specweave 0.24.13 → 0.26.2
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.
- package/CLAUDE.md +586 -18
- package/bin/specweave.js +14 -0
- package/dist/plugins/specweave-github/lib/CodeValidator.js +2 -2
- package/dist/plugins/specweave-github/lib/CodeValidator.js.map +1 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +17 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-issue-updater.js +1 -1
- package/dist/plugins/specweave-github/lib/github-issue-updater.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +7 -6
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -1
- package/dist/src/adapters/adapter-base.js +1 -1
- package/dist/src/adapters/adapter-base.js.map +1 -1
- package/dist/src/adapters/adapter-loader.js +1 -1
- package/dist/src/adapters/adapter-loader.js.map +1 -1
- package/dist/src/adapters/agents-md-generator.js +1 -1
- package/dist/src/adapters/agents-md-generator.js.map +1 -1
- package/dist/src/adapters/claude/adapter.js +1 -1
- package/dist/src/adapters/claude/adapter.js.map +1 -1
- package/dist/src/adapters/claude-md-generator.js +1 -1
- package/dist/src/adapters/claude-md-generator.js.map +1 -1
- package/dist/src/adapters/codex/adapter.js +1 -1
- package/dist/src/adapters/codex/adapter.js.map +1 -1
- package/dist/src/adapters/cursor/adapter.js +1 -1
- package/dist/src/adapters/cursor/adapter.js.map +1 -1
- package/dist/src/adapters/doc-generator.js +1 -1
- package/dist/src/adapters/doc-generator.js.map +1 -1
- package/dist/src/adapters/gemini/adapter.js +1 -1
- package/dist/src/adapters/gemini/adapter.js.map +1 -1
- package/dist/src/adapters/generic/adapter.js +1 -1
- package/dist/src/adapters/generic/adapter.js.map +1 -1
- package/dist/src/cli/commands/cicd-monitor.js +1 -1
- package/dist/src/cli/commands/cicd-monitor.js.map +1 -1
- package/dist/src/cli/commands/delete-feature.d.ts +14 -0
- package/dist/src/cli/commands/delete-feature.d.ts.map +1 -0
- package/dist/src/cli/commands/delete-feature.js +87 -0
- package/dist/src/cli/commands/delete-feature.js.map +1 -0
- package/dist/src/cli/commands/detect-specs.js +1 -1
- package/dist/src/cli/commands/detect-specs.js.map +1 -1
- package/dist/src/cli/commands/import-external.js +1 -1
- package/dist/src/cli/commands/import-external.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +39 -49
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/install.js +1 -1
- package/dist/src/cli/commands/install.js.map +1 -1
- package/dist/src/cli/commands/list.js +1 -1
- package/dist/src/cli/commands/list.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js +1 -1
- package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -1
- package/dist/src/cli/commands/plan/agent-invoker.js +1 -1
- package/dist/src/cli/commands/repair-status-desync.js +1 -1
- package/dist/src/cli/commands/repair-status-desync.js.map +1 -1
- package/dist/src/cli/commands/revert-wip-limit.js +1 -1
- package/dist/src/cli/commands/revert-wip-limit.js.map +1 -1
- package/dist/src/cli/commands/sync-specs.js +1 -1
- package/dist/src/cli/commands/sync-specs.js.map +1 -1
- package/dist/src/cli/helpers/init/initial-increment-generator.js +1 -1
- package/dist/src/cli/helpers/init/initial-increment-generator.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +13 -46
- package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +12 -31
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +6 -1
- package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
- package/dist/src/config/import-config.js +1 -1
- package/dist/src/config/import-config.js.map +1 -1
- package/dist/src/config/types.d.ts +203 -1208
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/core/ac-test-validator-cli.js +1 -1
- package/dist/src/core/ac-test-validator-cli.js.map +1 -1
- package/dist/src/core/ac-test-validator.js +1 -1
- package/dist/src/core/ac-test-validator.js.map +1 -1
- package/dist/src/core/brownfield/analyzer.js +1 -1
- package/dist/src/core/brownfield/analyzer.js.map +1 -1
- package/dist/src/core/brownfield/importer.js +1 -1
- package/dist/src/core/brownfield/importer.js.map +1 -1
- package/dist/src/core/cicd/config-loader.js +1 -1
- package/dist/src/core/cicd/config-loader.js.map +1 -1
- package/dist/src/core/cicd/notifier.js +1 -1
- package/dist/src/core/cicd/notifier.js.map +1 -1
- package/dist/src/core/cicd/parent-repo-validator.js +1 -1
- package/dist/src/core/cicd/parent-repo-validator.js.map +1 -1
- package/dist/src/core/cicd/state-manager.js +1 -1
- package/dist/src/core/cicd/state-manager.js.map +1 -1
- package/dist/src/core/config-manager.js +1 -1
- package/dist/src/core/config-manager.js.map +1 -1
- package/dist/src/core/cost-tracker.js +1 -1
- package/dist/src/core/cost-tracker.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.js +1 -1
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -1
- package/dist/src/core/feature-deleter/audit-logger.d.ts +30 -0
- package/dist/src/core/feature-deleter/audit-logger.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/audit-logger.js +77 -0
- package/dist/src/core/feature-deleter/audit-logger.js.map +1 -0
- package/dist/src/core/feature-deleter/confirmation-manager.d.ts +39 -0
- package/dist/src/core/feature-deleter/confirmation-manager.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/confirmation-manager.js +89 -0
- package/dist/src/core/feature-deleter/confirmation-manager.js.map +1 -0
- package/dist/src/core/feature-deleter/deletion-transaction.d.ts +51 -0
- package/dist/src/core/feature-deleter/deletion-transaction.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/deletion-transaction.js +185 -0
- package/dist/src/core/feature-deleter/deletion-transaction.js.map +1 -0
- package/dist/src/core/feature-deleter/git-service.d.ts +43 -0
- package/dist/src/core/feature-deleter/git-service.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/git-service.js +127 -0
- package/dist/src/core/feature-deleter/git-service.js.map +1 -0
- package/dist/src/core/feature-deleter/github-service.d.ts +36 -0
- package/dist/src/core/feature-deleter/github-service.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/github-service.js +102 -0
- package/dist/src/core/feature-deleter/github-service.js.map +1 -0
- package/dist/src/core/feature-deleter/index.d.ts +35 -0
- package/dist/src/core/feature-deleter/index.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/index.js +199 -0
- package/dist/src/core/feature-deleter/index.js.map +1 -0
- package/dist/src/core/feature-deleter/types.d.ts +179 -0
- package/dist/src/core/feature-deleter/types.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/types.js +7 -0
- package/dist/src/core/feature-deleter/types.js.map +1 -0
- package/dist/src/core/feature-deleter/validator.d.ts +46 -0
- package/dist/src/core/feature-deleter/validator.d.ts.map +1 -0
- package/dist/src/core/feature-deleter/validator.js +231 -0
- package/dist/src/core/feature-deleter/validator.js.map +1 -0
- package/dist/src/core/hooks/HealthReporter.js +1 -1
- package/dist/src/core/hooks/HealthReporter.js.map +1 -1
- package/dist/src/core/hooks/HookAutoFixer.js +1 -1
- package/dist/src/core/hooks/HookAutoFixer.js.map +1 -1
- package/dist/src/core/hooks/HookScanner.js +1 -1
- package/dist/src/core/hooks/HookScanner.js.map +1 -1
- package/dist/src/core/i18n/language-manager.js +1 -1
- package/dist/src/core/i18n/language-manager.js.map +1 -1
- package/dist/src/core/i18n/locale-manager.js +1 -1
- package/dist/src/core/i18n/locale-manager.js.map +1 -1
- package/dist/src/core/i18n/system-prompt-injector.js +1 -1
- package/dist/src/core/i18n/system-prompt-injector.js.map +1 -1
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
- package/dist/src/core/increment/ac-status-manager.js +18 -4
- package/dist/src/core/increment/ac-status-manager.js.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +1 -1
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/completion-validator.js +1 -1
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.js +1 -1
- package/dist/src/core/increment/conflict-resolver.js.map +1 -1
- package/dist/src/core/increment/desync-detector.js +1 -1
- package/dist/src/core/increment/desync-detector.js.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +1 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.js +1 -1
- package/dist/src/core/increment/duplicate-detector.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +1 -1
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-reopener.js +1 -1
- package/dist/src/core/increment/increment-reopener.js.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +1 -1
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/metadata-validator.js +1 -1
- package/dist/src/core/increment/metadata-validator.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.js +1 -1
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -1
- package/dist/src/core/increment/spec-frontmatter-updater.js +1 -1
- package/dist/src/core/increment/spec-frontmatter-updater.js.map +1 -1
- package/dist/src/core/increment/status-auto-transition.js +1 -1
- package/dist/src/core/increment/status-auto-transition.js.map +1 -1
- package/dist/src/core/increment-status.js +1 -1
- package/dist/src/core/increment-status.js.map +1 -1
- package/dist/src/core/living-docs/content-distributor.js +1 -1
- package/dist/src/core/living-docs/content-distributor.js.map +1 -1
- package/dist/src/core/living-docs/cross-linker.js +1 -1
- package/dist/src/core/living-docs/cross-linker.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +1 -1
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +72 -13
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +1 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.js +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -1
- package/dist/src/core/logging/prompt-logger.js +1 -1
- package/dist/src/core/logging/prompt-logger.js.map +1 -1
- package/dist/src/core/plugin-loader.js +1 -1
- package/dist/src/core/plugin-loader.js.map +1 -1
- package/dist/src/core/project-manager.js +1 -1
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/qa/qa-runner.js +1 -1
- package/dist/src/core/qa/qa-runner.js.map +1 -1
- package/dist/src/core/repo-structure/folder-detector.js +1 -1
- package/dist/src/core/repo-structure/folder-detector.js.map +1 -1
- package/dist/src/core/repo-structure/setup-state-manager.js +1 -1
- package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -1
- package/dist/src/core/spec-detector.js +1 -1
- package/dist/src/core/spec-detector.js.map +1 -1
- package/dist/src/core/specs/spec-metadata-manager.js +1 -1
- package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
- package/dist/src/core/status-line/status-line-updater.js +1 -1
- package/dist/src/core/status-line/status-line-updater.js.map +1 -1
- package/dist/src/core/status-line-validator.js +1 -1
- package/dist/src/core/status-line-validator.js.map +1 -1
- package/dist/src/core/sync/bidirectional-engine.js +1 -1
- package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
- package/dist/src/core/sync/profile-manager.js +1 -1
- package/dist/src/core/sync/profile-manager.js.map +1 -1
- package/dist/src/core/sync/project-context.js +1 -1
- package/dist/src/core/sync/project-context.js.map +1 -1
- package/dist/src/core/sync/sync-event-logger.js +1 -1
- package/dist/src/core/sync/sync-event-logger.js.map +1 -1
- package/dist/src/core/types/config.js +1 -1
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/us-completion-detector.d.ts +124 -0
- package/dist/src/core/us-completion-detector.d.ts.map +1 -0
- package/dist/src/core/us-completion-detector.js +270 -0
- package/dist/src/core/us-completion-detector.js.map +1 -0
- package/dist/src/core/utils/permission-checker.js +1 -1
- package/dist/src/core/utils/permission-checker.js.map +1 -1
- package/dist/src/core/workflow/autonomous-executor.js +1 -1
- package/dist/src/core/workflow/autonomous-executor.js.map +1 -1
- package/dist/src/core/workflow/backlog-scanner.js +1 -1
- package/dist/src/core/workflow/backlog-scanner.js.map +1 -1
- package/dist/src/core/workflow/cost-estimator.js +1 -1
- package/dist/src/core/workflow/cost-estimator.js.map +1 -1
- package/dist/src/core/workflow/state-manager.js +1 -1
- package/dist/src/core/workflow/state-manager.js.map +1 -1
- package/dist/src/importers/duplicate-detector.js +1 -1
- package/dist/src/importers/duplicate-detector.js.map +1 -1
- package/dist/src/importers/item-converter.js +1 -1
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/init/architecture/types.d.ts +33 -140
- package/dist/src/init/architecture/types.d.ts.map +1 -1
- package/dist/src/init/compliance/types.d.ts +30 -27
- package/dist/src/init/compliance/types.d.ts.map +1 -1
- package/dist/src/init/repo/types.d.ts +11 -34
- package/dist/src/init/repo/types.d.ts.map +1 -1
- package/dist/src/init/research/src/config/types.d.ts +15 -82
- package/dist/src/init/research/src/config/types.d.ts.map +1 -1
- package/dist/src/init/research/types.d.ts +38 -93
- package/dist/src/init/research/types.d.ts.map +1 -1
- package/dist/src/init/team/types.d.ts +4 -42
- package/dist/src/init/team/types.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +3 -3
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +1 -1
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/living-docs/id-registry.js +1 -1
- package/dist/src/living-docs/id-registry.js.map +1 -1
- package/dist/src/sync/external-item-sync-service.js +1 -1
- package/dist/src/sync/external-item-sync-service.js.map +1 -1
- package/dist/src/sync/sync-metadata.js +1 -1
- package/dist/src/sync/sync-metadata.js.map +1 -1
- package/dist/src/utils/agents-md-compiler.js +1 -1
- package/dist/src/utils/agents-md-compiler.js.map +1 -1
- package/dist/src/utils/auto-install.js +1 -1
- package/dist/src/utils/auto-install.js.map +1 -1
- package/dist/src/utils/cost-reporter.js +1 -1
- package/dist/src/utils/cost-reporter.js.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +1 -1
- package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/package-installer.js +1 -1
- package/dist/src/utils/docs-preview/package-installer.js.map +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.js +1 -1
- package/dist/src/utils/docs-preview/sidebar-builder.js.map +1 -1
- package/dist/src/utils/env-file-generator.js +1 -1
- package/dist/src/utils/env-file-generator.js.map +1 -1
- package/dist/src/utils/external-resource-validator.js +1 -1
- package/dist/src/utils/external-resource-validator.js.map +1 -1
- package/dist/src/utils/fs-native.d.ts +51 -5
- package/dist/src/utils/fs-native.d.ts.map +1 -1
- package/dist/src/utils/fs-native.js +100 -5
- package/dist/src/utils/fs-native.js.map +1 -1
- package/dist/src/utils/plugin-validator.js +1 -1
- package/dist/src/utils/plugin-validator.js.map +1 -1
- package/dist/src/utils/project-detection.js +1 -1
- package/dist/src/utils/project-detection.js.map +1 -1
- package/dist/src/utils/project-validator.js +1 -1
- package/dist/src/utils/project-validator.js.map +1 -1
- package/dist/src/utils/spec-parser.js +1 -1
- package/dist/src/utils/spec-parser.js.map +1 -1
- package/dist/src/utils/spec-splitter.js +1 -1
- package/dist/src/utils/spec-splitter.js.map +1 -1
- package/dist/src/validators/ac-coverage-validator.js +1 -1
- package/dist/src/validators/ac-coverage-validator.js.map +1 -1
- package/package.json +5 -6
- package/plugins/specweave/agents/code-standards-detective/AGENT.md +47 -0
- package/plugins/specweave/agents/docs-writer/AGENT.md +134 -1
- package/plugins/specweave/agents/increment-quality-judge-v2/AGENT.md +1 -0
- package/plugins/specweave/agents/infrastructure/AGENT.md +48 -1
- package/plugins/specweave/agents/performance/AGENT.md +46 -0
- package/plugins/specweave/agents/pm/AGENT.md +115 -3
- package/plugins/specweave/agents/qa-lead/AGENT.md +40 -1
- package/plugins/specweave/agents/reflective-reviewer/AGENT.md +5 -0
- package/plugins/specweave/agents/security/AGENT.md +45 -0
- package/plugins/specweave/agents/tdd-orchestrator/AGENT.md +128 -1
- package/plugins/specweave/agents/tech-lead/AGENT.md +138 -1
- package/plugins/specweave/agents/translator/AGENT.md +132 -0
- package/plugins/specweave/commands/specweave-sync-progress.md +616 -0
- package/plugins/specweave/hooks/hooks.json +0 -9
- package/plugins/specweave/hooks/post-increment-completion.sh +133 -0
- package/plugins/specweave/hooks/post-metadata-change.sh +28 -23
- package/plugins/specweave/hooks/post-task-completion.sh +7 -0
- package/plugins/specweave/hooks/pre-edit-write-consolidated.sh +44 -7
- package/plugins/specweave/hooks/shared/bulk-operation-detector.sh +167 -0
- package/plugins/specweave/lib/hooks/consolidated-sync.js +19 -2
- package/plugins/specweave/lib/hooks/us-completion-orchestrator.js +135 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +18 -4
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +1 -1
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +1 -1
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +1 -1
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -1
- package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
- package/plugins/specweave/skills/progress-sync/SKILL.md +405 -0
- package/plugins/specweave-ado/lib/ado-project-detector.js +1 -1
- package/plugins/specweave-ado/lib/ado-project-detector.ts +1 -1
- package/plugins/specweave-ado/lib/conflict-resolver.js +1 -1
- package/plugins/specweave-ado/lib/conflict-resolver.ts +1 -1
- package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +1 -1
- package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +5 -0
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -15
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +186 -0
- package/plugins/specweave-github/hooks/README.md +34 -25
- package/plugins/specweave-github/lib/CodeValidator.js +1 -1
- package/plugins/specweave-github/lib/CodeValidator.ts +2 -2
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +1 -1
- package/plugins/specweave-github/lib/github-client-v2.js +13 -1
- package/plugins/specweave-github/lib/github-client-v2.ts +17 -1
- package/plugins/specweave-github/lib/github-issue-updater.js +1 -1
- package/plugins/specweave-github/lib/github-issue-updater.ts +1 -1
- package/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
- package/plugins/specweave-github/lib/github-sync-bidirectional.ts +1 -1
- package/plugins/specweave-github/lib/github-sync-increment-changes.js +1 -1
- package/plugins/specweave-github/lib/github-sync-increment-changes.ts +1 -1
- package/plugins/specweave-github/lib/user-story-issue-builder.js +4 -4
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +7 -6
- package/plugins/specweave-infrastructure/agents/devops/AGENT.md +48 -1
- package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +6 -1
- package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +6 -1
- package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +6 -1
- package/plugins/specweave-infrastructure/agents/sre/AGENT.md +5 -0
- package/plugins/specweave-jira/lib/jira-epic-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-epic-sync.ts +1 -1
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +5 -0
- package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +47 -2
- package/plugins/specweave-ml/agents/data-scientist/AGENT.md +1 -1
- package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +5 -0
- package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +6 -1
- package/plugins/specweave-payments/agents/payment-integration/AGENT.md +1 -1
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +138 -0
- package/plugins/specweave-ado/hooks/hooks.json +0 -15
- package/plugins/specweave-github/hooks/hooks.json +0 -15
- package/plugins/specweave-jira/hooks/hooks.json +0 -15
- package/plugins/specweave-release/hooks/hooks.json +0 -15
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logger for Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-030, T-031, T-032, T-033
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import fs from 'fs/promises';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
|
|
10
|
+
/**
|
|
11
|
+
* Feature Deletion Audit Logger
|
|
12
|
+
* Writes deletion events to JSON Lines log with rotation
|
|
13
|
+
*/
|
|
14
|
+
export class FeatureDeletionAuditLogger {
|
|
15
|
+
constructor(projectRoot, logger) {
|
|
16
|
+
this.MAX_LOG_SIZE = 10 * 1024 * 1024; // 10MB
|
|
17
|
+
this.logger = logger || consoleLogger;
|
|
18
|
+
this.logFile = path.join(projectRoot, '.specweave/logs/feature-deletions.log');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* T-030, T-032, T-033: Log deletion event (JSON Lines format)
|
|
22
|
+
*/
|
|
23
|
+
async logDeletion(event) {
|
|
24
|
+
try {
|
|
25
|
+
// T-031: Check log size and rotate if needed
|
|
26
|
+
await this.rotateIfNeeded();
|
|
27
|
+
// Get user from git config or environment
|
|
28
|
+
const user = await this.getUser();
|
|
29
|
+
// Create full event
|
|
30
|
+
const fullEvent = {
|
|
31
|
+
...event,
|
|
32
|
+
timestamp: new Date().toISOString(),
|
|
33
|
+
user
|
|
34
|
+
};
|
|
35
|
+
// Append JSON line to log
|
|
36
|
+
const logLine = JSON.stringify(fullEvent) + '\n';
|
|
37
|
+
const logDir = path.dirname(this.logFile);
|
|
38
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
39
|
+
await fs.appendFile(this.logFile, logLine);
|
|
40
|
+
this.logger.log(`Audit log written: ${event.featureId} (${event.status})`);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.logger.warn(`Failed to write audit log: ${error}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* T-031: Rotate log if size exceeds 10MB
|
|
48
|
+
*/
|
|
49
|
+
async rotateIfNeeded() {
|
|
50
|
+
try {
|
|
51
|
+
const stats = await fs.stat(this.logFile);
|
|
52
|
+
if (stats.size > this.MAX_LOG_SIZE) {
|
|
53
|
+
this.logger.log('Rotating audit log (>10MB)');
|
|
54
|
+
const rotatedFile = this.logFile + '.1';
|
|
55
|
+
// Rename current log to .1 (overwrite if exists)
|
|
56
|
+
await fs.rename(this.logFile, rotatedFile);
|
|
57
|
+
this.logger.log(`Log rotated: ${path.basename(rotatedFile)}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Log file doesn't exist yet - not an error
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get user from git config or environment
|
|
66
|
+
*/
|
|
67
|
+
async getUser() {
|
|
68
|
+
try {
|
|
69
|
+
const result = await execFileNoThrow('git', ['config', 'user.name']);
|
|
70
|
+
return result.stdout.trim();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return process.env.USER || 'unknown';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/audit-logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IAKrC,YAAY,WAAmB,EAAE,MAAe;QAF/B,iBAAY,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;QAGvD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uCAAuC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAgD;QAChE,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAE5B,0CAA0C;YAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAElC,oBAAoB;YACpB,MAAM,SAAS,GAAkB;gBAC/B,GAAG,KAAK;gBACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,IAAI;aACL,CAAC;YAEF,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAE9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBAExC,iDAAiD;gBACjD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAE3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;YACrE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;QACvC,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation Manager - Multi-gate confirmation UX
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-004, T-015, T-017, T-018, T-026
|
|
5
|
+
*/
|
|
6
|
+
import { Logger } from '../../utils/logger.js';
|
|
7
|
+
import { ValidationResult, DeletionOptions } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Confirmation Manager - 4-tier safety gates
|
|
10
|
+
* Tier 1: Validation Report (auto-show)
|
|
11
|
+
* Tier 2: Primary Confirmation (y/N)
|
|
12
|
+
* Tier 3: Elevated Confirmation (type "delete" - force mode only)
|
|
13
|
+
* Tier 4: GitHub Confirmation (y/N - if GitHub cleanup needed)
|
|
14
|
+
*/
|
|
15
|
+
export declare class ConfirmationManager {
|
|
16
|
+
private logger;
|
|
17
|
+
constructor(logger?: Logger);
|
|
18
|
+
/**
|
|
19
|
+
* T-004, T-015: Get confirmation from user (multi-gate pattern)
|
|
20
|
+
*/
|
|
21
|
+
confirm(validation: ValidationResult, options: DeletionOptions): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* T-026: GitHub confirmation (separate gate)
|
|
24
|
+
*/
|
|
25
|
+
confirmGitHub(issueCount: number, options: DeletionOptions): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* T-004: Primary confirmation (y/N)
|
|
28
|
+
*/
|
|
29
|
+
private primaryConfirmation;
|
|
30
|
+
/**
|
|
31
|
+
* T-017: Elevated confirmation (type "delete" - force mode)
|
|
32
|
+
*/
|
|
33
|
+
private elevatedConfirmation;
|
|
34
|
+
/**
|
|
35
|
+
* Prompt user for input
|
|
36
|
+
*/
|
|
37
|
+
private prompt;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=confirmation-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/confirmation-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG/D;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAI3B;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBvF;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAanF;;OAEG;YACW,mBAAmB;IAMjC;;OAEG;YACW,oBAAoB;IAWlC;;OAEG;IACH,OAAO,CAAC,MAAM;CAaf"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation Manager - Multi-gate confirmation UX
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-004, T-015, T-017, T-018, T-026
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import * as readline from 'readline';
|
|
8
|
+
/**
|
|
9
|
+
* Confirmation Manager - 4-tier safety gates
|
|
10
|
+
* Tier 1: Validation Report (auto-show)
|
|
11
|
+
* Tier 2: Primary Confirmation (y/N)
|
|
12
|
+
* Tier 3: Elevated Confirmation (type "delete" - force mode only)
|
|
13
|
+
* Tier 4: GitHub Confirmation (y/N - if GitHub cleanup needed)
|
|
14
|
+
*/
|
|
15
|
+
export class ConfirmationManager {
|
|
16
|
+
constructor(logger) {
|
|
17
|
+
this.logger = logger || consoleLogger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* T-004, T-015: Get confirmation from user (multi-gate pattern)
|
|
21
|
+
*/
|
|
22
|
+
async confirm(validation, options) {
|
|
23
|
+
// Tier 1: Validation Report (already shown by validator)
|
|
24
|
+
// Tier 2: Primary Confirmation
|
|
25
|
+
if (!options.yes && !options.dryRun) {
|
|
26
|
+
const primaryConfirmed = await this.primaryConfirmation(validation);
|
|
27
|
+
if (!primaryConfirmed) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Tier 3: Elevated Confirmation (force mode only)
|
|
32
|
+
if (options.force && !options.dryRun) {
|
|
33
|
+
const elevatedConfirmed = await this.elevatedConfirmation(validation);
|
|
34
|
+
if (!elevatedConfirmed) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* T-026: GitHub confirmation (separate gate)
|
|
42
|
+
*/
|
|
43
|
+
async confirmGitHub(issueCount, options) {
|
|
44
|
+
if (options.noGithub || options.dryRun) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (options.yes) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const answer = await this.prompt(`Close ${issueCount} GitHub issue(s)? (y/N): `);
|
|
51
|
+
return answer.toLowerCase() === 'y';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* T-004: Primary confirmation (y/N)
|
|
55
|
+
*/
|
|
56
|
+
async primaryConfirmation(validation) {
|
|
57
|
+
const filesCount = validation.files.length;
|
|
58
|
+
const answer = await this.prompt(`Delete feature ${validation.featureId} (${filesCount} files)? (y/N): `);
|
|
59
|
+
return answer.toLowerCase() === 'y';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* T-017: Elevated confirmation (type "delete" - force mode)
|
|
63
|
+
*/
|
|
64
|
+
async elevatedConfirmation(validation) {
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log('⚠️ WARNING: Force deletion will orphan active increments!');
|
|
67
|
+
console.log(` Affected increments: ${validation.orphanedIncrements.join(', ')}`);
|
|
68
|
+
console.log(` Their metadata will be updated (feature_id removed).`);
|
|
69
|
+
console.log('');
|
|
70
|
+
const answer = await this.prompt('Type "delete" to confirm force deletion: ');
|
|
71
|
+
return answer === 'delete'; // Exact match, case-sensitive
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Prompt user for input
|
|
75
|
+
*/
|
|
76
|
+
prompt(question) {
|
|
77
|
+
const rl = readline.createInterface({
|
|
78
|
+
input: process.stdin,
|
|
79
|
+
output: process.stdout
|
|
80
|
+
});
|
|
81
|
+
return new Promise((resolve) => {
|
|
82
|
+
rl.question(question, (answer) => {
|
|
83
|
+
rl.close();
|
|
84
|
+
resolve(answer.trim());
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=confirmation-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-manager.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/confirmation-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deletion Transaction with 3-Phase Commit
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-007, T-008, T-009, T-010, T-011
|
|
5
|
+
*/
|
|
6
|
+
import { DeletionTransactionOptions, DeletionOptions, DeletionResult, ValidationResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Deletion Transaction - Atomic deletion with rollback
|
|
9
|
+
* Implements 3-phase commit: Validation → Staging → Commit
|
|
10
|
+
*/
|
|
11
|
+
export declare class DeletionTransaction {
|
|
12
|
+
private projectRoot;
|
|
13
|
+
private logger;
|
|
14
|
+
private gitService;
|
|
15
|
+
private backupDir;
|
|
16
|
+
private checkpointFile;
|
|
17
|
+
constructor(options: DeletionTransactionOptions);
|
|
18
|
+
/**
|
|
19
|
+
* T-010: Execute transaction (3-phase commit)
|
|
20
|
+
*/
|
|
21
|
+
execute(validation: ValidationResult, options: DeletionOptions): Promise<DeletionResult>;
|
|
22
|
+
/**
|
|
23
|
+
* T-008, T-010: Phase 2 - Staging (reversible)
|
|
24
|
+
*/
|
|
25
|
+
private stagingPhase;
|
|
26
|
+
/**
|
|
27
|
+
* T-010: Phase 3 - Commit (irreversible)
|
|
28
|
+
*/
|
|
29
|
+
private commitPhase;
|
|
30
|
+
/**
|
|
31
|
+
* T-011: Rollback (restore from backup)
|
|
32
|
+
*/
|
|
33
|
+
private rollback;
|
|
34
|
+
/**
|
|
35
|
+
* T-008: Create backup of files
|
|
36
|
+
*/
|
|
37
|
+
private createBackup;
|
|
38
|
+
/**
|
|
39
|
+
* T-008: Create checkpoint file
|
|
40
|
+
*/
|
|
41
|
+
private createCheckpoint;
|
|
42
|
+
/**
|
|
43
|
+
* T-009: Update orphaned increment metadata (remove feature_id)
|
|
44
|
+
*/
|
|
45
|
+
private updateOrphanedMetadata;
|
|
46
|
+
/**
|
|
47
|
+
* Cleanup backup and checkpoint after successful commit
|
|
48
|
+
*/
|
|
49
|
+
private cleanup;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=deletion-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-transaction.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/deletion-transaction.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAK3G;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,EAAE,0BAA0B;IAa/C;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAwB9F;;OAEG;YACW,YAAY;IAsB1B;;OAEG;YACW,WAAW;IA2BzB;;OAEG;YACW,QAAQ;IAyBtB;;OAEG;YACW,YAAY;IAe1B;;OAEG;YACW,gBAAgB;IAgB9B;;OAEG;YACW,sBAAsB;IAqBpC;;OAEG;YACW,OAAO;CAatB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deletion Transaction with 3-Phase Commit
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-007, T-008, T-009, T-010, T-011
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import { FeatureDeletionGitService } from './git-service.js';
|
|
8
|
+
import fs from 'fs/promises';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Deletion Transaction - Atomic deletion with rollback
|
|
12
|
+
* Implements 3-phase commit: Validation → Staging → Commit
|
|
13
|
+
*/
|
|
14
|
+
export class DeletionTransaction {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.projectRoot = options.projectRoot;
|
|
17
|
+
this.logger = options.logger || consoleLogger;
|
|
18
|
+
this.gitService = new FeatureDeletionGitService({
|
|
19
|
+
projectRoot: this.projectRoot,
|
|
20
|
+
logger: this.logger
|
|
21
|
+
});
|
|
22
|
+
const timestamp = Date.now();
|
|
23
|
+
this.backupDir = path.join(this.projectRoot, '.specweave/state/deletion-backup', `${timestamp}`);
|
|
24
|
+
this.checkpointFile = path.join(this.projectRoot, '.specweave/state/deletion-checkpoint.json');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* T-010: Execute transaction (3-phase commit)
|
|
28
|
+
*/
|
|
29
|
+
async execute(validation, options) {
|
|
30
|
+
this.logger.log('Starting deletion transaction (3-phase commit)');
|
|
31
|
+
try {
|
|
32
|
+
// Phase 1: Validation (already done, passed in)
|
|
33
|
+
this.logger.log('Phase 1: Validation - PASSED');
|
|
34
|
+
// Phase 2: Staging (reversible)
|
|
35
|
+
await this.stagingPhase(validation, options);
|
|
36
|
+
// Phase 3: Commit (irreversible)
|
|
37
|
+
const result = await this.commitPhase(validation, options);
|
|
38
|
+
// Cleanup
|
|
39
|
+
await this.cleanup();
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.logger.error(`Transaction failed: ${error}`);
|
|
44
|
+
await this.rollback(validation.files);
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* T-008, T-010: Phase 2 - Staging (reversible)
|
|
50
|
+
*/
|
|
51
|
+
async stagingPhase(validation, options) {
|
|
52
|
+
this.logger.log('Phase 2: Staging - Creating backup and staging deletions');
|
|
53
|
+
// T-008: Create backup
|
|
54
|
+
await this.createBackup(validation.files);
|
|
55
|
+
// T-008: Create checkpoint
|
|
56
|
+
await this.createCheckpoint(validation);
|
|
57
|
+
// T-018: Stage git deletions
|
|
58
|
+
if (!options.noGit) {
|
|
59
|
+
await this.gitService.stageGitDeletions(validation.files);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// No git - just delete files
|
|
63
|
+
for (const file of validation.files) {
|
|
64
|
+
await fs.unlink(file);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.logger.log('Phase 2: Staging - COMPLETE');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* T-010: Phase 3 - Commit (irreversible)
|
|
71
|
+
*/
|
|
72
|
+
async commitPhase(validation, options) {
|
|
73
|
+
this.logger.log('Phase 3: Commit - Finalizing deletion');
|
|
74
|
+
let commitSha;
|
|
75
|
+
// T-019: Create git commit
|
|
76
|
+
if (!options.noGit) {
|
|
77
|
+
commitSha = await this.gitService.commitDeletion(validation.featureId, validation);
|
|
78
|
+
}
|
|
79
|
+
// T-009: Update orphaned metadata (if force mode)
|
|
80
|
+
if (options.force && validation.orphanedIncrements.length > 0) {
|
|
81
|
+
await this.updateOrphanedMetadata(validation.orphanedIncrements);
|
|
82
|
+
}
|
|
83
|
+
this.logger.log('Phase 3: Commit - COMPLETE');
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
featureId: validation.featureId,
|
|
87
|
+
filesDeleted: validation.files.length,
|
|
88
|
+
commitSha,
|
|
89
|
+
orphanedIncrements: validation.orphanedIncrements,
|
|
90
|
+
warnings: validation.warnings
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* T-011: Rollback (restore from backup)
|
|
95
|
+
*/
|
|
96
|
+
async rollback(files) {
|
|
97
|
+
this.logger.warn('Rolling back transaction...');
|
|
98
|
+
try {
|
|
99
|
+
// Restore files from backup
|
|
100
|
+
for (const file of files) {
|
|
101
|
+
const backupPath = path.join(this.backupDir, path.relative(this.projectRoot, file));
|
|
102
|
+
try {
|
|
103
|
+
await fs.copyFile(backupPath, file);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
this.logger.warn(`Failed to restore ${file}: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Unstage git deletions
|
|
110
|
+
await this.gitService.unstageGitDeletions(files);
|
|
111
|
+
this.logger.log('Rollback complete. Files restored from backup.');
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
this.logger.error(`Rollback failed: ${error}`);
|
|
115
|
+
this.logger.error('Backup preserved at: ' + this.backupDir);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* T-008: Create backup of files
|
|
121
|
+
*/
|
|
122
|
+
async createBackup(files) {
|
|
123
|
+
this.logger.log(`Creating backup at ${this.backupDir}`);
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
const relativePath = path.relative(this.projectRoot, file);
|
|
126
|
+
const backupPath = path.join(this.backupDir, relativePath);
|
|
127
|
+
const backupDirPath = path.dirname(backupPath);
|
|
128
|
+
await fs.mkdir(backupDirPath, { recursive: true });
|
|
129
|
+
await fs.copyFile(file, backupPath);
|
|
130
|
+
}
|
|
131
|
+
this.logger.log(`Backed up ${files.length} files`);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* T-008: Create checkpoint file
|
|
135
|
+
*/
|
|
136
|
+
async createCheckpoint(validation) {
|
|
137
|
+
const checkpoint = {
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
featureId: validation.featureId,
|
|
140
|
+
filesCount: validation.files.length,
|
|
141
|
+
backupDir: this.backupDir,
|
|
142
|
+
phase: 'staging'
|
|
143
|
+
};
|
|
144
|
+
const checkpointDir = path.dirname(this.checkpointFile);
|
|
145
|
+
await fs.mkdir(checkpointDir, { recursive: true });
|
|
146
|
+
await fs.writeFile(this.checkpointFile, JSON.stringify(checkpoint, null, 2));
|
|
147
|
+
this.logger.log('Checkpoint created');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* T-009: Update orphaned increment metadata (remove feature_id)
|
|
151
|
+
*/
|
|
152
|
+
async updateOrphanedMetadata(orphanedIncrements) {
|
|
153
|
+
this.logger.log(`Updating ${orphanedIncrements.length} orphaned increment(s) metadata`);
|
|
154
|
+
for (const incrementId of orphanedIncrements) {
|
|
155
|
+
const metadataPath = path.join(this.projectRoot, '.specweave/increments', incrementId, 'metadata.json');
|
|
156
|
+
try {
|
|
157
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
158
|
+
const metadata = JSON.parse(content);
|
|
159
|
+
// Remove feature_id field
|
|
160
|
+
delete metadata.feature_id;
|
|
161
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));
|
|
162
|
+
this.logger.log(`Updated metadata for ${incrementId}`);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.logger.warn(`Failed to update metadata for ${incrementId}: ${error}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Cleanup backup and checkpoint after successful commit
|
|
171
|
+
*/
|
|
172
|
+
async cleanup() {
|
|
173
|
+
try {
|
|
174
|
+
// Remove backup directory
|
|
175
|
+
await fs.rm(this.backupDir, { recursive: true, force: true });
|
|
176
|
+
// Remove checkpoint file
|
|
177
|
+
await fs.unlink(this.checkpointFile);
|
|
178
|
+
this.logger.log('Cleanup complete');
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
this.logger.warn(`Cleanup failed: ${error}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=deletion-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-transaction.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/deletion-transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Service for Safe Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-018, T-019, T-020, T-021, T-022, T-023
|
|
5
|
+
*/
|
|
6
|
+
import { GitServiceOptions, ValidationResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Feature Deletion Git Service
|
|
9
|
+
* Handles git operations for feature deletion
|
|
10
|
+
*/
|
|
11
|
+
export declare class FeatureDeletionGitService {
|
|
12
|
+
private projectRoot;
|
|
13
|
+
private logger;
|
|
14
|
+
constructor(options: GitServiceOptions);
|
|
15
|
+
/**
|
|
16
|
+
* T-018, T-023: Stage git deletions (git rm for tracked, fs.unlink for untracked)
|
|
17
|
+
*/
|
|
18
|
+
stageGitDeletions(files: string[]): Promise<{
|
|
19
|
+
tracked: number;
|
|
20
|
+
untracked: number;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* T-019: Create git commit with descriptive message
|
|
24
|
+
*/
|
|
25
|
+
commitDeletion(featureId: string, validation: ValidationResult): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* T-021: Unstage git deletions (rollback)
|
|
28
|
+
*/
|
|
29
|
+
unstageGitDeletions(files: string[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* T-023: Detect git repository
|
|
32
|
+
*/
|
|
33
|
+
detectGitRepository(): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if file is tracked by git
|
|
36
|
+
*/
|
|
37
|
+
private isFileTracked;
|
|
38
|
+
/**
|
|
39
|
+
* Get git user name
|
|
40
|
+
*/
|
|
41
|
+
private getGitUser;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=git-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/git-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKjE;;;GAGG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,iBAAiB;IAKtC;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IA4BzF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BtF;;OAEG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7C;;OAEG;YACW,aAAa;IAS3B;;OAEG;YACW,UAAU;CAQzB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Service for Safe Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-018, T-019, T-020, T-021, T-022, T-023
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
|
|
8
|
+
import fs from 'fs/promises';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Feature Deletion Git Service
|
|
12
|
+
* Handles git operations for feature deletion
|
|
13
|
+
*/
|
|
14
|
+
export class FeatureDeletionGitService {
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.projectRoot = options.projectRoot;
|
|
17
|
+
this.logger = options.logger || consoleLogger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* T-018, T-023: Stage git deletions (git rm for tracked, fs.unlink for untracked)
|
|
21
|
+
*/
|
|
22
|
+
async stageGitDeletions(files) {
|
|
23
|
+
let tracked = 0;
|
|
24
|
+
let untracked = 0;
|
|
25
|
+
// Check if git repo exists
|
|
26
|
+
const isGitRepo = await this.detectGitRepository();
|
|
27
|
+
if (!isGitRepo) {
|
|
28
|
+
throw new Error('Not a git repository. Use --no-git to skip git operations.');
|
|
29
|
+
}
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const isTracked = await this.isFileTracked(file);
|
|
32
|
+
if (isTracked) {
|
|
33
|
+
// Use git rm for tracked files
|
|
34
|
+
await execFileNoThrow('git', ['rm', file], { cwd: this.projectRoot });
|
|
35
|
+
tracked++;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Use fs.unlink for untracked files
|
|
39
|
+
await fs.unlink(file);
|
|
40
|
+
untracked++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.logger.log(`Staged ${tracked} tracked files (git rm), ${untracked} untracked files (unlink)`);
|
|
44
|
+
return { tracked, untracked };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* T-019: Create git commit with descriptive message
|
|
48
|
+
*/
|
|
49
|
+
async commitDeletion(featureId, validation) {
|
|
50
|
+
// Get user from git config
|
|
51
|
+
const user = await this.getGitUser();
|
|
52
|
+
const timestamp = new Date().toISOString();
|
|
53
|
+
const mode = validation.mode;
|
|
54
|
+
// Format commit message
|
|
55
|
+
const message = [
|
|
56
|
+
`feat: delete feature ${featureId}`,
|
|
57
|
+
'',
|
|
58
|
+
`- Deleted ${validation.files.length} files`,
|
|
59
|
+
`- Living docs: ${validation.livingDocsFiles.length}`,
|
|
60
|
+
`- User stories: ${validation.userStoryFiles.length}`,
|
|
61
|
+
validation.orphanedIncrements.length > 0 ? `- Orphaned increments: ${validation.orphanedIncrements.join(', ')} (force mode)` : '',
|
|
62
|
+
'',
|
|
63
|
+
`Deleted by: ${user}`,
|
|
64
|
+
`Timestamp: ${timestamp}`,
|
|
65
|
+
`Mode: ${mode}`
|
|
66
|
+
].filter(Boolean).join('\n');
|
|
67
|
+
// Create commit
|
|
68
|
+
await execFileNoThrow('git', ['commit', '-m', message], { cwd: this.projectRoot });
|
|
69
|
+
// Get commit SHA
|
|
70
|
+
const result = await execFileNoThrow('git', ['rev-parse', 'HEAD'], { cwd: this.projectRoot });
|
|
71
|
+
const sha = result.stdout.trim();
|
|
72
|
+
this.logger.log(`Created commit ${sha.substring(0, 7)}`);
|
|
73
|
+
return sha;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* T-021: Unstage git deletions (rollback)
|
|
77
|
+
*/
|
|
78
|
+
async unstageGitDeletions(files) {
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
try {
|
|
81
|
+
await execFileNoThrow('git', ['reset', 'HEAD', '--', file], { cwd: this.projectRoot });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
this.logger.warn(`Failed to unstage ${file}: ${error}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
this.logger.log(`Unstaged ${files.length} files`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* T-023: Detect git repository
|
|
91
|
+
*/
|
|
92
|
+
async detectGitRepository() {
|
|
93
|
+
try {
|
|
94
|
+
const gitDir = path.join(this.projectRoot, '.git');
|
|
95
|
+
await fs.access(gitDir);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if file is tracked by git
|
|
104
|
+
*/
|
|
105
|
+
async isFileTracked(file) {
|
|
106
|
+
try {
|
|
107
|
+
await execFileNoThrow('git', ['ls-files', '--error-unmatch', file], { cwd: this.projectRoot });
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get git user name
|
|
116
|
+
*/
|
|
117
|
+
async getGitUser() {
|
|
118
|
+
try {
|
|
119
|
+
const result = await execFileNoThrow('git', ['config', 'user.name'], { cwd: this.projectRoot });
|
|
120
|
+
return result.stdout.trim();
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return process.env.USER || 'unknown';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=git-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/git-service.ts"],"names":[],"mappings":"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"}
|