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,395 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Living Docs Builder Worker
|
|
4
|
+
*
|
|
5
|
+
* Background worker that generates living documentation from codebase analysis.
|
|
6
|
+
* Handles long-running operations (hours/days for large codebases) with:
|
|
7
|
+
* - Checkpoint/resume support
|
|
8
|
+
* - Dependency waiting (clone/import jobs)
|
|
9
|
+
* - Phase-based progress tracking
|
|
10
|
+
* - Structured logging
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* node living-docs-worker.js <jobId> <projectPath>
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import { fileURLToPath } from 'url';
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = path.dirname(__filename);
|
|
20
|
+
// Dynamically loaded modules
|
|
21
|
+
let checkDependencies;
|
|
22
|
+
let waitForDependencies;
|
|
23
|
+
let getJobManager;
|
|
24
|
+
let runDiscovery;
|
|
25
|
+
let buildFoundation;
|
|
26
|
+
let saveFoundationDocs;
|
|
27
|
+
let loadImportedWorkItems;
|
|
28
|
+
let matchWorkItemsToModules;
|
|
29
|
+
let saveMatchingResults;
|
|
30
|
+
let analyzeModule;
|
|
31
|
+
let saveModuleAnalysis;
|
|
32
|
+
let generateSuggestions;
|
|
33
|
+
let saveSuggestionsReport;
|
|
34
|
+
let initializeCheckpoint;
|
|
35
|
+
let loadCheckpoint;
|
|
36
|
+
let saveCheckpoint;
|
|
37
|
+
let saveDiscoveryCheckpoint;
|
|
38
|
+
let loadDiscoveryCheckpoint;
|
|
39
|
+
let saveFoundationCheckpoint;
|
|
40
|
+
let saveMatchingCheckpoint;
|
|
41
|
+
let startModuleAnalysis;
|
|
42
|
+
let updateModuleProgress;
|
|
43
|
+
let recordError;
|
|
44
|
+
let completeJob;
|
|
45
|
+
let isPhaseCompleted;
|
|
46
|
+
let getResumePoint;
|
|
47
|
+
/**
|
|
48
|
+
* Main worker entry point
|
|
49
|
+
*/
|
|
50
|
+
async function main() {
|
|
51
|
+
const args = process.argv.slice(2);
|
|
52
|
+
if (args.length < 2) {
|
|
53
|
+
console.error('Usage: living-docs-worker.js <jobId> <projectPath>');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const jobId = args[0];
|
|
57
|
+
const projectPath = args[1];
|
|
58
|
+
// Write PID file with exclusive lock
|
|
59
|
+
const pidFile = path.join(projectPath, '.specweave', 'jobs', jobId, 'worker.pid');
|
|
60
|
+
fs.mkdirSync(path.dirname(pidFile), { recursive: true });
|
|
61
|
+
try {
|
|
62
|
+
const fd = fs.openSync(pidFile, 'wx');
|
|
63
|
+
fs.writeSync(fd, process.pid.toString());
|
|
64
|
+
fs.closeSync(fd);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (err.code === 'EEXIST') {
|
|
68
|
+
try {
|
|
69
|
+
const existingPid = parseInt(fs.readFileSync(pidFile, 'utf-8').trim(), 10);
|
|
70
|
+
process.kill(existingPid, 0);
|
|
71
|
+
console.error(`Worker already running for job ${jobId} (PID: ${existingPid})`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
fs.unlinkSync(pidFile);
|
|
76
|
+
fs.writeFileSync(pidFile, process.pid.toString());
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Cleanup on exit
|
|
84
|
+
const cleanup = () => {
|
|
85
|
+
try {
|
|
86
|
+
if (fs.existsSync(pidFile)) {
|
|
87
|
+
fs.unlinkSync(pidFile);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Ignore
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
process.on('exit', cleanup);
|
|
95
|
+
process.on('SIGTERM', () => { cleanup(); process.exit(0); });
|
|
96
|
+
process.on('SIGINT', () => { cleanup(); process.exit(0); });
|
|
97
|
+
// Setup logging
|
|
98
|
+
const logDir = path.join(projectPath, '.specweave', 'jobs', jobId);
|
|
99
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
100
|
+
const logPath = path.join(logDir, 'worker.log');
|
|
101
|
+
const progressPath = path.join(logDir, 'progress.json');
|
|
102
|
+
const log = (msg) => {
|
|
103
|
+
const timestamp = new Date().toISOString();
|
|
104
|
+
fs.appendFileSync(logPath, `[${timestamp}] ${msg}\n`);
|
|
105
|
+
};
|
|
106
|
+
const updateProgress = (phase, progress, message) => {
|
|
107
|
+
fs.writeFileSync(progressPath, JSON.stringify({
|
|
108
|
+
phase,
|
|
109
|
+
progress,
|
|
110
|
+
message,
|
|
111
|
+
updatedAt: new Date().toISOString()
|
|
112
|
+
}, null, 2));
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
log('════════════════════════════════════════════════════════════');
|
|
116
|
+
log('LIVING DOCS BUILDER STARTED');
|
|
117
|
+
log('════════════════════════════════════════════════════════════');
|
|
118
|
+
log(`Job ID: ${jobId}`);
|
|
119
|
+
log(`Project path: ${projectPath}`);
|
|
120
|
+
log(`PID: ${process.pid}`);
|
|
121
|
+
log(`Started at: ${new Date().toISOString()}`);
|
|
122
|
+
log('');
|
|
123
|
+
// Load job configuration
|
|
124
|
+
const configPath = path.join(logDir, 'config.json');
|
|
125
|
+
if (!fs.existsSync(configPath)) {
|
|
126
|
+
throw new Error(`Job config not found: ${configPath}`);
|
|
127
|
+
}
|
|
128
|
+
const jobConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
129
|
+
log(`User inputs: ${JSON.stringify(jobConfig.userInputs)}`);
|
|
130
|
+
log(`Dependencies: ${jobConfig.dependsOn?.join(', ') || 'none'}`);
|
|
131
|
+
log('');
|
|
132
|
+
// Load modules dynamically
|
|
133
|
+
log('Loading dependencies...');
|
|
134
|
+
const depModule = await import('../../core/background/job-dependency.js');
|
|
135
|
+
checkDependencies = depModule.checkDependencies;
|
|
136
|
+
waitForDependencies = depModule.waitForDependencies;
|
|
137
|
+
const jobManagerModule = await import('../../core/background/job-manager.js');
|
|
138
|
+
getJobManager = jobManagerModule.getJobManager;
|
|
139
|
+
const discoveryModule = await import('../../core/living-docs/discovery.js');
|
|
140
|
+
runDiscovery = discoveryModule.runDiscovery;
|
|
141
|
+
const foundationModule = await import('../../core/living-docs/foundation-builder.js');
|
|
142
|
+
buildFoundation = foundationModule.buildFoundation;
|
|
143
|
+
saveFoundationDocs = foundationModule.saveFoundationDocs;
|
|
144
|
+
const matcherModule = await import('../../core/living-docs/workitem-matcher.js');
|
|
145
|
+
loadImportedWorkItems = matcherModule.loadImportedWorkItems;
|
|
146
|
+
matchWorkItemsToModules = matcherModule.matchWorkItemsToModules;
|
|
147
|
+
saveMatchingResults = matcherModule.saveMatchingResults;
|
|
148
|
+
const analyzerModule = await import('../../core/living-docs/module-analyzer.js');
|
|
149
|
+
analyzeModule = analyzerModule.analyzeModule;
|
|
150
|
+
saveModuleAnalysis = analyzerModule.saveModuleAnalysis;
|
|
151
|
+
const suggestionsModule = await import('../../core/living-docs/suggestions-generator.js');
|
|
152
|
+
generateSuggestions = suggestionsModule.generateSuggestions;
|
|
153
|
+
saveSuggestionsReport = suggestionsModule.saveSuggestionsReport;
|
|
154
|
+
const checkpointModule = await import('../../core/living-docs/checkpoint-manager.js');
|
|
155
|
+
initializeCheckpoint = checkpointModule.initializeCheckpoint;
|
|
156
|
+
loadCheckpoint = checkpointModule.loadCheckpoint;
|
|
157
|
+
saveCheckpoint = checkpointModule.saveCheckpoint;
|
|
158
|
+
saveDiscoveryCheckpoint = checkpointModule.saveDiscoveryCheckpoint;
|
|
159
|
+
loadDiscoveryCheckpoint = checkpointModule.loadDiscoveryCheckpoint;
|
|
160
|
+
saveFoundationCheckpoint = checkpointModule.saveFoundationCheckpoint;
|
|
161
|
+
saveMatchingCheckpoint = checkpointModule.saveMatchingCheckpoint;
|
|
162
|
+
startModuleAnalysis = checkpointModule.startModuleAnalysis;
|
|
163
|
+
updateModuleProgress = checkpointModule.updateModuleProgress;
|
|
164
|
+
recordError = checkpointModule.recordError;
|
|
165
|
+
completeJob = checkpointModule.completeJob;
|
|
166
|
+
isPhaseCompleted = checkpointModule.isPhaseCompleted;
|
|
167
|
+
getResumePoint = checkpointModule.getResumePoint;
|
|
168
|
+
log('Dependencies loaded successfully');
|
|
169
|
+
log('');
|
|
170
|
+
// Get job manager and mark as running
|
|
171
|
+
const jobManager = getJobManager(projectPath);
|
|
172
|
+
jobManager.startJob(jobId);
|
|
173
|
+
// Check for existing checkpoint (resume support)
|
|
174
|
+
let checkpoint = loadCheckpoint(projectPath, jobId);
|
|
175
|
+
if (checkpoint) {
|
|
176
|
+
log(`Resuming from checkpoint: phase=${checkpoint.phase}, progress=${checkpoint.phaseProgress}%`);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
checkpoint = initializeCheckpoint(projectPath, jobId);
|
|
180
|
+
log('Initialized new checkpoint');
|
|
181
|
+
}
|
|
182
|
+
// ═══════════════════════════════════════════════════════════════
|
|
183
|
+
// PHASE 1: Wait for dependencies
|
|
184
|
+
// ═══════════════════════════════════════════════════════════════
|
|
185
|
+
if (jobConfig.dependsOn && jobConfig.dependsOn.length > 0 && !isPhaseCompleted(checkpoint, 'waiting')) {
|
|
186
|
+
log('PHASE: Waiting for dependencies...');
|
|
187
|
+
updateProgress('waiting', 0, 'Waiting for clone/import jobs to complete');
|
|
188
|
+
const depStatus = await waitForDependencies(projectPath, jobConfig.dependsOn, (status) => {
|
|
189
|
+
if (status.waitingFor.length > 0) {
|
|
190
|
+
log(` Still waiting for: ${status.waitingFor.join(', ')}`);
|
|
191
|
+
updateProgress('waiting', 0, `Waiting for ${status.waitingFor.length} jobs`);
|
|
192
|
+
}
|
|
193
|
+
}, 30000 // Check every 30 seconds
|
|
194
|
+
);
|
|
195
|
+
if (depStatus.failedDeps.length > 0) {
|
|
196
|
+
log(` WARNING: Some dependencies failed: ${depStatus.failedDeps.join(', ')}`);
|
|
197
|
+
log(' Proceeding with available data...');
|
|
198
|
+
}
|
|
199
|
+
log(' Dependencies complete');
|
|
200
|
+
checkpoint.phase = 'discovery';
|
|
201
|
+
saveCheckpoint(projectPath, jobId, checkpoint);
|
|
202
|
+
}
|
|
203
|
+
// ═══════════════════════════════════════════════════════════════
|
|
204
|
+
// PHASE 2: Discovery
|
|
205
|
+
// ═══════════════════════════════════════════════════════════════
|
|
206
|
+
let discovery = loadDiscoveryCheckpoint(projectPath, jobId);
|
|
207
|
+
if (!discovery) {
|
|
208
|
+
log('PHASE: Discovery - Scanning codebase...');
|
|
209
|
+
updateProgress('discovery', 0, 'Scanning codebase structure');
|
|
210
|
+
try {
|
|
211
|
+
discovery = await runDiscovery(projectPath, jobConfig.userInputs.additionalSources, (phase, current, total) => {
|
|
212
|
+
const progress = Math.round((current / total) * 100);
|
|
213
|
+
updateProgress('discovery', progress, `${phase}: ${current}/${total}`);
|
|
214
|
+
});
|
|
215
|
+
saveDiscoveryCheckpoint(projectPath, jobId, discovery);
|
|
216
|
+
log(` Discovered ${discovery.codebaseStats.totalFiles} files in ${discovery.modules.length} modules`);
|
|
217
|
+
log(` Tier: ${discovery.tier}`);
|
|
218
|
+
log(` Languages: ${discovery.techStack.languages.join(', ')}`);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
recordError(projectPath, jobId, 'discovery', err.message);
|
|
222
|
+
throw err;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
log(' Discovery loaded from checkpoint');
|
|
227
|
+
}
|
|
228
|
+
// ═══════════════════════════════════════════════════════════════
|
|
229
|
+
// PHASE 3: Foundation docs
|
|
230
|
+
// ═══════════════════════════════════════════════════════════════
|
|
231
|
+
if (!isPhaseCompleted(checkpoint, 'foundation')) {
|
|
232
|
+
log('PHASE: Foundation - Building high-level docs...');
|
|
233
|
+
updateProgress('foundation', 0, 'Generating overview documentation');
|
|
234
|
+
try {
|
|
235
|
+
const foundationDocs = await buildFoundation(projectPath, discovery, (docName, status) => {
|
|
236
|
+
log(` ${docName}: ${status}`);
|
|
237
|
+
if (status === 'generating') {
|
|
238
|
+
updateProgress('foundation', 50, `Generating ${docName}`);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
const savedPaths = await saveFoundationDocs(projectPath, foundationDocs);
|
|
242
|
+
saveFoundationCheckpoint(projectPath, jobId, savedPaths);
|
|
243
|
+
log(` Created ${savedPaths.length} foundation docs`);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
recordError(projectPath, jobId, 'foundation', err.message);
|
|
247
|
+
throw err;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
log(' Foundation phase already complete');
|
|
252
|
+
}
|
|
253
|
+
// ═══════════════════════════════════════════════════════════════
|
|
254
|
+
// PHASE 4: Integration (Work Item Matching)
|
|
255
|
+
// ═══════════════════════════════════════════════════════════════
|
|
256
|
+
let matchResult;
|
|
257
|
+
if (!isPhaseCompleted(checkpoint, 'integration')) {
|
|
258
|
+
log('PHASE: Integration - Matching work items...');
|
|
259
|
+
updateProgress('integration', 0, 'Loading imported work items');
|
|
260
|
+
try {
|
|
261
|
+
const workItems = await loadImportedWorkItems(projectPath, (phase, current, total) => {
|
|
262
|
+
updateProgress('integration', Math.round((current / total) * 50), `Loading work items: ${current}/${total}`);
|
|
263
|
+
});
|
|
264
|
+
log(` Loaded ${workItems.length} work items`);
|
|
265
|
+
matchResult = await matchWorkItemsToModules(projectPath, discovery, workItems, (phase, current, total) => {
|
|
266
|
+
updateProgress('integration', 50 + Math.round((current / total) * 50), `Matching: ${current}/${total}`);
|
|
267
|
+
});
|
|
268
|
+
await saveMatchingResults(projectPath, matchResult);
|
|
269
|
+
saveMatchingCheckpoint(projectPath, jobId, matchResult);
|
|
270
|
+
log(` Matched ${matchResult.stats.matchedWorkItems}/${matchResult.stats.totalWorkItems} items`);
|
|
271
|
+
log(` Modules with work items: ${matchResult.stats.modulesWithWorkItems}`);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
recordError(projectPath, jobId, 'integration', err.message);
|
|
275
|
+
throw err;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
log(' Integration phase already complete');
|
|
280
|
+
// Load from checkpoint if needed
|
|
281
|
+
matchResult = checkpoint.matchingStats ? {
|
|
282
|
+
stats: checkpoint.matchingStats,
|
|
283
|
+
moduleMap: new Map(),
|
|
284
|
+
priorityQueue: [],
|
|
285
|
+
unmatchedItems: []
|
|
286
|
+
} : null;
|
|
287
|
+
}
|
|
288
|
+
// ═══════════════════════════════════════════════════════════════
|
|
289
|
+
// PHASE 5: Deep Dive (Module Analysis)
|
|
290
|
+
// ═══════════════════════════════════════════════════════════════
|
|
291
|
+
const moduleAnalyses = new Map();
|
|
292
|
+
if (!isPhaseCompleted(checkpoint, 'deep-dive')) {
|
|
293
|
+
log('PHASE: Deep Dive - Analyzing modules...');
|
|
294
|
+
// Determine which modules to analyze based on depth setting
|
|
295
|
+
let modulesToAnalyze = [...discovery.modules];
|
|
296
|
+
if (jobConfig.userInputs.analysisDepth === 'quick') {
|
|
297
|
+
// Only top 5 priority modules
|
|
298
|
+
modulesToAnalyze = modulesToAnalyze.slice(0, 5);
|
|
299
|
+
}
|
|
300
|
+
else if (jobConfig.userInputs.analysisDepth === 'standard') {
|
|
301
|
+
// Top 10
|
|
302
|
+
modulesToAnalyze = modulesToAnalyze.slice(0, 10);
|
|
303
|
+
}
|
|
304
|
+
// 'deep' = all modules
|
|
305
|
+
// Check for resume point
|
|
306
|
+
const resumePoint = getResumePoint(projectPath, jobId);
|
|
307
|
+
let startIndex = 0;
|
|
308
|
+
if (resumePoint?.module) {
|
|
309
|
+
startIndex = modulesToAnalyze.findIndex(m => m.name === resumePoint.module);
|
|
310
|
+
if (startIndex === -1)
|
|
311
|
+
startIndex = 0;
|
|
312
|
+
log(` Resuming from module: ${resumePoint.module}`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
startModuleAnalysis(projectPath, jobId, modulesToAnalyze.map(m => m.name));
|
|
316
|
+
}
|
|
317
|
+
for (let i = startIndex; i < modulesToAnalyze.length; i++) {
|
|
318
|
+
const module = modulesToAnalyze[i];
|
|
319
|
+
const remaining = modulesToAnalyze.slice(i + 1).map(m => m.name);
|
|
320
|
+
log(` Analyzing module: ${module.name} (${i + 1}/${modulesToAnalyze.length})`);
|
|
321
|
+
updateProgress('deep-dive', Math.round(((i + 1) / modulesToAnalyze.length) * 100), `Analyzing ${module.name}`);
|
|
322
|
+
try {
|
|
323
|
+
const workItemMatches = matchResult?.moduleMap?.get(module.name)?.matches || [];
|
|
324
|
+
const analysis = await analyzeModule(projectPath, module, discovery.samplingConfig, workItemMatches, (_moduleName, _fileIdx, _totalFiles) => {
|
|
325
|
+
// File-level progress
|
|
326
|
+
});
|
|
327
|
+
moduleAnalyses.set(module.name, analysis);
|
|
328
|
+
await saveModuleAnalysis(projectPath, analysis);
|
|
329
|
+
updateModuleProgress(projectPath, jobId, module.name, remaining);
|
|
330
|
+
log(` Files analyzed: ${analysis.filesAnalyzed.length}`);
|
|
331
|
+
log(` Exports found: ${analysis.totalExports}`);
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
recordError(projectPath, jobId, 'deep-dive', `${module.name}: ${err.message}`);
|
|
335
|
+
log(` ERROR: ${err.message}`);
|
|
336
|
+
// Continue with next module
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
log(' Deep dive phase already complete');
|
|
342
|
+
}
|
|
343
|
+
// ═══════════════════════════════════════════════════════════════
|
|
344
|
+
// PHASE 6: Suggestions
|
|
345
|
+
// ═══════════════════════════════════════════════════════════════
|
|
346
|
+
log('PHASE: Suggestions - Generating recommendations...');
|
|
347
|
+
updateProgress('suggestions', 0, 'Generating SUGGESTIONS.md');
|
|
348
|
+
try {
|
|
349
|
+
const report = await generateSuggestions(projectPath, discovery, moduleAnalyses, matchResult || { stats: { totalWorkItems: 0, matchedWorkItems: 0, modulesWithWorkItems: 0 }, moduleMap: new Map(), priorityQueue: [], unmatchedItems: [] }, jobConfig.userInputs);
|
|
350
|
+
const suggestionsPath = await saveSuggestionsReport(projectPath, report);
|
|
351
|
+
log(` Created: ${suggestionsPath}`);
|
|
352
|
+
log(` Summary:`);
|
|
353
|
+
log(` - Total modules: ${report.summary.totalModules}`);
|
|
354
|
+
log(` - Documented: ${report.summary.modulesDocumented}`);
|
|
355
|
+
log(` - Partial: ${report.summary.modulesPartial}`);
|
|
356
|
+
log(` - Undocumented: ${report.summary.modulesUndocumented}`);
|
|
357
|
+
log(` - Coverage: ${report.summary.coveragePercent}%`);
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
recordError(projectPath, jobId, 'suggestions', err.message);
|
|
361
|
+
throw err;
|
|
362
|
+
}
|
|
363
|
+
// ═══════════════════════════════════════════════════════════════
|
|
364
|
+
// Complete
|
|
365
|
+
// ═══════════════════════════════════════════════════════════════
|
|
366
|
+
completeJob(projectPath, jobId);
|
|
367
|
+
jobManager.completeJob(jobId, {
|
|
368
|
+
completedAt: new Date().toISOString(),
|
|
369
|
+
modulesAnalyzed: moduleAnalyses.size,
|
|
370
|
+
suggestionsGenerated: true
|
|
371
|
+
});
|
|
372
|
+
updateProgress('complete', 100, 'Living docs generation complete');
|
|
373
|
+
log('');
|
|
374
|
+
log('════════════════════════════════════════════════════════════');
|
|
375
|
+
log('LIVING DOCS BUILDER COMPLETED');
|
|
376
|
+
log('════════════════════════════════════════════════════════════');
|
|
377
|
+
log(`Completed at: ${new Date().toISOString()}`);
|
|
378
|
+
log(`Output: .specweave/docs/SUGGESTIONS.md`);
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
log(`FATAL ERROR: ${err.message}`);
|
|
382
|
+
log(err.stack || '');
|
|
383
|
+
try {
|
|
384
|
+
const jobManager = getJobManager(projectPath);
|
|
385
|
+
jobManager.failJob(jobId, err.message);
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// Ignore
|
|
389
|
+
}
|
|
390
|
+
updateProgress('error', 0, err.message);
|
|
391
|
+
process.exit(1);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
main();
|
|
395
|
+
//# sourceMappingURL=living-docs-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"living-docs-worker.js","sourceRoot":"","sources":["../../../../src/cli/workers/living-docs-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Dependency System
|
|
3
|
+
*
|
|
4
|
+
* Enables jobs to wait for other jobs to complete before starting.
|
|
5
|
+
* Used by living-docs-builder to wait for clone and import jobs.
|
|
6
|
+
*/
|
|
7
|
+
import { BackgroundJobManager } from './job-manager.js';
|
|
8
|
+
export interface DependencyStatus {
|
|
9
|
+
/** Whether all dependencies are satisfied */
|
|
10
|
+
ready: boolean;
|
|
11
|
+
/** Job IDs still running/pending */
|
|
12
|
+
waitingFor: string[];
|
|
13
|
+
/** Job IDs that failed */
|
|
14
|
+
failedDeps: string[];
|
|
15
|
+
/** Job IDs that completed successfully */
|
|
16
|
+
completedDeps: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check the status of job dependencies
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkDependencies(jobManager: BackgroundJobManager, dependsOn: string[] | undefined): DependencyStatus;
|
|
22
|
+
/**
|
|
23
|
+
* Wait for all dependencies to complete (or fail)
|
|
24
|
+
*
|
|
25
|
+
* @param projectPath - Project root path
|
|
26
|
+
* @param dependsOn - Array of job IDs to wait for
|
|
27
|
+
* @param onProgress - Callback for progress updates
|
|
28
|
+
* @param pollIntervalMs - How often to check (default 10 seconds)
|
|
29
|
+
* @returns Final dependency status
|
|
30
|
+
*/
|
|
31
|
+
export declare function waitForDependencies(projectPath: string, dependsOn: string[] | undefined, onProgress: (status: DependencyStatus) => void, pollIntervalMs?: number): Promise<DependencyStatus>;
|
|
32
|
+
/**
|
|
33
|
+
* Check for circular dependencies
|
|
34
|
+
*
|
|
35
|
+
* @param jobManager - Job manager instance
|
|
36
|
+
* @param jobId - The job being checked
|
|
37
|
+
* @param dependsOn - Its dependencies
|
|
38
|
+
* @returns Array of circular dependency chains found, or empty if none
|
|
39
|
+
*/
|
|
40
|
+
export declare function detectCircularDependencies(jobManager: BackgroundJobManager, jobId: string, dependsOn: string[] | undefined): string[][];
|
|
41
|
+
/**
|
|
42
|
+
* Format dependency status for display
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatDependencyStatus(status: DependencyStatus): string;
|
|
45
|
+
//# sourceMappingURL=job-dependency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-dependency.d.ts","sourceRoot":"","sources":["../../../../src/core/background/job-dependency.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiB,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,KAAK,EAAE,OAAO,CAAC;IACf,oCAAoC;IACpC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,oBAAoB,EAChC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAC9B,gBAAgB,CAuClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,EAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,EAC9C,cAAc,GAAE,MAAc,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAa3B;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,oBAAoB,EAChC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,GAAG,SAAS,GAC9B,MAAM,EAAE,EAAE,CAoDZ;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAoBvE"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job Dependency System
|
|
3
|
+
*
|
|
4
|
+
* Enables jobs to wait for other jobs to complete before starting.
|
|
5
|
+
* Used by living-docs-builder to wait for clone and import jobs.
|
|
6
|
+
*/
|
|
7
|
+
import { getJobManager } from './job-manager.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check the status of job dependencies
|
|
10
|
+
*/
|
|
11
|
+
export function checkDependencies(jobManager, dependsOn) {
|
|
12
|
+
if (!dependsOn || dependsOn.length === 0) {
|
|
13
|
+
return { ready: true, waitingFor: [], failedDeps: [], completedDeps: [] };
|
|
14
|
+
}
|
|
15
|
+
const waitingFor = [];
|
|
16
|
+
const failedDeps = [];
|
|
17
|
+
const completedDeps = [];
|
|
18
|
+
for (const depId of dependsOn) {
|
|
19
|
+
const job = jobManager.getJob(depId);
|
|
20
|
+
if (!job) {
|
|
21
|
+
// Job doesn't exist (deleted or never created), treat as completed
|
|
22
|
+
completedDeps.push(depId);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
switch (job.status) {
|
|
26
|
+
case 'completed':
|
|
27
|
+
completedDeps.push(depId);
|
|
28
|
+
break;
|
|
29
|
+
case 'failed':
|
|
30
|
+
failedDeps.push(depId);
|
|
31
|
+
break;
|
|
32
|
+
case 'pending':
|
|
33
|
+
case 'running':
|
|
34
|
+
case 'paused':
|
|
35
|
+
default:
|
|
36
|
+
waitingFor.push(depId);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
ready: waitingFor.length === 0,
|
|
41
|
+
waitingFor,
|
|
42
|
+
failedDeps,
|
|
43
|
+
completedDeps
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Wait for all dependencies to complete (or fail)
|
|
48
|
+
*
|
|
49
|
+
* @param projectPath - Project root path
|
|
50
|
+
* @param dependsOn - Array of job IDs to wait for
|
|
51
|
+
* @param onProgress - Callback for progress updates
|
|
52
|
+
* @param pollIntervalMs - How often to check (default 10 seconds)
|
|
53
|
+
* @returns Final dependency status
|
|
54
|
+
*/
|
|
55
|
+
export async function waitForDependencies(projectPath, dependsOn, onProgress, pollIntervalMs = 10000) {
|
|
56
|
+
const jobManager = getJobManager(projectPath);
|
|
57
|
+
let status = checkDependencies(jobManager, dependsOn);
|
|
58
|
+
while (!status.ready) {
|
|
59
|
+
onProgress(status);
|
|
60
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
61
|
+
status = checkDependencies(jobManager, dependsOn);
|
|
62
|
+
}
|
|
63
|
+
// Final callback with ready status
|
|
64
|
+
onProgress(status);
|
|
65
|
+
return status;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check for circular dependencies
|
|
69
|
+
*
|
|
70
|
+
* @param jobManager - Job manager instance
|
|
71
|
+
* @param jobId - The job being checked
|
|
72
|
+
* @param dependsOn - Its dependencies
|
|
73
|
+
* @returns Array of circular dependency chains found, or empty if none
|
|
74
|
+
*/
|
|
75
|
+
export function detectCircularDependencies(jobManager, jobId, dependsOn) {
|
|
76
|
+
if (!dependsOn || dependsOn.length === 0) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
const circularChains = [];
|
|
80
|
+
const visited = new Set();
|
|
81
|
+
const path = [jobId];
|
|
82
|
+
function dfs(currentId) {
|
|
83
|
+
if (visited.has(currentId)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const job = jobManager.getJob(currentId);
|
|
87
|
+
if (!job) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Get dependencies from job config if it has them
|
|
91
|
+
const deps = job.config.dependsOn;
|
|
92
|
+
if (!deps || deps.length === 0) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const depId of deps) {
|
|
96
|
+
if (depId === jobId) {
|
|
97
|
+
// Found circular dependency back to original job
|
|
98
|
+
circularChains.push([...path, depId]);
|
|
99
|
+
}
|
|
100
|
+
else if (!visited.has(depId)) {
|
|
101
|
+
path.push(depId);
|
|
102
|
+
dfs(depId);
|
|
103
|
+
path.pop();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
visited.add(currentId);
|
|
107
|
+
}
|
|
108
|
+
// Check each direct dependency
|
|
109
|
+
for (const depId of dependsOn) {
|
|
110
|
+
if (depId === jobId) {
|
|
111
|
+
// Direct self-reference
|
|
112
|
+
circularChains.push([jobId, depId]);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
path.push(depId);
|
|
116
|
+
dfs(depId);
|
|
117
|
+
path.pop();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return circularChains;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Format dependency status for display
|
|
124
|
+
*/
|
|
125
|
+
export function formatDependencyStatus(status) {
|
|
126
|
+
if (status.ready) {
|
|
127
|
+
if (status.failedDeps.length > 0) {
|
|
128
|
+
return `Dependencies ready (${status.failedDeps.length} failed, proceeding with partial data)`;
|
|
129
|
+
}
|
|
130
|
+
return 'All dependencies completed';
|
|
131
|
+
}
|
|
132
|
+
const parts = [];
|
|
133
|
+
if (status.waitingFor.length > 0) {
|
|
134
|
+
parts.push(`Waiting for: ${status.waitingFor.join(', ')}`);
|
|
135
|
+
}
|
|
136
|
+
if (status.completedDeps.length > 0) {
|
|
137
|
+
parts.push(`Completed: ${status.completedDeps.length}`);
|
|
138
|
+
}
|
|
139
|
+
if (status.failedDeps.length > 0) {
|
|
140
|
+
parts.push(`Failed: ${status.failedDeps.length}`);
|
|
141
|
+
}
|
|
142
|
+
return parts.join(' | ');
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=job-dependency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-dependency.js","sourceRoot":"","sources":["../../../../src/core/background/job-dependency.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Spawns import workers as detached processes that survive terminal close.
|
|
5
5
|
* Progress tracked via file system - check with /specweave:jobs
|
|
6
6
|
*/
|
|
7
|
-
import type { BackgroundJob, JobType } from './types.js';
|
|
7
|
+
import type { BackgroundJob, JobType, LivingDocsUserInputs } from './types.js';
|
|
8
8
|
export interface LaunchOptions {
|
|
9
9
|
/** Job type */
|
|
10
10
|
type: JobType;
|
|
@@ -56,6 +56,26 @@ export interface CloneLaunchOptions {
|
|
|
56
56
|
* @returns Job info and process details
|
|
57
57
|
*/
|
|
58
58
|
export declare function launchCloneJob(options: CloneLaunchOptions): Promise<LaunchResult>;
|
|
59
|
+
export interface LivingDocsLaunchOptions {
|
|
60
|
+
/** Project path */
|
|
61
|
+
projectPath: string;
|
|
62
|
+
/** User inputs collected before launch */
|
|
63
|
+
userInputs: LivingDocsUserInputs;
|
|
64
|
+
/** Job IDs to wait for before starting */
|
|
65
|
+
dependsOn?: string[];
|
|
66
|
+
/** Run in foreground (blocking) instead of background */
|
|
67
|
+
foreground?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Launch a living-docs-builder job
|
|
71
|
+
*
|
|
72
|
+
* This job waits for dependencies (clone/import jobs) to complete before
|
|
73
|
+
* analyzing the codebase and generating living documentation.
|
|
74
|
+
*
|
|
75
|
+
* @param options Launch configuration
|
|
76
|
+
* @returns Job info and process details
|
|
77
|
+
*/
|
|
78
|
+
export declare function launchLivingDocsJob(options: LivingDocsLaunchOptions): Promise<LaunchResult>;
|
|
59
79
|
/**
|
|
60
80
|
* Check if a background job is still running
|
|
61
81
|
*/
|