specweave 0.22.13 → 0.23.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/.claude-plugin/README.md +2 -2
- package/CLAUDE.md +447 -52
- package/README.md +33 -10
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +1 -1
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +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 +4 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts +9 -0
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +10 -1
- package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +2 -2
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -1
- package/dist/plugins/specweave-github/lib/types.d.ts +1 -1
- package/dist/src/cli/commands/import-external.d.ts +22 -0
- package/dist/src/cli/commands/import-external.d.ts.map +1 -0
- package/dist/src/cli/commands/import-external.js +282 -0
- package/dist/src/cli/commands/import-external.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +359 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
- package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
- package/dist/src/cli/helpers/github-repo-selector.js +265 -0
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +41 -24
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/config/import-config.d.ts +69 -0
- package/dist/src/config/import-config.d.ts.map +1 -0
- package/dist/src/config/import-config.js +136 -0
- package/dist/src/config/import-config.js.map +1 -0
- package/dist/src/config/types.d.ts +26 -26
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
- package/dist/src/core/increment/ac-status-manager.js +4 -2
- package/dist/src/core/increment/ac-status-manager.js.map +1 -1
- package/dist/src/core/increment/completion-validator.d.ts +30 -1
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +151 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +25 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +130 -3
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +262 -18
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +25 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +16 -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 +56 -1
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +2 -2
- package/dist/src/core/living-docs/task-project-specific-generator.js +2 -2
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts +2 -2
- package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/prompt-consolidator.js +3 -15
- package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +3 -6
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +4 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/spec-content-sync.js +139 -4
- package/dist/src/core/spec-content-sync.js.map +1 -1
- package/dist/src/core/spec-task-mapper.d.ts.map +1 -1
- package/dist/src/core/spec-task-mapper.js +9 -8
- package/dist/src/core/spec-task-mapper.js.map +1 -1
- package/dist/src/core/status-line-validator.d.ts +63 -0
- package/dist/src/core/status-line-validator.d.ts.map +1 -0
- package/dist/src/core/status-line-validator.js +253 -0
- package/dist/src/core/status-line-validator.js.map +1 -0
- package/dist/src/core/sync/bidirectional-engine.d.ts +10 -1
- package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -1
- package/dist/src/core/sync/bidirectional-engine.js +10 -1
- package/dist/src/core/sync/bidirectional-engine.js.map +1 -1
- package/dist/src/core/sync/profile-manager.d.ts.map +1 -1
- package/dist/src/core/sync/profile-manager.js +3 -0
- package/dist/src/core/sync/profile-manager.js.map +1 -1
- package/dist/src/core/sync/project-context.d.ts.map +1 -1
- package/dist/src/core/sync/project-context.js +3 -0
- package/dist/src/core/sync/project-context.js.map +1 -1
- package/dist/src/core/sync/status-sync-engine.d.ts +1 -1
- package/dist/src/core/sync/status-sync-engine.js +1 -1
- package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
- package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-event-logger.js +39 -1
- package/dist/src/core/sync/sync-event-logger.js.map +1 -1
- package/dist/src/core/types/origin-metadata.d.ts +153 -0
- package/dist/src/core/types/origin-metadata.d.ts.map +1 -0
- package/dist/src/core/types/origin-metadata.js +166 -0
- package/dist/src/core/types/origin-metadata.js.map +1 -0
- package/dist/src/core/types/sync-config-validator.d.ts +57 -0
- package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
- package/dist/src/core/types/sync-config-validator.js +116 -0
- package/dist/src/core/types/sync-config-validator.js.map +1 -0
- package/dist/src/core/types/sync-profile.d.ts +8 -2
- package/dist/src/core/types/sync-profile.d.ts.map +1 -1
- package/dist/src/core/types/sync-profile.js.map +1 -1
- package/dist/src/core/types/sync-settings.d.ts +73 -0
- package/dist/src/core/types/sync-settings.d.ts.map +1 -0
- package/dist/src/core/types/sync-settings.js +90 -0
- package/dist/src/core/types/sync-settings.js.map +1 -0
- package/dist/src/core/utils/permission-checker.d.ts +100 -0
- package/dist/src/core/utils/permission-checker.d.ts.map +1 -0
- package/dist/src/core/utils/permission-checker.js +166 -0
- package/dist/src/core/utils/permission-checker.js.map +1 -0
- package/dist/src/generators/spec/spec-parser.js +3 -3
- package/dist/src/generators/spec/spec-parser.js.map +1 -1
- package/dist/src/generators/spec/task-parser.js +4 -4
- package/dist/src/generators/spec/task-parser.js.map +1 -1
- package/dist/src/id-generators/task-id-generator.d.ts +96 -0
- package/dist/src/id-generators/task-id-generator.d.ts.map +1 -0
- package/dist/src/id-generators/task-id-generator.js +143 -0
- package/dist/src/id-generators/task-id-generator.js.map +1 -0
- package/dist/src/id-generators/us-id-generator.d.ts +96 -0
- package/dist/src/id-generators/us-id-generator.d.ts.map +1 -0
- package/dist/src/id-generators/us-id-generator.js +143 -0
- package/dist/src/id-generators/us-id-generator.js.map +1 -0
- package/dist/src/importers/ado-importer.d.ts +43 -0
- package/dist/src/importers/ado-importer.d.ts.map +1 -0
- package/dist/src/importers/ado-importer.js +234 -0
- package/dist/src/importers/ado-importer.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +107 -0
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
- package/dist/src/importers/duplicate-detector.js +189 -0
- package/dist/src/importers/duplicate-detector.js.map +1 -0
- package/dist/src/importers/external-importer.d.ts +96 -0
- package/dist/src/importers/external-importer.d.ts.map +1 -0
- package/dist/src/importers/external-importer.js +13 -0
- package/dist/src/importers/external-importer.js.map +1 -0
- package/dist/src/importers/github-importer.d.ts +37 -0
- package/dist/src/importers/github-importer.d.ts.map +1 -0
- package/dist/src/importers/github-importer.js +161 -0
- package/dist/src/importers/github-importer.js.map +1 -0
- package/dist/src/importers/import-coordinator.d.ts +105 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -0
- package/dist/src/importers/import-coordinator.js +224 -0
- package/dist/src/importers/import-coordinator.js.map +1 -0
- package/dist/src/importers/item-converter.d.ts +96 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -0
- package/dist/src/importers/item-converter.js +246 -0
- package/dist/src/importers/item-converter.js.map +1 -0
- package/dist/src/importers/jira-importer.d.ts +42 -0
- package/dist/src/importers/jira-importer.d.ts.map +1 -0
- package/dist/src/importers/jira-importer.js +221 -0
- package/dist/src/importers/jira-importer.js.map +1 -0
- package/dist/src/importers/rate-limiter.d.ts +128 -0
- package/dist/src/importers/rate-limiter.d.ts.map +1 -0
- package/dist/src/importers/rate-limiter.js +200 -0
- package/dist/src/importers/rate-limiter.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +2 -2
- package/dist/src/init/repo/types.d.ts +2 -2
- package/dist/src/integrations/ado/ado-client.d.ts +6 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +23 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +6 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +38 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +149 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -0
- package/dist/src/living-docs/fs-id-allocator.js +325 -0
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -0
- package/dist/src/living-docs/id-registry.d.ts +124 -0
- package/dist/src/living-docs/id-registry.d.ts.map +1 -0
- package/dist/src/living-docs/id-registry.js +230 -0
- package/dist/src/living-docs/id-registry.js.map +1 -0
- package/dist/src/progress/us-progress-tracker.d.ts +68 -0
- package/dist/src/progress/us-progress-tracker.d.ts.map +1 -0
- package/dist/src/progress/us-progress-tracker.js +120 -0
- package/dist/src/progress/us-progress-tracker.js.map +1 -0
- package/dist/src/sync/external-item-sync-service.d.ts +150 -0
- package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
- package/dist/src/sync/external-item-sync-service.js +241 -0
- package/dist/src/sync/external-item-sync-service.js.map +1 -0
- package/dist/src/sync/format-preservation-sync.d.ts +90 -0
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
- package/dist/src/sync/format-preservation-sync.js +173 -0
- package/dist/src/sync/format-preservation-sync.js.map +1 -0
- package/dist/src/sync/index.d.ts +8 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +6 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/sync-coordinator.d.ts +49 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/src/sync/sync-coordinator.js +248 -0
- package/dist/src/sync/sync-coordinator.js.map +1 -0
- package/dist/src/sync/sync-metadata.d.ts +75 -0
- package/dist/src/sync/sync-metadata.d.ts.map +1 -0
- package/dist/src/sync/sync-metadata.js +100 -0
- package/dist/src/sync/sync-metadata.js.map +1 -0
- package/dist/src/types/living-docs-us-file.d.ts +63 -0
- package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
- package/dist/src/types/living-docs-us-file.js +27 -0
- package/dist/src/types/living-docs-us-file.js.map +1 -0
- package/dist/src/validators/format-preservation-validator.d.ts +127 -0
- package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
- package/dist/src/validators/format-preservation-validator.js +187 -0
- package/dist/src/validators/format-preservation-validator.js.map +1 -0
- package/package.json +3 -2
- package/plugins/specweave/.claude-plugin/plugin.json +36 -2
- package/plugins/specweave/agents/architect/AGENT.md +11 -2
- package/plugins/specweave/agents/test-aware-planner/AGENT.md +81 -25
- package/plugins/specweave/commands/specweave-archive-features.md +11 -1
- package/plugins/specweave/commands/specweave-import-external.md +407 -0
- package/plugins/specweave/commands/specweave-progress.md +45 -97
- package/plugins/specweave/hooks/post-edit-spec.sh +41 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +168 -26
- package/plugins/specweave/hooks/post-increment-planning.sh +148 -4
- package/plugins/specweave/hooks/post-spec-update.sh +0 -0
- package/plugins/specweave/hooks/post-task-completion.sh +75 -5
- package/plugins/specweave/hooks/post-write-spec.sh +37 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/sync-cache.js +294 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +67 -2
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +200 -14
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
- package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
- package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
- package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
- package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-ado/lib/conflict-resolver.ts +1 -1
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-backend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-docs-preview/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-figma/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +37 -22
- package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +1 -1
- package/plugins/specweave-github/lib/enhanced-github-sync.js +1 -1
- package/plugins/specweave-github/lib/enhanced-github-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.js +2 -1
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +4 -1
- package/plugins/specweave-github/lib/github-spec-sync.js +1 -1
- package/plugins/specweave-github/lib/github-spec-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-sync-bidirectional.js +1 -1
- package/plugins/specweave-github/lib/github-sync-bidirectional.ts +10 -1
- package/plugins/specweave-github/lib/progress-comment-builder.js +1 -1
- package/plugins/specweave-github/lib/progress-comment-builder.ts +2 -2
- package/plugins/specweave-github/lib/types.ts +1 -1
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-payments/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-testing/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ui/.claude-plugin/plugin.json +1 -1
- package/src/templates/.env.example +5 -0
- package/src/templates/config-permissions-guide.md +413 -0
- package/src/templates/config.json.template +68 -0
- package/src/templates/tasks.md.template +180 -201
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -5442
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Origin Metadata Types
|
|
3
|
+
*
|
|
4
|
+
* Defines types for tracking the origin of User Stories and Tasks:
|
|
5
|
+
* - Internal: Created within SpecWeave increments
|
|
6
|
+
* - External: Imported from external tools (GitHub, JIRA, ADO)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Origin badge emojis for living docs
|
|
10
|
+
*/
|
|
11
|
+
export const ORIGIN_BADGES = {
|
|
12
|
+
internal: '🏠', // Internal
|
|
13
|
+
github: '🔗', // GitHub
|
|
14
|
+
jira: '🎫', // JIRA
|
|
15
|
+
ado: '📋', // Azure DevOps
|
|
16
|
+
unknown: '❓' // Unknown external source
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Get origin badge for display
|
|
20
|
+
*
|
|
21
|
+
* @param source - External source or 'internal'
|
|
22
|
+
* @returns Emoji badge
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* getOriginBadge('github') // Returns: '🔗'
|
|
26
|
+
* getOriginBadge('internal') // Returns: '🏠'
|
|
27
|
+
*/
|
|
28
|
+
export function getOriginBadge(source) {
|
|
29
|
+
return ORIGIN_BADGES[source] || ORIGIN_BADGES.unknown;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Format origin for display in living docs
|
|
33
|
+
*
|
|
34
|
+
* @param metadata - External item metadata
|
|
35
|
+
* @returns Formatted origin string (e.g., "🔗 GitHub #638")
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* formatOrigin({
|
|
39
|
+
* id: 'US-004E',
|
|
40
|
+
* origin: 'external',
|
|
41
|
+
* source: 'github',
|
|
42
|
+
* external_id: 'GH-#638',
|
|
43
|
+
* external_url: 'https://github.com/...',
|
|
44
|
+
* imported_at: '2025-11-19T10:30:00Z'
|
|
45
|
+
* })
|
|
46
|
+
* // Returns: "🔗 [GitHub #638](https://github.com/...)"
|
|
47
|
+
*/
|
|
48
|
+
export function formatOrigin(metadata) {
|
|
49
|
+
const badge = getOriginBadge(metadata.source);
|
|
50
|
+
const displayId = metadata.external_id.replace(/^(GH|JIRA|ADO)-/, '');
|
|
51
|
+
return `${badge} [${metadata.source.toUpperCase()} ${displayId}](${metadata.external_url})`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if ID is from external source (has E suffix)
|
|
55
|
+
*
|
|
56
|
+
* @param id - User Story or Task ID
|
|
57
|
+
* @returns True if external, false if internal
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* isExternalId('US-004E') // Returns: true
|
|
61
|
+
* isExternalId('US-003') // Returns: false
|
|
62
|
+
* isExternalId('T-010E') // Returns: true
|
|
63
|
+
*/
|
|
64
|
+
export function isExternalId(id) {
|
|
65
|
+
return id.endsWith('E');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Extract origin from ID suffix
|
|
69
|
+
*
|
|
70
|
+
* @param id - User Story or Task ID
|
|
71
|
+
* @returns Origin type
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* getOriginFromId('US-004E') // Returns: 'external'
|
|
75
|
+
* getOriginFromId('US-003') // Returns: 'internal'
|
|
76
|
+
*/
|
|
77
|
+
export function getOriginFromId(id) {
|
|
78
|
+
return isExternalId(id) ? 'external' : 'internal';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Parse external ID to extract source and number
|
|
82
|
+
*
|
|
83
|
+
* @param externalId - External ID (e.g., "GH-#638", "JIRA-SPEC-789")
|
|
84
|
+
* @returns Parsed components
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* parseExternalId('GH-#638')
|
|
88
|
+
* // Returns: { source: 'github', number: '638' }
|
|
89
|
+
*
|
|
90
|
+
* parseExternalId('JIRA-SPEC-789')
|
|
91
|
+
* // Returns: { source: 'jira', number: 'SPEC-789' }
|
|
92
|
+
*/
|
|
93
|
+
export function parseExternalId(externalId) {
|
|
94
|
+
const ghMatch = externalId.match(/^GH-#?(\d+)$/);
|
|
95
|
+
if (ghMatch) {
|
|
96
|
+
return { source: 'github', number: ghMatch[1] };
|
|
97
|
+
}
|
|
98
|
+
const jiraMatch = externalId.match(/^JIRA-(.+)$/);
|
|
99
|
+
if (jiraMatch) {
|
|
100
|
+
return { source: 'jira', number: jiraMatch[1] };
|
|
101
|
+
}
|
|
102
|
+
const adoMatch = externalId.match(/^ADO-(\d+)$/);
|
|
103
|
+
if (adoMatch) {
|
|
104
|
+
return { source: 'ado', number: adoMatch[1] };
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create external item metadata
|
|
110
|
+
*
|
|
111
|
+
* @param params - Creation parameters
|
|
112
|
+
* @returns External item metadata
|
|
113
|
+
*/
|
|
114
|
+
export function createExternalMetadata(params) {
|
|
115
|
+
const metadata = {
|
|
116
|
+
id: params.id,
|
|
117
|
+
origin: 'external',
|
|
118
|
+
source: params.source,
|
|
119
|
+
external_id: params.externalId,
|
|
120
|
+
external_url: params.externalUrl,
|
|
121
|
+
imported_at: new Date().toISOString()
|
|
122
|
+
};
|
|
123
|
+
// Only include optional fields if explicitly provided
|
|
124
|
+
if (params.externalTitle !== undefined) {
|
|
125
|
+
metadata.external_title = params.externalTitle;
|
|
126
|
+
}
|
|
127
|
+
if (params.formatPreservation !== undefined) {
|
|
128
|
+
metadata.format_preservation = params.formatPreservation;
|
|
129
|
+
}
|
|
130
|
+
return metadata;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Validate external item metadata
|
|
134
|
+
*
|
|
135
|
+
* @param metadata - External item metadata
|
|
136
|
+
* @throws Error if metadata is invalid
|
|
137
|
+
*/
|
|
138
|
+
export function validateExternalMetadata(metadata) {
|
|
139
|
+
if (!metadata.id) {
|
|
140
|
+
throw new Error('External item metadata must have id');
|
|
141
|
+
}
|
|
142
|
+
if (!metadata.id.endsWith('E')) {
|
|
143
|
+
throw new Error(`External item ID must end with E suffix: ${metadata.id}`);
|
|
144
|
+
}
|
|
145
|
+
if (metadata.origin !== 'external') {
|
|
146
|
+
throw new Error(`External item must have origin='external': ${metadata.id}`);
|
|
147
|
+
}
|
|
148
|
+
if (!['github', 'jira', 'ado', 'unknown'].includes(metadata.source)) {
|
|
149
|
+
throw new Error(`Invalid external source: ${metadata.source}`);
|
|
150
|
+
}
|
|
151
|
+
if (!metadata.external_id) {
|
|
152
|
+
throw new Error(`External item must have external_id: ${metadata.id}`);
|
|
153
|
+
}
|
|
154
|
+
if (!metadata.external_url) {
|
|
155
|
+
throw new Error(`External item must have external_url: ${metadata.id}`);
|
|
156
|
+
}
|
|
157
|
+
if (!metadata.imported_at) {
|
|
158
|
+
throw new Error(`External item must have imported_at: ${metadata.id}`);
|
|
159
|
+
}
|
|
160
|
+
// Validate ISO 8601 format
|
|
161
|
+
const timestamp = new Date(metadata.imported_at);
|
|
162
|
+
if (isNaN(timestamp.getTime())) {
|
|
163
|
+
throw new Error(`Invalid imported_at timestamp: ${metadata.imported_at}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=origin-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin-metadata.js","sourceRoot":"","sources":["../../../../src/core/types/origin-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Config Validator - Validates critical sync configuration rules
|
|
3
|
+
*
|
|
4
|
+
* Enforces immutable architectural constraints:
|
|
5
|
+
* 1. Increment → Living Docs MUST be one-way (IMMUTABLE)
|
|
6
|
+
* 2. autoIncrementCreation MUST be false (FORBIDDEN)
|
|
7
|
+
* 3. Warns if all permissions enabled (conflict risk)
|
|
8
|
+
*
|
|
9
|
+
* Part of v0.24.0 three-permission architecture (FS-047)
|
|
10
|
+
*/
|
|
11
|
+
import { SyncSettings } from './sync-settings.js';
|
|
12
|
+
/**
|
|
13
|
+
* Validation result for sync configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface SyncConfigValidationResult {
|
|
16
|
+
valid: boolean;
|
|
17
|
+
errors: string[];
|
|
18
|
+
warnings: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Config structure (partial, relevant to sync validation)
|
|
22
|
+
*/
|
|
23
|
+
export interface SyncConfig {
|
|
24
|
+
sync?: {
|
|
25
|
+
settings?: SyncSettings;
|
|
26
|
+
incrementToLivingDocs?: 'one-way' | 'two-way';
|
|
27
|
+
autoIncrementCreation?: boolean;
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate sync configuration against architectural rules
|
|
33
|
+
*
|
|
34
|
+
* @param config - Configuration object from .specweave/config.json
|
|
35
|
+
* @returns Validation result with errors and warnings
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateSyncConfig(config: SyncConfig): SyncConfigValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* Throw error if sync config is invalid
|
|
40
|
+
*
|
|
41
|
+
* @param config - Configuration object from .specweave/config.json
|
|
42
|
+
* @param options - Optional logger for warnings
|
|
43
|
+
* @throws Error if validation fails
|
|
44
|
+
*/
|
|
45
|
+
export declare function assertValidSyncConfig(config: SyncConfig, options?: {
|
|
46
|
+
logger?: {
|
|
47
|
+
warn: (message: string) => void;
|
|
48
|
+
};
|
|
49
|
+
}): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get human-readable summary of sync config validation
|
|
52
|
+
*
|
|
53
|
+
* @param config - Configuration object
|
|
54
|
+
* @returns Summary string
|
|
55
|
+
*/
|
|
56
|
+
export declare function getSyncConfigSummary(config: SyncConfig): string;
|
|
57
|
+
//# sourceMappingURL=sync-config-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-config-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/types/sync-config-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,YAAY,CAAC;QACxB,qBAAqB,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,0BAA0B,CA0EjF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;CAAO,GAC7D,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAsB/D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Config Validator - Validates critical sync configuration rules
|
|
3
|
+
*
|
|
4
|
+
* Enforces immutable architectural constraints:
|
|
5
|
+
* 1. Increment → Living Docs MUST be one-way (IMMUTABLE)
|
|
6
|
+
* 2. autoIncrementCreation MUST be false (FORBIDDEN)
|
|
7
|
+
* 3. Warns if all permissions enabled (conflict risk)
|
|
8
|
+
*
|
|
9
|
+
* Part of v0.24.0 three-permission architecture (FS-047)
|
|
10
|
+
*/
|
|
11
|
+
import { validateSyncSettings } from './sync-settings.js';
|
|
12
|
+
/**
|
|
13
|
+
* Validate sync configuration against architectural rules
|
|
14
|
+
*
|
|
15
|
+
* @param config - Configuration object from .specweave/config.json
|
|
16
|
+
* @returns Validation result with errors and warnings
|
|
17
|
+
*/
|
|
18
|
+
export function validateSyncConfig(config) {
|
|
19
|
+
const result = {
|
|
20
|
+
valid: true,
|
|
21
|
+
errors: [],
|
|
22
|
+
warnings: [],
|
|
23
|
+
};
|
|
24
|
+
// If no sync config, that's fine (safe defaults apply)
|
|
25
|
+
if (!config.sync) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const { sync } = config;
|
|
29
|
+
// Rule 1: Validate SyncSettings structure (if provided)
|
|
30
|
+
if (sync.settings) {
|
|
31
|
+
try {
|
|
32
|
+
validateSyncSettings(sync.settings);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
result.valid = false;
|
|
36
|
+
result.errors.push(`Invalid sync settings: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Rule 2: incrementToLivingDocs MUST be 'one-way' (immutable architectural rule)
|
|
40
|
+
if (sync.incrementToLivingDocs !== undefined && sync.incrementToLivingDocs !== 'one-way') {
|
|
41
|
+
result.valid = false;
|
|
42
|
+
result.errors.push(`sync.incrementToLivingDocs MUST be 'one-way' (found: '${sync.incrementToLivingDocs}'). ` +
|
|
43
|
+
'Increment → Living Docs sync is ALWAYS one-way by architectural design. ' +
|
|
44
|
+
'This direction is IMMUTABLE and cannot be configured.');
|
|
45
|
+
}
|
|
46
|
+
// Rule 3: autoIncrementCreation MUST be false (forbidden feature)
|
|
47
|
+
if (sync.autoIncrementCreation === true) {
|
|
48
|
+
result.valid = false;
|
|
49
|
+
result.errors.push('sync.autoIncrementCreation MUST be false. ' +
|
|
50
|
+
'Auto-creating increments for external items is FORBIDDEN. ' +
|
|
51
|
+
'External items live in living docs ONLY. ' +
|
|
52
|
+
'Users MUST manually create increments when ready to work on external items.');
|
|
53
|
+
}
|
|
54
|
+
// Warning: All permissions enabled (full sync mode)
|
|
55
|
+
if (sync.settings &&
|
|
56
|
+
sync.settings.canUpsertInternalItems === true &&
|
|
57
|
+
sync.settings.canUpdateExternalItems === true &&
|
|
58
|
+
sync.settings.canUpdateStatus === true) {
|
|
59
|
+
result.warnings.push('⚠️ All sync permissions enabled (full sync mode). ' +
|
|
60
|
+
'This allows bidirectional sync between SpecWeave and external tools. ' +
|
|
61
|
+
'Be aware of potential sync conflicts when multiple tools modify the same items. ' +
|
|
62
|
+
'Consider enabling only the permissions you need for your workflow.');
|
|
63
|
+
}
|
|
64
|
+
// Warning: Conflicting permissions (update external without status)
|
|
65
|
+
if (sync.settings &&
|
|
66
|
+
sync.settings.canUpdateExternalItems === true &&
|
|
67
|
+
sync.settings.canUpdateStatus === false) {
|
|
68
|
+
result.warnings.push('⚠️ canUpdateExternalItems=true but canUpdateStatus=false. ' +
|
|
69
|
+
'External items will be updated with content changes but status will not sync. ' +
|
|
70
|
+
'Consider enabling canUpdateStatus if you want status to reflect completion.');
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Throw error if sync config is invalid
|
|
76
|
+
*
|
|
77
|
+
* @param config - Configuration object from .specweave/config.json
|
|
78
|
+
* @param options - Optional logger for warnings
|
|
79
|
+
* @throws Error if validation fails
|
|
80
|
+
*/
|
|
81
|
+
export function assertValidSyncConfig(config, options = {}) {
|
|
82
|
+
const result = validateSyncConfig(config);
|
|
83
|
+
if (!result.valid) {
|
|
84
|
+
throw new Error(`Invalid sync configuration:\n${result.errors.join('\n')}`);
|
|
85
|
+
}
|
|
86
|
+
// Log warnings (but don't throw)
|
|
87
|
+
if (result.warnings.length > 0 && options.logger) {
|
|
88
|
+
options.logger.warn('Sync configuration warnings:');
|
|
89
|
+
result.warnings.forEach((warning) => options.logger.warn(warning));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get human-readable summary of sync config validation
|
|
94
|
+
*
|
|
95
|
+
* @param config - Configuration object
|
|
96
|
+
* @returns Summary string
|
|
97
|
+
*/
|
|
98
|
+
export function getSyncConfigSummary(config) {
|
|
99
|
+
const result = validateSyncConfig(config);
|
|
100
|
+
const lines = [];
|
|
101
|
+
lines.push('=== Sync Configuration Validation ===');
|
|
102
|
+
lines.push(`Valid: ${result.valid ? '✅ Yes' : '❌ No'}`);
|
|
103
|
+
if (result.errors.length > 0) {
|
|
104
|
+
lines.push('\nErrors:');
|
|
105
|
+
result.errors.forEach((error) => lines.push(` ❌ ${error}`));
|
|
106
|
+
}
|
|
107
|
+
if (result.warnings.length > 0) {
|
|
108
|
+
lines.push('\nWarnings:');
|
|
109
|
+
result.warnings.forEach((warning) => lines.push(` ⚠️ ${warning}`));
|
|
110
|
+
}
|
|
111
|
+
if (result.valid && result.errors.length === 0 && result.warnings.length === 0) {
|
|
112
|
+
lines.push('\n✅ All sync configuration rules satisfied');
|
|
113
|
+
}
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=sync-config-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-config-validator.js","sourceRoot":"","sources":["../../../../src/core/types/sync-config-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Supports multiple projects per provider (GitHub, JIRA, ADO, etc.)
|
|
5
5
|
* with time range filtering and rate limiting protection.
|
|
6
6
|
*/
|
|
7
|
+
import { SyncSettings } from './sync-settings.js';
|
|
7
8
|
export type SyncProvider = 'github' | 'jira' | 'ado';
|
|
8
9
|
/**
|
|
9
10
|
* Sync Strategy (v0.13.0+ - Simplified Two-Tier Architecture)
|
|
@@ -310,8 +311,13 @@ export interface SyncConfiguration {
|
|
|
310
311
|
profiles: Record<string, SyncProfile>;
|
|
311
312
|
/** Project contexts */
|
|
312
313
|
projects?: Record<string, ProjectContext>;
|
|
313
|
-
/**
|
|
314
|
-
|
|
314
|
+
/**
|
|
315
|
+
* Global settings (v0.24.0+ - Three-Permission Architecture)
|
|
316
|
+
*
|
|
317
|
+
* Combines external tool permissions (SyncSettings) with global behavior settings.
|
|
318
|
+
* All permission settings default to false for safety (explicit opt-in required).
|
|
319
|
+
*/
|
|
320
|
+
settings?: SyncSettings & {
|
|
315
321
|
/** Auto-detect project from increment description */
|
|
316
322
|
autoDetectProject?: boolean;
|
|
317
323
|
/** Default time range for new syncs */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"sync-profile.d.ts","sourceRoot":"","sources":["../../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-profile.js","sourceRoot":"","sources":["../../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"sync-profile.js","sourceRoot":"","sources":["../../../../src/core/types/sync-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8fH,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAoB;IACxD,6EAA6E;IAC7E,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,OAAO,CAAC,QAAQ,KAAK,aAAa,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IACxD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAA8B,CAAC;IAExD,mDAAmD;IACnD,IAAI,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,QAAwB,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoB;IACnD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Settings - Controls what SpecWeave can modify in external tools
|
|
3
|
+
*
|
|
4
|
+
* These settings determine how Living Docs sync with external tools (GitHub, JIRA, ADO).
|
|
5
|
+
* All settings default to false for safety (explicit opt-in required).
|
|
6
|
+
*
|
|
7
|
+
* Storage: .specweave/config.json under sync.settings
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Three independent permission flags for external tool sync
|
|
11
|
+
*/
|
|
12
|
+
export interface SyncSettings {
|
|
13
|
+
/**
|
|
14
|
+
* Q1: Can SpecWeave CREATE and UPDATE internal work items in external tools?
|
|
15
|
+
*
|
|
16
|
+
* UPSERT = CREATE initially + UPDATE as work progresses
|
|
17
|
+
* - Controls: Title, Description/Body, Acceptance Criteria for INTERNAL items
|
|
18
|
+
* - Flow: increment → living spec → CREATE external item → UPDATE on task completion
|
|
19
|
+
* - If false: Stops before external item creation (local-only workflow)
|
|
20
|
+
*
|
|
21
|
+
* @default false (safer, no external items created)
|
|
22
|
+
*/
|
|
23
|
+
canUpsertInternalItems: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Q2: Can SpecWeave UPDATE work items created externally?
|
|
26
|
+
*
|
|
27
|
+
* UPDATE = Full content updates (title, description, ACs, tasks, comments)
|
|
28
|
+
* - Controls: FULL content updates of EXTERNAL items
|
|
29
|
+
* - Flow: increment progress → living spec → UPDATE external tool (full sync)
|
|
30
|
+
* - If false: External items remain read-only snapshots (no sync back)
|
|
31
|
+
*
|
|
32
|
+
* @default false (safer, external items remain read-only)
|
|
33
|
+
*/
|
|
34
|
+
canUpdateExternalItems: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Q3: Can SpecWeave UPDATE status of work items?
|
|
37
|
+
*
|
|
38
|
+
* STATUS = Status field ONLY (for BOTH internal AND external items)
|
|
39
|
+
* - Controls: Status field updates after all ACs/tasks complete
|
|
40
|
+
* - Flow: Both flows (internal and external items)
|
|
41
|
+
* - If false: No status updates regardless of item origin (manual status management)
|
|
42
|
+
*
|
|
43
|
+
* @default false (safer, status updated manually in external tool)
|
|
44
|
+
*/
|
|
45
|
+
canUpdateStatus: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Default sync settings (all permissions disabled for safety)
|
|
49
|
+
*/
|
|
50
|
+
export declare const DEFAULT_SYNC_SETTINGS: SyncSettings;
|
|
51
|
+
/**
|
|
52
|
+
* Type guard to check if an object is valid SyncSettings
|
|
53
|
+
*/
|
|
54
|
+
export declare function isValidSyncSettings(obj: any): obj is SyncSettings;
|
|
55
|
+
/**
|
|
56
|
+
* Migrate old syncDirection to new SyncSettings
|
|
57
|
+
*
|
|
58
|
+
* @param syncDirection - Old syncDirection value ('bidirectional' | 'export' | 'import' | 'to-external' | 'from-external' | undefined)
|
|
59
|
+
* @returns SyncSettings with appropriate permissions
|
|
60
|
+
*/
|
|
61
|
+
export declare function migrateSyncDirection(syncDirection?: string | null): SyncSettings;
|
|
62
|
+
/**
|
|
63
|
+
* Validate SyncSettings object
|
|
64
|
+
*
|
|
65
|
+
* @param settings - Settings to validate
|
|
66
|
+
* @throws Error if settings are invalid
|
|
67
|
+
*/
|
|
68
|
+
export declare function validateSyncSettings(settings: SyncSettings): void;
|
|
69
|
+
/**
|
|
70
|
+
* Merge user-provided settings with defaults (fill in missing fields)
|
|
71
|
+
*/
|
|
72
|
+
export declare function mergeSyncSettings(userSettings: Partial<SyncSettings> | undefined): SyncSettings;
|
|
73
|
+
//# sourceMappingURL=sync-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-settings.d.ts","sourceRoot":"","sources":["../../../../src/core/types/sync-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;;;;;;;;OASG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;;;;;;;;OASG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAInC,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,YAAY,CAQjE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,CA8BhF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAgBjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,GAC9C,YAAY,CAKd"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Settings - Controls what SpecWeave can modify in external tools
|
|
3
|
+
*
|
|
4
|
+
* These settings determine how Living Docs sync with external tools (GitHub, JIRA, ADO).
|
|
5
|
+
* All settings default to false for safety (explicit opt-in required).
|
|
6
|
+
*
|
|
7
|
+
* Storage: .specweave/config.json under sync.settings
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default sync settings (all permissions disabled for safety)
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_SYNC_SETTINGS = {
|
|
13
|
+
canUpsertInternalItems: false,
|
|
14
|
+
canUpdateExternalItems: false,
|
|
15
|
+
canUpdateStatus: false,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Type guard to check if an object is valid SyncSettings
|
|
19
|
+
*/
|
|
20
|
+
export function isValidSyncSettings(obj) {
|
|
21
|
+
return (typeof obj === 'object' &&
|
|
22
|
+
obj !== null &&
|
|
23
|
+
typeof obj.canUpsertInternalItems === 'boolean' &&
|
|
24
|
+
typeof obj.canUpdateExternalItems === 'boolean' &&
|
|
25
|
+
typeof obj.canUpdateStatus === 'boolean');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Migrate old syncDirection to new SyncSettings
|
|
29
|
+
*
|
|
30
|
+
* @param syncDirection - Old syncDirection value ('bidirectional' | 'export' | 'import' | 'to-external' | 'from-external' | undefined)
|
|
31
|
+
* @returns SyncSettings with appropriate permissions
|
|
32
|
+
*/
|
|
33
|
+
export function migrateSyncDirection(syncDirection) {
|
|
34
|
+
if (syncDirection === 'bidirectional') {
|
|
35
|
+
// Old bidirectional mode → enable all permissions
|
|
36
|
+
return {
|
|
37
|
+
canUpsertInternalItems: true,
|
|
38
|
+
canUpdateExternalItems: true,
|
|
39
|
+
canUpdateStatus: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (syncDirection === 'export' || syncDirection === 'to-external') {
|
|
43
|
+
// Old export-only mode → create/update internal items only
|
|
44
|
+
return {
|
|
45
|
+
canUpsertInternalItems: true,
|
|
46
|
+
canUpdateExternalItems: false,
|
|
47
|
+
canUpdateStatus: false,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (syncDirection === 'import' || syncDirection === 'from-external') {
|
|
51
|
+
// Old import-only mode → status updates only
|
|
52
|
+
return {
|
|
53
|
+
canUpsertInternalItems: false,
|
|
54
|
+
canUpdateExternalItems: false,
|
|
55
|
+
canUpdateStatus: true,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Old one-way or missing or unknown → disable all (safer default)
|
|
59
|
+
return { ...DEFAULT_SYNC_SETTINGS };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate SyncSettings object
|
|
63
|
+
*
|
|
64
|
+
* @param settings - Settings to validate
|
|
65
|
+
* @throws Error if settings are invalid
|
|
66
|
+
*/
|
|
67
|
+
export function validateSyncSettings(settings) {
|
|
68
|
+
if (!settings || typeof settings !== 'object') {
|
|
69
|
+
throw new Error('SyncSettings must be a non-null object');
|
|
70
|
+
}
|
|
71
|
+
if (typeof settings.canUpsertInternalItems !== 'boolean') {
|
|
72
|
+
throw new Error('SyncSettings.canUpsertInternalItems must be a boolean (required)');
|
|
73
|
+
}
|
|
74
|
+
if (typeof settings.canUpdateExternalItems !== 'boolean') {
|
|
75
|
+
throw new Error('SyncSettings.canUpdateExternalItems must be a boolean (required)');
|
|
76
|
+
}
|
|
77
|
+
if (typeof settings.canUpdateStatus !== 'boolean') {
|
|
78
|
+
throw new Error('SyncSettings.canUpdateStatus must be a boolean (required)');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Merge user-provided settings with defaults (fill in missing fields)
|
|
83
|
+
*/
|
|
84
|
+
export function mergeSyncSettings(userSettings) {
|
|
85
|
+
return {
|
|
86
|
+
...DEFAULT_SYNC_SETTINGS,
|
|
87
|
+
...userSettings,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=sync-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-settings.js","sourceRoot":"","sources":["../../../../src/core/types/sync-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2CH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,sBAAsB,EAAE,KAAK;IAC7B,sBAAsB,EAAE,KAAK;IAC7B,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAO,GAAG,CAAC,sBAAsB,KAAK,SAAS;QAC/C,OAAO,GAAG,CAAC,sBAAsB,KAAK,SAAS;QAC/C,OAAO,GAAG,CAAC,eAAe,KAAK,SAAS,CACzC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAA6B;IAChE,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;QACtC,kDAAkD;QAClD,OAAO;YACL,sBAAsB,EAAE,IAAI;YAC5B,sBAAsB,EAAE,IAAI;YAC5B,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QAClE,2DAA2D;QAC3D,OAAO;YACL,sBAAsB,EAAE,IAAI;YAC5B,sBAAsB,EAAE,KAAK;YAC7B,eAAe,EAAE,KAAK;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,eAAe,EAAE,CAAC;QACpE,6CAA6C;QAC7C,OAAO;YACL,sBAAsB,EAAE,KAAK;YAC7B,sBAAsB,EAAE,KAAK;YAC7B,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,QAAQ,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,QAAQ,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAA+C;IAE/C,OAAO;QACL,GAAG,qBAAqB;QACxB,GAAG,YAAY;KAChB,CAAC;AACJ,CAAC"}
|