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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Service for Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-024, T-025, T-026, T-027, T-028, T-029
|
|
5
|
+
*/
|
|
6
|
+
import { GitHubServiceOptions, GitHubIssue } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Feature Deletion GitHub Service
|
|
9
|
+
* Handles GitHub issue cleanup via gh CLI
|
|
10
|
+
*/
|
|
11
|
+
export declare class FeatureDeletionGitHubService {
|
|
12
|
+
private owner;
|
|
13
|
+
private repo;
|
|
14
|
+
private logger;
|
|
15
|
+
constructor(options: GitHubServiceOptions);
|
|
16
|
+
/**
|
|
17
|
+
* T-024: Find all GitHub issues matching feature pattern
|
|
18
|
+
*/
|
|
19
|
+
findFeatureIssues(featureId: string): Promise<GitHubIssue[]>;
|
|
20
|
+
/**
|
|
21
|
+
* T-025, T-028, T-029: Close GitHub issues with retry logic
|
|
22
|
+
*/
|
|
23
|
+
deleteIssues(issues: GitHubIssue[]): Promise<{
|
|
24
|
+
closed: number;
|
|
25
|
+
failed: number;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* T-029: Close single issue with exponential backoff retry
|
|
29
|
+
*/
|
|
30
|
+
private closeIssueWithRetry;
|
|
31
|
+
/**
|
|
32
|
+
* Sleep helper for retry delay
|
|
33
|
+
*/
|
|
34
|
+
private sleep;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=github-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-service.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/github-service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/D;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,oBAAoB;IAMzC;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA+BlE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBtF;;OAEG;YACW,mBAAmB;IA6BjC;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Service for Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-024, T-025, T-026, T-027, T-028, T-029
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import { execFileNoThrow } from '../../utils/execFileNoThrow.js';
|
|
8
|
+
/**
|
|
9
|
+
* Feature Deletion GitHub Service
|
|
10
|
+
* Handles GitHub issue cleanup via gh CLI
|
|
11
|
+
*/
|
|
12
|
+
export class FeatureDeletionGitHubService {
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.owner = options.owner;
|
|
15
|
+
this.repo = options.repo;
|
|
16
|
+
this.logger = options.logger || consoleLogger;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* T-024: Find all GitHub issues matching feature pattern
|
|
20
|
+
*/
|
|
21
|
+
async findFeatureIssues(featureId) {
|
|
22
|
+
try {
|
|
23
|
+
// Search for issues with [FS-XXX] in title
|
|
24
|
+
const query = `repo:${this.owner}/${this.repo} is:issue "[${featureId}]" in:title`;
|
|
25
|
+
const result = await execFileNoThrow('gh', [
|
|
26
|
+
'issue',
|
|
27
|
+
'list',
|
|
28
|
+
'--search', query,
|
|
29
|
+
'--json', 'number,title,url',
|
|
30
|
+
'--limit', '50'
|
|
31
|
+
]);
|
|
32
|
+
const issues = JSON.parse(result.stdout);
|
|
33
|
+
// Filter to exact pattern: [FS-XXX][US-YYY]
|
|
34
|
+
const pattern = new RegExp(`\\[${featureId}\\]\\[US-\\d{3}\\]`);
|
|
35
|
+
const filteredIssues = issues.filter((issue) => pattern.test(issue.title));
|
|
36
|
+
this.logger.log(`Found ${filteredIssues.length} GitHub issues for ${featureId}`);
|
|
37
|
+
return filteredIssues.map((issue) => ({
|
|
38
|
+
number: issue.number,
|
|
39
|
+
title: issue.title,
|
|
40
|
+
url: issue.url
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.logger.warn(`GitHub issue search failed: ${error}`);
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* T-025, T-028, T-029: Close GitHub issues with retry logic
|
|
50
|
+
*/
|
|
51
|
+
async deleteIssues(issues) {
|
|
52
|
+
let closed = 0;
|
|
53
|
+
let failed = 0;
|
|
54
|
+
for (const issue of issues) {
|
|
55
|
+
const success = await this.closeIssueWithRetry(issue);
|
|
56
|
+
if (success) {
|
|
57
|
+
closed++;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
failed++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
this.logger.log(`GitHub cleanup: ${closed} closed, ${failed} failed`);
|
|
64
|
+
return { closed, failed };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* T-029: Close single issue with exponential backoff retry
|
|
68
|
+
*/
|
|
69
|
+
async closeIssueWithRetry(issue, attempt = 1) {
|
|
70
|
+
try {
|
|
71
|
+
await execFileNoThrow('gh', [
|
|
72
|
+
'issue',
|
|
73
|
+
'close',
|
|
74
|
+
issue.number.toString(),
|
|
75
|
+
'--comment',
|
|
76
|
+
'Closed by feature deletion automation'
|
|
77
|
+
]);
|
|
78
|
+
this.logger.log(`Closed issue #${issue.number}: ${issue.title}`);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const errorMsg = error.toString();
|
|
83
|
+
// T-028: Handle rate limit with retry
|
|
84
|
+
if (errorMsg.includes('rate limit') && attempt <= 3) {
|
|
85
|
+
const delay = Math.pow(2, attempt) * 1000; // 2s, 4s, 8s
|
|
86
|
+
this.logger.warn(`Rate limit hit, retrying in ${delay}ms (attempt ${attempt}/3)`);
|
|
87
|
+
await this.sleep(delay);
|
|
88
|
+
return this.closeIssueWithRetry(issue, attempt + 1);
|
|
89
|
+
}
|
|
90
|
+
// T-028: Handle other errors (non-blocking)
|
|
91
|
+
this.logger.warn(`Failed to close issue #${issue.number}: ${error}`);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Sleep helper for retry delay
|
|
97
|
+
*/
|
|
98
|
+
sleep(ms) {
|
|
99
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=github-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-service.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/github-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Deleter - Main Orchestrator
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-012, T-013, T-014, T-015, T-016, T-017, T-036
|
|
5
|
+
*/
|
|
6
|
+
import { FeatureDeleterOptions, DeletionOptions, DeletionResult } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Feature Deleter - Orchestrates safe feature deletion workflow
|
|
9
|
+
* Steps: Validate → Confirm → Execute Transaction → Audit
|
|
10
|
+
*/
|
|
11
|
+
export declare class FeatureDeleter {
|
|
12
|
+
private projectRoot;
|
|
13
|
+
private logger;
|
|
14
|
+
private validator;
|
|
15
|
+
private confirmationManager;
|
|
16
|
+
private auditLogger;
|
|
17
|
+
constructor(options?: FeatureDeleterOptions);
|
|
18
|
+
/**
|
|
19
|
+
* T-036: Execute feature deletion workflow
|
|
20
|
+
*/
|
|
21
|
+
execute(featureId: string, options: DeletionOptions): Promise<DeletionResult>;
|
|
22
|
+
/**
|
|
23
|
+
* T-012, T-013, T-014, T-015: Handle dry-run mode
|
|
24
|
+
*/
|
|
25
|
+
private handleDryRun;
|
|
26
|
+
/**
|
|
27
|
+
* Handle GitHub issue cleanup
|
|
28
|
+
*/
|
|
29
|
+
private handleGitHubCleanup;
|
|
30
|
+
/**
|
|
31
|
+
* Extract GitHub owner and repo from git remote URL
|
|
32
|
+
*/
|
|
33
|
+
private getGitHubOwnerRepo;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOpF;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,WAAW,CAA6B;gBAEpC,OAAO,GAAE,qBAA0B;IAa/C;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAsFnF;;OAEG;YACW,YAAY;IA4B1B;;OAEG;YACW,mBAAmB;IAwCjC;;OAEG;YACW,kBAAkB;CAgCjC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Deleter - Main Orchestrator
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Tasks: T-012, T-013, T-014, T-015, T-016, T-017, T-036
|
|
5
|
+
*/
|
|
6
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
7
|
+
import { FeatureValidator } from './validator.js';
|
|
8
|
+
import { ConfirmationManager } from './confirmation-manager.js';
|
|
9
|
+
import { DeletionTransaction } from './deletion-transaction.js';
|
|
10
|
+
import { FeatureDeletionGitHubService } from './github-service.js';
|
|
11
|
+
import { FeatureDeletionAuditLogger } from './audit-logger.js';
|
|
12
|
+
/**
|
|
13
|
+
* Feature Deleter - Orchestrates safe feature deletion workflow
|
|
14
|
+
* Steps: Validate → Confirm → Execute Transaction → Audit
|
|
15
|
+
*/
|
|
16
|
+
export class FeatureDeleter {
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.projectRoot = options.projectRoot || process.cwd();
|
|
19
|
+
this.logger = options.logger || consoleLogger;
|
|
20
|
+
this.validator = new FeatureValidator({
|
|
21
|
+
projectRoot: this.projectRoot,
|
|
22
|
+
logger: this.logger
|
|
23
|
+
});
|
|
24
|
+
this.confirmationManager = new ConfirmationManager(this.logger);
|
|
25
|
+
this.auditLogger = new FeatureDeletionAuditLogger(this.projectRoot, this.logger);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* T-036: Execute feature deletion workflow
|
|
29
|
+
*/
|
|
30
|
+
async execute(featureId, options) {
|
|
31
|
+
try {
|
|
32
|
+
// Step 1: Validate
|
|
33
|
+
const validation = await this.validator.validate(featureId, options);
|
|
34
|
+
// T-013, T-014, T-015: Show dry-run report
|
|
35
|
+
if (options.dryRun) {
|
|
36
|
+
return this.handleDryRun(validation, options);
|
|
37
|
+
}
|
|
38
|
+
// T-003: Display validation report
|
|
39
|
+
const report = this.validator.formatValidationReport(validation);
|
|
40
|
+
console.log('\n' + report + '\n');
|
|
41
|
+
// Check validation errors
|
|
42
|
+
if (!validation.valid) {
|
|
43
|
+
await this.auditLogger.logDeletion({
|
|
44
|
+
featureId,
|
|
45
|
+
mode: validation.mode,
|
|
46
|
+
filesDeleted: 0,
|
|
47
|
+
status: 'failed',
|
|
48
|
+
errors: validation.errors
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
featureId,
|
|
53
|
+
filesDeleted: 0,
|
|
54
|
+
errors: validation.errors,
|
|
55
|
+
warnings: validation.warnings
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Step 2: Confirm
|
|
59
|
+
const confirmed = await this.confirmationManager.confirm(validation, options);
|
|
60
|
+
if (!confirmed) {
|
|
61
|
+
console.log('\nDeletion cancelled by user.');
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
featureId,
|
|
65
|
+
filesDeleted: 0,
|
|
66
|
+
errors: ['Cancelled by user']
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// Step 3: Execute transaction
|
|
70
|
+
const transaction = new DeletionTransaction({
|
|
71
|
+
projectRoot: this.projectRoot,
|
|
72
|
+
logger: this.logger
|
|
73
|
+
});
|
|
74
|
+
const result = await transaction.execute(validation, options);
|
|
75
|
+
// Step 4: GitHub cleanup (optional)
|
|
76
|
+
let githubIssuesClosed = 0;
|
|
77
|
+
if (!options.noGithub) {
|
|
78
|
+
githubIssuesClosed = await this.handleGitHubCleanup(validation, options);
|
|
79
|
+
result.githubIssuesClosed = githubIssuesClosed;
|
|
80
|
+
}
|
|
81
|
+
// Step 5: Audit log
|
|
82
|
+
await this.auditLogger.logDeletion({
|
|
83
|
+
featureId,
|
|
84
|
+
mode: validation.mode,
|
|
85
|
+
filesDeleted: result.filesDeleted,
|
|
86
|
+
commitSha: result.commitSha,
|
|
87
|
+
orphanedIncrements: result.orphanedIncrements,
|
|
88
|
+
githubIssuesClosed,
|
|
89
|
+
status: 'success'
|
|
90
|
+
});
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Log failure
|
|
95
|
+
await this.auditLogger.logDeletion({
|
|
96
|
+
featureId,
|
|
97
|
+
mode: options.force ? 'force' : 'safe',
|
|
98
|
+
filesDeleted: 0,
|
|
99
|
+
status: 'failed',
|
|
100
|
+
errors: [error.message || error.toString()]
|
|
101
|
+
});
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* T-012, T-013, T-014, T-015: Handle dry-run mode
|
|
107
|
+
*/
|
|
108
|
+
async handleDryRun(validation, options) {
|
|
109
|
+
console.log('\n[DRY-RUN] Deletion Plan:\n');
|
|
110
|
+
console.log(this.validator.formatValidationReport(validation));
|
|
111
|
+
console.log('\nFiles to delete:');
|
|
112
|
+
validation.files.forEach((f) => console.log(` ${f}`));
|
|
113
|
+
console.log('\nGit operations:');
|
|
114
|
+
console.log(` - git rm (tracked files)`);
|
|
115
|
+
console.log(` - rm (untracked files)`);
|
|
116
|
+
console.log(` - git commit -m "feat: delete feature ${validation.featureId}"`);
|
|
117
|
+
if (!options.noGithub && validation.githubIssues?.length > 0) {
|
|
118
|
+
console.log('\nGitHub operations:');
|
|
119
|
+
validation.githubIssues.forEach((issue) => {
|
|
120
|
+
console.log(` - Close issue #${issue.number}: ${issue.title}`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
console.log('\n✓ Dry-run complete (no changes made)\n');
|
|
124
|
+
return {
|
|
125
|
+
success: true,
|
|
126
|
+
featureId: validation.featureId,
|
|
127
|
+
filesDeleted: 0,
|
|
128
|
+
warnings: ['Dry-run mode - no changes made']
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Handle GitHub issue cleanup
|
|
133
|
+
*/
|
|
134
|
+
async handleGitHubCleanup(validation, options) {
|
|
135
|
+
try {
|
|
136
|
+
// Extract owner/repo from git remote
|
|
137
|
+
const { owner, repo } = await this.getGitHubOwnerRepo();
|
|
138
|
+
if (!owner || !repo) {
|
|
139
|
+
this.logger.warn('GitHub cleanup skipped: Unable to detect owner/repo from git remote');
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
// Find GitHub issues
|
|
143
|
+
const githubService = new FeatureDeletionGitHubService({
|
|
144
|
+
owner,
|
|
145
|
+
repo,
|
|
146
|
+
logger: this.logger
|
|
147
|
+
});
|
|
148
|
+
const issues = await githubService.findFeatureIssues(validation.featureId);
|
|
149
|
+
if (issues.length === 0) {
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
// T-026: Confirm GitHub cleanup
|
|
153
|
+
const confirmed = await this.confirmationManager.confirmGitHub(issues.length, options);
|
|
154
|
+
if (!confirmed) {
|
|
155
|
+
console.log('GitHub cleanup skipped.');
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
// Close issues
|
|
159
|
+
const { closed } = await githubService.deleteIssues(issues);
|
|
160
|
+
return closed;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
this.logger.warn(`GitHub cleanup failed (non-critical): ${error}`);
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Extract GitHub owner and repo from git remote URL
|
|
169
|
+
*/
|
|
170
|
+
async getGitHubOwnerRepo() {
|
|
171
|
+
try {
|
|
172
|
+
const { execFileNoThrow } = await import('../../utils/execFileNoThrow.js');
|
|
173
|
+
const result = await execFileNoThrow('git', ['remote', 'get-url', 'origin'], {
|
|
174
|
+
cwd: this.projectRoot
|
|
175
|
+
});
|
|
176
|
+
if (!result.success) {
|
|
177
|
+
return { owner: '', repo: '' };
|
|
178
|
+
}
|
|
179
|
+
const remoteUrl = result.stdout.trim();
|
|
180
|
+
// Parse GitHub URL patterns:
|
|
181
|
+
// - https://github.com/owner/repo.git
|
|
182
|
+
// - git@github.com:owner/repo.git
|
|
183
|
+
// - https://github.com/owner/repo
|
|
184
|
+
const httpsMatch = remoteUrl.match(/github\.com[/:]([\w-]+)\/([\w-]+?)(\.git)?$/);
|
|
185
|
+
if (httpsMatch) {
|
|
186
|
+
return {
|
|
187
|
+
owner: httpsMatch[1],
|
|
188
|
+
repo: httpsMatch[2]
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return { owner: '', repo: '' };
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
this.logger.warn(`Failed to extract GitHub owner/repo: ${error}`);
|
|
195
|
+
return { owner: '', repo: '' };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Safe Feature Deletion Command
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Feature: FS-052
|
|
5
|
+
*/
|
|
6
|
+
import { Logger } from '../../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options for feature deletion operation
|
|
9
|
+
*/
|
|
10
|
+
export interface DeletionOptions {
|
|
11
|
+
/** Bypass active increment validation (force deletion) */
|
|
12
|
+
force?: boolean;
|
|
13
|
+
/** Preview deletion without executing (dry-run mode) */
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
/** Skip git operations (use filesystem only) */
|
|
16
|
+
noGit?: boolean;
|
|
17
|
+
/** Skip GitHub issue cleanup */
|
|
18
|
+
noGithub?: boolean;
|
|
19
|
+
/** Skip confirmations (except elevated confirmation in force mode) */
|
|
20
|
+
yes?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of feature deletion operation
|
|
24
|
+
*/
|
|
25
|
+
export interface DeletionResult {
|
|
26
|
+
/** Whether deletion succeeded */
|
|
27
|
+
success: boolean;
|
|
28
|
+
/** Feature ID that was deleted */
|
|
29
|
+
featureId: string;
|
|
30
|
+
/** Number of files deleted */
|
|
31
|
+
filesDeleted: number;
|
|
32
|
+
/** Git commit SHA (if git operations executed) */
|
|
33
|
+
commitSha?: string;
|
|
34
|
+
/** Number of GitHub issues closed */
|
|
35
|
+
githubIssuesClosed?: number;
|
|
36
|
+
/** Increment IDs orphaned by force deletion */
|
|
37
|
+
orphanedIncrements?: string[];
|
|
38
|
+
/** Execution steps with checkpoints */
|
|
39
|
+
steps?: CheckpointStep[];
|
|
40
|
+
/** Errors encountered during deletion */
|
|
41
|
+
errors?: string[];
|
|
42
|
+
/** Warnings (non-blocking issues) */
|
|
43
|
+
warnings?: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Checkpoint step for transaction tracking
|
|
47
|
+
*/
|
|
48
|
+
export interface CheckpointStep {
|
|
49
|
+
/** Step name */
|
|
50
|
+
name: string;
|
|
51
|
+
/** Step status */
|
|
52
|
+
status: 'pending' | 'in-progress' | 'completed' | 'failed';
|
|
53
|
+
/** Timestamp (ISO 8601) */
|
|
54
|
+
timestamp: string;
|
|
55
|
+
/** Error message (if failed) */
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validation result for feature deletion
|
|
60
|
+
*/
|
|
61
|
+
export interface ValidationResult {
|
|
62
|
+
/** Whether validation passed */
|
|
63
|
+
valid: boolean;
|
|
64
|
+
/** Errors that block deletion */
|
|
65
|
+
errors: string[];
|
|
66
|
+
/** Warnings that don't block deletion */
|
|
67
|
+
warnings?: string[];
|
|
68
|
+
/** Feature ID being validated */
|
|
69
|
+
featureId: string;
|
|
70
|
+
/** All files to delete */
|
|
71
|
+
files: string[];
|
|
72
|
+
/** Living docs folder files */
|
|
73
|
+
livingDocsFiles: string[];
|
|
74
|
+
/** User story markdown files */
|
|
75
|
+
userStoryFiles: string[];
|
|
76
|
+
/** Active increments referencing feature (orphaned if force mode) */
|
|
77
|
+
orphanedIncrements: string[];
|
|
78
|
+
/** GitHub issues to close */
|
|
79
|
+
githubIssues?: GitHubIssue[];
|
|
80
|
+
/** Validation mode (safe or force) */
|
|
81
|
+
mode: 'safe' | 'force';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* GitHub issue metadata
|
|
85
|
+
*/
|
|
86
|
+
export interface GitHubIssue {
|
|
87
|
+
/** Issue number */
|
|
88
|
+
number: number;
|
|
89
|
+
/** Issue title */
|
|
90
|
+
title: string;
|
|
91
|
+
/** Issue URL */
|
|
92
|
+
url: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Audit log event for feature deletion
|
|
96
|
+
*/
|
|
97
|
+
export interface DeletionEvent {
|
|
98
|
+
/** Feature ID deleted */
|
|
99
|
+
featureId: string;
|
|
100
|
+
/** Timestamp (ISO 8601) */
|
|
101
|
+
timestamp: string;
|
|
102
|
+
/** User who performed deletion */
|
|
103
|
+
user: string;
|
|
104
|
+
/** Deletion mode (safe or force) */
|
|
105
|
+
mode: 'safe' | 'force';
|
|
106
|
+
/** Number of files deleted */
|
|
107
|
+
filesDeleted: number;
|
|
108
|
+
/** Git commit SHA (if committed) */
|
|
109
|
+
commitSha?: string;
|
|
110
|
+
/** Orphaned increment IDs (if force mode) */
|
|
111
|
+
orphanedIncrements?: string[];
|
|
112
|
+
/** Number of GitHub issues closed */
|
|
113
|
+
githubIssuesClosed?: number;
|
|
114
|
+
/** Deletion status (success, partial, failed) */
|
|
115
|
+
status: 'success' | 'partial' | 'failed';
|
|
116
|
+
/** Errors encountered */
|
|
117
|
+
errors?: string[];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Constructor options for FeatureValidator
|
|
121
|
+
*/
|
|
122
|
+
export interface FeatureValidatorOptions {
|
|
123
|
+
/** Project root directory */
|
|
124
|
+
projectRoot?: string;
|
|
125
|
+
/** Logger instance */
|
|
126
|
+
logger?: Logger;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Constructor options for FeatureDeleter
|
|
130
|
+
*/
|
|
131
|
+
export interface FeatureDeleterOptions {
|
|
132
|
+
/** Project root directory */
|
|
133
|
+
projectRoot?: string;
|
|
134
|
+
/** Logger instance */
|
|
135
|
+
logger?: Logger;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Constructor options for DeletionTransaction
|
|
139
|
+
*/
|
|
140
|
+
export interface DeletionTransactionOptions {
|
|
141
|
+
/** Project root directory */
|
|
142
|
+
projectRoot: string;
|
|
143
|
+
/** Logger instance */
|
|
144
|
+
logger?: Logger;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Constructor options for FeatureDeletionGitService
|
|
148
|
+
*/
|
|
149
|
+
export interface GitServiceOptions {
|
|
150
|
+
/** Project root directory */
|
|
151
|
+
projectRoot: string;
|
|
152
|
+
/** Logger instance */
|
|
153
|
+
logger?: Logger;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Constructor options for FeatureDeletionGitHubService
|
|
157
|
+
*/
|
|
158
|
+
export interface GitHubServiceOptions {
|
|
159
|
+
/** GitHub repository owner */
|
|
160
|
+
owner: string;
|
|
161
|
+
/** GitHub repository name */
|
|
162
|
+
repo: string;
|
|
163
|
+
/** Logger instance */
|
|
164
|
+
logger?: Logger;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Increment metadata structure
|
|
168
|
+
*/
|
|
169
|
+
export interface IncrementMetadata {
|
|
170
|
+
/** Increment ID */
|
|
171
|
+
id: string;
|
|
172
|
+
/** Increment status */
|
|
173
|
+
status: string;
|
|
174
|
+
/** Feature ID (if linked) */
|
|
175
|
+
feature_id?: string;
|
|
176
|
+
/** Other metadata fields */
|
|
177
|
+
[key: string]: unknown;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/feature-deleter/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature Validator for Safe Feature Deletion
|
|
3
|
+
* Increment: 0053-safe-feature-deletion
|
|
4
|
+
* Task: T-001 - Implement Active Increment Validation
|
|
5
|
+
*
|
|
6
|
+
* GREEN PHASE: Real implementation to make tests pass
|
|
7
|
+
*/
|
|
8
|
+
import { FeatureValidatorOptions, ValidationResult, DeletionOptions } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* FeatureValidator - Validates feature deletion pre-conditions
|
|
11
|
+
*
|
|
12
|
+
* GREEN PHASE: Implements active increment validation logic
|
|
13
|
+
*/
|
|
14
|
+
export declare class FeatureValidator {
|
|
15
|
+
private projectRoot;
|
|
16
|
+
private logger;
|
|
17
|
+
constructor(options?: FeatureValidatorOptions);
|
|
18
|
+
/**
|
|
19
|
+
* Validate feature deletion pre-conditions
|
|
20
|
+
* Tasks: T-001, T-002, T-003, T-005, T-006
|
|
21
|
+
*/
|
|
22
|
+
validate(featureId: string, options: DeletionOptions): Promise<ValidationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Scan increment metadata.json files for feature_id references
|
|
25
|
+
*
|
|
26
|
+
* GREEN PHASE: Full implementation with file system scanning
|
|
27
|
+
*/
|
|
28
|
+
private scanIncrementReferences;
|
|
29
|
+
/**
|
|
30
|
+
* T-005: Detect all feature files (living docs + user stories)
|
|
31
|
+
*/
|
|
32
|
+
private detectFeatureFiles;
|
|
33
|
+
/**
|
|
34
|
+
* T-006: Validate git working directory is clean
|
|
35
|
+
*/
|
|
36
|
+
private validateGitStatus;
|
|
37
|
+
/**
|
|
38
|
+
* Recursively get all files in a directory
|
|
39
|
+
*/
|
|
40
|
+
private getAllFiles;
|
|
41
|
+
/**
|
|
42
|
+
* T-003: Format validation report for display
|
|
43
|
+
*/
|
|
44
|
+
formatValidationReport(validation: ValidationResult): string;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../../src/core/feature-deleter/validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAIpB;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,uBAA4B;IAKjD;;;OAGG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2DtF;;;;OAIG;YACW,uBAAuB;IAsDrC;;OAEG;YACW,kBAAkB;IA4ChC;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;YACW,WAAW;IAiBzB;;OAEG;IACH,sBAAsB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM;CAiC7D"}
|