specfact-cli 0.9.0__tar.gz → 0.9.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/PKG-INFO +5 -5
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/README.md +4 -4
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/pyproject.toml +1 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-enforce.md +10 -2
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-import-from-code.md +28 -41
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-add-feature.md +18 -18
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-add-story.md +2 -2
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-compare.md +53 -44
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-init.md +30 -28
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-promote.md +11 -11
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-review.md +36 -36
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-select.md +69 -67
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-update-feature.md +7 -7
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-plan-update-idea.md +3 -3
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-sync.md +76 -76
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/__init__.py +1 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/__init__.py +1 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/cli.py +11 -5
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/constitution.py +13 -11
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/enforce.py +77 -17
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/generate.py +95 -38
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/import_cmd.py +30 -22
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/plan.py +395 -227
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/sync.py +25 -20
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/bridge.py +137 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/project.py +71 -5
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/__init__.py +1 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/bridge_probe.py +0 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/bridge_sync.py +18 -6
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/bridge_watch.py +2 -3
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/templates/__init__.py +0 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/templates/bridge_templates.py +0 -1
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/bundle_loader.py +16 -6
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/structure.py +92 -131
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/.gitignore +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/LICENSE.md +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/mappings/node-async.yaml +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/mappings/python-async.yaml +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/mappings/speckit-default.yaml +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/prompts/specfact-repro.md +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/schemas/deviation.schema.json +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/schemas/plan.schema.json +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/schemas/protocol.schema.json +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/templates/github-action.yml.j2 +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/templates/plan.bundle.yaml.j2 +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/templates/pr-template.md.j2 +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/templates/protocol.yaml.j2 +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/resources/templates/telemetry.yaml.example +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/analyze_agent.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/base.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/plan_agent.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/registry.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/agents/sync_agent.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/ambiguity_scanner.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/code_analyzer.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/constitution_evidence_extractor.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/contract_extractor.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/control_flow_analyzer.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/requirement_extractor.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/analyzers/test_pattern_extractor.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/init.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/commands/repro.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/common/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/common/logger_setup.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/common/logging_utils.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/common/text_utils.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/common/utils.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/comparators/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/comparators/plan_comparator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/enrichers/constitution_enricher.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/enrichers/plan_enricher.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/contract_generator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/plan_generator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/protocol_generator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/report_generator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/generators/workflow_generator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/importers/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/importers/speckit_converter.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/importers/speckit_scanner.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/migrations/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/migrations/plan_migrator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/deviation.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/enforcement.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/plan.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/protocol.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/models/sdd.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/modes/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/modes/detector.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/modes/router.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/resources/semgrep/async.yml +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/runtime.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/repository_sync.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/speckit_sync.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/sync/watcher.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/telemetry.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/acceptance_criteria.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/console.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/enrichment_parser.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/feature_keys.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/git.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/github_annotations.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/ide_setup.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/prompts.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/structured_io.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/utils/yaml_utils.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/validators/__init__.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/validators/contract_validator.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/validators/fsm.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/validators/repro_checker.py +0 -0
- {specfact_cli-0.9.0 → specfact_cli-0.9.2}/src/specfact_cli/validators/schema.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specfact-cli
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2
|
|
4
4
|
Summary: Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions.
|
|
5
5
|
Project-URL: Homepage, https://github.com/nold-ai/specfact-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/nold-ai/specfact-cli.git
|
|
@@ -353,13 +353,13 @@ pip install specfact-cli
|
|
|
353
353
|
|
|
354
354
|
```bash
|
|
355
355
|
# Modernizing legacy code? (Recommended)
|
|
356
|
-
specfact import from-code --repo .
|
|
356
|
+
specfact import from-code my-project --repo .
|
|
357
357
|
|
|
358
358
|
# Starting a new project?
|
|
359
|
-
specfact plan init --interactive
|
|
359
|
+
specfact plan init my-project --interactive
|
|
360
360
|
|
|
361
|
-
# Using GitHub Spec-Kit?
|
|
362
|
-
specfact import from-
|
|
361
|
+
# Using GitHub Spec-Kit or other tools?
|
|
362
|
+
specfact import from-bridge --repo ./my-project --adapter speckit --write
|
|
363
363
|
```
|
|
364
364
|
|
|
365
365
|
That's it! 🎉
|
|
@@ -87,13 +87,13 @@ pip install specfact-cli
|
|
|
87
87
|
|
|
88
88
|
```bash
|
|
89
89
|
# Modernizing legacy code? (Recommended)
|
|
90
|
-
specfact import from-code --repo .
|
|
90
|
+
specfact import from-code my-project --repo .
|
|
91
91
|
|
|
92
92
|
# Starting a new project?
|
|
93
|
-
specfact plan init --interactive
|
|
93
|
+
specfact plan init my-project --interactive
|
|
94
94
|
|
|
95
|
-
# Using GitHub Spec-Kit?
|
|
96
|
-
specfact import from-
|
|
95
|
+
# Using GitHub Spec-Kit or other tools?
|
|
96
|
+
specfact import from-bridge --repo ./my-project --adapter speckit --write
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
That's it! 🎉
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfact-cli"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.2"
|
|
8
8
|
description = "Brownfield-first CLI: Reverse engineer legacy Python → specs → enforced contracts. Automate legacy code documentation and prevent modernization regressions."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -53,7 +53,12 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
53
53
|
|
|
54
54
|
## Goal
|
|
55
55
|
|
|
56
|
-
Configure quality gates and enforcement modes for contract validation. This command
|
|
56
|
+
Configure quality gates and enforcement modes for contract validation. This command has two subcommands:
|
|
57
|
+
|
|
58
|
+
1. **`enforce stage`** - Sets the enforcement preset that determines how contract violations are handled (minimal, balanced, strict)
|
|
59
|
+
2. **`enforce sdd`** - Validates SDD manifest against project bundle and contracts (requires bundle name)
|
|
60
|
+
|
|
61
|
+
This prompt focuses on **`enforce stage`**. For SDD validation, see the `enforce sdd` command which requires a project bundle name.
|
|
57
62
|
|
|
58
63
|
## Operating Constraints
|
|
59
64
|
|
|
@@ -61,6 +66,8 @@ Configure quality gates and enforcement modes for contract validation. This comm
|
|
|
61
66
|
|
|
62
67
|
**Command**: `specfact enforce stage`
|
|
63
68
|
|
|
69
|
+
**Note**: This prompt covers `enforce stage` only. The `enforce sdd` subcommand requires a project bundle name (e.g., `specfact enforce sdd legacy-api`) and validates SDD manifests against project bundles.
|
|
70
|
+
|
|
64
71
|
**Mode Auto-Detection**: The CLI automatically detects operational mode (CI/CD or CoPilot) based on environment. No need to specify `--mode` flag.
|
|
65
72
|
|
|
66
73
|
## What This Command Does
|
|
@@ -141,7 +148,8 @@ specfact enforce stage --preset strict
|
|
|
141
148
|
| LOW | Log |
|
|
142
149
|
|
|
143
150
|
**Next Steps**:
|
|
144
|
-
- Run validation:
|
|
151
|
+
- Run validation: `specfact repro`
|
|
152
|
+
- Validate SDD: `specfact enforce sdd <bundle-name>` (requires project bundle)
|
|
145
153
|
- Review configuration: Check `.specfact/config/enforcement.yaml`
|
|
146
154
|
```
|
|
147
155
|
|
|
@@ -58,18 +58,18 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
58
58
|
|
|
59
59
|
**For updating features** (after enrichment):
|
|
60
60
|
|
|
61
|
-
- `specfact plan update-feature --key <key> --title <title> --outcomes <outcomes> --acceptance <acceptance> --constraints <constraints> --confidence <confidence> --draft
|
|
61
|
+
- `specfact plan update-feature --bundle <bundle-name> --key <key> --title <title> --outcomes <outcomes> --acceptance <acceptance> --constraints <constraints> --confidence <confidence> --draft/--no-draft`
|
|
62
62
|
- Updates existing feature metadata (title, outcomes, acceptance criteria, constraints, confidence, draft status)
|
|
63
63
|
- Works in CI/CD, Copilot, and interactive modes
|
|
64
|
-
- Example: `specfact plan update-feature --key FEATURE-001 --title "New Title" --outcomes "Outcome 1, Outcome 2"`
|
|
64
|
+
- Example: `specfact plan update-feature --bundle legacy-api --key FEATURE-001 --title "New Title" --outcomes "Outcome 1, Outcome 2"`
|
|
65
65
|
|
|
66
66
|
**For adding features**:
|
|
67
67
|
|
|
68
|
-
- `specfact plan add-feature --key <key> --title <title> --outcomes <outcomes> --acceptance <acceptance
|
|
68
|
+
- `specfact plan add-feature --bundle <bundle-name> --key <key> --title <title> --outcomes <outcomes> --acceptance <acceptance>`
|
|
69
69
|
|
|
70
70
|
**For adding stories**:
|
|
71
71
|
|
|
72
|
-
- `specfact plan add-story --feature <feature-key> --key <story-key> --title <title> --acceptance <acceptance> --story-points <points> --value-points <points
|
|
72
|
+
- `specfact plan add-story --bundle <bundle-name> --feature <feature-key> --key <story-key> --title <title> --acceptance <acceptance> --story-points <points> --value-points <points>`
|
|
73
73
|
|
|
74
74
|
**❌ FORBIDDEN**: Direct Python code manipulation like:
|
|
75
75
|
|
|
@@ -85,7 +85,7 @@ generator.generate(plan_bundle, plan_path) # Bypassing CLI
|
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
87
|
# ✅ ALWAYS DO THIS:
|
|
88
|
-
specfact plan update-feature --key FEATURE-001 --title "New Title"
|
|
88
|
+
specfact plan update-feature --bundle legacy-api --key FEATURE-001 --title "New Title"
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
## ⏸️ Wait States: User Input Required
|
|
@@ -197,8 +197,8 @@ specfact import from-code --repo <path> --name <name> --entry-point <subdirector
|
|
|
197
197
|
**Apply enrichments via CLI using the `--enrichment` flag**:
|
|
198
198
|
|
|
199
199
|
```bash
|
|
200
|
-
# Apply enrichment report to refine the auto-detected
|
|
201
|
-
specfact import from-code
|
|
200
|
+
# Apply enrichment report to refine the auto-detected project bundle
|
|
201
|
+
specfact import from-code <bundle-name> --repo <path> --enrichment <enrichment-report-path>
|
|
202
202
|
```
|
|
203
203
|
|
|
204
204
|
**The `--enrichment` flag**:
|
|
@@ -250,9 +250,8 @@ specfact import from-code --repo <path> --name <name> --enrichment <enrichment-r
|
|
|
250
250
|
Extract arguments from user input:
|
|
251
251
|
|
|
252
252
|
- `--repo PATH` - Repository path (default: current directory)
|
|
253
|
-
-
|
|
253
|
+
- `BUNDLE_NAME` - Project bundle name (required positional argument, e.g., `legacy-api`, `auth-module`)
|
|
254
254
|
- `--confidence FLOAT` - Minimum confidence score (0.0-1.0, default: 0.5)
|
|
255
|
-
- `--out PATH` - Output plan bundle path (optional, default: `.specfact/plans/<name>-<timestamp>.bundle.<format>`)
|
|
256
255
|
- `--report PATH` - Analysis report path (optional, default: `.specfact/reports/brownfield/analysis-<timestamp>.md`)
|
|
257
256
|
- `--shadow-only` - Observe mode without enforcing (optional)
|
|
258
257
|
- `--key-format {classname|sequential}` - Feature key format (default: `classname`)
|
|
@@ -262,13 +261,13 @@ Extract arguments from user input:
|
|
|
262
261
|
- Incremental modernization: Modernize one part of the codebase at a time
|
|
263
262
|
- Example: `--entry-point projects/api-service` analyzes only `projects/api-service/` and its subdirectories
|
|
264
263
|
|
|
265
|
-
**Important**:
|
|
264
|
+
**Important**: Bundle name is **required**. If not provided, **ask the user interactively** for a bundle name and **WAIT for their response**. Use kebab-case (e.g., `legacy-api`, `auth-module`).
|
|
266
265
|
|
|
267
|
-
**WAIT STATE**: If
|
|
266
|
+
**WAIT STATE**: If bundle name is missing, you MUST:
|
|
268
267
|
|
|
269
|
-
1. Ask: "What name would you like to use
|
|
268
|
+
1. Ask: "What bundle name would you like to use? (e.g., 'legacy-api', 'auth-module', 'payment-service')"
|
|
270
269
|
2. **STOP and WAIT** for user response
|
|
271
|
-
3. **DO NOT continue** until user provides a name
|
|
270
|
+
3. **DO NOT continue** until user provides a bundle name
|
|
272
271
|
|
|
273
272
|
For single quotes in args like "I'm Groot", use escape syntax: e.g `'I'\''m Groot'` (or double-quote if possible: `"I'm Groot"`).
|
|
274
273
|
|
|
@@ -278,17 +277,17 @@ For single quotes in args like "I'm Groot", use escape syntax: e.g `'I'\''m Groo
|
|
|
278
277
|
|
|
279
278
|
```bash
|
|
280
279
|
# Full repository analysis
|
|
281
|
-
specfact import from-code
|
|
280
|
+
specfact import from-code <bundle-name> --repo <repo_path> --confidence <confidence>
|
|
282
281
|
|
|
283
282
|
# Partial repository analysis (analyze only specific subdirectory)
|
|
284
|
-
specfact import from-code
|
|
283
|
+
specfact import from-code <bundle-name> --repo <repo_path> --entry-point <subdirectory> --confidence <confidence>
|
|
285
284
|
```
|
|
286
285
|
|
|
287
286
|
**Note**: Mode is auto-detected by the CLI. No need to specify `--mode` flag.
|
|
288
287
|
|
|
289
288
|
**Capture CLI output**:
|
|
290
289
|
|
|
291
|
-
-
|
|
290
|
+
- Project bundle directory: `.specfact/projects/<bundle-name>/`
|
|
292
291
|
- Analysis report path: `.specfact/reports/brownfield/analysis-<timestamp>.md`
|
|
293
292
|
- Metadata: feature counts, story counts, average confidence, execution time
|
|
294
293
|
- **Deduplication summary**: "✓ Removed N duplicate features from plan bundle" (if duplicates were found during import)
|
|
@@ -340,12 +339,8 @@ The CLI automatically deduplicates features during import using normalized key m
|
|
|
340
339
|
- Semantic insights and recommendations
|
|
341
340
|
|
|
342
341
|
4. **Save enrichment report** to the proper location:
|
|
343
|
-
-
|
|
344
|
-
- Derive enrichment report path
|
|
345
|
-
- Taking the plan bundle filename (e.g., `specfact-cli.2025-11-17T09-26-47.bundle.<format>`)
|
|
346
|
-
- Replacing `.bundle.<format>` with `.enrichment.md` (e.g., `specfact-cli.2025-11-17T09-26-47.enrichment.md`)
|
|
347
|
-
- Placing it in `.specfact/reports/enrichment/` directory
|
|
348
|
-
- Full path example: `.specfact/reports/enrichment/specfact-cli.2025-11-17T09-26-47.enrichment.md`
|
|
342
|
+
- Use bundle name from CLI output (e.g., `legacy-api`)
|
|
343
|
+
- Derive enrichment report path: `.specfact/reports/enrichment/<bundle-name>-<timestamp>.enrichment.md`
|
|
349
344
|
- **Ensure the directory exists**: Create `.specfact/reports/enrichment/` if it doesn't exist
|
|
350
345
|
|
|
351
346
|
**What NOT to do**:
|
|
@@ -360,29 +355,24 @@ The CLI automatically deduplicates features during import using normalized key m
|
|
|
360
355
|
|
|
361
356
|
**If enrichment was generated**:
|
|
362
357
|
|
|
363
|
-
1. **Save enrichment report** to the enrichment reports directory
|
|
358
|
+
1. **Save enrichment report** to the enrichment reports directory:
|
|
364
359
|
- Location: `.specfact/reports/enrichment/`
|
|
365
|
-
- Naming:
|
|
366
|
-
- Example:
|
|
367
|
-
- Full path: `.specfact/reports/enrichment/specfact-cli.2025-11-17T09-26-47.enrichment.md`
|
|
360
|
+
- Naming: `<bundle-name>-<timestamp>.enrichment.md`
|
|
361
|
+
- Example: `.specfact/reports/enrichment/legacy-api-2025-11-17T09-26-47.enrichment.md`
|
|
368
362
|
|
|
369
363
|
2. **Execute CLI with `--enrichment` flag**:
|
|
370
364
|
|
|
371
365
|
```bash
|
|
372
|
-
specfact import from-code
|
|
366
|
+
specfact import from-code <bundle-name> --repo <repo_path> --enrichment <enrichment-report-path>
|
|
373
367
|
```
|
|
374
368
|
|
|
375
369
|
3. **The CLI will**:
|
|
376
|
-
- Load the original
|
|
370
|
+
- Load the original project bundle from `.specfact/projects/<bundle-name>/`
|
|
377
371
|
- Parse the enrichment report
|
|
378
|
-
- Apply missing features to the
|
|
372
|
+
- Apply missing features to the project bundle
|
|
379
373
|
- Adjust confidence scores
|
|
380
374
|
- Add business context
|
|
381
|
-
- Validate and
|
|
382
|
-
- Format: `<name>.<original-timestamp>.enriched.<enrichment-timestamp>.bundle.<format>`
|
|
383
|
-
- Example: `specfact-cli.2025-11-17T09-26-47.enriched.2025-11-17T11-15-29.bundle.<format>`
|
|
384
|
-
- The original plan bundle remains unchanged
|
|
385
|
-
- The enriched plan is stored as a separate file for comparison and versioning
|
|
375
|
+
- Validate and save the enriched project bundle (updates existing bundle)
|
|
386
376
|
|
|
387
377
|
**If no enrichment**:
|
|
388
378
|
|
|
@@ -410,11 +400,9 @@ If `--report` is provided, generate a Markdown import report:
|
|
|
410
400
|
|
|
411
401
|
### 6. Present Results
|
|
412
402
|
|
|
413
|
-
**Present the CLI-generated
|
|
403
|
+
**Present the CLI-generated project bundle** to the user:
|
|
414
404
|
|
|
415
|
-
- **
|
|
416
|
-
- **Original plan** (if enrichment was applied): Show the original plan bundle path
|
|
417
|
-
- **Enriched plan** (if enrichment was applied): Show the enriched plan bundle path with clear naming
|
|
405
|
+
- **Project bundle location**: `.specfact/projects/<bundle-name>/`
|
|
418
406
|
- **Feature summary**: List features from CLI output with confidence scores
|
|
419
407
|
- **Story summary**: List stories from CLI output per feature
|
|
420
408
|
- **CLI metadata**: Execution time, file counts, validation results
|
|
@@ -425,8 +413,7 @@ If `--report` is provided, generate a Markdown import report:
|
|
|
425
413
|
```markdown
|
|
426
414
|
✓ Import complete!
|
|
427
415
|
|
|
428
|
-
|
|
429
|
-
Enriched plan: specfact-cli.2025-11-17T09-26-47.enriched.2025-11-17T11-15-29.bundle.<format>
|
|
416
|
+
Project bundle: .specfact/projects/legacy-api/
|
|
430
417
|
|
|
431
418
|
CLI Analysis Results:
|
|
432
419
|
- Features identified: 19
|
|
@@ -604,7 +591,7 @@ When comparing imported plans with main plans:
|
|
|
604
591
|
|
|
605
592
|
To compare plans, normalize feature keys by removing prefixes and underscores, then match by normalized key.
|
|
606
593
|
|
|
607
|
-
**Important**: This is a **one-way import** - it imports from code into SpecFact
|
|
594
|
+
**Important**: This is a **one-way import** - it imports from code into SpecFact modular project bundle format. For external tool integration (Spec-Kit, Linear, Jira), use `specfact import from-bridge --adapter <adapter>` instead.
|
|
608
595
|
|
|
609
596
|
## Constitution Bootstrap (Optional)
|
|
610
597
|
|
|
@@ -67,13 +67,13 @@ Add a new feature to an existing plan bundle. The feature will be added with the
|
|
|
67
67
|
|
|
68
68
|
The `specfact plan add-feature` command:
|
|
69
69
|
|
|
70
|
-
1. **Loads** the existing
|
|
71
|
-
2. **Validates** the
|
|
70
|
+
1. **Loads** the existing project bundle from `.specfact/projects/<bundle-name>/`
|
|
71
|
+
2. **Validates** the project bundle structure
|
|
72
72
|
3. **Checks** if the feature key already exists (prevents duplicates)
|
|
73
73
|
4. **Creates** a new feature with specified metadata
|
|
74
|
-
5. **Adds** the feature to the
|
|
75
|
-
6. **Validates** the updated
|
|
76
|
-
7. **Saves** the updated
|
|
74
|
+
5. **Adds** the feature to the project bundle (saves to `features/FEATURE-XXX.yaml`)
|
|
75
|
+
6. **Validates** the updated project bundle
|
|
76
|
+
7. **Saves** the updated project bundle
|
|
77
77
|
|
|
78
78
|
## Execution Steps
|
|
79
79
|
|
|
@@ -81,11 +81,11 @@ The `specfact plan add-feature` command:
|
|
|
81
81
|
|
|
82
82
|
**Parse user input** to extract:
|
|
83
83
|
|
|
84
|
+
- `--bundle <bundle-name>` - Project bundle name (required, e.g., `legacy-api`)
|
|
84
85
|
- Feature key (required, e.g., `FEATURE-001`)
|
|
85
86
|
- Feature title (required)
|
|
86
87
|
- Outcomes (optional, comma-separated)
|
|
87
88
|
- Acceptance criteria (optional, comma-separated)
|
|
88
|
-
- Plan bundle path (optional, defaults to active plan or `.specfact/plans/main.bundle.<format>`)
|
|
89
89
|
|
|
90
90
|
**WAIT STATE**: If required arguments are missing, ask the user:
|
|
91
91
|
|
|
@@ -100,17 +100,17 @@ Please provide these values:
|
|
|
100
100
|
|
|
101
101
|
### 2. Check Plan Bundle Existence
|
|
102
102
|
|
|
103
|
-
**
|
|
103
|
+
**WAIT STATE**: If `--bundle` is missing, ask user for bundle name and **WAIT**:
|
|
104
104
|
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
```text
|
|
106
|
+
"Which project bundle should I use? (e.g., 'legacy-api', 'auth-module')
|
|
107
|
+
[WAIT FOR USER RESPONSE - DO NOT CONTINUE]"
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
**If
|
|
110
|
+
**If bundle doesn't exist**:
|
|
111
111
|
|
|
112
|
-
- Report error: "
|
|
113
|
-
- **WAIT STATE**: Ask user if they want to create a new
|
|
112
|
+
- Report error: "Project bundle not found. Create one with: `specfact plan init <bundle-name>`"
|
|
113
|
+
- **WAIT STATE**: Ask user if they want to create a new bundle or specify a different bundle name
|
|
114
114
|
|
|
115
115
|
### 3. Execute Add Feature Command
|
|
116
116
|
|
|
@@ -118,15 +118,15 @@ specfact plan select
|
|
|
118
118
|
|
|
119
119
|
```bash
|
|
120
120
|
# Basic usage
|
|
121
|
-
specfact plan add-feature --key FEATURE-001 --title "Feature Title"
|
|
121
|
+
specfact plan add-feature --bundle <bundle-name> --key FEATURE-001 --title "Feature Title"
|
|
122
122
|
|
|
123
123
|
# With outcomes and acceptance
|
|
124
124
|
specfact plan add-feature \
|
|
125
|
+
--bundle <bundle-name> \
|
|
125
126
|
--key FEATURE-001 \
|
|
126
127
|
--title "Feature Title" \
|
|
127
128
|
--outcomes "Outcome 1, Outcome 2" \
|
|
128
|
-
--acceptance "Criterion 1, Criterion 2"
|
|
129
|
-
--plan <plan_path>
|
|
129
|
+
--acceptance "Criterion 1, Criterion 2"
|
|
130
130
|
```
|
|
131
131
|
|
|
132
132
|
**Capture from CLI**:
|
|
@@ -141,7 +141,7 @@ specfact plan add-feature \
|
|
|
141
141
|
**Common errors**:
|
|
142
142
|
|
|
143
143
|
- **Feature key already exists**: Report error and suggest using `specfact plan update-feature` instead
|
|
144
|
-
- **
|
|
144
|
+
- **Project bundle not found**: Report error and suggest creating bundle with `specfact plan init <bundle-name>`
|
|
145
145
|
- **Invalid plan structure**: Report validation error
|
|
146
146
|
|
|
147
147
|
### 5. Report Completion
|
|
@@ -155,7 +155,7 @@ specfact plan add-feature \
|
|
|
155
155
|
**Title**: Feature Title
|
|
156
156
|
**Outcomes**: Outcome 1, Outcome 2
|
|
157
157
|
**Acceptance**: Criterion 1, Criterion 2
|
|
158
|
-
**
|
|
158
|
+
**Project Bundle**: `.specfact/projects/<bundle-name>/`
|
|
159
159
|
|
|
160
160
|
**Next Steps**:
|
|
161
161
|
- Add stories to this feature: `/specfact-cli/specfact-plan-add-story`
|
|
@@ -133,7 +133,7 @@ specfact plan add-story \
|
|
|
133
133
|
--feature FEATURE-001 \
|
|
134
134
|
--key STORY-001 \
|
|
135
135
|
--title "Story Title" \
|
|
136
|
-
--
|
|
136
|
+
--bundle <bundle-name>
|
|
137
137
|
|
|
138
138
|
# With acceptance criteria and points
|
|
139
139
|
specfact plan add-story \
|
|
@@ -143,7 +143,7 @@ specfact plan add-story \
|
|
|
143
143
|
--acceptance "Criterion 1, Criterion 2" \
|
|
144
144
|
--story-points 5 \
|
|
145
145
|
--value-points 3 \
|
|
146
|
-
--
|
|
146
|
+
--bundle <bundle-name>
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
**Capture from CLI**:
|
|
@@ -18,7 +18,7 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
18
18
|
### Rules
|
|
19
19
|
|
|
20
20
|
1. **ALWAYS execute CLI first**: Run `specfact plan compare` before any comparison - execute the CLI command before any other operations
|
|
21
|
-
2. **ALWAYS use non-interactive mode for CI/CD**: When executing CLI commands, use `--
|
|
21
|
+
2. **ALWAYS use non-interactive mode for CI/CD**: When executing CLI commands, use `--no-interactive` flag to avoid interactive prompts that can cause timeouts in Copilot environments
|
|
22
22
|
3. **ALWAYS use tools for read/write**: Use file reading tools (e.g., `read_file`) to read artifacts for display purposes only. Use CLI commands for all write operations. Never use direct file manipulation.
|
|
23
23
|
4. **NEVER modify .specfact folder directly**: Do NOT create, modify, or delete any files in `.specfact/` folder directly. All operations must go through the CLI.
|
|
24
24
|
5. **NEVER write code**: Do not implement comparison logic - the CLI handles this
|
|
@@ -52,9 +52,9 @@ You **MUST** consider the user input before proceeding (if not empty).
|
|
|
52
52
|
|
|
53
53
|
## Goal
|
|
54
54
|
|
|
55
|
-
Compare
|
|
55
|
+
Compare two project bundles (or legacy plan bundles) to detect deviations, mismatches, and missing features. This command helps identify gaps between planned features and actual implementation, ensuring alignment between specification and code.
|
|
56
56
|
|
|
57
|
-
**Note**: This is a **read-only comparison** operation - it generates comparison reports but does not modify
|
|
57
|
+
**Note**: This is a **read-only comparison** operation - it generates comparison reports but does not modify bundles. Works with both modular project bundles (`.specfact/projects/<bundle-name>/`) and legacy monolithic bundles (`.specfact/plans/*.bundle.<format>`).
|
|
58
58
|
|
|
59
59
|
## Action Required
|
|
60
60
|
|
|
@@ -75,10 +75,11 @@ Compare a manual plan bundle with an auto-derived plan bundle to detect deviatio
|
|
|
75
75
|
- Parse the CLI table output to get plan names for the specified numbers
|
|
76
76
|
- Extract the full plan file names from the table
|
|
77
77
|
|
|
78
|
-
- **For CI/CD/non-interactive use**: Use `--
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
specfact plan select --
|
|
78
|
+
- **For CI/CD/non-interactive use**: Use `--no-interactive` with filters:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
specfact plan select --no-interactive --current
|
|
82
|
+
specfact plan select --no-interactive --last 1
|
|
82
83
|
```
|
|
83
84
|
|
|
84
85
|
2. **Get full plan paths using CLI**:
|
|
@@ -87,13 +88,14 @@ Compare a manual plan bundle with an auto-derived plan bundle to detect deviatio
|
|
|
87
88
|
specfact plan select <plan_number>
|
|
88
89
|
```
|
|
89
90
|
|
|
90
|
-
- This will output the full
|
|
91
|
-
- Use this to construct the full path: `.specfact/plans/<plan_name>`
|
|
91
|
+
- This will output the full bundle name/path
|
|
92
|
+
- Use this to construct the full path: `.specfact/projects/<bundle-name>/` (for project bundles) or `.specfact/plans/<plan_name>` (for legacy bundles)
|
|
92
93
|
|
|
93
|
-
- **For CI/CD/non-interactive use**: Use `--
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
specfact plan select --
|
|
94
|
+
- **For CI/CD/non-interactive use**: Use `--no-interactive` with filters:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
specfact plan select --no-interactive --current
|
|
98
|
+
specfact plan select --no-interactive --last 1
|
|
97
99
|
```
|
|
98
100
|
|
|
99
101
|
**If user input contains plan names** (e.g., "main.bundle.<format> vs auto-derived.bundle.<format>"):
|
|
@@ -105,10 +107,10 @@ Compare a manual plan bundle with an auto-derived plan bundle to detect deviatio
|
|
|
105
107
|
|
|
106
108
|
**If arguments missing**: Ask user interactively for each missing argument and **WAIT for their response**:
|
|
107
109
|
|
|
108
|
-
1. **Manual
|
|
110
|
+
1. **Manual bundle path**: "Which manual bundle to compare? (Enter bundle name, plan number, or path. Default: active bundle or .specfact/projects/main/)"
|
|
109
111
|
- **[WAIT FOR USER RESPONSE - DO NOT CONTINUE]**
|
|
110
112
|
|
|
111
|
-
2. **Auto
|
|
113
|
+
2. **Auto bundle path**: "Which auto-derived bundle to compare? (Enter bundle name, plan number, or path. Default: latest in .specfact/projects/)"
|
|
112
114
|
- **[WAIT FOR USER RESPONSE - DO NOT CONTINUE]**
|
|
113
115
|
|
|
114
116
|
3. **Output format**: "Output format? (1) Markdown, (2) JSON, (3) YAML (default: markdown)"
|
|
@@ -133,7 +135,7 @@ Compare a manual plan bundle with an auto-derived plan bundle to detect deviatio
|
|
|
133
135
|
## Command
|
|
134
136
|
|
|
135
137
|
```bash
|
|
136
|
-
specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yaml}] [--out PATH]
|
|
138
|
+
specfact plan compare [--manual PATH] [--auto PATH] [--output-format {markdown|json|yaml}] [--out PATH]
|
|
137
139
|
```
|
|
138
140
|
|
|
139
141
|
**Note**: Mode is auto-detected by the CLI. No need to specify `--mode` flag.
|
|
@@ -144,11 +146,16 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
144
146
|
|
|
145
147
|
**Arguments:**
|
|
146
148
|
|
|
147
|
-
- `--manual PATH` - Manual
|
|
148
|
-
- `--auto PATH` - Auto-derived
|
|
149
|
-
- `--format {markdown|json|yaml}` - Output format (default: `markdown`) - **ASK USER if not specified**
|
|
149
|
+
- `--manual PATH` - Manual bundle path (project bundle directory or legacy plan file). Default: active bundle or `.specfact/projects/main/` - **ASK USER if default not found**
|
|
150
|
+
- `--auto PATH` - Auto-derived bundle path (project bundle directory or legacy plan file). Default: latest in `.specfact/projects/` - **ASK USER if default not found**
|
|
151
|
+
- `--output-format {markdown|json|yaml}` - Output format (default: `markdown`) - **ASK USER if not specified**
|
|
150
152
|
- `--out PATH` - Output file path (optional, default: auto-generated in `.specfact/reports/comparison/`)
|
|
151
153
|
|
|
154
|
+
**Note**: Paths can be:
|
|
155
|
+
|
|
156
|
+
- Project bundle directories: `.specfact/projects/<bundle-name>/` (modular format)
|
|
157
|
+
- Legacy plan files: `.specfact/plans/*.bundle.<format>` (monolithic format, for backward compatibility)
|
|
158
|
+
|
|
152
159
|
**What it does:**
|
|
153
160
|
|
|
154
161
|
1. Loads and validates both plan bundles (manual and auto-derived)
|
|
@@ -181,13 +188,14 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
181
188
|
specfact plan select <plan_number>
|
|
182
189
|
```
|
|
183
190
|
|
|
184
|
-
- Parse the CLI output to get the full
|
|
185
|
-
- Construct full path: `.specfact/plans/<plan_name>`
|
|
191
|
+
- Parse the CLI output to get the full bundle name
|
|
192
|
+
- Construct full path: `.specfact/projects/<bundle-name>/` (for project bundles) or `.specfact/plans/<plan_name>` (for legacy bundles)
|
|
186
193
|
|
|
187
|
-
- **For CI/CD/non-interactive use**: Use `--
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
specfact plan select --
|
|
194
|
+
- **For CI/CD/non-interactive use**: Use `--no-interactive` with filters:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
specfact plan select --no-interactive --current
|
|
198
|
+
specfact plan select --no-interactive --last 1
|
|
191
199
|
```
|
|
192
200
|
|
|
193
201
|
- **If user input contains plan names** (e.g., "main.bundle.<format> vs auto-derived.bundle.<format>"):
|
|
@@ -198,14 +206,14 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
198
206
|
|
|
199
207
|
**Step 2**: Resolve manual plan path.
|
|
200
208
|
|
|
201
|
-
- **If plan number
|
|
202
|
-
- **If missing**: Check if default path (`.specfact/plans/main.bundle.<format>`) exists using CLI
|
|
203
|
-
- **Verify using CLI**: Attempt to use the path with `specfact plan compare` - if it fails, the
|
|
209
|
+
- **If bundle name/plan number provided**: Use CLI to resolve (see Step 1)
|
|
210
|
+
- **If missing**: Check if default path (`.specfact/projects/main/` or `.specfact/plans/main.bundle.<format>`) exists using CLI
|
|
211
|
+
- **Verify using CLI**: Attempt to use the path with `specfact plan compare` - if it fails, the bundle doesn't exist
|
|
204
212
|
- **If not exists**: Ask user and **WAIT**:
|
|
205
213
|
|
|
206
214
|
```text
|
|
207
|
-
"Manual
|
|
208
|
-
or create one with `specfact plan init
|
|
215
|
+
"Manual bundle not found at default location. Enter bundle name, plan number, or path to manual bundle,
|
|
216
|
+
or create one with `specfact plan init <bundle-name>`?
|
|
209
217
|
[WAIT FOR USER RESPONSE - DO NOT CONTINUE]"
|
|
210
218
|
```
|
|
211
219
|
|
|
@@ -220,7 +228,7 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
220
228
|
```
|
|
221
229
|
|
|
222
230
|
- **Parse CLI output** to find latest auto-derived plan (by modification date)
|
|
223
|
-
- **For CI/CD/non-interactive**: Use `specfact plan select --
|
|
231
|
+
- **For CI/CD/non-interactive**: Use `specfact plan select --no-interactive --last 1` to get most recent plan
|
|
224
232
|
- **If found**: Ask user and **WAIT**:
|
|
225
233
|
|
|
226
234
|
```text
|
|
@@ -231,12 +239,12 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
231
239
|
- **If not found**: Ask user and **WAIT**:
|
|
232
240
|
|
|
233
241
|
```text
|
|
234
|
-
"No auto-derived
|
|
235
|
-
or generate one with `specfact import from-code --repo
|
|
242
|
+
"No auto-derived bundles found. Enter bundle name, plan number, or path to auto-derived bundle,
|
|
243
|
+
or generate one with `specfact import from-code <bundle-name> --repo .`?
|
|
236
244
|
[WAIT FOR USER RESPONSE - DO NOT CONTINUE]"
|
|
237
245
|
```
|
|
238
246
|
|
|
239
|
-
**Step 3**: Check if `--format` is specified.
|
|
247
|
+
**Step 3**: Check if `--output-format` is specified.
|
|
240
248
|
|
|
241
249
|
- **If missing**: Ask user and **WAIT**:
|
|
242
250
|
|
|
@@ -278,15 +286,16 @@ specfact plan compare [--manual PATH] [--auto PATH] [--format {markdown|json|yam
|
|
|
278
286
|
**⚠️ CRITICAL**: Use the resolved file paths (not plan numbers) in the CLI command:
|
|
279
287
|
|
|
280
288
|
```bash
|
|
281
|
-
specfact plan compare --manual <MANUAL_PATH> --auto <AUTO_PATH> --format <FORMAT> --out <OUT_PATH>
|
|
289
|
+
specfact plan compare --manual <MANUAL_PATH> --auto <AUTO_PATH> --output-format <FORMAT> --out <OUT_PATH>
|
|
282
290
|
```
|
|
283
291
|
|
|
284
|
-
**Example**: If user said "
|
|
292
|
+
**Example**: If user said "legacy-api vs modernized-api", execute:
|
|
285
293
|
|
|
286
|
-
|
|
287
|
-
|
|
294
|
+
```bash
|
|
295
|
+
specfact plan compare --manual .specfact/projects/legacy-api/ --auto .specfact/projects/modernized-api/
|
|
296
|
+
```
|
|
288
297
|
|
|
289
|
-
|
|
298
|
+
**Example**: If user said "19 vs 20" (legacy plan numbers), and CLI resolved them to legacy plan files:
|
|
290
299
|
|
|
291
300
|
```bash
|
|
292
301
|
specfact plan compare --manual .specfact/plans/specfact-import-test-v2.2025-11-17T13-53-31.bundle.<format> --auto .specfact/plans/specfact-import-test-v2.2025-11-17T13-53-31.enriched.2025-11-17T13-55-40.bundle.<format>
|
|
@@ -306,14 +315,14 @@ specfact plan compare --manual .specfact/plans/specfact-import-test-v2.2025-11-1
|
|
|
306
315
|
```bash
|
|
307
316
|
SpecFact CLI - Plan Comparator
|
|
308
317
|
|
|
309
|
-
Manual
|
|
310
|
-
Auto
|
|
318
|
+
Manual Bundle: .specfact/projects/main/
|
|
319
|
+
Auto Bundle: .specfact/projects/legacy-api/
|
|
311
320
|
Total Deviations: 15
|
|
312
321
|
|
|
313
322
|
Comparison Results
|
|
314
323
|
|
|
315
|
-
Manual
|
|
316
|
-
Auto
|
|
324
|
+
Manual Bundle: .specfact/projects/main/
|
|
325
|
+
Auto Bundle: .specfact/projects/legacy-api/
|
|
317
326
|
Total Deviations: 15
|
|
318
327
|
|
|
319
328
|
Deviation Summary:
|
|
@@ -358,7 +367,7 @@ Fix the blocking deviations or adjust enforcement config
|
|
|
358
367
|
**ALWAYS execute the specfact CLI** to perform the comparison:
|
|
359
368
|
|
|
360
369
|
```bash
|
|
361
|
-
specfact plan compare --manual <manual_path> --auto <auto_path> --format <format> --out <output_path>
|
|
370
|
+
specfact plan compare --manual <manual_path> --auto <auto_path> --output-format <format> --out <output_path>
|
|
362
371
|
```
|
|
363
372
|
|
|
364
373
|
**The CLI performs**:
|