specweave 0.29.1 → 0.30.0
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/README.md +65 -16
- package/bin/specweave.js +16 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts +134 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js +423 -0
- package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +23 -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 +95 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/types.d.ts +20 -0
- package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts +2 -2
- package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.js +1 -1
- package/dist/plugins/specweave-jira/lib/setup-wizard.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/cli/commands/detect-project.js +1 -1
- package/dist/src/cli/commands/detect-project.js.map +1 -1
- 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-docs.js +1 -1
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +1 -1
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +31 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/jobs.js +15 -1
- package/dist/src/cli/commands/jobs.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/switch-project.js +1 -1
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-scheduled.d.ts +38 -0
- package/dist/src/cli/commands/sync-scheduled.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-scheduled.js +170 -0
- package/dist/src/cli/commands/sync-scheduled.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import-grouping.d.ts +53 -0
- package/dist/src/cli/helpers/init/external-import-grouping.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/external-import-grouping.js +287 -0
- package/dist/src/cli/helpers/init/external-import-grouping.js.map +1 -0
- package/dist/src/cli/helpers/init/external-import.d.ts +1 -34
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +15 -486
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +58 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.js +290 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts +48 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.js +238 -0
- package/dist/src/cli/helpers/init/sync-profile-helpers.js.map +1 -0
- package/dist/src/cli/helpers/init/types.d.ts +1 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +113 -3
- package/dist/src/cli/helpers/issue-tracker/ado.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 +2 -287
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts +25 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +306 -0
- package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/types.d.ts +27 -0
- 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/cli/workers/living-docs-worker.d.ts +16 -0
- package/dist/src/cli/workers/living-docs-worker.d.ts.map +1 -0
- package/dist/src/cli/workers/living-docs-worker.js +395 -0
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -0
- package/dist/src/core/background/job-dependency.d.ts +45 -0
- package/dist/src/core/background/job-dependency.d.ts.map +1 -0
- package/dist/src/core/background/job-dependency.js +144 -0
- package/dist/src/core/background/job-dependency.js.map +1 -0
- package/dist/src/core/background/job-launcher.d.ts +21 -1
- package/dist/src/core/background/job-launcher.d.ts.map +1 -1
- package/dist/src/core/background/job-launcher.js +93 -0
- package/dist/src/core/background/job-launcher.js.map +1 -1
- package/dist/src/core/background/types.d.ts +73 -2
- package/dist/src/core/background/types.d.ts.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/comment-builder.d.ts +1 -1
- package/dist/src/core/comment-builder.d.ts.map +1 -1
- package/dist/src/core/{cost-tracker.d.ts → cost/cost-tracker.d.ts} +2 -2
- package/dist/src/core/cost/cost-tracker.d.ts.map +1 -0
- package/dist/src/core/{cost-tracker.js → cost/cost-tracker.js} +2 -2
- package/dist/src/core/cost/cost-tracker.js.map +1 -0
- package/dist/src/core/credentials/credentials-manager.d.ts.map +1 -0
- package/dist/src/core/credentials/credentials-manager.js.map +1 -0
- 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/increment-archiver.d.ts +9 -8
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +40 -42
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-status.d.ts.map +1 -0
- package/dist/src/core/{increment-status.js → increment/increment-status.js} +1 -1
- package/dist/src/core/increment/increment-status.js.map +1 -0
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment/increment-utils.js.map +1 -0
- 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/living-docs/checkpoint-manager.d.ts +120 -0
- package/dist/src/core/living-docs/checkpoint-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/checkpoint-manager.js +231 -0
- package/dist/src/core/living-docs/checkpoint-manager.js.map +1 -0
- package/dist/src/core/living-docs/discovery.d.ts +91 -0
- package/dist/src/core/living-docs/discovery.d.ts.map +1 -0
- package/dist/src/core/living-docs/discovery.js +656 -0
- package/dist/src/core/living-docs/discovery.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +23 -4
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +133 -30
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/foundation-builder.d.ts +37 -0
- package/dist/src/core/living-docs/foundation-builder.d.ts.map +1 -0
- package/dist/src/core/living-docs/foundation-builder.js +357 -0
- package/dist/src/core/living-docs/foundation-builder.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +58 -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 +204 -7
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.d.ts +97 -0
- package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/module-analyzer.js +427 -0
- package/dist/src/core/living-docs/module-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/suggestions-generator.d.ts +112 -0
- package/dist/src/core/living-docs/suggestions-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/suggestions-generator.js +362 -0
- package/dist/src/core/living-docs/suggestions-generator.js.map +1 -0
- package/dist/src/core/living-docs/workitem-matcher.d.ts +116 -0
- package/dist/src/core/living-docs/workitem-matcher.d.ts.map +1 -0
- package/dist/src/core/living-docs/workitem-matcher.js +356 -0
- package/dist/src/core/living-docs/workitem-matcher.js.map +1 -0
- package/dist/src/core/{plugin-loader.d.ts → plugins/plugin-loader.d.ts} +1 -1
- package/dist/src/core/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/src/core/{plugin-loader.js → plugins/plugin-loader.js} +2 -2
- package/dist/src/core/plugins/plugin-loader.js.map +1 -0
- package/dist/src/core/{project-manager.d.ts → project/project-manager.d.ts} +1 -1
- package/dist/src/core/project/project-manager.d.ts.map +1 -0
- package/dist/src/core/{project-manager.js → project/project-manager.js} +3 -3
- package/dist/src/core/project/project-manager.js.map +1 -0
- package/dist/src/core/project/project-structure-detector.d.ts.map +1 -0
- package/dist/src/core/project/project-structure-detector.js.map +1 -0
- package/dist/src/core/{rfc-generator-v2.d.ts → rfc/rfc-generator-v2.d.ts} +1 -1
- package/dist/src/core/rfc/rfc-generator-v2.d.ts.map +1 -0
- package/dist/src/core/{rfc-generator-v2.js → rfc/rfc-generator-v2.js} +1 -1
- package/dist/src/core/rfc/rfc-generator-v2.js.map +1 -0
- package/dist/src/core/scheduler/index.d.ts +1 -0
- package/dist/src/core/scheduler/index.d.ts.map +1 -1
- package/dist/src/core/scheduler/index.js +1 -0
- package/dist/src/core/scheduler/index.js.map +1 -1
- package/dist/src/core/scheduler/scheduled-job.d.ts +1 -1
- package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -1
- package/dist/src/core/scheduler/scheduled-job.js.map +1 -1
- package/dist/src/core/scheduler/session-sync-executor.d.ts +138 -0
- package/dist/src/core/scheduler/session-sync-executor.d.ts.map +1 -0
- package/dist/src/core/scheduler/session-sync-executor.js +333 -0
- package/dist/src/core/scheduler/session-sync-executor.js.map +1 -0
- package/dist/src/core/{spec-content-sync.d.ts → specs/spec-content-sync.d.ts} +2 -2
- package/dist/src/core/specs/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/{spec-content-sync.js → specs/spec-content-sync.js} +1 -1
- package/dist/src/core/specs/spec-content-sync.js.map +1 -0
- package/dist/src/core/{spec-detector.d.ts → specs/spec-detector.d.ts} +1 -1
- package/dist/src/core/specs/spec-detector.d.ts.map +1 -0
- package/dist/src/core/{spec-detector.js → specs/spec-detector.js} +1 -1
- package/dist/src/core/specs/spec-detector.js.map +1 -0
- package/dist/src/core/{spec-identifier-detector.d.ts → specs/spec-identifier-detector.d.ts} +2 -2
- package/dist/src/core/specs/spec-identifier-detector.d.ts.map +1 -0
- package/dist/src/core/{spec-identifier-detector.js → specs/spec-identifier-detector.js} +1 -1
- package/dist/src/core/specs/spec-identifier-detector.js.map +1 -0
- 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/specs/spec-task-mapper.d.ts.map +1 -0
- package/dist/src/core/specs/spec-task-mapper.js.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts +62 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-audit-logger.js +59 -0
- package/dist/src/core/sync/sync-audit-logger.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +51 -27
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +219 -179
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/markdown-generator.d.ts +75 -0
- package/dist/src/importers/markdown-generator.d.ts.map +1 -0
- package/dist/src/importers/markdown-generator.js +250 -0
- package/dist/src/importers/markdown-generator.js.map +1 -0
- package/dist/src/integrations/ado/ado-client.d.ts +93 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +172 -1
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +44 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +119 -1
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +2 -2
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +1 -1
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/src/living-docs/epic-id-allocator.d.ts +177 -0
- package/dist/src/living-docs/epic-id-allocator.d.ts.map +1 -0
- package/dist/src/living-docs/epic-id-allocator.js +363 -0
- package/dist/src/living-docs/epic-id-allocator.js.map +1 -0
- package/dist/src/sync/external-change-puller.d.ts +94 -0
- package/dist/src/sync/external-change-puller.d.ts.map +1 -0
- package/dist/src/sync/external-change-puller.js +181 -0
- package/dist/src/sync/external-change-puller.js.map +1 -0
- package/dist/src/sync/index.d.ts +4 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +2 -0
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/living-docs-updater.d.ts +93 -0
- package/dist/src/sync/living-docs-updater.d.ts.map +1 -0
- package/dist/src/sync/living-docs-updater.js +218 -0
- package/dist/src/sync/living-docs-updater.js.map +1 -0
- package/dist/src/testing/test-generator.js +1 -1
- package/dist/src/testing/test-generator.js.map +1 -1
- package/dist/src/utils/cost-reporter.d.ts +1 -1
- package/dist/src/utils/cost-reporter.d.ts.map +1 -1
- package/dist/src/utils/model-selection.js +4 -4
- package/dist/src/utils/model-selection.js.map +1 -1
- package/dist/src/utils/pricing-constants.d.ts +2 -2
- package/dist/src/utils/pricing-constants.js +2 -2
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -28
- package/plugins/specweave/agents/code-standards-detective/AGENT.md +3 -3
- package/plugins/specweave/agents/infrastructure/AGENT.md +4 -0
- package/plugins/specweave/agents/performance/AGENT.md +2 -2
- package/plugins/specweave/agents/reflective-reviewer/AGENT.md +3 -3
- package/plugins/specweave/agents/translator/AGENT.md +2 -2
- package/plugins/specweave/commands/specweave-costs.md +2 -2
- package/plugins/specweave/commands/specweave-do.md +2 -2
- package/plugins/specweave/hooks/lib/scheduler-startup.sh +59 -8
- package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
- package/plugins/specweave/skills/role-orchestrator/README.md +1 -1
- package/plugins/specweave-ado/agents/ado-manager/AGENT.md +8 -2
- package/plugins/specweave-ado/agents/ado-multi-project-mapper/AGENT.md +2 -2
- package/plugins/specweave-ado/agents/ado-sync-judge/AGENT.md +2 -2
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-spec-commit-sync.ts +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +1 -1
- package/plugins/specweave-ado/lib/conflict-resolver.js +87 -0
- package/plugins/specweave-ado/lib/conflict-resolver.ts +124 -0
- package/plugins/specweave-ado/skills/specweave-ado-mapper/SKILL.md +1 -1
- package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +3 -3
- package/plugins/specweave-backend/skills/dotnet-backend/SKILL.md +1 -1
- package/plugins/specweave-backend/skills/nodejs-backend/SKILL.md +1 -1
- package/plugins/specweave-backend/skills/python-backend/SKILL.md +1 -1
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +6 -1
- package/plugins/specweave-diagrams/agents/diagrams-architect/AGENT.md +2 -2
- package/plugins/specweave-diagrams/skills/diagrams-architect/SKILL.md +1 -1
- package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +4 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +1 -1
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +11 -1
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +6 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +96 -0
- package/plugins/specweave-github/lib/github-client-v2.js +97 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +115 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
- package/plugins/specweave-github/lib/github-spec-commit-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +1 -1
- package/plugins/specweave-github/lib/types.ts +21 -0
- package/plugins/specweave-infrastructure/agents/devops/AGENT.md +1 -1
- package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +3 -3
- package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +2 -2
- package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +3 -3
- package/plugins/specweave-infrastructure/agents/sre/AGENT.md +2 -2
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +11 -1
- package/plugins/specweave-jira/commands/import-projects.js +1 -1
- package/plugins/specweave-jira/commands/import-projects.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-spec-commit-sync.ts +1 -1
- package/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
- package/plugins/specweave-jira/lib/jira-spec-content-sync.ts +1 -1
- package/plugins/specweave-jira/lib/setup-wizard.js +2 -2
- package/plugins/specweave-jira/lib/setup-wizard.ts +2 -2
- package/plugins/specweave-jira/skills/specweave-jira-mapper/SKILL.md +1 -1
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +5 -1
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +6 -1
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +6 -1
- package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +3 -3
- package/plugins/specweave-ml/agents/data-scientist/AGENT.md +2 -1
- package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +2 -1
- package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +3 -3
- package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +6 -1
- package/plugins/specweave-payments/agents/payment-integration/AGENT.md +3 -3
- package/plugins/specweave-release/agents/release-manager/AGENT.md +6 -1
- package/plugins/specweave-release/commands/specweave-release-npm.md +8 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +144 -0
- package/plugins/specweave-testing/agents/qa-engineer/AGENT.md +5 -0
- package/src/templates/AGENTS.md.template +97 -0
- package/dist/src/core/cost-tracker.d.ts.map +0 -1
- package/dist/src/core/cost-tracker.js.map +0 -1
- package/dist/src/core/credentials-manager.d.ts.map +0 -1
- package/dist/src/core/credentials-manager.js.map +0 -1
- package/dist/src/core/increment-status.d.ts.map +0 -1
- package/dist/src/core/increment-status.js.map +0 -1
- package/dist/src/core/increment-utils.d.ts.map +0 -1
- package/dist/src/core/increment-utils.js.map +0 -1
- package/dist/src/core/plugin-loader.d.ts.map +0 -1
- package/dist/src/core/plugin-loader.js.map +0 -1
- package/dist/src/core/project-manager.d.ts.map +0 -1
- package/dist/src/core/project-manager.js.map +0 -1
- package/dist/src/core/project-structure-detector.d.ts.map +0 -1
- package/dist/src/core/project-structure-detector.js.map +0 -1
- package/dist/src/core/rfc-generator-v2.d.ts.map +0 -1
- package/dist/src/core/rfc-generator-v2.js.map +0 -1
- package/dist/src/core/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/spec-content-sync.js.map +0 -1
- package/dist/src/core/spec-detector.d.ts.map +0 -1
- package/dist/src/core/spec-detector.js.map +0 -1
- package/dist/src/core/spec-identifier-detector.d.ts.map +0 -1
- package/dist/src/core/spec-identifier-detector.js.map +0 -1
- package/dist/src/core/spec-task-mapper.d.ts.map +0 -1
- package/dist/src/core/spec-task-mapper.js.map +0 -1
- package/dist/src/utils/spec-parser.d.ts +0 -145
- package/dist/src/utils/spec-parser.d.ts.map +0 -1
- package/dist/src/utils/spec-parser.js +0 -640
- package/dist/src/utils/spec-parser.js.map +0 -1
- package/plugins/specweave/agents/pm/AGENT.md.bak2 +0 -1754
- package/plugins/specweave/hooks/hooks.json.bak +0 -72
- package/plugins/specweave/hooks/hooks.json.v1-backup +0 -16
- package/plugins/specweave/hooks/v2/hooks.json +0 -16
- /package/dist/src/core/{credentials-manager.d.ts → credentials/credentials-manager.d.ts} +0 -0
- /package/dist/src/core/{credentials-manager.js → credentials/credentials-manager.js} +0 -0
- /package/dist/src/core/{increment-status.d.ts → increment/increment-status.d.ts} +0 -0
- /package/dist/src/core/{increment-utils.d.ts → increment/increment-utils.d.ts} +0 -0
- /package/dist/src/core/{increment-utils.js → increment/increment-utils.js} +0 -0
- /package/dist/src/core/{project-structure-detector.d.ts → project/project-structure-detector.d.ts} +0 -0
- /package/dist/src/core/{project-structure-detector.js → project/project-structure-detector.js} +0 -0
- /package/dist/src/core/{spec-task-mapper.d.ts → specs/spec-task-mapper.d.ts} +0 -0
- /package/dist/src/core/{spec-task-mapper.js → specs/spec-task-mapper.js} +0 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolver for Living Docs Synchronization
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL PRINCIPLE: External tool status ALWAYS wins in conflicts!
|
|
5
|
+
* This ensures that QA and stakeholder decisions in external tools
|
|
6
|
+
* take precedence over local development status.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from '../../../src/utils/fs-native.js';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as yaml from 'yaml';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Status Mapping
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const STATUS_MAPPING = {
|
|
15
|
+
ado: {
|
|
16
|
+
'New': 'draft',
|
|
17
|
+
'Active': 'in-progress',
|
|
18
|
+
'Resolved': 'implemented',
|
|
19
|
+
'Closed': 'complete',
|
|
20
|
+
'In Review': 'in-qa',
|
|
21
|
+
'In QA': 'in-qa',
|
|
22
|
+
'Blocked': 'blocked',
|
|
23
|
+
'Removed': 'cancelled'
|
|
24
|
+
},
|
|
25
|
+
jira: {
|
|
26
|
+
'To Do': 'draft',
|
|
27
|
+
'In Progress': 'in-progress',
|
|
28
|
+
'Code Review': 'implemented',
|
|
29
|
+
'In Review': 'implemented',
|
|
30
|
+
'QA': 'in-qa',
|
|
31
|
+
'Testing': 'in-qa',
|
|
32
|
+
'Done': 'complete',
|
|
33
|
+
'Closed': 'complete',
|
|
34
|
+
'Blocked': 'blocked',
|
|
35
|
+
'Cancelled': 'cancelled'
|
|
36
|
+
},
|
|
37
|
+
github: {
|
|
38
|
+
'open': 'in-progress',
|
|
39
|
+
'closed': 'complete'
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const REVERSE_STATUS_MAPPING = {
|
|
43
|
+
ado: {
|
|
44
|
+
'draft': 'New',
|
|
45
|
+
'in-progress': 'Active',
|
|
46
|
+
'implemented': 'Resolved',
|
|
47
|
+
'in-qa': 'In QA',
|
|
48
|
+
'complete': 'Closed',
|
|
49
|
+
'blocked': 'Blocked',
|
|
50
|
+
'cancelled': 'Removed'
|
|
51
|
+
},
|
|
52
|
+
jira: {
|
|
53
|
+
'draft': 'To Do',
|
|
54
|
+
'in-progress': 'In Progress',
|
|
55
|
+
'implemented': 'Code Review',
|
|
56
|
+
'in-qa': 'QA',
|
|
57
|
+
'complete': 'Done',
|
|
58
|
+
'blocked': 'Blocked',
|
|
59
|
+
'cancelled': 'Cancelled'
|
|
60
|
+
},
|
|
61
|
+
github: {
|
|
62
|
+
'draft': 'open',
|
|
63
|
+
'in-progress': 'open',
|
|
64
|
+
'implemented': 'open',
|
|
65
|
+
'in-qa': 'open',
|
|
66
|
+
'complete': 'closed',
|
|
67
|
+
'blocked': 'open',
|
|
68
|
+
'cancelled': 'closed'
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// Conflict Resolver Class
|
|
73
|
+
// ============================================================================
|
|
74
|
+
export class ConflictResolver {
|
|
75
|
+
constructor() {
|
|
76
|
+
this.resolutionLog = [];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Map external status to local SpecWeave status
|
|
80
|
+
*/
|
|
81
|
+
mapExternalStatus(tool, externalStatus) {
|
|
82
|
+
const mapping = STATUS_MAPPING[tool];
|
|
83
|
+
return mapping[externalStatus] || 'unknown';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Map local status to external tool status
|
|
87
|
+
*/
|
|
88
|
+
mapLocalStatus(tool, localStatus) {
|
|
89
|
+
const mapping = REVERSE_STATUS_MAPPING[tool];
|
|
90
|
+
return mapping[localStatus] || 'Active';
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* CRITICAL: Resolve status conflict - EXTERNAL ALWAYS WINS
|
|
94
|
+
*/
|
|
95
|
+
resolveStatusConflict(localStatus, externalStatus) {
|
|
96
|
+
const resolution = {
|
|
97
|
+
field: 'status',
|
|
98
|
+
localValue: localStatus,
|
|
99
|
+
externalValue: externalStatus.status,
|
|
100
|
+
resolution: 'external', // ALWAYS external for status
|
|
101
|
+
resolvedValue: externalStatus.mappedStatus,
|
|
102
|
+
reason: 'External tool reflects QA and stakeholder decisions',
|
|
103
|
+
timestamp: new Date().toISOString()
|
|
104
|
+
};
|
|
105
|
+
// Log the resolution
|
|
106
|
+
console.log(`📊 Status Conflict Detected:`);
|
|
107
|
+
console.log(` Local: ${localStatus}`);
|
|
108
|
+
console.log(` External: ${externalStatus.status} (${externalStatus.tool})`);
|
|
109
|
+
console.log(` ✅ Resolution: EXTERNAL WINS - ${externalStatus.mappedStatus}`);
|
|
110
|
+
this.resolutionLog.push(resolution);
|
|
111
|
+
return resolution;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Compare timestamps to determine winner (Increment 0089)
|
|
115
|
+
*
|
|
116
|
+
* For pull sync, we compare local lastModified vs external ChangedDate.
|
|
117
|
+
* The more recent timestamp wins.
|
|
118
|
+
*
|
|
119
|
+
* @param localTimestamp - Local file lastModified timestamp (ISO string or null)
|
|
120
|
+
* @param externalTimestamp - External tool ChangedDate (ISO string)
|
|
121
|
+
* @returns Comparison result with winner and reasoning
|
|
122
|
+
*/
|
|
123
|
+
compareTimestamps(localTimestamp, externalTimestamp) {
|
|
124
|
+
const externalDate = new Date(externalTimestamp);
|
|
125
|
+
// If no local timestamp, external wins by default
|
|
126
|
+
if (!localTimestamp) {
|
|
127
|
+
return {
|
|
128
|
+
winner: 'external',
|
|
129
|
+
localTimestamp: null,
|
|
130
|
+
externalTimestamp,
|
|
131
|
+
timeDiffMs: 0,
|
|
132
|
+
reason: 'No local timestamp available, external wins by default',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const localDate = new Date(localTimestamp);
|
|
136
|
+
const timeDiffMs = externalDate.getTime() - localDate.getTime();
|
|
137
|
+
// External is more recent → external wins
|
|
138
|
+
if (timeDiffMs > 0) {
|
|
139
|
+
console.log(`📊 Timestamp Comparison:`);
|
|
140
|
+
console.log(` Local: ${localTimestamp}`);
|
|
141
|
+
console.log(` External: ${externalTimestamp}`);
|
|
142
|
+
console.log(` ✅ Winner: EXTERNAL (${Math.round(timeDiffMs / 60000)}min newer)`);
|
|
143
|
+
return {
|
|
144
|
+
winner: 'external',
|
|
145
|
+
localTimestamp,
|
|
146
|
+
externalTimestamp,
|
|
147
|
+
timeDiffMs,
|
|
148
|
+
reason: `External is ${Math.round(timeDiffMs / 60000)} minutes newer`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Local is more recent → local wins (don't overwrite local changes)
|
|
152
|
+
if (timeDiffMs < 0) {
|
|
153
|
+
console.log(`📊 Timestamp Comparison:`);
|
|
154
|
+
console.log(` Local: ${localTimestamp}`);
|
|
155
|
+
console.log(` External: ${externalTimestamp}`);
|
|
156
|
+
console.log(` ✅ Winner: LOCAL (${Math.round(Math.abs(timeDiffMs) / 60000)}min newer)`);
|
|
157
|
+
return {
|
|
158
|
+
winner: 'local',
|
|
159
|
+
localTimestamp,
|
|
160
|
+
externalTimestamp,
|
|
161
|
+
timeDiffMs,
|
|
162
|
+
reason: `Local is ${Math.round(Math.abs(timeDiffMs) / 60000)} minutes newer`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// Same timestamp → no conflict
|
|
166
|
+
return {
|
|
167
|
+
winner: 'none',
|
|
168
|
+
localTimestamp,
|
|
169
|
+
externalTimestamp,
|
|
170
|
+
timeDiffMs: 0,
|
|
171
|
+
reason: 'Timestamps are identical, no conflict',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Resolve conflict using timestamp comparison (Increment 0089)
|
|
176
|
+
*
|
|
177
|
+
* Combines timestamp comparison with status conflict resolution.
|
|
178
|
+
* Used by ExternalChangePuller for pull sync.
|
|
179
|
+
*
|
|
180
|
+
* @param field - The field being compared (e.g., 'status')
|
|
181
|
+
* @param localValue - Current local value
|
|
182
|
+
* @param externalValue - Value from external tool
|
|
183
|
+
* @param localTimestamp - Local lastModified timestamp
|
|
184
|
+
* @param externalTimestamp - External ChangedDate
|
|
185
|
+
* @returns Conflict resolution result
|
|
186
|
+
*/
|
|
187
|
+
resolveWithTimestamp(field, localValue, externalValue, localTimestamp, externalTimestamp) {
|
|
188
|
+
const comparison = this.compareTimestamps(localTimestamp, externalTimestamp);
|
|
189
|
+
const resolution = {
|
|
190
|
+
field,
|
|
191
|
+
localValue,
|
|
192
|
+
externalValue,
|
|
193
|
+
resolution: comparison.winner === 'local' ? 'local' : 'external',
|
|
194
|
+
resolvedValue: comparison.winner === 'local' ? localValue : externalValue,
|
|
195
|
+
reason: comparison.reason,
|
|
196
|
+
timestamp: new Date().toISOString(),
|
|
197
|
+
};
|
|
198
|
+
// Log the resolution
|
|
199
|
+
console.log(`📊 Conflict Resolved (${field}):`);
|
|
200
|
+
console.log(` Winner: ${comparison.winner.toUpperCase()}`);
|
|
201
|
+
console.log(` Reason: ${comparison.reason}`);
|
|
202
|
+
this.resolutionLog.push(resolution);
|
|
203
|
+
return resolution;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Resolve priority conflict - EXTERNAL WINS
|
|
207
|
+
*/
|
|
208
|
+
resolvePriorityConflict(localPriority, externalPriority) {
|
|
209
|
+
const resolution = {
|
|
210
|
+
field: 'priority',
|
|
211
|
+
localValue: localPriority,
|
|
212
|
+
externalValue: externalPriority,
|
|
213
|
+
resolution: 'external',
|
|
214
|
+
resolvedValue: externalPriority || localPriority,
|
|
215
|
+
reason: 'External tool reflects stakeholder prioritization',
|
|
216
|
+
timestamp: new Date().toISOString()
|
|
217
|
+
};
|
|
218
|
+
if (localPriority !== externalPriority && externalPriority) {
|
|
219
|
+
console.log(`📊 Priority Conflict Detected:`);
|
|
220
|
+
console.log(` Local: ${localPriority}`);
|
|
221
|
+
console.log(` External: ${externalPriority}`);
|
|
222
|
+
console.log(` ✅ Resolution: EXTERNAL WINS - ${externalPriority}`);
|
|
223
|
+
this.resolutionLog.push(resolution);
|
|
224
|
+
}
|
|
225
|
+
return resolution;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Apply conflict resolutions to spec
|
|
229
|
+
*/
|
|
230
|
+
async applyResolutions(specPath, resolutions) {
|
|
231
|
+
const content = await fs.readFile(specPath, 'utf-8');
|
|
232
|
+
const lines = content.split('\n');
|
|
233
|
+
let inFrontmatter = false;
|
|
234
|
+
let frontmatterEnd = -1;
|
|
235
|
+
// Find frontmatter boundaries
|
|
236
|
+
for (let i = 0; i < lines.length; i++) {
|
|
237
|
+
if (lines[i] === '---') {
|
|
238
|
+
if (!inFrontmatter) {
|
|
239
|
+
inFrontmatter = true;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
frontmatterEnd = i;
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Apply resolutions
|
|
248
|
+
for (const resolution of resolutions) {
|
|
249
|
+
if (resolution.field === 'status') {
|
|
250
|
+
// Update status in frontmatter
|
|
251
|
+
for (let i = 1; i < frontmatterEnd; i++) {
|
|
252
|
+
if (lines[i].startsWith('status:')) {
|
|
253
|
+
lines[i] = `status: ${resolution.resolvedValue}`;
|
|
254
|
+
console.log(`✅ Applied status resolution: ${resolution.resolvedValue}`);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Add sync metadata
|
|
259
|
+
const syncTimestamp = new Date().toISOString();
|
|
260
|
+
let syncedAtFound = false;
|
|
261
|
+
for (let i = 1; i < frontmatterEnd; i++) {
|
|
262
|
+
if (lines[i].includes('syncedAt:')) {
|
|
263
|
+
lines[i] = ` syncedAt: "${syncTimestamp}"`;
|
|
264
|
+
syncedAtFound = true;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!syncedAtFound) {
|
|
269
|
+
// Add syncedAt after externalLinks
|
|
270
|
+
for (let i = 1; i < frontmatterEnd; i++) {
|
|
271
|
+
if (lines[i].includes('externalLinks:')) {
|
|
272
|
+
// Find the external tool section
|
|
273
|
+
for (let j = i + 1; j < frontmatterEnd; j++) {
|
|
274
|
+
if (lines[j].includes('ado:') || lines[j].includes('jira:') || lines[j].includes('github:')) {
|
|
275
|
+
// Insert after the URL line
|
|
276
|
+
for (let k = j + 1; k < frontmatterEnd; k++) {
|
|
277
|
+
if (lines[k].includes('Url:')) {
|
|
278
|
+
lines.splice(k + 1, 0, ` syncedAt: "${syncTimestamp}"`);
|
|
279
|
+
frontmatterEnd++; // Adjust for inserted line
|
|
280
|
+
syncedAtFound = true;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (syncedAtFound)
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (syncedAtFound)
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else if (resolution.field === 'priority' && resolution.resolvedValue) {
|
|
295
|
+
// Update priority in frontmatter
|
|
296
|
+
for (let i = 1; i < frontmatterEnd; i++) {
|
|
297
|
+
if (lines[i].startsWith('priority:')) {
|
|
298
|
+
lines[i] = `priority: ${resolution.resolvedValue}`;
|
|
299
|
+
console.log(`✅ Applied priority resolution: ${resolution.resolvedValue}`);
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Write updated content
|
|
306
|
+
await fs.writeFile(specPath, lines.join('\n'));
|
|
307
|
+
console.log(`✅ Resolutions applied to ${path.basename(specPath)}`);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Validate that external status wins in implementation
|
|
311
|
+
*/
|
|
312
|
+
validateImplementation(implementationCode) {
|
|
313
|
+
const violations = [];
|
|
314
|
+
// Check for incorrect patterns
|
|
315
|
+
const incorrectPatterns = [
|
|
316
|
+
{
|
|
317
|
+
pattern: /if.*conflict.*\{[^}]*spec\.status\s*=\s*localStatus/,
|
|
318
|
+
message: 'Local status should never win in conflicts'
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
pattern: /resolution\s*:\s*['"]local['"]/,
|
|
322
|
+
message: 'Resolution should be "external" for status conflicts'
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
pattern: /prefer.*local.*status/i,
|
|
326
|
+
message: 'Should prefer external status'
|
|
327
|
+
}
|
|
328
|
+
];
|
|
329
|
+
for (const { pattern, message } of incorrectPatterns) {
|
|
330
|
+
if (pattern.test(implementationCode)) {
|
|
331
|
+
violations.push(message);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Check for correct patterns
|
|
335
|
+
const requiredPatterns = [
|
|
336
|
+
{
|
|
337
|
+
pattern: /external.*wins|EXTERNAL.*WINS|externalStatus.*applied/i,
|
|
338
|
+
message: 'Missing confirmation that external wins'
|
|
339
|
+
}
|
|
340
|
+
];
|
|
341
|
+
for (const { pattern, message } of requiredPatterns) {
|
|
342
|
+
if (!pattern.test(implementationCode)) {
|
|
343
|
+
violations.push(message);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
valid: violations.length === 0,
|
|
348
|
+
violations
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get resolution history
|
|
353
|
+
*/
|
|
354
|
+
getResolutionLog() {
|
|
355
|
+
return this.resolutionLog;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Generate resolution report
|
|
359
|
+
*/
|
|
360
|
+
generateReport() {
|
|
361
|
+
const report = [];
|
|
362
|
+
report.push('# Conflict Resolution Report');
|
|
363
|
+
report.push(`\n**Generated**: ${new Date().toISOString()}`);
|
|
364
|
+
report.push(`**Total Resolutions**: ${this.resolutionLog.length}`);
|
|
365
|
+
report.push('\n## Resolutions\n');
|
|
366
|
+
for (const resolution of this.resolutionLog) {
|
|
367
|
+
report.push(`### ${resolution.field}`);
|
|
368
|
+
report.push(`- **Local Value**: ${resolution.localValue}`);
|
|
369
|
+
report.push(`- **External Value**: ${resolution.externalValue}`);
|
|
370
|
+
report.push(`- **Resolution**: ${resolution.resolution.toUpperCase()} WINS`);
|
|
371
|
+
report.push(`- **Resolved To**: ${resolution.resolvedValue}`);
|
|
372
|
+
report.push(`- **Reason**: ${resolution.reason}`);
|
|
373
|
+
report.push(`- **Time**: ${resolution.timestamp}\n`);
|
|
374
|
+
}
|
|
375
|
+
report.push('## Validation');
|
|
376
|
+
report.push('✅ All conflicts resolved with external tool priority');
|
|
377
|
+
return report.join('\n');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// ============================================================================
|
|
381
|
+
// Helper Functions
|
|
382
|
+
// ============================================================================
|
|
383
|
+
/**
|
|
384
|
+
* Load spec metadata from file
|
|
385
|
+
*/
|
|
386
|
+
export async function loadSpecMetadata(specPath) {
|
|
387
|
+
const content = await fs.readFile(specPath, 'utf-8');
|
|
388
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
389
|
+
if (!frontmatterMatch) {
|
|
390
|
+
throw new Error(`No frontmatter found in ${specPath}`);
|
|
391
|
+
}
|
|
392
|
+
return yaml.parse(frontmatterMatch[1]);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Perform three-permission sync with conflict resolution
|
|
396
|
+
*/
|
|
397
|
+
export async function performBidirectionalSync(specPath, externalStatus) {
|
|
398
|
+
const resolver = new ConflictResolver();
|
|
399
|
+
const spec = await loadSpecMetadata(specPath);
|
|
400
|
+
const resolutions = [];
|
|
401
|
+
// Check for status conflict
|
|
402
|
+
if (spec.status !== externalStatus.mappedStatus) {
|
|
403
|
+
const statusResolution = resolver.resolveStatusConflict(spec.status, externalStatus);
|
|
404
|
+
resolutions.push(statusResolution);
|
|
405
|
+
}
|
|
406
|
+
// Apply resolutions if any conflicts found
|
|
407
|
+
if (resolutions.length > 0) {
|
|
408
|
+
await resolver.applyResolutions(specPath, resolutions);
|
|
409
|
+
// Generate and save report
|
|
410
|
+
const report = resolver.generateReport();
|
|
411
|
+
const reportPath = specPath.replace('.md', '-sync-report.md');
|
|
412
|
+
await fs.writeFile(reportPath, report);
|
|
413
|
+
console.log(`📄 Sync report saved to ${path.basename(reportPath)}`);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
console.log('✅ No conflicts detected - spec in sync with external tool');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ============================================================================
|
|
420
|
+
// Export for testing
|
|
421
|
+
// ============================================================================
|
|
422
|
+
export default ConflictResolver;
|
|
423
|
+
//# sourceMappingURL=conflict-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.js","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/conflict-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - Rate limiting protection
|
|
8
8
|
* - Secure command execution (no shell injection)
|
|
9
9
|
*/
|
|
10
|
-
import { GitHubIssue, GitHubMilestone } from './types';
|
|
10
|
+
import { GitHubIssue, GitHubMilestone, GitHubExternalChange } from './types';
|
|
11
11
|
import { SyncProfile, TimeRangePreset } from '../../../src/core/types/sync-profile';
|
|
12
12
|
export declare class GitHubClientV2 {
|
|
13
13
|
private owner;
|
|
@@ -170,5 +170,27 @@ export declare class GitHubClientV2 {
|
|
|
170
170
|
delayMs?: number;
|
|
171
171
|
}): Promise<GitHubIssue[]>;
|
|
172
172
|
private sleep;
|
|
173
|
+
/**
|
|
174
|
+
* Fetch recently changed issues for pull sync
|
|
175
|
+
*
|
|
176
|
+
* Uses GitHub Issues API with `since` parameter to find issues
|
|
177
|
+
* that have been updated since a given timestamp.
|
|
178
|
+
*
|
|
179
|
+
* @param since - Timestamp to query changes from
|
|
180
|
+
* @param linkedIssueNumbers - Optional list of issue numbers to filter (linked items only)
|
|
181
|
+
* @returns Array of external changes with changedAt, changedBy, and current values
|
|
182
|
+
*/
|
|
183
|
+
fetchRecentChanges(since: Date, linkedIssueNumbers?: number[]): Promise<GitHubExternalChange[]>;
|
|
184
|
+
/**
|
|
185
|
+
* Get issue events for detailed change tracking
|
|
186
|
+
*
|
|
187
|
+
* Use this for detailed changelog when needed.
|
|
188
|
+
* GET /repos/{owner}/{repo}/issues/{issue_number}/events
|
|
189
|
+
*
|
|
190
|
+
* @param issueNumber - Issue number
|
|
191
|
+
* @param perPage - Limit number of events
|
|
192
|
+
* @returns Array of events with action details
|
|
193
|
+
*/
|
|
194
|
+
getIssueEvents(issueNumber: number, perPage?: number): Promise<any[]>;
|
|
173
195
|
}
|
|
174
196
|
//# sourceMappingURL=github-client-v2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client-v2.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-client-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"github-client-v2.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-client-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -621,5 +621,100 @@ export class GitHubClientV2 {
|
|
|
621
621
|
sleep(ms) {
|
|
622
622
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
623
623
|
}
|
|
624
|
+
// ==========================================================================
|
|
625
|
+
// Pull Sync - External Change Detection (Increment 0089)
|
|
626
|
+
// ==========================================================================
|
|
627
|
+
/**
|
|
628
|
+
* Fetch recently changed issues for pull sync
|
|
629
|
+
*
|
|
630
|
+
* Uses GitHub Issues API with `since` parameter to find issues
|
|
631
|
+
* that have been updated since a given timestamp.
|
|
632
|
+
*
|
|
633
|
+
* @param since - Timestamp to query changes from
|
|
634
|
+
* @param linkedIssueNumbers - Optional list of issue numbers to filter (linked items only)
|
|
635
|
+
* @returns Array of external changes with changedAt, changedBy, and current values
|
|
636
|
+
*/
|
|
637
|
+
async fetchRecentChanges(since, linkedIssueNumbers) {
|
|
638
|
+
// Build JQ filter for issues updated since timestamp
|
|
639
|
+
const sinceISO = since.toISOString();
|
|
640
|
+
// Query parameters - MUST use .[] to iterate array from GitHub API
|
|
641
|
+
const jqFilter = linkedIssueNumbers && linkedIssueNumbers.length > 0
|
|
642
|
+
? `.[] | select(.number | IN(${linkedIssueNumbers.join(',')})) | {number, title, state, updated_at, user: .user.login, assignee: .assignee.login, labels: [.labels[].name]}`
|
|
643
|
+
: `.[] | {number, title, state, updated_at, user: .user.login, assignee: .assignee.login, labels: [.labels[].name]}`;
|
|
644
|
+
// Use GitHub API to fetch issues updated since timestamp
|
|
645
|
+
const result = await execFileNoThrow('gh', [
|
|
646
|
+
'api',
|
|
647
|
+
`repos/${this.fullRepo}/issues`,
|
|
648
|
+
'--method', 'GET',
|
|
649
|
+
'-f', `since=${sinceISO}`,
|
|
650
|
+
'-f', 'state=all',
|
|
651
|
+
'-f', 'sort=updated',
|
|
652
|
+
'-f', 'direction=desc',
|
|
653
|
+
'-f', 'per_page=100',
|
|
654
|
+
'--jq', jqFilter,
|
|
655
|
+
]);
|
|
656
|
+
if (result.exitCode !== 0) {
|
|
657
|
+
throw new Error(`Failed to fetch recent changes: ${result.stderr || result.stdout}`);
|
|
658
|
+
}
|
|
659
|
+
// Parse NDJSON output (one JSON object per line)
|
|
660
|
+
const lines = result.stdout.trim().split('\n').filter(l => l.trim());
|
|
661
|
+
const issues = [];
|
|
662
|
+
for (const line of lines) {
|
|
663
|
+
try {
|
|
664
|
+
issues.push(JSON.parse(line));
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
// Skip malformed lines
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
// Map to GitHubExternalChange format
|
|
671
|
+
const changes = issues.map(issue => ({
|
|
672
|
+
platform: 'github',
|
|
673
|
+
externalId: `GH-${issue.number}`,
|
|
674
|
+
issueNumber: issue.number,
|
|
675
|
+
changedAt: issue.updated_at || new Date().toISOString(),
|
|
676
|
+
changedBy: issue.user || 'unknown',
|
|
677
|
+
changedFields: [], // GitHub doesn't provide changelog in list API
|
|
678
|
+
currentState: {
|
|
679
|
+
status: issue.state,
|
|
680
|
+
labels: issue.labels || [],
|
|
681
|
+
assignee: issue.assignee || null,
|
|
682
|
+
},
|
|
683
|
+
}));
|
|
684
|
+
return changes;
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Get issue events for detailed change tracking
|
|
688
|
+
*
|
|
689
|
+
* Use this for detailed changelog when needed.
|
|
690
|
+
* GET /repos/{owner}/{repo}/issues/{issue_number}/events
|
|
691
|
+
*
|
|
692
|
+
* @param issueNumber - Issue number
|
|
693
|
+
* @param perPage - Limit number of events
|
|
694
|
+
* @returns Array of events with action details
|
|
695
|
+
*/
|
|
696
|
+
async getIssueEvents(issueNumber, perPage = 30) {
|
|
697
|
+
const result = await execFileNoThrow('gh', [
|
|
698
|
+
'api',
|
|
699
|
+
`repos/${this.fullRepo}/issues/${issueNumber}/events`,
|
|
700
|
+
'-f', `per_page=${perPage}`,
|
|
701
|
+
'--jq', '.[].{event, created_at, actor: .actor.login}',
|
|
702
|
+
]);
|
|
703
|
+
if (result.exitCode !== 0) {
|
|
704
|
+
throw new Error(`Failed to get issue events: ${result.stderr || result.stdout}`);
|
|
705
|
+
}
|
|
706
|
+
// Parse NDJSON output
|
|
707
|
+
const lines = result.stdout.trim().split('\n').filter(l => l.trim());
|
|
708
|
+
const events = [];
|
|
709
|
+
for (const line of lines) {
|
|
710
|
+
try {
|
|
711
|
+
events.push(JSON.parse(line));
|
|
712
|
+
}
|
|
713
|
+
catch {
|
|
714
|
+
// Skip malformed lines
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
return events;
|
|
718
|
+
}
|
|
624
719
|
}
|
|
625
720
|
//# sourceMappingURL=github-client-v2.js.map
|