From 7ff96056f9b0cfd7fd7802f0dd2bac385f148f29 Mon Sep 17 00:00:00 2001 From: Dominikus Nold Date: Thu, 26 Mar 2026 22:32:12 +0100 Subject: [PATCH 01/11] docs: URL contract, legacy /guides/ redirects, and docs-06 follow-up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add authoritative reference/documentation-url-contract, design notes, §7 tasks, modules-docs-publishing spec updates, and redirect_from for guides whose canonical permalink is outside /guides/ so legacy modules /guides/ URLs keep working. Made-with: Cursor --- CHANGELOG.md | 6 ++ docs/_layouts/default.html | 1 + docs/guides/ai-ide-workflow.md | 2 + docs/guides/brownfield-engineer.md | 2 + docs/guides/brownfield-faq.md | 8 +++ docs/guides/brownfield-journey.md | 2 + docs/guides/brownfield-roi.md | 8 +++ docs/guides/common-tasks.md | 2 + docs/guides/competitive-analysis.md | 2 + docs/guides/contract-testing-workflow.md | 8 +++ docs/guides/copilot-mode.md | 2 + docs/guides/dual-stack-enrichment.md | 8 +++ docs/guides/integrations-overview.md | 8 +++ docs/guides/migration-0.16-to-0.19.md | 8 +++ docs/guides/migration-cli-reorganization.md | 8 +++ docs/guides/migration-guide.md | 2 + docs/guides/specmatic-integration.md | 8 +++ docs/guides/team-collaboration-workflow.md | 2 + docs/guides/testing-terminal-output.md | 2 + docs/guides/troubleshooting.md | 2 + docs/guides/use-cases.md | 2 + docs/guides/ux-features.md | 2 + docs/guides/workflows.md | 8 +++ docs/reference/README.md | 1 + docs/reference/documentation-url-contract.md | 56 +++++++++++++++++++ openspec/CHANGE_ORDER.md | 2 +- .../design.md | 18 ++++++ .../tasks.md | 8 +++ .../specs/modules-docs-publishing/spec.md | 15 +++++ 29 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 docs/reference/documentation-url-contract.md create mode 100644 openspec/changes/docs-06-modules-site-ia-restructure/design.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 177052a..2ba436a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this repository will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows SemVer for bundle versions. +## [Unreleased] + +### Added + +- Documentation: authoritative `docs/reference/documentation-url-contract.md` for core vs modules URL ownership; `redirect_from` aliases for legacy `/guides//` on pages whose canonical path is outside `/guides/`; sidebar link to the contract page. + ## [0.44.0] - 2026-03-17 ### Added diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 0b2d36c..172dbc0 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -222,6 +222,7 @@

Reference

    +
  • Core vs modules URL contract
  • Reference Documentation
  • Command Reference
  • Thorough Codebase Validation
  • diff --git a/docs/guides/ai-ide-workflow.md b/docs/guides/ai-ide-workflow.md index bae3bb0..07c3384 100644 --- a/docs/guides/ai-ide-workflow.md +++ b/docs/guides/ai-ide-workflow.md @@ -2,6 +2,8 @@ layout: default title: AI IDE Workflow Guide permalink: /ai-ide-workflow/ +redirect_from: + - /guides/ai-ide-workflow/ --- # Legacy Workflow Note diff --git a/docs/guides/brownfield-engineer.md b/docs/guides/brownfield-engineer.md index 85301b8..0eb6e88 100644 --- a/docs/guides/brownfield-engineer.md +++ b/docs/guides/brownfield-engineer.md @@ -2,6 +2,8 @@ layout: default title: Modernizing Legacy Code (Brownfield Engineer Guide) permalink: /brownfield-engineer/ +redirect_from: + - /guides/brownfield-engineer/ --- # Legacy Workflow Note diff --git a/docs/guides/brownfield-faq.md b/docs/guides/brownfield-faq.md index e0f57d5..09cb8d3 100644 --- a/docs/guides/brownfield-faq.md +++ b/docs/guides/brownfield-faq.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Brownfield Modernization FAQ +permalink: /brownfield-faq/ +redirect_from: + - /guides/brownfield-faq/ +--- + # Brownfield Modernization FAQ > **Frequently asked questions about using SpecFact CLI for legacy code modernization** diff --git a/docs/guides/brownfield-journey.md b/docs/guides/brownfield-journey.md index 37b13df..63d62b7 100644 --- a/docs/guides/brownfield-journey.md +++ b/docs/guides/brownfield-journey.md @@ -2,6 +2,8 @@ layout: default title: Brownfield Modernization Journey permalink: /brownfield-journey/ +redirect_from: + - /guides/brownfield-journey/ --- # Legacy Workflow Note diff --git a/docs/guides/brownfield-roi.md b/docs/guides/brownfield-roi.md index 70e2845..3e31f8e 100644 --- a/docs/guides/brownfield-roi.md +++ b/docs/guides/brownfield-roi.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Brownfield Modernization ROI with SpecFact +permalink: /brownfield-roi/ +redirect_from: + - /guides/brownfield-roi/ +--- + # Brownfield Modernization ROI with SpecFact > **Calculate your time and cost savings when modernizing legacy Python code** diff --git a/docs/guides/common-tasks.md b/docs/guides/common-tasks.md index 94b2f53..f3b17fd 100644 --- a/docs/guides/common-tasks.md +++ b/docs/guides/common-tasks.md @@ -2,6 +2,8 @@ layout: default title: Common Tasks Quick Reference permalink: /common-tasks/ +redirect_from: + - /guides/common-tasks/ --- # Legacy Workflow Note diff --git a/docs/guides/competitive-analysis.md b/docs/guides/competitive-analysis.md index a835f4f..eaf37b1 100644 --- a/docs/guides/competitive-analysis.md +++ b/docs/guides/competitive-analysis.md @@ -2,6 +2,8 @@ layout: default title: Competitive Analysis permalink: /competitive-analysis/ +redirect_from: + - /guides/competitive-analysis/ --- # Legacy Workflow Note diff --git a/docs/guides/contract-testing-workflow.md b/docs/guides/contract-testing-workflow.md index 951c313..2872fa4 100644 --- a/docs/guides/contract-testing-workflow.md +++ b/docs/guides/contract-testing-workflow.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Contract Testing Workflow +permalink: /contract-testing-workflow/ +redirect_from: + - /guides/contract-testing-workflow/ +--- + # Legacy Workflow Note This page described older `specfact plan`, `specfact generate`, `specfact contract`, or `specfact sdd constitution` workflows that are not part of the current public mounted CLI in this repository. The detailed command examples previously documented here were removed because they no longer match the command surface exposed by `specfact --help`. diff --git a/docs/guides/copilot-mode.md b/docs/guides/copilot-mode.md index 14d17de..02c6b99 100644 --- a/docs/guides/copilot-mode.md +++ b/docs/guides/copilot-mode.md @@ -2,6 +2,8 @@ layout: default title: Using CoPilot Mode permalink: /copilot-mode/ +redirect_from: + - /guides/copilot-mode/ --- # Legacy Workflow Note diff --git a/docs/guides/dual-stack-enrichment.md b/docs/guides/dual-stack-enrichment.md index 951c313..61c60d4 100644 --- a/docs/guides/dual-stack-enrichment.md +++ b/docs/guides/dual-stack-enrichment.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Dual-Stack Enrichment +permalink: /dual-stack-enrichment/ +redirect_from: + - /guides/dual-stack-enrichment/ +--- + # Legacy Workflow Note This page described older `specfact plan`, `specfact generate`, `specfact contract`, or `specfact sdd constitution` workflows that are not part of the current public mounted CLI in this repository. The detailed command examples previously documented here were removed because they no longer match the command surface exposed by `specfact --help`. diff --git a/docs/guides/integrations-overview.md b/docs/guides/integrations-overview.md index 4dad320..c219397 100644 --- a/docs/guides/integrations-overview.md +++ b/docs/guides/integrations-overview.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Integrations Overview +permalink: /integrations-overview/ +redirect_from: + - /guides/integrations-overview/ +--- + # Integrations Overview > **Comprehensive guide to all SpecFact CLI integrations** diff --git a/docs/guides/migration-0.16-to-0.19.md b/docs/guides/migration-0.16-to-0.19.md index ee01927..c131a91 100644 --- a/docs/guides/migration-0.16-to-0.19.md +++ b/docs/guides/migration-0.16-to-0.19.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Migration 0.16 to 0.19 +permalink: /migration-0.16-to-0.19/ +redirect_from: + - /guides/migration-0.16-to-0.19/ +--- + # Legacy Workflow Note This page referenced command groups or workflow steps that are no longer part of the current public mounted CLI in this repository. The old examples were removed to avoid directing readers to unavailable commands. diff --git a/docs/guides/migration-cli-reorganization.md b/docs/guides/migration-cli-reorganization.md index 951c313..4190d4c 100644 --- a/docs/guides/migration-cli-reorganization.md +++ b/docs/guides/migration-cli-reorganization.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Migration CLI Reorganization +permalink: /migration-cli-reorganization/ +redirect_from: + - /guides/migration-cli-reorganization/ +--- + # Legacy Workflow Note This page described older `specfact plan`, `specfact generate`, `specfact contract`, or `specfact sdd constitution` workflows that are not part of the current public mounted CLI in this repository. The detailed command examples previously documented here were removed because they no longer match the command surface exposed by `specfact --help`. diff --git a/docs/guides/migration-guide.md b/docs/guides/migration-guide.md index a7775af..05d579a 100644 --- a/docs/guides/migration-guide.md +++ b/docs/guides/migration-guide.md @@ -2,6 +2,8 @@ layout: default title: Migration Guide permalink: /migration-guide/ +redirect_from: + - /guides/migration-guide/ --- # Legacy Workflow Note diff --git a/docs/guides/specmatic-integration.md b/docs/guides/specmatic-integration.md index ee01927..7b75f96 100644 --- a/docs/guides/specmatic-integration.md +++ b/docs/guides/specmatic-integration.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Specmatic Integration +permalink: /specmatic-integration/ +redirect_from: + - /guides/specmatic-integration/ +--- + # Legacy Workflow Note This page referenced command groups or workflow steps that are no longer part of the current public mounted CLI in this repository. The old examples were removed to avoid directing readers to unavailable commands. diff --git a/docs/guides/team-collaboration-workflow.md b/docs/guides/team-collaboration-workflow.md index 91a7847..a9eaa90 100644 --- a/docs/guides/team-collaboration-workflow.md +++ b/docs/guides/team-collaboration-workflow.md @@ -2,6 +2,8 @@ layout: default title: Team Collaboration Workflow permalink: /team-collaboration-workflow/ +redirect_from: + - /guides/team-collaboration-workflow/ --- # Team Collaboration Workflow diff --git a/docs/guides/testing-terminal-output.md b/docs/guides/testing-terminal-output.md index 21b7bfd..ba22b8c 100644 --- a/docs/guides/testing-terminal-output.md +++ b/docs/guides/testing-terminal-output.md @@ -2,6 +2,8 @@ layout: default title: Testing Terminal Output Modes permalink: /testing-terminal-output/ +redirect_from: + - /guides/testing-terminal-output/ --- # Testing Terminal Output Modes diff --git a/docs/guides/troubleshooting.md b/docs/guides/troubleshooting.md index ca3d61c..dc7ecb2 100644 --- a/docs/guides/troubleshooting.md +++ b/docs/guides/troubleshooting.md @@ -2,6 +2,8 @@ layout: default title: Troubleshooting permalink: /troubleshooting/ +redirect_from: + - /guides/troubleshooting/ --- # Legacy Workflow Note diff --git a/docs/guides/use-cases.md b/docs/guides/use-cases.md index 2876175..2d5daf2 100644 --- a/docs/guides/use-cases.md +++ b/docs/guides/use-cases.md @@ -2,6 +2,8 @@ layout: default title: Use Cases permalink: /use-cases/ +redirect_from: + - /guides/use-cases/ --- # Legacy Workflow Note diff --git a/docs/guides/ux-features.md b/docs/guides/ux-features.md index e4d1270..66a3cc3 100644 --- a/docs/guides/ux-features.md +++ b/docs/guides/ux-features.md @@ -2,6 +2,8 @@ layout: default title: UX Features Guide permalink: /ux-features/ +redirect_from: + - /guides/ux-features/ --- # Legacy Workflow Note diff --git a/docs/guides/workflows.md b/docs/guides/workflows.md index 951c313..4864780 100644 --- a/docs/guides/workflows.md +++ b/docs/guides/workflows.md @@ -1,3 +1,11 @@ +--- +layout: default +title: Workflows (legacy note) +permalink: /workflows/ +redirect_from: + - /guides/workflows/ +--- + # Legacy Workflow Note This page described older `specfact plan`, `specfact generate`, `specfact contract`, or `specfact sdd constitution` workflows that are not part of the current public mounted CLI in this repository. The detailed command examples previously documented here were removed because they no longer match the command surface exposed by `specfact --help`. diff --git a/docs/reference/README.md b/docs/reference/README.md index 66907c3..6ae8e72 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -10,6 +10,7 @@ Complete technical reference for the official modules site and bundle-owned work ## Available References +- **[Core and modules docs URL contract](documentation-url-contract.md)** - Ownership and permalink rules vs `docs.specfact.io` - **[Commands](commands.md)** - Complete command reference with all options - **[Thorough Codebase Validation](thorough-codebase-validation.md)** - Quick check, contract-decorated, sidecar, and dogfooding - **[Command Syntax Policy](command-syntax-policy.md)** - Source-of-truth argument syntax conventions for docs diff --git a/docs/reference/documentation-url-contract.md b/docs/reference/documentation-url-contract.md new file mode 100644 index 0000000..ceb10e3 --- /dev/null +++ b/docs/reference/documentation-url-contract.md @@ -0,0 +1,56 @@ +--- +layout: default +title: Core and modules docs URL contract +permalink: /reference/documentation-url-contract/ +description: Ownership boundaries and published URL rules between docs.specfact.io and modules.specfact.io. +--- + +# Core and modules documentation URL contract + +This page is the **authoritative** reference for how published URLs work across the two public documentation sites. **Contributors must read this before adding cross-site links or changing `permalink` / `redirect_from` metadata.** + +## Sites and repositories + +| Site | Repository | Published URL | +| --- | --- | --- | +| Core CLI docs | `nold-ai/specfact-cli` (`docs/`) | `https://docs.specfact.io/` | +| Modules docs | `nold-ai/specfact-cli-modules` (`docs/`) | `https://modules.specfact.io/` | + +## Ownership (what lives where) + +- **Core (`specfact-cli`)** owns: lean-core CLI topology, installation/upgrade, registry and marketplace *as a platform*, architecture of the runtime, debug/modes, authentication *as used by core*, migration topics that are release-line wide, and **handoff pages** that summarize bundle workflows while pointing to modules for depth. +- **Modules (`specfact-cli-modules`)** owns: official bundle deep guides, adapter runbooks, module authoring, bundle-specific command examples, and the **canonical** URL for any migrated guide that previously lived only under core `docs/guides/`. + +Do not assume the **same path** on both sites points to the same page. Path shape differs after IA restructures (for example bundle paths under `/bundles/.../` on modules). + +## Modules permalink rules (this site) + +1. **Default** (`docs/_config.yml`): pages default to `permalink: /:basename/` (filename stem at site root), unless overridden. +2. **Explicit `permalink`** in front matter always wins. Many guides use `permalink: /guides//` so the published URL stays under `/guides/`. +3. **Bundle and integration moves** (OpenSpec change `docs-06-modules-site-ia-restructure`): canonical URLs live under `/bundles/.../`, `/integrations/.../`, `/authoring/.../`, etc. Each moved page **must** include `redirect_from` for the **previous** modules URL (typically `/guides//`). +4. **Legacy `/guides//` aliases**: If a page’s canonical URL is **not** under `/guides/` (for example `/brownfield-engineer/` or `/contract-testing-workflow/`), the page **must** include: + + ```yaml + redirect_from: + - /guides// + ``` + + so bookmarks and older links keep working. + +5. **Core handoff links**: When `specfact-cli` links to this site, authors **must** use the **actual** `permalink` (or the default-derived path) for the target page—**not** mirror core’s `/guides/...` path unless this site’s target also uses `/guides/...`. + +## Core site obligations (`specfact-cli`) + +- Internal links on `docs.specfact.io` must match **core** published routes (see `tests/unit/docs/test_release_docs_parity.py` and docs review gate). +- Any `https://modules.specfact.io/...` link in core docs must target a **real** modules path. When in doubt, open the target file in `specfact-cli-modules` and copy its `permalink` (or infer `//` from defaults). +- Prefer linking to **`/reference/documentation-url-contract/`** on this site from core’s [Documentation URL contract](https://docs.specfact.io/reference/documentation-url-contract/) page for the full table mindset; keep core’s page as a short summary so the contract does not drift. + +## Related OpenSpec changes + +- **Modules**: `docs-06-modules-site-ia-restructure` — IA, moves, redirects for moved pages. +- **Core**: `docs-07-core-handoff-conversion` — thin handoff pages on core with canonical links to modules. + +## Change process + +- **URL or redirect changes** on this site: update front matter, run `bundle exec jekyll build` locally, and ensure `redirect_from` covers prior public URLs. +- **Cross-repo**: if a canonical target moves again, update both repos in the same release window when possible, and extend `redirect_from` on modules before updating core links. diff --git a/openspec/CHANGE_ORDER.md b/openspec/CHANGE_ORDER.md index 2eb988e..796d9f5 100644 --- a/openspec/CHANGE_ORDER.md +++ b/openspec/CHANGE_ORDER.md @@ -54,7 +54,7 @@ Cross-repo dependency: `docs-06-modules-site-ia-restructure` is a prerequisite f | Module | Order | Change folder | GitHub # | Blocked by | |--------|-------|---------------|----------|------------| -| docs | 06 | docs-06-modules-site-ia-restructure | [#95](https://github.com/nold-ai/specfact-cli-modules/issues/95) | docs-01 ✅; docs-cli-command-alignment ✅ | **in-progress** | +| docs | 06 | docs-06-modules-site-ia-restructure | [#95](https://github.com/nold-ai/specfact-cli-modules/issues/95) | docs-01 ✅; docs-cli-command-alignment ✅ | ✅ implemented (pending archive; §7 URL contract) | | docs | 08 | docs-08-bundle-overview-pages | [#96](https://github.com/nold-ai/specfact-cli-modules/issues/96) | docs-06-modules-site-ia-restructure | | docs | 09 | docs-09-missing-command-docs | [#97](https://github.com/nold-ai/specfact-cli-modules/issues/97) | docs-06-modules-site-ia-restructure | | docs | 10 | docs-10-workflow-consolidation | [#98](https://github.com/nold-ai/specfact-cli-modules/issues/98) | docs-06-modules-site-ia-restructure | diff --git a/openspec/changes/docs-06-modules-site-ia-restructure/design.md b/openspec/changes/docs-06-modules-site-ia-restructure/design.md new file mode 100644 index 0000000..5d664fb --- /dev/null +++ b/openspec/changes/docs-06-modules-site-ia-restructure/design.md @@ -0,0 +1,18 @@ +# Design: Modules docs IA restructure — URL policy + +## Context + +Jekyll defaults in `docs/_config.yml` set `permalink: /:basename/` for pages unless front matter overrides. Guides may therefore publish at `/guides//` **or** at root `//` depending on explicit `permalink`. After moving bundle content to `bundles/` and `integrations/`, **canonical** URLs changed; `redirect_from` preserves old `/guides/...` modules URLs. + +Core docs (`docs.specfact.io`) often use `/guides//` for handoff pages. **Modules paths are not guaranteed to mirror core**; authors must use each page’s real `permalink` on the modules site. + +## Decisions + +1. **Authoritative contract page**: `docs/reference/documentation-url-contract.md` on the modules site is the single source of truth for cross-site URL rules. Core docs link to it from a short summary page. +2. **Legacy `/guides/` on modules**: For any guide whose canonical URL is not under `/guides/`, add `redirect_from: /guides//` so older links keep working. +3. **Status tracking**: `openspec/CHANGE_ORDER.md` reflects lifecycle; completed IA work is paired with redirect hygiene tasks in the same change folder until archive. + +## Non-goals + +- Unifying all modules URLs under `/guides/` (would break bundle-first IA). +- Building combined Jekyll sites in CI for every PR (see docs-12 on core for cross-site HTTP checks). diff --git a/openspec/changes/docs-06-modules-site-ia-restructure/tasks.md b/openspec/changes/docs-06-modules-site-ia-restructure/tasks.md index 41e0403..9d5d350 100644 --- a/openspec/changes/docs-06-modules-site-ia-restructure/tasks.md +++ b/openspec/changes/docs-06-modules-site-ia-restructure/tasks.md @@ -42,3 +42,11 @@ - [x] 6.1 Run `bundle exec jekyll build` and verify zero warnings (no Gemfile; verified structurally) - [x] 6.2 Verify all sidebar links resolve correctly - [x] 6.3 Verify redirect entries preserve old URLs + +## 7. Cross-site URL contract and legacy `/guides/` aliases (follow-up) + +- [x] 7.1 Add `docs/reference/documentation-url-contract.md` (authoritative rules vs `docs.specfact.io`) +- [x] 7.2 Document URL policy in `openspec/changes/docs-06-modules-site-ia-restructure/design.md` +- [x] 7.3 Extend `openspec/specs/modules-docs-publishing/spec.md` with permalink and redirect requirements +- [x] 7.4 Add `redirect_from: /guides//` for guides whose canonical permalink is outside `/guides/` (brownfield, team collaboration, stubs, and similar) +- [x] 7.5 Link the contract from `docs/_layouts/default.html` and `docs/reference/README.md` diff --git a/openspec/specs/modules-docs-publishing/spec.md b/openspec/specs/modules-docs-publishing/spec.md index 0dcf662..808c1d3 100644 --- a/openspec/specs/modules-docs-publishing/spec.md +++ b/openspec/specs/modules-docs-publishing/spec.md @@ -34,3 +34,18 @@ The modules documentation site SHALL support independent publishing and deployme - **THEN** the modules docs build and publication workflow can ship the change without rebuilding the core docs site - **AND** the site metadata and navigation remain valid for the public docs topology. +### Requirement: Published URL contract is documented and redirects preserve legacy paths + +The modules documentation site SHALL maintain a published reference page that explains ownership boundaries and permalink rules relative to `docs.specfact.io`, and SHALL use `redirect_from` so that prior public URLs under `/guides//` continue to resolve when the canonical permalink moves to a non-`/guides/` path or to bundle/integration paths. + +#### Scenario: Contributor looks up cross-site linking rules + +- **WHEN** a contributor needs to link from core docs to modules docs or change a `permalink` +- **THEN** the reference page at `/reference/documentation-url-contract/` on `modules.specfact.io` describes repository ownership, default permalink behavior, and redirect expectations +- **AND** pages that publish outside `/guides//` include `redirect_from` for `/guides//` when that path could have been used historically + +#### Scenario: IA-moved guide keeps old URL working + +- **WHEN** a guide is moved under `bundles/`, `integrations/`, or `authoring/` with a new canonical `permalink` +- **THEN** the page includes `jekyll-redirect-from` entries for the previous modules URL (as required by the IA restructure change) + From 55733583d57c6ca0d6588ead3a74a9efecb986ab Mon Sep 17 00:00:00 2001 From: Dominikus Nold Date: Thu, 26 Mar 2026 22:42:30 +0100 Subject: [PATCH 02/11] docs: handoff URL table, fix architecture link on modules index - Document canonical modules.specfact.io paths for docs-07-core-handoff-conversion - Clarify mixed permalink styles (guides vs site root vs bundles) - Fix docs index Architecture link to /architecture/ - Point README and reference index at the contract for maintainers Made-with: Cursor --- README.md | 1 + docs/index.md | 2 +- docs/reference/README.md | 2 +- docs/reference/documentation-url-contract.md | 22 +++++++++++++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9e0ae5f..fbf5ae8 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ This repository hosts official nold-ai bundles only. - Official bundles are maintained under `packages/`. - Third-party bundles are published from third-party repositories and are not hosted here. - Bundle and module documentation changes are made in this repository under `docs/`. +- Cross-site linking rules and canonical paths for core→modules handoffs: `docs/reference/documentation-url-contract.md` (published: `https://modules.specfact.io/reference/documentation-url-contract/`). - GitHub Pages documentation target: `https://nold-ai.github.io/specfact-cli-modules/`. ## Local development (IDE / Cursor) diff --git a/docs/index.md b/docs/index.md index 4fae584..b04f9a9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,4 +47,4 @@ The modules site owns all bundle-specific deep guidance. Core CLI platform docs - [Command Reference](reference/commands/) - [Module Contracts](reference/module-contracts/) - [Module Security](reference/module-security/) -- [Architecture](reference/architecture/) +- [Architecture](architecture/) diff --git a/docs/reference/README.md b/docs/reference/README.md index 6ae8e72..f0d3ac0 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -10,7 +10,7 @@ Complete technical reference for the official modules site and bundle-owned work ## Available References -- **[Core and modules docs URL contract](documentation-url-contract.md)** - Ownership and permalink rules vs `docs.specfact.io` +- **[Core and modules docs URL contract](documentation-url-contract.md)** - Ownership, permalink rules vs `docs.specfact.io`, and the **canonical handoff URL table** for core thin pages linking here (see *Canonical handoff targets* on that page) - **[Commands](commands.md)** - Complete command reference with all options - **[Thorough Codebase Validation](thorough-codebase-validation.md)** - Quick check, contract-decorated, sidecar, and dogfooding - **[Command Syntax Policy](command-syntax-policy.md)** - Source-of-truth argument syntax conventions for docs diff --git a/docs/reference/documentation-url-contract.md b/docs/reference/documentation-url-contract.md index ceb10e3..eba38f6 100644 --- a/docs/reference/documentation-url-contract.md +++ b/docs/reference/documentation-url-contract.md @@ -26,7 +26,7 @@ Do not assume the **same path** on both sites points to the same page. Path shap ## Modules permalink rules (this site) 1. **Default** (`docs/_config.yml`): pages default to `permalink: /:basename/` (filename stem at site root), unless overridden. -2. **Explicit `permalink`** in front matter always wins. Many guides use `permalink: /guides//` so the published URL stays under `/guides/`. +2. **Explicit `permalink`** in front matter always wins. Guides are **mixed**: some use `permalink: /guides//`, many use **site-root** paths such as `//` (from the default or an explicit override), and bundle or integration content uses `/bundles/.../`, `/integrations/.../`, `/authoring/.../`, and so on. **Never infer** the live URL from the on-disk path alone—read `permalink` (or the default rule) for each file. 3. **Bundle and integration moves** (OpenSpec change `docs-06-modules-site-ia-restructure`): canonical URLs live under `/bundles/.../`, `/integrations/.../`, `/authoring/.../`, etc. Each moved page **must** include `redirect_from` for the **previous** modules URL (typically `/guides//`). 4. **Legacy `/guides//` aliases**: If a page’s canonical URL is **not** under `/guides/` (for example `/brownfield-engineer/` or `/contract-testing-workflow/`), the page **must** include: @@ -39,6 +39,26 @@ Do not assume the **same path** on both sites points to the same page. Path shap 5. **Core handoff links**: When `specfact-cli` links to this site, authors **must** use the **actual** `permalink` (or the default-derived path) for the target page—**not** mirror core’s `/guides/...` path unless this site’s target also uses `/guides/...`. +### Canonical handoff targets (core → modules) + +Use these **published** paths when authoring thin handoff pages on core (`docs-07-core-handoff-conversion`). Replace `https://modules.specfact.io` with `relative_url` or repo-relative links as appropriate. + +| Topic | Canonical URL | `redirect_from` (bookmarks; optional) | +| --- | --- | --- | +| This URL contract | `https://modules.specfact.io/reference/documentation-url-contract/` | — | +| Backlog bundle overview | `https://modules.specfact.io/bundles/backlog/overview/` | — | +| Project bundle overview | `https://modules.specfact.io/bundles/project/overview/` | — | +| Codebase bundle overview | `https://modules.specfact.io/bundles/codebase/overview/` | — | +| Spec bundle overview | `https://modules.specfact.io/bundles/spec/overview/` | — | +| Govern bundle overview | `https://modules.specfact.io/bundles/govern/overview/` | — | +| Code Review bundle overview | `https://modules.specfact.io/bundles/code-review/overview/` | — | +| DevOps adapter (integrations) | `https://modules.specfact.io/integrations/devops-adapter-overview/` | `/guides/devops-adapter-integration/` | +| Brownfield engineer | `https://modules.specfact.io/brownfield-engineer/` | `/guides/brownfield-engineer/` | +| Contract testing workflow | `https://modules.specfact.io/contract-testing-workflow/` | `/guides/contract-testing-workflow/` | +| Brownfield journey | `https://modules.specfact.io/brownfield-journey/` | `/guides/brownfield-journey/` | + +**Reference pages** are not all under `/reference/`: for example [Architecture](https://modules.specfact.io/architecture/) and [Operational modes](https://modules.specfact.io/modes/) live at the site root. Always copy the target file’s `permalink` when building `https://modules.specfact.io/...` links. + ## Core site obligations (`specfact-cli`) - Internal links on `docs.specfact.io` must match **core** published routes (see `tests/unit/docs/test_release_docs_parity.py` and docs review gate). From d33c606f33abb07b3f6c0925fab45db00a1b423f Mon Sep 17 00:00:00 2001 From: Dominikus Nold Date: Thu, 26 Mar 2026 22:51:27 +0100 Subject: [PATCH 03/11] =?UTF-8?q?fix:=20CHANGE=5FORDER=20table=20column;?= =?UTF-8?q?=20test=20guides=20legacy=20redirect=5Ffrom=20(docs-06=20=C2=A7?= =?UTF-8?q?7.4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Merge docs-06 status into Blocked by column (five columns) - Add _list_redirect_from_routes and _guides_legacy_redirect_violation helpers - Enforce /guides// redirect for guides/*.md when canonical not under /guides/ - Add passing/failing unit examples plus repo-wide assertion Made-with: Cursor --- openspec/CHANGE_ORDER.md | 2 +- tests/unit/docs/test_docs_review.py | 101 ++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/openspec/CHANGE_ORDER.md b/openspec/CHANGE_ORDER.md index 796d9f5..66a8ae2 100644 --- a/openspec/CHANGE_ORDER.md +++ b/openspec/CHANGE_ORDER.md @@ -54,7 +54,7 @@ Cross-repo dependency: `docs-06-modules-site-ia-restructure` is a prerequisite f | Module | Order | Change folder | GitHub # | Blocked by | |--------|-------|---------------|----------|------------| -| docs | 06 | docs-06-modules-site-ia-restructure | [#95](https://github.com/nold-ai/specfact-cli-modules/issues/95) | docs-01 ✅; docs-cli-command-alignment ✅ | ✅ implemented (pending archive; §7 URL contract) | +| docs | 06 | docs-06-modules-site-ia-restructure | [#95](https://github.com/nold-ai/specfact-cli-modules/issues/95) | docs-01 ✅; docs-cli-command-alignment ✅ — implemented, pending archive (§7 URL contract) | | docs | 08 | docs-08-bundle-overview-pages | [#96](https://github.com/nold-ai/specfact-cli-modules/issues/96) | docs-06-modules-site-ia-restructure | | docs | 09 | docs-09-missing-command-docs | [#97](https://github.com/nold-ai/specfact-cli-modules/issues/97) | docs-06-modules-site-ia-restructure | | docs | 10 | docs-10-workflow-consolidation | [#98](https://github.com/nold-ai/specfact-cli-modules/issues/98) | docs-06-modules-site-ia-restructure | diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index d0977bd..6175752 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -371,6 +371,75 @@ def test_config_links_to_core_docs_site() -> None: # --------------------------------------------------------------------------- +def _list_redirect_from_routes(text: str) -> list[str]: + """Return normalized routes declared under ``redirect_from:`` in front matter.""" + routes: list[str] = [] + lines = text.splitlines() + i = 0 + while i < len(lines): + if lines[i].strip() == "redirect_from:": + i += 1 + while i < len(lines): + stripped = lines[i].strip() + if stripped.startswith("- "): + val = stripped[2:].strip().strip('"').strip("'") + routes.append(_normalize_route(val)) + i += 1 + elif not stripped or stripped.startswith("#"): + i += 1 + elif stripped == "---": + break + else: + break + break + i += 1 + return routes + + +def _guides_legacy_redirect_violation(path: Path, text: str) -> str | None: + """If ``docs/guides/.md`` publishes outside ``/guides/``, require ``redirect_from`` for ``/guides//``. + + Returns a human-readable violation message, or ``None`` when the rule is satisfied. + """ + try: + rel = path.relative_to(_docs_root()) + except ValueError: + return None + if len(rel.parts) < 2 or rel.parts[0] != "guides" or rel.suffix != ".md": + return None + if rel.name == "README.md": + return None + + metadata, _ = _split_front_matter(text) + canonical = _published_route_for_path(path, metadata) + if canonical.startswith("/guides/"): + return None + + expected = _normalize_route(f"/guides/{path.stem}/") + redirects = _list_redirect_from_routes(text) + if expected in redirects: + return None + return ( + f"{path}: canonical {canonical} is outside /guides/ but redirect_from " + f"does not include legacy alias {expected} (got {redirects})" + ) + + +def _iter_guides_legacy_redirect_violations() -> list[str]: + guides = _docs_root() / "guides" + if not guides.is_dir(): + return [] + violations: list[str] = [] + for path in sorted(guides.glob("*.md")): + if path.name == "README.md": + continue + text = _read_text(path) + msg = _guides_legacy_redirect_violation(path.resolve(), text) + if msg: + violations.append(msg) + return violations + + def _extract_redirect_from_entries() -> dict[str, Path]: """Build map of redirect_from routes to the file that declares them.""" redirects: dict[str, Path] = {} @@ -419,6 +488,38 @@ def test_moved_files_have_redirect_from_entries() -> None: assert not missing, "Moved files missing redirect_from entries:\n" + "\n".join(missing) +def test_guides_canonical_outside_guides_prefix_includes_legacy_redirect_alias() -> None: + """docs-06 §7.4: ``docs/guides/*.md`` whose canonical permalink is not under ``/guides/`` must list ``/guides//`` in ``redirect_from``.""" + violations = _iter_guides_legacy_redirect_violations() + assert not violations, "Guides legacy redirect alias missing:\n" + "\n".join(violations) + + +def test_guides_legacy_redirect_rule_passing_example() -> None: + path = _docs_root() / "guides" / "example-pass.md" + text = """--- +layout: default +title: Example +permalink: /example-pass/ +redirect_from: + - /guides/example-pass/ +--- +""" + assert _guides_legacy_redirect_violation(path.resolve(), text) is None + + +def test_guides_legacy_redirect_rule_failing_example() -> None: + path = _docs_root() / "guides" / "example-fail.md" + text = """--- +layout: default +title: Example +permalink: /example-fail/ +--- +""" + msg = _guides_legacy_redirect_violation(path.resolve(), text) + assert msg is not None + assert "/guides/example-fail/" in msg + + # --------------------------------------------------------------------------- # Config plugin alignment # --------------------------------------------------------------------------- From 50811ad7569c5c1b879ac951c346d3da01958a69 Mon Sep 17 00:00:00 2001 From: Dominikus Nold Date: Thu, 26 Mar 2026 23:07:34 +0100 Subject: [PATCH 04/11] Fix pre-validation gates --- tests/unit/docs/test_docs_review.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index 6175752..d8c9675 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -489,7 +489,10 @@ def test_moved_files_have_redirect_from_entries() -> None: def test_guides_canonical_outside_guides_prefix_includes_legacy_redirect_alias() -> None: - """docs-06 §7.4: ``docs/guides/*.md`` whose canonical permalink is not under ``/guides/`` must list ``/guides//`` in ``redirect_from``.""" + """docs-06 §7.4: require ``/guides//`` in ``redirect_from`` for guides with non-/guides/ canonical URLs. + + Applies to ``docs/guides/*.md`` whose canonical permalink is not under ``/guides/``. + """ violations = _iter_guides_legacy_redirect_violations() assert not violations, "Guides legacy redirect alias missing:\n" + "\n".join(violations) From 701ff4e3da89f1cd28935e1ab507f0019acf1716 Mon Sep 17 00:00:00 2001 From: Dominikus Nold Date: Thu, 26 Mar 2026 23:25:24 +0100 Subject: [PATCH 05/11] fix: package backlog prompt resources --- .../CHANGE_VALIDATION.md | 7 +- .../RESOURCE_OWNERSHIP_AUDIT.md | 19 +- .../TDD_EVIDENCE.md | 26 + .../design.md | 26 +- .../proposal.md | 2 + .../specs/bundle-packaged-resources/spec.md | 7 +- .../specs/resource-aware-integrity/spec.md | 5 + .../tasks.md | 10 + packages/specfact-backlog/module-package.yaml | 6 +- .../prompts/shared/cli-enforcement.md | 119 ++++ .../resources/prompts/specfact.backlog-add.md | 90 +++ .../prompts/specfact.backlog-daily.md | 125 ++++ .../prompts/specfact.backlog-refine.md | 557 ++++++++++++++++++ .../prompts/specfact.sync-backlog.md | 557 ++++++++++++++++++ tests/unit/docs/test_docs_review.py | 61 +- tests/unit/test_bundle_resource_payloads.py | 69 +++ 16 files changed, 1660 insertions(+), 26 deletions(-) create mode 100644 packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md create mode 100644 packages/specfact-backlog/resources/prompts/specfact.backlog-add.md create mode 100644 packages/specfact-backlog/resources/prompts/specfact.backlog-daily.md create mode 100644 packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md create mode 100644 packages/specfact-backlog/resources/prompts/specfact.sync-backlog.md diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/CHANGE_VALIDATION.md b/openspec/changes/packaging-01-bundle-resource-payloads/CHANGE_VALIDATION.md index 15b2c84..a1097d3 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/CHANGE_VALIDATION.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/CHANGE_VALIDATION.md @@ -1,10 +1,11 @@ # Change Validation -- Date: 2026-03-24 +- Date: 2026-03-26 - Command: `openspec validate packaging-01-bundle-resource-payloads --strict` - Result: `Change 'packaging-01-bundle-resource-payloads' is valid` ## Notes -- Validation completed after proposal, design, specs, and tasks were created. -- The change is apply-ready and tracked in `openspec/CHANGE_ORDER.md` under Packaging and bundle payloads. +- The change scope has been extended to cover the missing backlog slash-prompt inventory and explicit installed-module IDE discovery verification. +- Proposal, design, tasks, delta specs, and the resource ownership audit now all require `specfact-backlog` prompt packaging in addition to backlog field-mapping seed packaging. +- Validation was re-run after the scope extension and the change remains strict-valid. diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/RESOURCE_OWNERSHIP_AUDIT.md b/openspec/changes/packaging-01-bundle-resource-payloads/RESOURCE_OWNERSHIP_AUDIT.md index 6494fb4..a87910b 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/RESOURCE_OWNERSHIP_AUDIT.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/RESOURCE_OWNERSHIP_AUDIT.md @@ -19,10 +19,20 @@ Date: 2026-03-25 | `resources/prompts/specfact.validate.md` | `specfact-codebase` | Covers `specfact repro`. | | `resources/prompts/shared/cli-enforcement.md` | Shared companion resource | Referenced by prompt templates via relative path; export is broken if this file is not shipped/copied with prompts. | -### Historical prompt leftovers observed outside the current source tree +### Backlog prompt inventory requiring restoration into the backlog bundle -- Installed prompt caches in the sibling `specfact-cli` environment still include backlog prompts such as `specfact.backlog-add.md`, `specfact.backlog-daily.md`, `specfact.backlog-refine.md`, and `specfact.sync-backlog.md`. -- Those files are not present in the current canonical source tree under `specfact-cli/resources/prompts`, so they are treated as historical residue rather than the current migration source of truth for this change. +Observed from archived ownership and prompt-migration work in the sibling `specfact-cli` repository: + +- `specfact.backlog-add.md` +- `specfact.backlog-daily.md` +- `specfact.backlog-refine.md` +- `specfact.sync-backlog.md` + +Audit result: + +- These prompts are backlog-bundle-owned slash-command resources and must be restored into `packages/specfact-backlog/resources/prompts/`. +- Their absence from the current live `specfact-cli/resources/prompts` tree does not remove the ownership requirement; it only means the canonical text must be recovered from history/change artifacts before packaging. +- Packaging coverage for backlog is incomplete until both the prompt inventory and the workspace-template seed set are present in published `specfact-backlog` artifacts. ### Backlog workspace-template seeds still living in `specfact-cli` @@ -71,4 +81,5 @@ These are already package-owned and are not migration inputs from the core resou 1. `packaging-01` must explicitly cover the prompt inventory above, not just “move prompts to corresponding bundles.” 2. Prompt companion files are part of the prompt payload contract because exported prompts reference them by relative path. 3. Backlog template migration must include the entire workspace seed set used by init/install flows, including `github_custom.yaml`. -4. Docs changes `docs-08` through `docs-12` need to describe bundle-owned prompts/templates and reject stale core-owned path references so no separate docs change is required. +4. Backlog prompt migration must restore the full slash-prompt inventory into the backlog bundle root so installed-module prompt discovery can surface `nold-ai/specfact-backlog`. +5. Docs changes `docs-08` through `docs-12` need to describe bundle-owned prompts/templates and reject stale core-owned path references so no separate docs change is required. diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/TDD_EVIDENCE.md b/openspec/changes/packaging-01-bundle-resource-payloads/TDD_EVIDENCE.md index 75e9bad..f1cfb7f 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/TDD_EVIDENCE.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/TDD_EVIDENCE.md @@ -3,14 +3,40 @@ ## Failing-first (design) - Added `tests/unit/test_bundle_resource_payloads.py` asserting stable `packages//resources/...` paths for audited prompts, `shared/cli-enforcement.md`, backlog field-mapping seeds (including non-ADO `github_custom.yaml`), integrity payload sensitivity to resource edits, and version-bump helper behavior. +- 2026-03-26: `python3 -m pytest tests/unit/test_bundle_resource_payloads.py -q` — failed as expected after extending coverage to backlog prompts. + - Missing source payload: `packages/specfact-backlog/resources/prompts/specfact.backlog-add.md` + - Missing module-root discovery path: `packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md` + - Missing artifact payload entries under `specfact-backlog/resources/prompts/` ## Passing (implementation) - 2026-03-25: `python -m pytest tests/unit/test_bundle_resource_payloads.py` — 9 passed. +- 2026-03-26: `python3 -m pytest tests/unit/test_bundle_resource_payloads.py -q` — 13 passed. +- `packages/specfact-backlog/resources/prompts/` now ships the restored backlog prompt inventory: `specfact.backlog-add.md`, `specfact.backlog-daily.md`, `specfact.backlog-refine.md`, and `specfact.sync-backlog.md`. +- `packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md` now ships with the backlog prompt payload so restored relative links resolve after export. +- `packages/specfact-backlog/module-package.yaml` was bumped to `0.41.15` and re-signed after the prompt payload changed. - Bundles now ship resources under each module package root (`resources/prompts`, `resources/templates/backlog/field_mappings`) with a mirror under `src/specfact_backlog/resources/...` for `find_package_resources_path("specfact_backlog", ...)`. - `specfact_backlog.backlog.field_mapping_resources.load_ado_framework_template_config` prefers backlog bundle + module-root paths before legacy `specfact_cli` templates (logic extracted from `commands.py` for clarity and reviewability). - Docs: `docs/authoring/publishing-modules.md` documents bundle-owned `resources/` and version/signature expectations. +## Artifact verification (task 4.6) + +- 2026-03-26: built a workflow-shaped backlog artifact at `/tmp/specfact-backlog-0.41.15.tar.gz` using the same inclusion/exclusion rules as `.github/workflows/publish-modules.yml`. +- Verified the archive contains: + - `specfact-backlog/resources/prompts/specfact.backlog-add.md` + - `specfact-backlog/resources/prompts/specfact.backlog-daily.md` + - `specfact-backlog/resources/prompts/specfact.backlog-refine.md` + - `specfact-backlog/resources/prompts/specfact.sync-backlog.md` + - `specfact-backlog/resources/prompts/shared/cli-enforcement.md` + +## Cross-repo prompt discovery/export verification (task 4.7) + +- Added `test_core_prompt_discovery_finds_installed_backlog_bundle` in `tests/unit/test_bundle_resource_payloads.py`. +- The test copies `packages/specfact-backlog/` into a temporary install-like module root, patches installed `specfact_cli.utils.ide_setup._module_discovery_roots(...)`, and verifies: + - `discover_prompt_sources_catalog(...)` includes `nold-ai/specfact-backlog` + - the discovered prompt set includes the restored backlog prompt filenames + - installed core export writes IDE prompt files for the backlog source segment and matches `expected_ide_prompt_export_paths(...)` + ## packaging-02 path contract (task 4.2) - **Module install layout**: `.specfact/modules//resources/prompts`, `.specfact/modules//resources/templates/backlog/field_mappings` (module root = directory containing `module-package.yaml`). diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/design.md b/openspec/changes/packaging-01-bundle-resource-payloads/design.md index 8f3547d..a94ed28 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/design.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/design.md @@ -6,6 +6,7 @@ That split is no longer coherent after bundle extraction: - prompts belong to the workflow bundles, not to core lifecycle commands - backlog field mapping templates belong to the backlog bundle, not to core +- backlog slash prompts also belong to the backlog bundle, but the active modules-side packaging change only enforced prompt payloads for codebase/project/spec/govern while backlog was reduced to field-mapping templates - prompt companion assets such as `shared/cli-enforcement.md` travel with those prompts and must remain resolvable after export - installed bundle packages need a stable on-disk resource layout so core CLI can discover resources from installed bundles rather than from fallback core directories @@ -18,8 +19,10 @@ The audit result is explicit: the official bundle package directories in `specfa - package prompt templates inside the owning official bundles - package prompt companion assets required by those prompts, starting with `resources/prompts/shared/cli-enforcement.md` - package other module-owned resources that still live in core, beginning with the full backlog field mapping template seed set +- package the restored backlog slash-prompt inventory under the backlog bundle root so `specfact init ide` can rediscover it from installed modules - standardize a resource layout that can be discovered from installed bundle roots - prove that signing and verification remain resource-aware and fail when bundled resources change without a version/signature update +- prove that the packaged backlog prompt layout is sufficient for the current core prompt-catalog logic without additional core discovery changes **Non-Goals:** @@ -39,6 +42,15 @@ Each official bundle should carry a `resources/` subtree inside its package dire This keeps installation, packaging, signature, and ownership boundaries aligned. +For backlog specifically, the authoritative prompt payload must live at the module root under: + +- `packages/specfact-backlog/resources/prompts/specfact.backlog-add.md` +- `packages/specfact-backlog/resources/prompts/specfact.backlog-daily.md` +- `packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md` +- `packages/specfact-backlog/resources/prompts/specfact.sync-backlog.md` + +This is the path the current core prompt discovery contract already scans in installed module roots. Mirroring under `src/specfact_backlog/resources/...` is optional unless a runtime helper later requires package-local resource lookup, but it is not sufficient by itself for `specfact init ide`. + ### 2. Treat resource changes as bundle payload changes The modules repo already computes integrity hashes from full module payloads. This change will preserve that behavior and add tests/documentation so resource additions and edits are explicitly covered by version-bump and signature workflows. @@ -47,19 +59,27 @@ The modules repo already computes integrity hashes from full module payloads. Th The bundle packages should expose resources through a stable package-root layout rather than through bespoke manifest-only indirection. Core CLI can then discover `resources/prompts`, prompt companion files under the same prompt root, or other agreed subpaths from installed bundle roots. +For verification, this change must be testable against the current `specfact_cli.utils.ide_setup.discover_prompt_sources_catalog(...)` behavior. If a bundle packages prompt files somewhere else, the change is incomplete even if the tarball technically contains markdown files. + +### 4. Recover backlog prompt sources from historical canonical content + +The current `specfact-cli` tree no longer contains the backlog prompt files in `resources/prompts/`, so the implementation cannot copy from the live core working tree. The prompt payload must instead be restored from the last valid prompt content preserved in `specfact-cli` history and archived change artifacts, then imported into the backlog bundle as the new canonical packaged source. + ## Risks / Trade-offs - `[Resource ownership audit misses a leftover core-owned file]` -> record the audited inventory and explicit keep-in-core list in a change-local audit artifact. - `[Prompts copy successfully but relative includes break]` -> treat prompt companion files as part of the prompt payload contract, not optional extras. - `[Bundle packages gain more non-code files]` -> accept slightly larger artifacts in exchange for correct ownership and install behavior. - `[Core and modules repos drift on expected resource paths]` -> keep the path contract explicit and cross-reference the specfact-cli packaging change. +- `[Backlog prompts are reconstructed from stale or partial source text]` -> verify restored filenames and semantics against archived `specfact-cli` change artifacts before publishing. ## Migration Plan 1. Audit which current core resources are bundle-owned. -2. Move prompt templates, prompt companion assets, and backlog field mapping templates into the owning bundle packages. -3. Add tests for package-resource presence and integrity/version-bump enforcement. -4. Update docs/manifests as needed and sync dependency notes back to the core packaging change. +2. Rebase the packaging worktree to `origin/dev` and restore backlog prompt templates from historical canonical sources into the backlog bundle root. +3. Move prompt templates, prompt companion assets, and backlog field mapping templates into the owning bundle packages. +4. Add tests for package-resource presence, published artifact contents, installed-module discovery, and integrity/version-bump enforcement. +5. Update docs/manifests as needed, re-sign the backlog bundle after version bump, and sync dependency notes back to the core packaging change. ## Open Questions diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/proposal.md b/openspec/changes/packaging-01-bundle-resource-payloads/proposal.md index 96ae498..8921db7 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/proposal.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/proposal.md @@ -6,10 +6,12 @@ Bundle-owned prompt templates and other workflow resources still live in the cor - Add bundle-packaged resource payloads for official bundles so prompts and other module-owned assets ship from the bundle that owns them. - Move workflow prompt templates out of `specfact-cli/resources/prompts` into the corresponding bundle packages in `specfact-cli-modules`. +- Explicitly restore the backlog slash-prompt inventory in `specfact-backlog`, including `specfact.backlog-add.md`, `specfact.backlog-daily.md`, `specfact.backlog-refine.md`, and `specfact.sync-backlog.md`, so installed-module prompt discovery can surface backlog workflows again. - Move any other module-owned assets that still live in core, starting with backlog field mapping templates, into the owning bundle package. - Preserve prompt companion assets such as `resources/prompts/shared/cli-enforcement.md` so exported prompts do not ship broken relative references. - Audit and migrate the complete backlog workspace-template seed set required by init/install flows, not just `ado_*.yaml`. - Define and test a consistent package layout for bundle resources so the core CLI can discover them from installed bundle locations. +- Add cross-repo verification requirements that prove `specfact init ide` can discover backlog prompt resources from an installed `nold-ai/specfact-backlog` module root after the bundle is published/installed. - Lock resource payloads into signing, verification, and publish/version-bump workflows so bundle updates are resource-aware. - Keep `specfact-cli` runtime discovery, source selection, and `specfact init ide` export orchestration out of scope here; that work is tracked in `specfact-cli` change `init-ide-prompt-source-selection` (`nold-ai/specfact-cli#382`). diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/specs/bundle-packaged-resources/spec.md b/openspec/changes/packaging-01-bundle-resource-payloads/specs/bundle-packaged-resources/spec.md index dadf4c9..318ef8b 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/specs/bundle-packaged-resources/spec.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/specs/bundle-packaged-resources/spec.md @@ -6,7 +6,12 @@ Each official bundle package SHALL include the prompt templates and other non-co #### Scenario: Official bundles ship the audited prompt inventory - **WHEN** the audited prompt inventory from `RESOURCE_OWNERSHIP_AUDIT.md` is inspected - **THEN** each prompt template's canonical packaged source exists under the owning official bundle package -- **AND** the ownership mapping covers at least the codebase, project, spec, and govern bundles for the currently exported core prompt set +- **AND** the ownership mapping covers the codebase, project, spec, govern, and backlog bundles for the currently supported prompt set + +#### Scenario: Backlog bundle ships the restored slash-prompt inventory +- **WHEN** the backlog bundle package is inspected from source or from an installed artifact +- **THEN** `resources/prompts/` contains `specfact.backlog-add.md`, `specfact.backlog-daily.md`, `specfact.backlog-refine.md`, and `specfact.sync-backlog.md` +- **AND** those prompt files are treated as canonical bundle-owned sources rather than historical leftovers #### Scenario: Prompt companion resources ship with prompt payloads - **WHEN** an exported prompt template references a companion file by relative path, such as `./shared/cli-enforcement.md` diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md b/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md index 0da017f..6a76ce2 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md @@ -18,6 +18,11 @@ Bundled resources SHALL live at stable paths inside the bundle package so that t - **WHEN** the core CLI inspects an installed official bundle package - **THEN** the bundle contains a stable prompt resource path that can be discovered without scanning the core CLI repository +#### Scenario: Installed backlog bundle contributes prompt source catalog entries +- **WHEN** `nold-ai/specfact-backlog` is installed under an effective module root with the packaged backlog prompt files +- **THEN** core prompt-source discovery includes `nold-ai/specfact-backlog` as a prompt source +- **AND** `specfact init ide` can export the backlog prompt filenames from that installed module root + #### Scenario: Core resolves prompt companion resources with exported prompts - **WHEN** the core CLI exports a prompt that depends on a companion file such as `shared/cli-enforcement.md` - **THEN** the companion resource is discoverable from the same installed bundle root diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/tasks.md b/openspec/changes/packaging-01-bundle-resource-payloads/tasks.md index ce24552..677a52c 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/tasks.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/tasks.md @@ -14,6 +14,9 @@ - [x] 2.4 Add failing tests for integrity/version-bump enforcement when bundled resources change. - [x] 2.5 Add failing tests or fixtures that exercise the stable resource paths expected by `specfact init ide` and related copy flows. - [x] 2.6 Record failing evidence in `TDD_EVIDENCE.md`. +- [x] 2.7 Add failing tests that assert `specfact-backlog` packages the backlog slash-prompt inventory at `resources/prompts/` with the expected filenames. +- [x] 2.8 Add failing artifact-content checks that confirm published `specfact-backlog-*.tar.gz` archives contain `resources/prompts/...` entries, not only field-mapping templates. +- [x] 2.9 Add or update a cross-repo verification slice that proves core prompt discovery includes `nold-ai/specfact-backlog` when an installed module root contains backlog prompt resources. ## 3. Bundle Resource Migration @@ -21,6 +24,10 @@ - [x] 3.2 Move prompt companion assets needed by migrated prompts into the stable bundle prompt layout. - [x] 3.3 Move backlog field mapping templates and any other audited bundle-owned resources into the owning bundle packages. - [x] 3.4 Update manifests, package data, and publish-time expectations so the resources are included in released bundle artifacts. +- [x] 3.5 Rebase the implementation worktree `feature/packaging-01-bundle-resource-payloads` onto `origin/dev` before editing payload files or tests. +- [x] 3.6 Restore the canonical backlog prompt sources into `packages/specfact-backlog/resources/prompts/` from the last valid backlog prompt content in `specfact-cli` history/change artifacts. +- [x] 3.7 If any restored backlog prompt uses relative companion assets, package those companions under the same backlog prompt root and verify the references remain valid after export. +- [x] 3.8 Bump `packages/specfact-backlog/module-package.yaml` version and refresh integrity metadata because prompt resources are part of the signed module payload. ## 4. Validation @@ -29,3 +36,6 @@ - [x] 4.3 Update docs or package guidance for bundle-owned resources and publish/version-bump expectations. - [x] 4.4 Confirm docs changes `docs-08` through `docs-12` absorb the user-facing documentation fallout from migrated resources so no extra docs change is required. - [x] 4.5 Run `openspec validate packaging-01-bundle-resource-payloads --strict`. +- [x] 4.6 Rebuild or inspect the published backlog artifact and verify it contains `resources/prompts/specfact.backlog-add.md`, `specfact.backlog-daily.md`, `specfact.backlog-refine.md`, and `specfact.sync-backlog.md`. +- [x] 4.7 Verify in `specfact-cli` that installed-module prompt discovery surfaces `nold-ai/specfact-backlog` from an installed module root and that `specfact init ide` can export the restored backlog prompts. +- [x] 4.8 Record both modules-repo and cross-repo verification evidence in `TDD_EVIDENCE.md`. diff --git a/packages/specfact-backlog/module-package.yaml b/packages/specfact-backlog/module-package.yaml index 3c7f86d..acc09f6 100644 --- a/packages/specfact-backlog/module-package.yaml +++ b/packages/specfact-backlog/module-package.yaml @@ -1,5 +1,5 @@ name: nold-ai/specfact-backlog -version: 0.41.14 +version: 0.41.15 commands: - backlog tier: official @@ -17,5 +17,5 @@ schema_extensions: project_metadata: - backlog_core.backlog_config integrity: - checksum: sha256:edda19b7862d2fc6f4510d148b71e7f74e5d3ff18cc4852018b0912592729c58 - signature: eQ86/44q9ZKUkkNIv/HzyZ7Oc3QXPyPZLpFtoMMTF5QjWWbE1RFntJs/8BWKHniV23iJnRUBlBnm4YIP30UQAQ== + checksum: sha256:b99db1457dabb2e8e7096cd46c88f7c47328c49f8ec92114df4c6f0110fa4f43 + signature: gKFlj/hC6Pr2oxBrXhMmkVmo2Y8RoPZalYtXxlTZ3IwQSCPFfji/qdMl0UntK+jwxqTS+62ZD5CSfzDWGRaMAA== diff --git a/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md b/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md new file mode 100644 index 0000000..b8aab9a --- /dev/null +++ b/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md @@ -0,0 +1,119 @@ +# CLI Usage Enforcement Rules + +## Core Principle + +**ALWAYS use SpecFact CLI commands. Never create artifacts directly.** + +## CLI vs LLM Capabilities + +### CLI-Only Operations (CI/CD Mode - No LLM Required) + +The CLI can perform these operations **without LLM**: + +- ✅ Tool execution (ruff, pylint, basedpyright, mypy, semgrep, specmatic) +- ✅ Bundle management (create, load, save, validate structure) +- ✅ Metadata management (timestamps, hashes, telemetry) +- ✅ Planning operations (init, add-feature, add-story, update-idea, update-feature) +- ✅ AST/Semgrep-based analysis (code structure, patterns, relationships) +- ✅ Specmatic validation (OpenAPI/AsyncAPI contract validation) +- ✅ Format validation (YAML/JSON schema compliance) +- ✅ Source tracking and drift detection + +**CRITICAL LIMITATIONS**: + +- ❌ **CANNOT generate code** - No LLM available in CLI-only mode +- ❌ **CANNOT do reasoning** - No semantic understanding without LLM + +### LLM-Required Operations (AI IDE Mode - Via Slash Prompts) + +These operations **require LLM** and are only available via AI IDE slash prompts: + +- ✅ Code generation (requires LLM reasoning) +- ✅ Code enhancement (contracts, refactoring, improvements) +- ✅ Semantic understanding (business logic, context, priorities) +- ✅ Plan enrichment (missing features, confidence adjustments, business context) +- ✅ Code reasoning (why decisions were made, trade-offs, constraints) + +**Access**: Only available via AI IDE slash prompts (Cursor, CoPilot, etc.) +**Pattern**: Slash prompt → LLM generates → CLI validates → Apply if valid + +## LLM Grounding Rules + +- Treat CLI artifacts as the source of truth for keys, structure, and metadata. +- Scan the codebase only when asked to infer missing behavior/context or explain deviations; respect `--entry-point` scope when provided. +- Use codebase findings to propose updates via CLI (enrichment report, plan update commands), never to rewrite artifacts directly. + +## Rules + +1. **Execute CLI First**: Always run CLI commands before any analysis +2. **Use CLI for Writes**: All write operations must go through CLI +3. **Read for Display Only**: Use file reading tools for display/analysis only +4. **Never Modify .specfact/**: Do not create/modify files in `.specfact/` directly +5. **Never Bypass Validation**: CLI ensures schema compliance and metadata +6. **Code Generation Requires LLM**: Code generation is only possible via AI IDE slash prompts, not CLI-only + +## Standard Validation Loop Pattern (For LLM-Generated Code) + +When generating or enhancing code via LLM, **ALWAYS** follow this pattern: + +```text +1. CLI Prompt Generation (Required) + ↓ + CLI generates structured prompt → saved to .specfact/prompts/ + (e.g., `generate contracts-prompt`, future: `generate code-prompt`) + +2. LLM Execution (Required - AI IDE Only) + ↓ + LLM reads prompt → generates enhanced code → writes to TEMPORARY file + (NEVER writes directly to original artifacts) + Pattern: `enhanced_.py` or `generated_.py` + +3. CLI Validation Loop (Required, up to N retries) + ↓ + CLI validates temp file with all relevant tools: + - Syntax validation (py_compile) + - File size check (must be >= original) + - AST structure comparison (preserve functions/classes) + - Contract imports verification + - Code quality checks (ruff, pylint, basedpyright, mypy) + - Test execution (contract-test, pytest) + ↓ + If validation fails: + - CLI provides detailed error feedback + - LLM fixes issues in temp file + - Re-validate (max 3 attempts) + ↓ + If validation succeeds: + - CLI applies changes to original file + - CLI removes temporary file + - CLI updates metadata/telemetry +``` + +**This pattern must be used for**: + +- ✅ Contract enhancement (`generate contracts-prompt` / `contracts-apply`) - Already implemented +- ⏳ Code generation (future: `generate code-prompt` / `code-apply`) - Needs implementation +- ⏳ Plan enrichment (future: `plan enrich-prompt` / `enrich-apply`) - Needs implementation +- ⏳ Any LLM-enhanced artifact modification - Needs implementation + +## What Happens If You Don't Follow + +- ❌ Artifacts may not match CLI schema versions +- ❌ Missing metadata and telemetry +- ❌ Format inconsistencies +- ❌ Validation failures +- ❌ Works only in Copilot mode, fails in CI/CD +- ❌ Code generation attempts in CLI-only mode will fail (no LLM available) + +## Available CLI Commands + +- `specfact plan init ` - Initialize project bundle +- `specfact plan select ` - Set active plan (used as default for other commands) +- `specfact code import [] --repo ` - Import from codebase (uses active plan if bundle not specified) +- `specfact plan review []` - Review plan (uses active plan if bundle not specified) +- `specfact plan harden []` - Create SDD manifest (uses active plan if bundle not specified) +- `specfact enforce sdd []` - Validate SDD (uses active plan if bundle not specified) +- `specfact sync bridge --adapter --repo ` - Sync with external tools +- See [Command Reference](../../docs/reference/commands.md) for full list + +**Note**: Most commands now support active plan fallback. If `--bundle` is not specified, commands automatically use the active plan set via `plan select`. This improves workflow efficiency in AI IDE environments. diff --git a/packages/specfact-backlog/resources/prompts/specfact.backlog-add.md b/packages/specfact-backlog/resources/prompts/specfact.backlog-add.md new file mode 100644 index 0000000..8442789 --- /dev/null +++ b/packages/specfact-backlog/resources/prompts/specfact.backlog-add.md @@ -0,0 +1,90 @@ +--- +description: "Create backlog items with guided interactive flow and hierarchy checks" +--- + +# SpecFact Backlog Add Command + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Purpose + +Create a new backlog item in GitHub or Azure DevOps using the `specfact backlog add` workflow. The command supports interactive prompts, parent hierarchy validation, DoR checks, and provider-specific fields. + +**When to use:** Adding new work items (epic/feature/story/task/bug) with consistent quality and parent-child structure. + +**Quick:** `/specfact.backlog-add --adapter github --project-id owner/repo --type story --title "..."` + +## Parameters + +### Required + +- `--adapter ADAPTER` - Backlog adapter (`github`, `ado`) +- `--project-id PROJECT` - Project context + - GitHub: `owner/repo` + - ADO: `org/project` + +### Common options + +- `--type TYPE` - Backlog item type (provider/template specific) +- `--title TITLE` - Item title +- `--body BODY` - Item body/description +- `--parent PARENT_ID` - Optional parent issue/work item id +- `--non-interactive` - Disable prompt flow and require explicit inputs +- `--check-dor` - Run Definition of Ready checks before create +- `--template TEMPLATE` - Optional backlog template override +- `--custom-config PATH` - Optional mapping/config override file + +### Adapter-specific options + +- GitHub: + - `--repo-owner OWNER` + - `--repo-name NAME` + - `--github-token TOKEN` (or `GITHUB_TOKEN`) +- Azure DevOps: + - `--ado-org ORG` + - `--ado-project PROJECT` + - `--ado-token TOKEN` (or `AZURE_DEVOPS_TOKEN`) + - `--ado-base-url URL` (optional) + +## Workflow + +### Step 1: Execute command + +Run the CLI command with user arguments: + +```bash +specfact backlog add [OPTIONS] +``` + +### Step 2: Interactive completion (if inputs are missing) + +- Prompt for missing required fields. +- Prompt for optional quality fields (acceptance criteria, points, priority) when supported. +- Validate parent selection and allowed hierarchy before create. + +### Step 3: Confirm and create + +- Show planned create payload summary. +- Execute provider create operation. +- Return created item id/key/url. + +## CLI Enforcement + +- Always execute `specfact backlog add` for creation. +- Do not create provider issues/work items directly outside CLI unless user explicitly requests a manual path. + +## Input Contract + +- This command does not use `--export-to-tmp`/`--import-from-tmp` artifacts. +- Provide values through CLI options or interactive prompts; do not fabricate external tmp-file schemas. +- Do not ask Copilot to output `## Item N:` sections, `**ID**` labels, or markdown tmp files for this command. + +## Context + +{ARGS} diff --git a/packages/specfact-backlog/resources/prompts/specfact.backlog-daily.md b/packages/specfact-backlog/resources/prompts/specfact.backlog-daily.md new file mode 100644 index 0000000..e467543 --- /dev/null +++ b/packages/specfact-backlog/resources/prompts/specfact.backlog-daily.md @@ -0,0 +1,125 @@ +--- +description: "Daily standup and sprint review with story-by-story walkthrough" +--- + +# SpecFact Daily Standup Command + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Purpose + +Run a daily standup view and optional interactive walkthrough of backlog items (GitHub Issues, Azure DevOps work items) with the DevOps team: list items in scope, review story-by-story, highlight current focus, surface issues or open questions, and allow adding discussion notes as annotation comments on the issue. + +**When to use:** Daily standup, sprint review, quick status sync with the team. + +**Quick:** `/specfact.daily` or `/specfact.backlog-daily` with optional adapter and filters. From a clone, org/repo or org/project are auto-detected from git remote. + +## Parameters + +### Required + +- `ADAPTER` - Backlog adapter name (github, ado, etc.) + +### Adapter Configuration (same as backlog-refine) + +**GitHub:** `--repo-owner`, `--repo-name`, `--github-token` (optional). +**Azure DevOps:** `--ado-org`, `--ado-project`, `--ado-team` (optional), `--ado-base-url`, `--ado-token` (optional). + +When run from a **clone**, org/repo or org/project are inferred from `git remote get-url origin`; no need to pass them unless overriding. + +### Filters + +- `--state STATE` - Filter by state (e.g. open, Active). Use `--state any` to disable state filtering. +- `--assignee USERNAME` or `--assignee me` - Filter by assignee. Use `--assignee any` to disable assignee filtering. +- `--search QUERY` - Provider-specific search query +- `--release RELEASE` - Filter by release identifier +- `--id ISSUE_ID` - Filter to one exact backlog item ID +- `--sprint SPRINT` / `--iteration PATH` - Filter by sprint/iteration (e.g. `current`) +- `--limit N` - Max items (default 20) +- `--first-issues N` / `--last-issues N` - Optional issue window (oldest/newest by numeric ID, mutually exclusive) +- `--blockers-first` - Sort items with blockers first +- `--show-unassigned` / `--unassigned-only` - Include or show only unassigned items + +### Daily-Specific Options + +- `--interactive` - Step-by-step review: select items with arrow keys, view full detail (refine-like) and **existing comments** on each issue +- `--copilot-export PATH` - Write summarized progress per story to a file for Copilot slash-command use +- `--summarize` - Output a prompt (instruction + filter context + standup data) to **stdout** for Copilot or slash command to generate a standup summary +- `--summarize-to PATH` - Write the same summarize prompt to a **file** +- `--comments` / `--annotations` - Include descriptions and comments in `--copilot-export` and summarize output +- `--first-comments N` / `--last-comments N` - Optional comment window for export/summarize outputs (`--comments`); default includes all comments +- `--suggest-next` - In interactive mode, show suggested next item by value score +- `--post` with `--yesterday`, `--today`, `--blockers` - Post a standup comment to the first item's issue (when adapter supports comments) +- Interactive navigation action `Post standup update` - Post yesterday/today/blockers to the currently selected story during `--interactive` walkthrough + +## Workflow + +### Step 1: Run Daily Standup + +Execute the CLI with adapter and optional filters: + +```bash +specfact backlog daily $ADAPTER [--state open] [--sprint current] [--assignee me] [--limit 20] +``` + +Or use the slash command with arguments: `/specfact.backlog-daily --adapter ado --sprint current` + +**What you see:** A standup table (assigned items) and a "Pending / open for commitment" table (unassigned items in scope). Each row shows ID, title, status, last updated, and optional yesterday/today/blockers from the item body. + +### Step 2: Interactive Story-by-Story Review (with DevOps team) + +When the user runs **`--interactive`** (or the slash command drives an interactive flow): + +1. **For each story** (one at a time): + - **Present** the item: ID, title, status, assignees, last updated, description, acceptance criteria, standup fields (yesterday/today/blockers), and the **latest existing comment** (when the adapter supports fetching comments). + - **Interactive comment scope**: If older comments exist, explicitly mention the count of hidden comments and guide users to export options for full context. + - **Highlight current focus**: What is the team member working on? What is the next intended step? + - **Surface issues or open questions**: Blockers, ambiguities, dependencies, or decisions needed. + - **Allow discussion notes**: If the team agrees, suggest or add a **comment** on the issue (e.g. "Standup YYYY-MM-DD: …" or "Discussion: …") so the discussion is captured as an annotation. Only add comments when the user explicitly approves (e.g. "add that as a comment"). + - If in CLI interactive navigation, use **Post standup update** to write the note to the selected story directly. + - **Move to next** only when the team is done with this story (e.g. "next", "done"). + +2. **Rules**: + - Do not update the backlog item body or title unless the user asks for a refinement (use `specfact backlog refine` for that). + - Comments are for **discussion notes** and standup updates; keep them short and actionable. + - If the adapter does not support comments, report that clearly and skip adding comments. + +3. **Navigation**: After each story, offer "Next story", "Previous story", "Back to list", "Exit" (or equivalent) so the team can move through the list without re-running the command. + +### Step 3: Generate Standup Summary (optional) + +When the user has run `specfact backlog daily ... --summarize` or `--summarize-to PATH`, the output is a **prompt** containing: + +- A short instruction: generate a concise daily standup summary from the following data. +- Filter context (adapter, state, sprint, assignee, limit). +- Per-item data (same as `--copilot-export`: ID, title, status, assignees, last updated, progress, blockers). + +**Use this output** by pasting it into Copilot or invoking the slash command `specfact.daily` with this context, so the AI can produce a short narrative summary (e.g. "Today's standup: 3 in progress, 1 blocked, 2 pending commitment …"). + +## Comments on Issues + +- **Interactive detail view** shows only the **latest comment** plus a hint when additional comments exist, to keep standup readable. +- **Full comment context**: use `--copilot-export --comments` or `--summarize --comments` (optional `--first-comments N` / `--last-comments N`) to include full or scoped comment history. +- **Adding comments**: When the team agrees to record a discussion note or standup update, add it as a comment on the issue (via `--post` for first-item standup lines or interactive **Post standup update** for selected stories). Do not invent comments; only suggest or add when the user approves. + +## CLI Enforcement + +- Execute `specfact backlog daily` (or equivalent) first; use its output as context. +- Use `--interactive` for story-by-story walkthrough; use `--summarize` or `--summarize-to` when a standup summary prompt is needed. +- Use `--copilot-export` when you need a file of item summaries for reference during standup. + +## Output Contract + +- This command does not support `--import-from-tmp`; do not invent a tmp import schema. +- Do not instruct Copilot to produce `## Item N:` blocks or `**ID**`/`**Body**` tmp artifacts for this command. +- If you write `--copilot-export` or `--summarize-to` artifacts, keep item sections and IDs unchanged from CLI output. + +## Context + +{ARGS} diff --git a/packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md b/packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md new file mode 100644 index 0000000..2d6f83f --- /dev/null +++ b/packages/specfact-backlog/resources/prompts/specfact.backlog-refine.md @@ -0,0 +1,557 @@ +--- +description: "Refine backlog items using template-driven AI assistance" +--- + +# SpecFact Backlog Refinement Command + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Purpose + +Refine backlog items from DevOps tools (GitHub Issues, Azure DevOps, etc.) into structured, template-compliant work items using AI-assisted refinement with template detection and validation. + +**When to use:** Standardizing backlog items, enforcing corporate templates (user stories, defects, spikes, enablers), preparing items for sprint planning. + +**Quick:** `/specfact.backlog-refine --adapter github --labels feature,enhancement` or `/specfact.backlog-refine --adapter ado --sprint "Sprint 1"` + +## Parameters + +### Required + +- `ADAPTER` - Backlog adapter name (github, ado, etc.) + +### Adapter Configuration (Required for GitHub/ADO) + +**GitHub Adapter:** + +- `--repo-owner OWNER` - GitHub repository owner (required for GitHub adapter) +- `--repo-name NAME` - GitHub repository name (required for GitHub adapter) +- `--github-token TOKEN` - GitHub API token (optional, uses GITHUB_TOKEN env var or gh CLI if not provided) + +**Azure DevOps Adapter:** + +- `--ado-org ORG` - Azure DevOps organization or collection name (required for ADO adapter, except when collection is in base_url) +- `--ado-project PROJECT` - Azure DevOps project (required for ADO adapter) +- `--ado-team TEAM` - Azure DevOps team name (optional, defaults to project name for iteration lookup) +- `--ado-base-url URL` - Azure DevOps base URL (optional, defaults to `https://dev.azure.com` for cloud) + - **Cloud**: `https://dev.azure.com` (default) + - **On-premise**: `https://server` or `https://server/tfs/collection` (if collection included) +- `--ado-token TOKEN` - Azure DevOps PAT (optional, uses AZURE_DEVOPS_TOKEN env var or stored token if not provided) + +**ADO Configuration Notes:** + +- **Cloud (Azure DevOps Services)**: Always requires `--ado-org` and `--ado-project`. Base URL defaults to `https://dev.azure.com`. +- **On-premise (Azure DevOps Server)**: + - If base URL includes collection (e.g., `https://server/tfs/DefaultCollection`), `--ado-org` is optional. + - If base URL doesn't include collection, provide collection name via `--ado-org`. +- **API Endpoints**: + - WIQL queries use POST to `{base_url}/{org}/{project}/_apis/wit/wiql?api-version=7.1` (project-level) + - Work items batch GET uses `{base_url}/{org}/_apis/wit/workitems?ids={ids}&api-version=7.1` (organization-level) + - The `api-version` parameter is **required** for all ADO API calls + +### Filters + +- `--labels LABELS` or `--tags TAGS` - Filter by labels/tags (comma-separated, e.g., "feature,enhancement") +- `--state STATE` - Filter by state (case-insensitive, e.g., "open", "closed", "Active", "New"). Use `--state any` to disable state filtering. +- `--assignee USERNAME` - Filter by assignee (case-insensitive): + - **GitHub**: Login or @username (e.g., "johndoe" or "@johndoe") + - **ADO**: displayName, uniqueName, or mail (e.g., "Jane Doe" or `"jane.doe@example.com"`) + - Use `--assignee any` to disable assignee filtering. +- `--iteration PATH` - Filter by iteration path (ADO format: "Project\\Sprint 1", case-insensitive) +- `--sprint SPRINT` - Filter by sprint (case-insensitive): + - **ADO**: Use full iteration path (e.g., "Project\\Sprint 1") to avoid ambiguity when multiple sprints share the same name + - If omitted, defaults to current active iteration for the team + - Ambiguous name-only matches will prompt for explicit iteration path +- `--release RELEASE` - Filter by release identifier (case-insensitive) +- `--limit N` - Maximum number of items to process in this refinement session (caps batch size) +- `--first-issues N` / `--last-issues N` - Process only the first or last N items after filters/refinement checks (mutually exclusive; sorted by numeric issue/work-item ID, lower=older, higher=newer) +- `--ignore-refined` / `--no-ignore-refined` - When set (default), exclude already-refined items so `--limit` applies to items that need refinement. Use `--no-ignore-refined` to process the first N items in order. +- `--id ISSUE_ID` - Refine only this backlog item (issue or work item ID). Other items are ignored. +- `--persona PERSONA` - Filter templates by persona (product-owner, architect, developer) +- `--framework FRAMEWORK` - Filter templates by framework (agile, scrum, safe, kanban) + +### Template Selection + +- `--template TEMPLATE_ID` or `-t TEMPLATE_ID` - Target template ID (default: auto-detect) +- `--auto-accept-high-confidence` - Auto-accept refinements with confidence >= 0.85 + +### Preview and Writeback + +- `--preview` / `--no-preview` - Preview mode: show what will be written without updating backlog (default: --preview) + - **Preview mode shows**: Full item details (title, body, metrics, acceptance_criteria, work_item_type, etc.) + - **Preview mode skips**: Interactive refinement prompts (use `--write` to enable interactive refinement) +- `--write` - Write mode: explicitly opt-in to update remote backlog (requires --write flag) + +### Export/Import for Copilot Processing + +- `--export-to-tmp` - Export backlog items to temporary file for copilot processing (default: `/tmp/specfact-backlog-refine-.md`) +- `--import-from-tmp` - Import refined content from temporary file after copilot processing (default: `/tmp/specfact-backlog-refine--refined.md`) +- `--tmp-file PATH` - Custom temporary file path (overrides default) +- `--first-comments N` / `--last-comments N` - Optional comment window for preview and write-mode prompt context (default preview shows last 2; write prompts include full comments by default) + +**Export/Import Workflow**: + +1. Export items: `specfact backlog refine --adapter github --export-to-tmp --repo-owner OWNER --repo-name NAME` +2. Process with copilot: Open exported file and follow the embedded `## Copilot Instructions` and per-item template guidance (`Target Template`, `Required Sections`, `Optional Sections`). Save as `-refined.md` +3. Import refined: `specfact backlog refine --adapter github --import-from-tmp --repo-owner OWNER --repo-name NAME --write` + +When refining from an exported file, treat the embedded instructions in that file as the source of truth for required structure and formatting. + +**Critical content-preservation rule**: +- Never summarize, shorten, or silently remove details from story content. +- Preserve all existing requirements, constraints, business value, and feature intent. +- Refinement must increase clarity/structure, not reduce scope/detail. + +**Exact tmp structure contract (`--import-from-tmp`)**: + +- Keep one section per item with this exact heading pattern: `## Item N: `. +- The first non-empty line of each item block MUST be the `## Item N: ...` heading. +- Keep and preserve these metadata labels exactly (order may vary; labels must match): + - `**ID**: <original exported id>` (**mandatory and unchanged**) + - `**URL**: <url>` + - `**State**: <state>` + - `**Provider**: <provider>` +- Keep body in this exact form (fence language must be `markdown`): + - `**Body**:` + - ```` ```markdown ... ``` ```` +- Optional parsed fields (if present) must use exact labels: + - `**Acceptance Criteria**:` + - `**Metrics**:` with lines containing `Story Points:`, `Business Value:`, `Priority:` +- Do not prepend explanatory text, summaries, or headers before the first `## Item N:` block. +- Do not rename labels (`**ID**`, `**Body**`, `**Acceptance Criteria**`, `**Metrics**`). + +Exact item example: + +````markdown +## Item 1: Improve backlog refine import mapping + +**ID**: 123 +**URL**: https://dev.azure.com/org/project/_workitems/edit/123 +**State**: Active +**Provider**: ado + +**Metrics**: +- Story Points: 5 +- Business Value: 8 +- Priority: 2 + +**Acceptance Criteria**: +- [ ] Mapping uses configured story points field + +**Body**: +```markdown +## Description + +Refined body content. +``` +```` + +If `**ID**` is missing or changed, import cannot map refined content to backlog items and writeback will fail. + +**Provider-specific body contract (critical)**: + +- **GitHub**: + - Keep template narrative sections in `**Body**` markdown (for example `## As a`, `## I want`, `## So that`, `## Acceptance Criteria` when required by template). + - Metrics may be in `**Metrics**` and/or body sections if your template expects body headings. +- **ADO**: + - Keep narrative/template sections in `**Body**` markdown. + - Keep structured metadata in `**Metrics**` (`Story Points`, `Business Value`, `Priority`). + - Do **not** add metadata-only headings (`## Story Points`, `## Business Value`, `## Priority`, `## Work Item Type`, `## Area Path`, `## Iteration Path`) inside body text. + - Do **not** duplicate `## Description` heading text into the narrative content. + +**Template-driven refinement method (mandatory)**: + +- Use exported `**Target Template**`, `**Required Sections**`, and `**Optional Sections**` as the authoritative contract for each item. +- Preserve all functional and non-functional requirements; never silently drop details. +- Improve clarity, specificity, and testability (SMART-style) without scope reduction. +- If one story is too large, propose split candidates in `## Notes`; do not remove detail from the original item silently. + +**What to include / exclude boundaries**: + +- Include: + - All original business intent, user value, constraints, assumptions, dependencies, and acceptance signals. + - Explicit acceptance criteria and measurable outcomes. +- Exclude: + - Generic summaries that replace detailed requirements. + - Placeholder text (`unspecified`, `TBD`, `no info`) when original detail exists. + - Extra wrapper prose outside `## Item N:` blocks. + +One-shot GitHub scaffold example: + +````markdown +## Item 1: Improve authentication flow + +**ID**: 42 +**URL**: https://github.com/org/repo/issues/42 +**State**: open +**Provider**: github + +**Metrics**: +- Story Points: 8 +- Business Value: 13 +- Priority: 2 + +**Acceptance Criteria**: +- [ ] Token refresh handles expiry and retry behavior + +**Body**: +```markdown +## As a +platform user + +## I want +reliable authentication and token refresh behavior + +## So that +I can access protected resources without disruption + +## Acceptance Criteria +- [ ] Valid refresh token rotates and issues new access token +- [ ] Expired/invalid token returns clear error and audit event +``` +```` + +One-shot ADO scaffold example: + +````markdown +## Item 2: Harden login reliability + +**ID**: 108 +**URL**: https://dev.azure.com/org/project/_workitems/edit/108 +**State**: Active +**Provider**: ado + +**Metrics**: +- Story Points: 5 +- Business Value: 8 +- Priority: 2 + +**Acceptance Criteria**: +- [ ] All required acceptance checks are explicit and testable + +**Body**: +```markdown +## As a +registered user + +## I want +the login flow to handle token expiry and retries safely + +## So that +I can complete authentication without ambiguity or data loss + +## Acceptance Criteria +- [ ] Expired access token triggers refresh workflow +- [ ] Failed refresh prompts re-authentication with clear guidance +``` +```` + +**Comment context in export**: + +- Export includes item comments when adapter supports comment retrieval (GitHub + ADO). +- Export always includes full comment history (no truncation). +- Use `--first-comments N` or `--last-comments N` only to adjust preview output density. +- For refined import readiness, the `-refined.md` artifact should omit the instruction header and keep only item sections. + +### Definition of Ready (DoR) + +- `--check-dor` - Check Definition of Ready (DoR) rules before refinement (loads from `.specfact/dor.yaml`) + +### OpenSpec Integration + +- `--bundle BUNDLE` or `-b BUNDLE` - OpenSpec bundle path to import refined items +- `--auto-bundle` - Auto-import refined items to OpenSpec bundle +- `--openspec-comment` - Add OpenSpec change proposal reference as comment (preserves original body) + +### Generic Search + +- `--search QUERY` or `-s QUERY` - Search query using provider-specific syntax (e.g., GitHub: "is:open label:feature") + +## Workflow + +### Step 1: Execute CLI Command + +Execute the SpecFact CLI command with user-provided arguments: + +```bash +specfact backlog refine $ADAPTER \ + [--labels LABELS] [--state STATE] [--assignee USERNAME] \ + [--iteration PATH] [--sprint SPRINT] [--release RELEASE] \ + [--limit N] \ + [--persona PERSONA] [--framework FRAMEWORK] \ + [--template TEMPLATE_ID] [--auto-accept-high-confidence] \ + [--preview] [--write] \ + [--bundle BUNDLE] [--auto-bundle] \ + [--search QUERY] +``` + +**Capture CLI output**: + +- List of backlog items found +- Template detection results for each item +- Refinement prompts for IDE AI copilot +- Validation results +- Preview of what will be written (if --preview) +- Writeback confirmation (if --write) + +### Step 2: Process Refinement Prompts (If Items Need Refinement) + +**When CLI generates refinement prompts**: + +1. **For each item needing refinement**: + - CLI displays a refinement prompt + - Copy the prompt and execute it in your IDE AI copilot + - Get refined content from AI copilot response + - Paste refined content back to CLI when prompted + +2. **CLI validation**: + - CLI validates refined content against template requirements + - CLI provides confidence score + - CLI shows preview of changes (original vs refined) + +3. **User confirmation**: + - Review preview (fields that will be updated vs preserved) + - Accept or reject refinement + - If accepted and --write flag set, CLI updates remote backlog + +4. **Session control**: + - Use `:skip` to skip the current item without updating + - Use `:quit` or `:abort` to cancel the entire session gracefully + - Session cancellation shows summary and exits without error + +### Interactive refinement (Copilot mode) + +When refining backlog items in Copilot mode (e.g. after export to tmp or during a refinement session), follow this **per-story loop** so the PO and stakeholders can review and approve before any update: + +1. **For each story** (one at a time): + - **Present** the refined story in a clear, readable format: + - Use headings for Title, Body, Acceptance Criteria, Metrics. + - Use tables or panels for structured data so it is easy to scan. + - **Assess specification level** so the DevOps team knows if the story is ready, under-specified, or over-specified: + - **Under-specified**: Missing acceptance criteria, vague scope, unclear "so that" or user value. List evidence (e.g. "No AC", "Scope could mean X or Y"). Suggest what to add. + - **Over-specified**: Too much implementation detail, too many sub-steps for one story, or solution prescribed instead of outcome. List evidence and suggest what to trim or split. + - **Fit for scope and intent**: Clear persona, capability, benefit, and testable AC; appropriate size. State briefly why it is ready (and, if DoR is in use, that DoR is satisfied). + - **List ambiguities** or open questions (e.g. unclear scope, missing acceptance criteria, conflicting assumptions). + - **Ask** the PO and other stakeholders for clarification: "Please review the refined story above. Do you want any changes? Any ambiguities to resolve? Should this story be split?" + - **If the user provides feedback**: Re-refine the story incorporating the feedback, then repeat from "Present" for this story. + - **Only when the user explicitly approves** (e.g. "looks good", "approved", "no changes"): Mark this story as done and move to the **next** story. + - **Do not update** the backlog item (or write to the refined file as final) until the user has approved this story. + +2. **Formatting**: + - Use clear headings, bullet lists, and optional tables/panels so refinement sessions are easy to follow and enjoyable. + - Keep each story’s block self-contained so stakeholders can focus on one item at a time. + +3. **Rule**: The backlog item (or exported block) must only be updated/finalized **after** the user has approved the refined content for that story. Then proceed to the next story with the same process. + +### Step 3: Present Results + +Display refinement results: + +- Number of items refined +- Number of items skipped +- Template matches found +- Confidence scores +- Preview status (if --preview) +- Writeback status (if --write) + +## CLI Enforcement + +**CRITICAL**: Always use SpecFact CLI commands. See [CLI Enforcement Rules](./shared/cli-enforcement.md) for details. + +**Rules**: + +- Execute CLI first - never modify backlog items directly +- Use refinement prompts generated by CLI +- Validate refined content through CLI +- Use --preview flag by default for safety +- Use --write flag only when ready to update backlog + +## Field Preservation Policy + +**Fields that will be UPDATED**: + +- `title`: Updated if changed during refinement +- `body_markdown`: Updated with refined content +- `acceptance_criteria`: Updated if extracted/refined (provider-specific mapping) +- `story_points`: Updated if extracted/refined (provider-specific mapping) +- `business_value`: Updated if extracted/refined (provider-specific mapping) +- `priority`: Updated if extracted/refined (provider-specific mapping) +- `value_points`: Updated if calculated (SAFe: business_value / story_points) +- `work_item_type`: Updated if extracted/refined (provider-specific mapping) + +**Fields that will be PRESERVED** (not modified): + +- `assignees`: Preserved +- `tags`: Preserved +- `state`: Preserved (original state maintained) +- `sprint`: Preserved (if present) +- `release`: Preserved (if present) +- `iteration`: Preserved (if present) +- `area`: Preserved (if present) +- `source_state`: Preserved for cross-adapter state mapping (stored in bundle entries) +- All other metadata: Preserved in provider_fields + +**Provider-Specific Field Mapping**: + +- **GitHub**: Fields are extracted from markdown body (headings, labels, etc.) and mapped to canonical fields +- **ADO**: Fields are extracted from separate ADO fields (System.Description, System.AcceptanceCriteria, Microsoft.VSTS.Common.StoryPoints, etc.) and mapped to canonical fields +- **Custom Mapping**: ADO supports custom field mapping via `.specfact/templates/backlog/field_mappings/ado_custom.yaml` or `SPECFACT_ADO_CUSTOM_MAPPING` environment variable + +**Cross-Adapter State Preservation**: + +- When items are imported into bundles, the original `source_state` (e.g., "open", "closed", "New", "Active") is stored in `source_metadata["source_state"]` +- During cross-adapter export (e.g., GitHub → ADO), the `source_state` is used to determine the correct target state +- Generic state mapping ensures state is correctly translated between any adapter pair using OpenSpec as intermediate format +- This ensures closed GitHub issues sync to ADO as "Closed", and open GitHub issues sync to ADO as "New" + +**OpenSpec Comment Integration**: + +- When `--openspec-comment` is used, a structured comment is added to the backlog item +- The comment includes: Change ID, template used, confidence score, refinement timestamp +- Original body is preserved; comment provides OpenSpec reference for cross-sync + +**Cross-Adapter State Mapping**: + +- When refining items that will be synced across adapters (e.g., GitHub ↔ ADO), state is preserved using generic mapping +- Generic state mapping uses OpenSpec as intermediate format: + - Source adapter state → OpenSpec status → Target adapter state + - Example: GitHub "open" → OpenSpec "proposed" → ADO "New" + - Example: GitHub "closed" → OpenSpec "applied" → ADO "Closed" +- State preservation: Original `source_state` is stored in bundle entries and used during cross-adapter export +- Bidirectional mapping: Works in both directions (GitHub → ADO and ADO → GitHub) +- State mapping is automatic during `sync bridge` operations when `source_state` and `source_type` are present + +## Architecture Note + +SpecFact CLI follows a CLI-first architecture: + +- SpecFact CLI generates prompts/instructions for IDE AI copilots +- IDE AI copilots execute those instructions using their native LLM +- IDE AI copilots feed results back to SpecFact CLI +- SpecFact CLI validates and processes the results +- SpecFact CLI does NOT directly invoke LLM APIs + +## Expected Output + +### Success (Preview Mode) + +```text +✓ Refinement completed (Preview Mode) + +Found 5 backlog items +Limited to 3 items (found 5 total) +Refined: 3 +Skipped: 0 + +Preview mode: Refinement will NOT be written to backlog +Use --write flag to explicitly opt-in to writeback +``` + +### Success (Cancelled Session) + +```text +Session cancelled by user + +Found 5 backlog items +Refined: 1 +Skipped: 1 +``` + +### Success (Write Mode) + +```text +✓ Refinement completed and written to backlog + +Found 5 backlog items +Refined: 3 +Skipped: 2 + +Items updated in remote backlog: + - #123: User Story Template Applied + - #124: Defect Template Applied + - #125: Spike Template Applied +``` + +## Common Patterns + +```bash +# Refine GitHub issues with feature label (requires repo-owner and repo-name) +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --labels feature + +# Refine ADO work items (Azure DevOps Services - cloud) with full iteration path +/specfact.backlog-refine --adapter ado --ado-org my-org --ado-project my-project --sprint "MyProject\\Sprint 1" + +# Refine ADO work items using current active iteration (sprint omitted) +/specfact.backlog-refine --adapter ado --ado-org my-org --ado-project my-project --ado-team "My Team" --state Active + +# Refine ADO work items (Azure DevOps Server - on-premise, collection in base_url) +/specfact.backlog-refine --adapter ado --ado-base-url "https://devops.company.com/tfs/DefaultCollection" --ado-project my-project --state Active + +# Refine ADO work items (Azure DevOps Server - on-premise, collection provided) +/specfact.backlog-refine --adapter ado --ado-base-url "https://devops.company.com" --ado-org "DefaultCollection" --ado-project my-project --state Active + +# Refine with batch limit (process max 10 items) +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --limit 10 --labels feature + +# Refine with case-insensitive filters +/specfact.backlog-refine --adapter ado --ado-org my-org --ado-project my-project --state "new" --assignee "jane doe" + +# Refine with Scrum framework and Product Owner persona +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --framework scrum --persona product-owner + +# Preview refinement without writing +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --preview + +# Write refinement to backlog with OpenSpec comment (explicit opt-in) +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --write --openspec-comment + +# Check Definition of Ready before refinement +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --check-dor --labels feature + +# Refine and import to OpenSpec bundle +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --bundle my-project --auto-bundle --state open + +# Cross-adapter sync workflow: Refine GitHub → Sync to ADO (with state preservation) +/specfact.backlog-refine --adapter github --repo-owner nold-ai --repo-name specfact-cli --write --labels feature +# Then sync to ADO (state will be automatically mapped: open → New, closed → Closed) +# specfact sync bridge --adapter ado --ado-org my-org --ado-project my-project --mode bidirectional + +# Cross-adapter sync workflow: Refine ADO → Sync to GitHub (with state preservation) +/specfact.backlog-refine --adapter ado --ado-org my-org --ado-project my-project --write --state Active +# Then sync to GitHub (state will be automatically mapped: New → open, Closed → closed) +# specfact sync bridge --adapter github --repo-owner my-org --repo-name my-repo --mode bidirectional +``` + +## Troubleshooting + +### ADO API Errors + +**Error: "No HTTP resource was found that matches the request URI"** + +- **Cause**: Missing `api-version` parameter or incorrect URL format +- **Solution**: Ensure `api-version=7.1` is included in all ADO API URLs. Check base URL format for on-premise installations. + +**Error: "The requested resource does not support http method 'GET'"** + +- **Cause**: Attempting to use GET on WIQL endpoint (which requires POST) +- **Solution**: WIQL queries must use POST method with JSON body containing the query. This is handled automatically by SpecFact CLI. + +**Error: Organization removed from request string** + +- **Cause**: Incorrect base URL format (may already include organization/collection) +- **Solution**: For on-premise, check if base URL already includes collection. If yes, omit `--ado-org` or adjust base URL accordingly. + +**Error: "Azure DevOps API token required"** + +- **Cause**: Missing authentication token +- **Solution**: Provide token via `--ado-token`, `AZURE_DEVOPS_TOKEN` environment variable, or use `specfact auth azure-devops` for device code flow. + +## Context + +{ARGS} diff --git a/packages/specfact-backlog/resources/prompts/specfact.sync-backlog.md b/packages/specfact-backlog/resources/prompts/specfact.sync-backlog.md new file mode 100644 index 0000000..83dc155 --- /dev/null +++ b/packages/specfact-backlog/resources/prompts/specfact.sync-backlog.md @@ -0,0 +1,557 @@ +# SpecFact Sync Backlog Command + +## User Input + +```text +$ARGUMENTS +``` + +You **MUST** consider the user input before proceeding (if not empty). + +## Purpose + +Sync OpenSpec change proposals to DevOps backlog tools (GitHub Issues, ADO, Linear, Jira) with AI-assisted content sanitization. Supports export-only sync from OpenSpec change proposals to DevOps issues. + +**When to use:** Creating backlog issues from OpenSpec change proposals, syncing change status to DevOps tools, managing public vs internal issue content. + +**Quick:** `/specfact.sync-backlog --adapter github` or `/specfact.sync-backlog --sanitize --target-repo owner/repo` + +## Parameters + +### Target/Input + +- `--repo PATH` - Path to OpenSpec repository containing change proposals. Default: current directory (.) +- `--code-repo PATH` - Path to source code repository for code change detection (default: same as `--repo`). **Required when OpenSpec repository differs from source code repository.** For example, if OpenSpec proposals are in `specfact-cli-internal` but source code is in `specfact-cli`, use `--repo /path/to/specfact-cli-internal --code-repo /path/to/specfact-cli`. +- `--target-repo OWNER/REPO` - Target repository for issue creation (format: owner/repo). Default: same as code repository + +### Behavior/Options + +- `--sanitize/--no-sanitize` - Sanitize proposal content for public issues (default: auto-detect based on repo setup) + - Auto-detection: If code repo != planning repo → sanitize, if same repo → no sanitization + - `--sanitize`: Force sanitization (removes competitive analysis, internal strategy, implementation details) + - `--no-sanitize`: Skip sanitization (use full proposal content) + - **Proposal Filtering**: The sanitization flag also controls which proposals are synced: + - **Public repos** (`--sanitize`): Only syncs proposals with status `"applied"` (archived/completed changes) + - **Internal repos** (`--no-sanitize`): Syncs all active proposals (`"proposed"`, `"in-progress"`, `"applied"`, `"deprecated"`, `"discarded"`) + - Filtering prevents premature exposure of work-in-progress proposals to public repositories +- `--interactive` - Interactive mode for AI-assisted sanitization (requires slash command) + - Enables interactive change selection + - Enables per-change sanitization selection + - Enables LLM review workflow for sanitized proposals +- `--change-ids IDS` - Comma-separated list of change proposal IDs to export (default: all active proposals) + - Example: `--change-ids add-devops-backlog-tracking,add-change-tracking-datamodel` + - Only used in non-interactive mode (interactive mode prompts for selection) +- `--export-to-tmp` - Export proposal content to temporary file for LLM review (sanitization workflow) + - Creates `/tmp/specfact-proposal-<change-id>.md` for each proposal + - Used internally by slash command for sanitization review +- `--import-from-tmp` - Import sanitized content from temporary file (sanitization workflow) + - Reads `/tmp/specfact-proposal-<change-id>-sanitized.md` for each proposal + - Used internally by slash command after LLM review +- `--tmp-file PATH` - Specify temporary file path (used with --export-to-tmp or --import-from-tmp) + - Default: `/tmp/specfact-proposal-<change-id>.md` or `/tmp/specfact-proposal-<change-id>-sanitized.md` + +**Exact tmp structure contract (`sync bridge --import-from-tmp`)**: + +- Preserve proposal heading and section headers exactly: + - `# Change: <title>` + - `## Why` + - `## What Changes` +- Keep a blank line after each section header (`## Why` and `## What Changes`) before content. +- Do not rename, remove, or reorder these headers. +- Keep sanitized content inside `## Why` and `## What Changes` sections only. +- Do not add extra top-level sections before, between, or after these sections. +- If headers are missing or renamed, parser extraction for rationale/description will be incomplete. + +Exact sanitized tmp example: + +```markdown +# Change: Improve backlog refinement mapping + +## Why + +Short rationale text. + +## What Changes + +Sanitized proposal description text. +``` + +### Code Change Tracking (Advanced) + +- `--track-code-changes/--no-track-code-changes` - Detect code changes (git commits, file modifications) and add progress comments to existing issues (default: False) + - **Repository Selection**: Uses `--code-repo` if provided, otherwise uses `--repo` for code change detection + - **Git Commit Detection**: Searches git log for commits mentioning the change proposal ID (e.g., `add-code-change-tracking`) + - **File Change Tracking**: Extracts files modified in detected commits + - **Progress Comment Generation**: Formats comment with commit details and file changes + - **Duplicate Prevention**: Checks against existing comments to avoid duplicates + - **Source Tracking Update**: Updates `proposal.md` with progress metadata +- `--add-progress-comment/--no-add-progress-comment` - Add manual progress comment to existing issues without code change detection (default: False) +- `--update-existing/--no-update-existing` - Update existing issue bodies when proposal content changes (default: False for safety). Uses content hash to detect changes. + +### Advanced/Configuration + +- `--adapter TYPE` - DevOps adapter type (github, ado, linear, jira). Default: github + +**GitHub Adapter Options:** + +- `--repo-owner OWNER` - Repository owner (for GitHub adapter). Optional, can use bridge config +- `--repo-name NAME` - Repository name (for GitHub adapter). Optional, can use bridge config +- `--github-token TOKEN` - GitHub API token (optional, uses GITHUB_TOKEN env var or gh CLI if not provided) +- `--use-gh-cli/--no-gh-cli` - Use GitHub CLI (`gh auth token`) to get token automatically (default: True). Useful in enterprise environments where PAT creation is restricted + +**Azure DevOps Adapter Options:** + +- `--ado-org ORG` - Azure DevOps organization (required for ADO adapter) +- `--ado-project PROJECT` - Azure DevOps project (required for ADO adapter) +- `--ado-base-url URL` - Azure DevOps base URL (optional, defaults to <https://dev.azure.com>). Use for Azure DevOps Server (on-prem) +- `--ado-token TOKEN` - Azure DevOps PAT (optional, uses AZURE_DEVOPS_TOKEN env var if not provided). Requires Work Items (Read & Write) permissions +- `--ado-work-item-type TYPE` - Azure DevOps work item type (optional, derived from process template if not provided). Examples: 'User Story', 'Product Backlog Item', 'Bug' + +## Workflow + +### Step 1: Parse Arguments + +- Extract repository path (default: current directory) +- Extract adapter type (default: github) +- Extract sanitization preference (default: auto-detect) +- Extract target repository (default: same as code repo) + +### Step 2: Interactive Change Selection (Slash Command Only) + +**When using slash command** (`/specfact.sync-backlog`), provide interactive selection: + +1. **List available change proposals**: + - Read OpenSpec change proposals from `openspec/changes/` (including archived proposals) + - Display list with: change ID, title, status, existing issue (if any) + - Format: `[1] add-devops-backlog-tracking (applied) - Issue #17` + - Format: `[2] add-change-tracking-datamodel (proposed) - No issue` + - **Note**: When `--sanitize` is used, only proposals with status `"applied"` will be synced to public repos + +2. **User selection**: + - Prompt: "Select changes to export (comma-separated numbers, 'all', or 'none'):" + - Parse selection (e.g., "1,3" or "all") + - Validate selection against available proposals + +3. **Per-change sanitization selection**: + - For each selected change, prompt: "Sanitize '[change-title]'? (y/n/auto):" + - `y`: Force sanitization + - `n`: Skip sanitization + - `auto`: Use auto-detection (code repo != planning repo) + - Store selection: `{change_id: sanitize_choice}` + +**When using CLI directly** (non-interactive): + +- **Public repos** (`--sanitize`): Only exports proposals with status `"applied"` (archived/completed) +- **Internal repos** (`--no-sanitize`): Exports all active proposals regardless of status +- Use `--sanitize/--no-sanitize` flag to control filtering behavior +- No per-change selection + +### Step 3: Execute CLI (Initial Pass) + +**For non-sanitized proposals** (direct export): + +```bash +# GitHub adapter +specfact sync bridge --adapter github --mode export-only --repo <openspec-path> \ + --no-sanitize --change-ids <id1,id2> \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + [--target-repo <owner/repo>] [--repo-owner <owner>] [--repo-name <name>] \ + [--github-token <token>] [--use-gh-cli] + +# Azure DevOps adapter +specfact sync bridge --adapter ado --mode export-only --repo <openspec-path> \ + --no-sanitize --change-ids <id1,id2> \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + --ado-org <org> --ado-project <project> \ + [--ado-token <token>] [--ado-base-url <url>] [--ado-work-item-type <type>] +``` + +**For sanitized proposals** (requires LLM review): + +```bash +# Step 3a: Export to temporary file for LLM review (GitHub) +specfact sync bridge --adapter github --mode export-only --repo <openspec-path> \ + --sanitize --change-ids <id1,id2> \ + [--code-repo <source-code-path>] \ + --export-to-tmp --tmp-file /tmp/specfact-proposal-<change-id>.md \ + [--target-repo <owner/repo>] [--repo-owner <owner>] [--repo-name <name>] \ + [--github-token <token>] [--use-gh-cli] + +# Step 3a: Export to temporary file for LLM review (ADO) +specfact sync bridge --adapter ado --mode export-only --repo <openspec-path> \ + --sanitize --change-ids <id1,id2> \ + [--code-repo <source-code-path>] \ + --export-to-tmp --tmp-file /tmp/specfact-proposal-<change-id>.md \ + --ado-org <org> --ado-project <project> \ + [--ado-token <token>] [--ado-base-url <url>] +``` + +**Note**: When `--code-repo` is provided, code change detection uses that repository. Otherwise, code changes are detected in the OpenSpec repository (`--repo`). + +### Step 4: LLM Sanitization Review (Slash Command Only, For Sanitized Proposals) + +**Only execute if sanitization is required**: + +1. **Read temporary file**: + - Read `/tmp/specfact-proposal-<change-id>.md` for each sanitized proposal + - Display original content to user + +2. **LLM sanitization**: + - Review proposal content for: + - Competitive analysis sections (remove) + - Market positioning statements (remove) + - Implementation details (file paths, code structure - remove or generalize) + - Effort estimates and timelines (remove) + - Internal strategy sections (remove) + - Preserve: + - User-facing value propositions + - High-level feature descriptions + - Acceptance criteria (user-facing) + - External documentation links + +3. **Generate sanitized content**: + - Create sanitized version with removed sections/patterns + - Write to `/tmp/specfact-proposal-<change-id>-sanitized.md` + - Display diff (original vs sanitized) for user review + +4. **User approval**: + - Prompt: "Approve sanitized content? (y/n/edit):" + - `y`: Proceed to Step 5 + - `n`: Skip this proposal + - `edit`: Allow user to manually edit sanitized file, then proceed + +### Step 5: Execute CLI (Final Export) + +**For sanitized proposals** (after LLM review): + +```bash +# Step 5a: Import sanitized content from temporary file (GitHub) +specfact sync bridge --adapter github --mode export-only --repo <path> \ + --import-from-tmp --tmp-file /tmp/specfact-proposal-<change-id>-sanitized.md \ + --change-ids <id1,id2> \ + [--target-repo <owner/repo>] [--repo-owner <owner>] [--repo-name <name>] \ + [--github-token <token>] [--use-gh-cli] + +# Step 5a: Import sanitized content from temporary file (ADO) +specfact sync bridge --adapter ado --mode export-only --repo <path> \ + --import-from-tmp --tmp-file /tmp/specfact-proposal-<change-id>-sanitized.md \ + --change-ids <id1,id2> \ + --ado-org <org> --ado-project <project> \ + [--ado-token <token>] [--ado-base-url <url>] +``` + +**For non-sanitized proposals** (already exported in Step 3): + +- No additional CLI call needed + +### Step 6: Present Results + +- Display sync results (issues created/updated) +- Show issue URLs and numbers +- Indicate sanitization status (if applied) +- List which proposals were sanitized vs exported directly +- **Show code change tracking results** (if `--track-code-changes` was enabled): + - Number of commits detected + - Number of progress comments added + - Repository used for code change detection (`--code-repo` or `--repo`) +- **Show filtering warnings** (if proposals were filtered out due to status) + - Example: `⚠ Filtered out 2 proposal(s) with non-applied status (public repos only sync archived/completed proposals)` +- Present any warnings or errors + +## CLI Enforcement + +**CRITICAL**: Always use SpecFact CLI commands. See [CLI Enforcement Rules](./shared/cli-enforcement.md) for details. + +**Rules:** + +- Execute CLI first - never create artifacts directly +- Use `--no-interactive` flag in CI/CD environments +- Never modify `.specfact/` or `openspec/` directly +- Use CLI output as grounding for validation +- Code generation requires LLM (only via AI IDE slash prompts, not CLI-only) + +## Dual-Stack Workflow (Copilot Mode) + +When in copilot mode, follow this workflow: + +### Phase 1: Interactive Selection (Slash Command Only) + +**Purpose**: Allow user to select which changes to export and sanitization preferences + +**What to do**: + +1. **List available proposals**: + - Read `openspec/changes/` directory (including `archive/` subdirectory) + - Parse `proposal.md` files to extract: change_id, title, status + - Check for existing issues via `source_tracking` section + - Display numbered list to user + - **Note**: When `--sanitize` is used, only proposals with status `"applied"` will be available for public repos + +2. **User selection**: + - Prompt for change selection (comma-separated numbers, 'all', 'none') + - For each selected change, prompt for sanitization preference (y/n/auto) + - Store selections: `{change_id: {selected: bool, sanitize: bool|None}}` + +**Output**: Dictionary mapping change IDs to selection and sanitization preferences + +### Phase 2: CLI Export to Temporary Files (For Sanitized Proposals Only) + +**Purpose**: Export proposal content to temporary files for LLM review + +**When**: Only for proposals where `sanitize=True` + +**What to do**: + +```bash +# For each sanitized proposal, export to temp file (GitHub) +specfact sync bridge --adapter github --mode export-only --repo <openspec-path> \ + --change-ids <change-id> --export-to-tmp --tmp-file /tmp/specfact-proposal-<change-id>.md \ + [--code-repo <source-code-path>] \ + [--repo-owner <owner>] [--repo-name <name>] [--github-token <token>] [--use-gh-cli] + +# For each sanitized proposal, export to temp file (ADO) +specfact sync bridge --adapter ado --mode export-only --repo <openspec-path> \ + --change-ids <change-id> --export-to-tmp --tmp-file /tmp/specfact-proposal-<change-id>.md \ + [--code-repo <source-code-path>] \ + --ado-org <org> --ado-project <project> [--ado-token <token>] [--ado-base-url <url>] +``` + +**Capture**: + +- Temporary file paths for each proposal +- Original proposal content (for comparison) + +**What NOT to do**: + +- ❌ Create GitHub issues directly (wait for sanitization review) +- ❌ Skip LLM review for sanitized proposals + +### Phase 3: LLM Sanitization Review (For Sanitized Proposals Only) + +**Purpose**: Review and sanitize proposal content before creating public issues + +**When**: Only for proposals where `sanitize=True` + +**What to do**: + +1. **Read temporary file**: + - Read `/tmp/specfact-proposal-<change-id>.md` for each sanitized proposal + - Display original content to user + +2. **LLM sanitization**: + - Review proposal content section by section + - Remove: + - Competitive analysis sections (`## Competitive Analysis`) + - Market positioning statements (`## Market Positioning`) + - Implementation details (file paths like `src/specfact_cli/...`, code structure) + - Effort estimates and timelines + - Internal strategy sections + - Preserve: + - User-facing value propositions + - High-level feature descriptions (without file paths) + - Acceptance criteria (user-facing) + - External documentation links + +3. **Generate sanitized content**: + - Create sanitized version with removed sections/patterns + - Write to `/tmp/specfact-proposal-<change-id>-sanitized.md` + - Display diff (original vs sanitized) for user review + +4. **User approval**: + - Prompt: "Approve sanitized content for '[change-title]'? (y/n/edit):" + - `y`: Proceed to Phase 4 + - `n`: Skip this proposal (don't create issue) + - `edit`: Allow user to manually edit sanitized file, then proceed + +**Output**: Sanitized content files in `/tmp/specfact-proposal-<change-id>-sanitized.md` + +**What NOT to do**: + +- ❌ Create GitHub issues directly (use CLI in Phase 4) +- ❌ Modify original proposal files +- ❌ Skip user approval step + +### Phase 4: CLI Direct Export (For Non-Sanitized Proposals) + +**Purpose**: Export proposals that don't require sanitization + +**When**: For proposals where `sanitize=False` + +**What to do**: + +```bash +# Export non-sanitized proposals directly (GitHub) +specfact sync bridge --adapter github --mode export-only --repo <openspec-path> \ + --change-ids <id1,id2> --no-sanitize \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + [--repo-owner <owner>] [--repo-name <name>] [--github-token <token>] [--use-gh-cli] + +# Export non-sanitized proposals directly (ADO) +specfact sync bridge --adapter ado --mode export-only --repo <openspec-path> \ + --change-ids <id1,id2> --no-sanitize \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + --ado-org <org> --ado-project <project> [--ado-token <token>] [--ado-base-url <url>] +``` + +**Result**: Issues created directly without LLM review + +### Phase 5: CLI Import Sanitized Content (For Sanitized Proposals Only) + +**Purpose**: Create GitHub issues from LLM-reviewed sanitized content + +**When**: Only for proposals where `sanitize=True` and user approved + +**What to do**: + +```bash +# For each approved sanitized proposal, import from temp file and create issue (GitHub) +specfact sync bridge --adapter github --mode export-only --repo <openspec-path> \ + --change-ids <change-id> --import-from-tmp --tmp-file /tmp/specfact-proposal-<change-id>-sanitized.md \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + [--repo-owner <owner>] [--repo-name <name>] [--github-token <token>] [--use-gh-cli] + +# For each approved sanitized proposal, import from temp file and create work item (ADO) +specfact sync bridge --adapter ado --mode export-only --repo <openspec-path> \ + --change-ids <change-id> --import-from-tmp --tmp-file /tmp/specfact-proposal-<change-id>-sanitized.md \ + [--code-repo <source-code-path>] \ + [--track-code-changes] [--add-progress-comment] \ + --ado-org <org> --ado-project <project> [--ado-token <token>] [--ado-base-url <url>] +``` + +**Result**: Issues created with sanitized content + +**What NOT to do**: + +- ❌ Create GitHub issues directly via API (use CLI command) +- ❌ Skip CLI validation +- ❌ Modify `.specfact/` or `openspec/` folders directly + +### Phase 6: Cleanup and Results + +**Purpose**: Clean up temporary files and present results + +**What to do**: + +1. **Cleanup**: + - Remove temporary files: `/tmp/specfact-proposal-*.md` + - Remove sanitized files: `/tmp/specfact-proposal-*-sanitized.md` + +2. **Present results**: + - Display sync results (issues created/updated) + - Show issue URLs and numbers + - Indicate which proposals were sanitized vs exported directly + - **Show code change tracking results** (if `--track-code-changes` was enabled): + - Number of commits detected per proposal + - Number of progress comments added per issue + - Repository used for code change detection (`--code-repo` or `--repo`) + - Example: `✓ Detected 3 commits for 'add-feature-x', added 1 progress comment to issue #123` + - **Show filtering warnings** (if proposals were filtered out): + - Public repos: `⚠ Filtered out N proposal(s) with non-applied status (public repos only sync archived/completed proposals)` + - Internal repos: `⚠ Filtered out N proposal(s) without source tracking entry and inactive status` + - Present any warnings or errors + +**Note**: If code generation is needed, use the validation loop pattern (see [CLI Enforcement Rules](./shared/cli-enforcement.md#standard-validation-loop-pattern-for-llm-generated-code)) + +## Expected Output + +### Success + +```text +✓ Successfully synced 3 change proposals + +Adapter: github +Repository: nold-ai/specfact-cli-internal +Code Repository: nold-ai/specfact-cli (separate repo) + +Issues Created: + - #14: Add DevOps Backlog Tracking Integration + - #15: Add Change Tracking Data Model + - #16: Implement OpenSpec Bridge Adapter + +Sanitization: Applied (different repos detected) +Issue IDs saved to OpenSpec proposal files +``` + +### Success (With Code Change Tracking) + +```text +✓ Successfully synced 3 change proposals + +Adapter: github +Repository: nold-ai/specfact-cli-internal +Code Repository: nold-ai/specfact-cli (separate repo) + +Issues Created: + - #14: Add DevOps Backlog Tracking Integration + - #15: Add Change Tracking Data Model + - #16: Implement OpenSpec Bridge Adapter + +Code Change Tracking: + - Detected 5 commits for 'add-devops-backlog-tracking' + - Added 1 progress comment to issue #14 + - Detected 3 commits for 'add-change-tracking-datamodel' + - Added 1 progress comment to issue #15 + - No new commits detected for 'implement-openspec-bridge-adapter' + +Sanitization: Applied (different repos detected) +Issue IDs saved to OpenSpec proposal files +``` + +### Error (Missing Token) + +```text +✗ Sync failed: Missing GitHub API token +Provide token via --github-token, GITHUB_TOKEN env var, or --use-gh-cli +``` + +### Warning (Sanitization Applied) + +```text +⚠ Content sanitization applied (code repo != planning repo) +Competitive analysis and internal strategy sections removed +``` + +### Warning (Proposals Filtered - Public Repo) + +```text +✓ Successfully synced 1 change proposals +⚠ Filtered out 2 proposal(s) with non-applied status (public repos only sync archived/completed proposals, regardless of source tracking). Only 1 applied proposal(s) will be synced. +``` + +### Warning (Proposals Filtered - Internal Repo) + +```text +✓ Successfully synced 3 change proposals +⚠ Filtered out 1 proposal(s) without source tracking entry for target repo and inactive status. Only 3 proposal(s) will be synced. +``` + +## Common Patterns + +```bash +# Public repo: only syncs "applied" proposals (archived changes) +/specfact.sync-backlog --adapter github --sanitize --target-repo nold-ai/specfact-cli + +# Internal repo: syncs all active proposals (proposed, in-progress, applied, etc.) +/specfact.sync-backlog --adapter github --no-sanitize --target-repo nold-ai/specfact-cli-internal + +# Auto-detect sanitization (filters based on repo setup) +/specfact.sync-backlog --adapter github + +# Explicit repository configuration (GitHub) +/specfact.sync-backlog --adapter github --repo-owner nold-ai --repo-name specfact-cli-internal + +# Azure DevOps adapter (requires org and project) +/specfact.sync-backlog --adapter ado --ado-org my-org --ado-project my-project + +# Use GitHub CLI for token (enterprise-friendly) +/specfact.sync-backlog --adapter github --use-gh-cli +``` + +## Context + +{ARGS} diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index d8c9675..fa4a323 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -89,6 +89,36 @@ def _normalize_route(route: str) -> str: return cleaned +def _list_redirect_from_routes(text: str) -> list[str]: + """Return normalized redirect_from routes declared in YAML front matter only.""" + lines = text.splitlines() + if not lines or lines[0].strip() != "---": + return [] + + end_index = None + for index in range(1, len(lines)): + if lines[index].strip() == "---": + end_index = index + break + if end_index is None: + return [] + + routes: list[str] = [] + in_redirect_block = False + for line in lines[1:end_index]: + if line.strip() == "redirect_from:": + in_redirect_block = True + continue + if in_redirect_block: + stripped = line.strip() + if stripped.startswith("- "): + route = stripped[2:].strip().strip('"').strip("'") + routes.append(_normalize_route(route)) + elif stripped and not stripped.startswith("-"): + in_redirect_block = False + return routes + + def _published_route_for_path(path: Path, metadata: dict[str, str]) -> str: permalink = metadata.get("permalink") if permalink: @@ -447,21 +477,28 @@ def _extract_redirect_from_entries() -> dict[str, Path]: text = _read_text(path) if "redirect_from:" not in text: continue - in_redirect_block = False - for line in text.splitlines(): - if line.strip() == "redirect_from:": - in_redirect_block = True - continue - if in_redirect_block: - stripped = line.strip() - if stripped.startswith("- "): - route = stripped[2:].strip().strip('"').strip("'") - redirects[_normalize_route(route)] = path - elif stripped == "---" or (stripped and not stripped.startswith("-")): - in_redirect_block = False + for route in _list_redirect_from_routes(text): + redirects[route] = path return redirects +def test_list_redirect_from_routes_ignores_body_redirect_marker() -> None: + text = """--- +layout: default +title: Example +redirect_from: + - /legacy-path/ +--- + +Body content. + +redirect_from: + - /not-front-matter/ +""" + + assert _list_redirect_from_routes(text) == ["/legacy-path/"] + + def test_moved_files_have_redirect_from_entries() -> None: """Every file under bundles/, authoring/, integrations/ that was moved from guides/ should have a redirect_from entry pointing to its old location.""" diff --git a/tests/unit/test_bundle_resource_payloads.py b/tests/unit/test_bundle_resource_payloads.py index 02587cc..c313c33 100644 --- a/tests/unit/test_bundle_resource_payloads.py +++ b/tests/unit/test_bundle_resource_payloads.py @@ -3,6 +3,8 @@ from __future__ import annotations import hashlib +import shutil +import tarfile from pathlib import Path import pytest @@ -16,6 +18,12 @@ _EXPECTED_PROMPTS: dict[str, tuple[str, ...]] = { + "specfact-backlog": ( + "specfact.backlog-add.md", + "specfact.backlog-daily.md", + "specfact.backlog-refine.md", + "specfact.sync-backlog.md", + ), "specfact-codebase": ( "specfact.01-import.md", "specfact.validate.md", @@ -43,6 +51,25 @@ "github_custom.yaml", ) +_IGNORED_DIR_NAMES = {"__pycache__", ".pytest_cache", ".mypy_cache", ".ruff_cache", "logs"} +_IGNORED_SUFFIXES = {".pyc", ".pyo"} + + +def _build_bundle_artifact(bundle: str, tmp_path: Path) -> Path: + bundle_dir = REPO_ROOT / "packages" / bundle + artifact = tmp_path / f"{bundle}.tar.gz" + with tarfile.open(artifact, "w:gz") as archive: + for path in sorted(bundle_dir.rglob("*")): + if not path.is_file(): + continue + rel = path.relative_to(bundle_dir) + if any(part in _IGNORED_DIR_NAMES for part in rel.parts): + continue + if path.suffix.lower() in _IGNORED_SUFFIXES: + continue + archive.add(path, arcname=f"{bundle}/{rel.as_posix()}") + return artifact + @pytest.mark.parametrize("bundle,prompts", list(_EXPECTED_PROMPTS.items())) def test_official_bundles_package_expected_prompt_files(bundle: str, prompts: tuple[str, ...]) -> None: @@ -92,11 +119,53 @@ def test_github_custom_seed_includes_bug_parent_hierarchy() -> None: def test_module_package_layout_matches_init_ide_resource_contract() -> None: """Core discovers resources/prompts and resources/templates/... under the module package root.""" backlog = REPO_ROOT / "packages" / "specfact-backlog" + assert (backlog / "resources" / "prompts" / "specfact.backlog-refine.md").is_file() assert (backlog / "resources" / "templates" / "backlog" / "field_mappings" / "ado_default.yaml").is_file() codebase = REPO_ROOT / "packages" / "specfact-codebase" assert (codebase / "resources" / "prompts" / "specfact.01-import.md").is_file() +def test_backlog_artifact_contains_prompt_payload(tmp_path: Path) -> None: + artifact = _build_bundle_artifact("specfact-backlog", tmp_path) + with tarfile.open(artifact, "r:gz") as archive: + names = set(archive.getnames()) + + for prompt in _EXPECTED_PROMPTS["specfact-backlog"]: + assert f"specfact-backlog/resources/prompts/{prompt}" in names + + +def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + from specfact_cli.utils import ide_setup + + modules_root = tmp_path / "modules" + installed_bundle = modules_root / "specfact-backlog" + shutil.copytree(REPO_ROOT / "packages" / "specfact-backlog", installed_bundle) + repo_path = tmp_path / "repo" + repo_path.mkdir() + + monkeypatch.setattr(ide_setup, "_module_discovery_roots", lambda _repo: [(modules_root, "custom")]) + catalog = ide_setup.discover_prompt_sources_catalog(repo_path, include_package_fallback=False) + + assert "nold-ai/specfact-backlog" in catalog + names = {path.name for path in catalog["nold-ai/specfact-backlog"]} + assert set(_EXPECTED_PROMPTS["specfact-backlog"]) <= names + + source_id = "nold-ai/specfact-backlog" + segment = ide_setup.source_id_to_path_segment(source_id) + copied, _ = ide_setup._copy_template_files_to_ide( + repo_path, + "vscode", + list(catalog[source_id]), + source_segment=segment, + write_settings=False, + ) + assert copied + copied_names = {path.name for path in copied} + expected_names = {f"{Path(name).stem}.prompt.md" for name in _EXPECTED_PROMPTS["specfact-backlog"]} + assert expected_names <= copied_names + assert all(path.parent.name == segment for path in copied) + + def test_resource_change_changes_signed_payload_checksum(tmp_path: Path) -> None: """Bundled resource files participate in the module integrity payload (resource-aware integrity).""" sign_script = load_module_from_path("sign_modules_payload", SIGN_SCRIPT) From 7c440ef693b42f08c360ea872d98ae4d94a05ef2 Mon Sep 17 00:00:00 2001 From: Dominikus Nold <djm81@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:32:55 +0100 Subject: [PATCH 06/11] fix type check error --- tests/unit/docs/test_docs_review.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index fa4a323..76c2a73 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -401,31 +401,6 @@ def test_config_links_to_core_docs_site() -> None: # --------------------------------------------------------------------------- -def _list_redirect_from_routes(text: str) -> list[str]: - """Return normalized routes declared under ``redirect_from:`` in front matter.""" - routes: list[str] = [] - lines = text.splitlines() - i = 0 - while i < len(lines): - if lines[i].strip() == "redirect_from:": - i += 1 - while i < len(lines): - stripped = lines[i].strip() - if stripped.startswith("- "): - val = stripped[2:].strip().strip('"').strip("'") - routes.append(_normalize_route(val)) - i += 1 - elif not stripped or stripped.startswith("#"): - i += 1 - elif stripped == "---": - break - else: - break - break - i += 1 - return routes - - def _guides_legacy_redirect_violation(path: Path, text: str) -> str | None: """If ``docs/guides/<stem>.md`` publishes outside ``/guides/``, require ``redirect_from`` for ``/guides/<stem>/``. From 36aea5b419a3a997a0f2dbd4bd48a0aa12697500 Mon Sep 17 00:00:00 2001 From: Dominikus Nold <djm81@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:42:01 +0100 Subject: [PATCH 07/11] Tighten backlog resource packaging checks --- .../specs/resource-aware-integrity/spec.md | 1 + packages/specfact-backlog/module-package.yaml | 6 ++--- .../prompts/shared/cli-enforcement.md | 2 +- tests/unit/docs/test_docs_review.py | 10 ++++----- tests/unit/test_bundle_resource_payloads.py | 22 ++++++++++++------- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md b/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md index 6a76ce2..abe00ed 100644 --- a/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md +++ b/openspec/changes/packaging-01-bundle-resource-payloads/specs/resource-aware-integrity/spec.md @@ -19,6 +19,7 @@ Bundled resources SHALL live at stable paths inside the bundle package so that t - **THEN** the bundle contains a stable prompt resource path that can be discovered without scanning the core CLI repository #### Scenario: Installed backlog bundle contributes prompt source catalog entries + - **WHEN** `nold-ai/specfact-backlog` is installed under an effective module root with the packaged backlog prompt files - **THEN** core prompt-source discovery includes `nold-ai/specfact-backlog` as a prompt source - **AND** `specfact init ide` can export the backlog prompt filenames from that installed module root diff --git a/packages/specfact-backlog/module-package.yaml b/packages/specfact-backlog/module-package.yaml index acc09f6..86cc202 100644 --- a/packages/specfact-backlog/module-package.yaml +++ b/packages/specfact-backlog/module-package.yaml @@ -1,5 +1,5 @@ name: nold-ai/specfact-backlog -version: 0.41.15 +version: 0.41.16 commands: - backlog tier: official @@ -17,5 +17,5 @@ schema_extensions: project_metadata: - backlog_core.backlog_config integrity: - checksum: sha256:b99db1457dabb2e8e7096cd46c88f7c47328c49f8ec92114df4c6f0110fa4f43 - signature: gKFlj/hC6Pr2oxBrXhMmkVmo2Y8RoPZalYtXxlTZ3IwQSCPFfji/qdMl0UntK+jwxqTS+62ZD5CSfzDWGRaMAA== + checksum: sha256:8edbb9cad806a60976bfb5348f9a24863d71305583feb140d3af37c45ba29e59 + signature: X7hk6nWlHPGKyjXwxY04BQzfMwq5Bh2h/qnTZZb8l6sqGdC9mPLvmoMMNkrZ422wP5UuPSgTJSAu04tAyWcoAw== diff --git a/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md b/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md index b8aab9a..05e2227 100644 --- a/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md +++ b/packages/specfact-backlog/resources/prompts/shared/cli-enforcement.md @@ -114,6 +114,6 @@ When generating or enhancing code via LLM, **ALWAYS** follow this pattern: - `specfact plan harden [<bundle-name>]` - Create SDD manifest (uses active plan if bundle not specified) - `specfact enforce sdd [<bundle-name>]` - Validate SDD (uses active plan if bundle not specified) - `specfact sync bridge --adapter <adapter> --repo <path>` - Sync with external tools -- See [Command Reference](../../docs/reference/commands.md) for full list +- See [Command Reference](https://docs.specfact.io/reference/commands/) for full list **Note**: Most commands now support active plan fallback. If `--bundle` is not specified, commands automatically use the active plan set via `plan select`. This improves workflow efficiency in AI IDE environments. diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index 76c2a73..c09d6e8 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -89,7 +89,7 @@ def _normalize_route(route: str) -> str: return cleaned -def _list_redirect_from_routes(text: str) -> list[str]: +def _list_front_matter_redirect_from_routes(text: str) -> list[str]: """Return normalized redirect_from routes declared in YAML front matter only.""" lines = text.splitlines() if not lines or lines[0].strip() != "---": @@ -421,7 +421,7 @@ def _guides_legacy_redirect_violation(path: Path, text: str) -> str | None: return None expected = _normalize_route(f"/guides/{path.stem}/") - redirects = _list_redirect_from_routes(text) + redirects = _list_front_matter_redirect_from_routes(text) if expected in redirects: return None return ( @@ -452,12 +452,12 @@ def _extract_redirect_from_entries() -> dict[str, Path]: text = _read_text(path) if "redirect_from:" not in text: continue - for route in _list_redirect_from_routes(text): + for route in _list_front_matter_redirect_from_routes(text): redirects[route] = path return redirects -def test_list_redirect_from_routes_ignores_body_redirect_marker() -> None: +def test_list_front_matter_redirect_from_routes_ignores_body_redirect_marker() -> None: text = """--- layout: default title: Example @@ -471,7 +471,7 @@ def test_list_redirect_from_routes_ignores_body_redirect_marker() -> None: - /not-front-matter/ """ - assert _list_redirect_from_routes(text) == ["/legacy-path/"] + assert _list_front_matter_redirect_from_routes(text) == ["/legacy-path/"] def test_moved_files_have_redirect_from_entries() -> None: diff --git a/tests/unit/test_bundle_resource_payloads.py b/tests/unit/test_bundle_resource_payloads.py index c313c33..27c8502 100644 --- a/tests/unit/test_bundle_resource_payloads.py +++ b/tests/unit/test_bundle_resource_payloads.py @@ -71,12 +71,14 @@ def _build_bundle_artifact(bundle: str, tmp_path: Path) -> Path: return artifact +def _top_level_prompt_names(prompt_root: Path) -> set[str]: + return {path.name for path in prompt_root.glob("specfact*.md") if path.is_file()} + + @pytest.mark.parametrize("bundle,prompts", list(_EXPECTED_PROMPTS.items())) def test_official_bundles_package_expected_prompt_files(bundle: str, prompts: tuple[str, ...]) -> None: root = REPO_ROOT / "packages" / bundle / "resources" / "prompts" - for name in prompts: - path = root / name - assert path.is_file(), f"missing prompt {path}" + assert _top_level_prompt_names(root) == set(prompts) companion = root / _COMPANION assert companion.is_file(), f"missing companion {companion}" @@ -128,10 +130,14 @@ def test_module_package_layout_matches_init_ide_resource_contract() -> None: def test_backlog_artifact_contains_prompt_payload(tmp_path: Path) -> None: artifact = _build_bundle_artifact("specfact-backlog", tmp_path) with tarfile.open(artifact, "r:gz") as archive: - names = set(archive.getnames()) + names = { + name + for name in archive.getnames() + if name.startswith("specfact-backlog/resources/prompts/") and name.count("/") == 3 and name.endswith(".md") + } - for prompt in _EXPECTED_PROMPTS["specfact-backlog"]: - assert f"specfact-backlog/resources/prompts/{prompt}" in names + expected = {f"specfact-backlog/resources/prompts/{prompt}" for prompt in _EXPECTED_PROMPTS["specfact-backlog"]} + assert names == expected def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: @@ -148,7 +154,7 @@ def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, mo assert "nold-ai/specfact-backlog" in catalog names = {path.name for path in catalog["nold-ai/specfact-backlog"]} - assert set(_EXPECTED_PROMPTS["specfact-backlog"]) <= names + assert names == set(_EXPECTED_PROMPTS["specfact-backlog"]) source_id = "nold-ai/specfact-backlog" segment = ide_setup.source_id_to_path_segment(source_id) @@ -162,7 +168,7 @@ def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, mo assert copied copied_names = {path.name for path in copied} expected_names = {f"{Path(name).stem}.prompt.md" for name in _EXPECTED_PROMPTS["specfact-backlog"]} - assert expected_names <= copied_names + assert copied_names == expected_names assert all(path.parent.name == segment for path in copied) From 0b21d096230fb83ccc4586d01a445685d7d0ac5b Mon Sep 17 00:00:00 2001 From: Dominikus Nold <djm81@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:44:37 +0100 Subject: [PATCH 08/11] Handle YAML comments in redirect parser --- tests/unit/docs/test_docs_review.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/unit/docs/test_docs_review.py b/tests/unit/docs/test_docs_review.py index c09d6e8..cf14807 100644 --- a/tests/unit/docs/test_docs_review.py +++ b/tests/unit/docs/test_docs_review.py @@ -112,9 +112,9 @@ def _list_front_matter_redirect_from_routes(text: str) -> list[str]: if in_redirect_block: stripped = line.strip() if stripped.startswith("- "): - route = stripped[2:].strip().strip('"').strip("'") + route = stripped[2:].split("#", 1)[0].strip().strip('"').strip("'") routes.append(_normalize_route(route)) - elif stripped and not stripped.startswith("-"): + elif stripped and not stripped.startswith("-") and not stripped.startswith("#"): in_redirect_block = False return routes @@ -474,6 +474,23 @@ def test_list_front_matter_redirect_from_routes_ignores_body_redirect_marker() - assert _list_front_matter_redirect_from_routes(text) == ["/legacy-path/"] +def test_list_front_matter_redirect_from_routes_keeps_entries_after_comments() -> None: + text = """--- +layout: default +title: Example +redirect_from: + # legacy aliases + - /legacy-one/ # keep + + - \"/legacy-two/\" +permalink: /current/ +--- +Body +""" + + assert _list_front_matter_redirect_from_routes(text) == ["/legacy-one/", "/legacy-two/"] + + def test_moved_files_have_redirect_from_entries() -> None: """Every file under bundles/, authoring/, integrations/ that was moved from guides/ should have a redirect_from entry pointing to its old location.""" From 4ec285691b4b23ddd942cb416a0e992904846db4 Mon Sep 17 00:00:00 2001 From: Dominikus Nold <djm81@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:46:38 +0100 Subject: [PATCH 09/11] Fix backlog resource payload lint --- tests/unit/test_bundle_resource_payloads.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_bundle_resource_payloads.py b/tests/unit/test_bundle_resource_payloads.py index 27c8502..22c99c5 100644 --- a/tests/unit/test_bundle_resource_payloads.py +++ b/tests/unit/test_bundle_resource_payloads.py @@ -9,6 +9,7 @@ import pytest import yaml +from specfact_cli.utils import ide_setup from tests.unit._script_test_utils import load_module_from_path @@ -141,8 +142,6 @@ def test_backlog_artifact_contains_prompt_payload(tmp_path: Path) -> None: def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - from specfact_cli.utils import ide_setup - modules_root = tmp_path / "modules" installed_bundle = modules_root / "specfact-backlog" shutil.copytree(REPO_ROOT / "packages" / "specfact-backlog", installed_bundle) @@ -158,7 +157,7 @@ def test_core_prompt_discovery_finds_installed_backlog_bundle(tmp_path: Path, mo source_id = "nold-ai/specfact-backlog" segment = ide_setup.source_id_to_path_segment(source_id) - copied, _ = ide_setup._copy_template_files_to_ide( + copied, _ = ide_setup._copy_template_files_to_ide( # pylint: disable=protected-access repo_path, "vscode", list(catalog[source_id]), From ce05148a021474b19c59de6dda9a1a99236a5101 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 22:51:39 +0000 Subject: [PATCH 10/11] chore(registry): publish changed modules [skip ci] --- registry/index.json | 6 +++--- .../modules/specfact-backlog-0.41.16.tar.gz | Bin 0 -> 131393 bytes .../specfact-backlog-0.41.16.tar.gz.sha256 | 1 + .../specfact-backlog-0.41.16.tar.sig | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 registry/modules/specfact-backlog-0.41.16.tar.gz create mode 100644 registry/modules/specfact-backlog-0.41.16.tar.gz.sha256 create mode 100644 registry/signatures/specfact-backlog-0.41.16.tar.sig diff --git a/registry/index.json b/registry/index.json index 1ce7815..369d04c 100644 --- a/registry/index.json +++ b/registry/index.json @@ -15,9 +15,9 @@ }, { "id": "nold-ai/specfact-backlog", - "latest_version": "0.41.14", - "download_url": "modules/specfact-backlog-0.41.14.tar.gz", - "checksum_sha256": "124b51ee51f5dd91453f38708a662c2b65527be02e0dacde302da64cce1d8968", + "latest_version": "0.41.16", + "download_url": "modules/specfact-backlog-0.41.16.tar.gz", + "checksum_sha256": "ad2d9dfdf6bbae411f11920eaafb9578c5b24599ce699fa74c141bb88a331c5f", "tier": "official", "publisher": { "name": "nold-ai", diff --git a/registry/modules/specfact-backlog-0.41.16.tar.gz b/registry/modules/specfact-backlog-0.41.16.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c27442753b553fd9153c56aac09489bada39842 GIT binary patch literal 131393 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 literal 0 HcmV?d00001 diff --git a/registry/modules/specfact-backlog-0.41.16.tar.gz.sha256 b/registry/modules/specfact-backlog-0.41.16.tar.gz.sha256 new file mode 100644 index 0000000..2f70489 --- /dev/null +++ b/registry/modules/specfact-backlog-0.41.16.tar.gz.sha256 @@ -0,0 +1 @@ +ad2d9dfdf6bbae411f11920eaafb9578c5b24599ce699fa74c141bb88a331c5f diff --git a/registry/signatures/specfact-backlog-0.41.16.tar.sig b/registry/signatures/specfact-backlog-0.41.16.tar.sig new file mode 100644 index 0000000..03c2eb4 --- /dev/null +++ b/registry/signatures/specfact-backlog-0.41.16.tar.sig @@ -0,0 +1 @@ +X7hk6nWlHPGKyjXwxY04BQzfMwq5Bh2h/qnTZZb8l6sqGdC9mPLvmoMMNkrZ422wP5UuPSgTJSAu04tAyWcoAw== From ff88da84d70adb7b786d3230d2a2638740055a00 Mon Sep 17 00:00:00 2001 From: Dominikus Nold <djm81@users.noreply.github.com> Date: Fri, 27 Mar 2026 00:04:40 +0100 Subject: [PATCH 11/11] Update checks and agents instructions --- AGENTS.md | 2 ++ README.md | 1 + scripts/pre-commit-quality-checks.sh | 22 ++++++++++++++++++++ tests/unit/test_pre_commit_quality_parity.py | 1 + 4 files changed, 26 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 003de29..ef9a42d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,6 +42,8 @@ pre-commit install pre-commit run --all-files ``` +Staged `*.py` files trigger `hatch run lint` (includes pylint) via `scripts/pre-commit-quality-checks.sh`, matching `.github/workflows/pr-orchestrator.yml`. + ## Development workflow ### Branch protection diff --git a/README.md b/README.md index 9e0ae5f..10b0324 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ pre-commit run --all-files ``` Scope notes: +- Pre-commit runs `hatch run lint` when any staged file is `*.py`, matching the CI quality job (Ruff alone does not run pylint). - `ruff` runs on the full repo. - `basedpyright` and `pylint` are scoped to `src/`, `tests/`, and `tools/` for modules-repo infrastructure parity. - Bundle-package behavioral validation is covered through `test`, `contract-test`, and migration-specific suite additions under `tests/`. diff --git a/scripts/pre-commit-quality-checks.sh b/scripts/pre-commit-quality-checks.sh index 10a0854..ddd8cbe 100755 --- a/scripts/pre-commit-quality-checks.sh +++ b/scripts/pre-commit-quality-checks.sh @@ -25,6 +25,10 @@ has_staged_yaml() { staged_files | grep -E '\.ya?ml$' >/dev/null 2>&1 } +has_staged_python() { + staged_files | grep -E '\.py$' >/dev/null 2>&1 +} + check_safe_change() { local files files=$(staged_files) @@ -96,6 +100,23 @@ run_bundle_import_checks() { fi } +# Parity with CI quality job (.github/workflows/pr-orchestrator.yml: hatch run lint). +# Ruff does not enforce pylint rules (e.g. C0301 max line length on docstrings); pre-commit must run lint too. +run_lint_if_staged_python() { + if ! has_staged_python; then + info "ℹ️ No staged Python files — skipping hatch run lint (pylint-inclusive)" + return 0 + fi + info "🔎 Staged Python detected — running hatch run lint (ruff + basedpyright + pylint)" + if hatch run lint; then + success "✅ Lint passed" + else + error "❌ Lint failed (matches CI quality gate)" + warn "💡 Run: hatch run lint" + exit 1 + fi +} + run_contract_test_fast_path() { info "🧪 Running contract-test fast path" if hatch run contract-test; then @@ -112,6 +133,7 @@ warn "🔍 Running modules pre-commit quality checks" run_format_safety run_yaml_lint_if_needed run_bundle_import_checks +run_lint_if_staged_python if check_safe_change; then success "✅ Safe change detected - skipping contract tests" diff --git a/tests/unit/test_pre_commit_quality_parity.py b/tests/unit/test_pre_commit_quality_parity.py index 5aa9e7b..7b3e145 100644 --- a/tests/unit/test_pre_commit_quality_parity.py +++ b/tests/unit/test_pre_commit_quality_parity.py @@ -38,4 +38,5 @@ def test_modules_pre_commit_script_enforces_required_quality_commands() -> None: assert "hatch run format" in script_text assert "hatch run yaml-lint" in script_text assert "hatch run check-bundle-imports" in script_text + assert "hatch run lint" in script_text assert "hatch run contract-test" in script_text