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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Checker - Controls what SpecWeave can modify in external tools
|
|
3
|
+
*
|
|
4
|
+
* Provides centralized permission checking for external tool sync operations.
|
|
5
|
+
* All permissions default to false (explicit opt-in required).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const checker = await PermissionChecker.load(projectRoot);
|
|
10
|
+
*
|
|
11
|
+
* if (checker.canUpsertInternalItems()) {
|
|
12
|
+
* await createGitHubIssue(item);
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* if (checker.canUpdateStatus()) {
|
|
16
|
+
* await updateIssueStatus(issueNumber, 'Done');
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { SyncSettings } from '../types/sync-settings.js';
|
|
21
|
+
/**
|
|
22
|
+
* Configuration structure from .specweave/config.json
|
|
23
|
+
*/
|
|
24
|
+
export interface SpecWeaveConfig {
|
|
25
|
+
sync?: {
|
|
26
|
+
settings?: Partial<SyncSettings> & {
|
|
27
|
+
syncDirection?: 'bidirectional' | 'one-way';
|
|
28
|
+
autoDetectProject?: boolean;
|
|
29
|
+
defaultTimeRange?: string;
|
|
30
|
+
rateLimitProtection?: boolean;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Permission checker for external tool sync operations
|
|
36
|
+
*/
|
|
37
|
+
export declare class PermissionChecker {
|
|
38
|
+
private settings;
|
|
39
|
+
/**
|
|
40
|
+
* Create permission checker with explicit settings
|
|
41
|
+
* @param settings - Sync permission settings
|
|
42
|
+
*/
|
|
43
|
+
constructor(settings: SyncSettings);
|
|
44
|
+
/**
|
|
45
|
+
* Load permission settings from .specweave/config.json
|
|
46
|
+
* @param projectRoot - Project root directory
|
|
47
|
+
* @returns Permission checker instance
|
|
48
|
+
*/
|
|
49
|
+
static load(projectRoot: string): Promise<PermissionChecker>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if SpecWeave can CREATE and UPDATE internal work items in external tools
|
|
52
|
+
*
|
|
53
|
+
* UPSERT = CREATE initially + UPDATE as work progresses
|
|
54
|
+
* - Controls: Title, Description/Body, Acceptance Criteria for INTERNAL items
|
|
55
|
+
* - Flow: increment → living spec → CREATE external item → UPDATE on task completion
|
|
56
|
+
* - If false: Stops before external item creation (local-only workflow)
|
|
57
|
+
*
|
|
58
|
+
* @returns true if UPSERT (CREATE + UPDATE) is allowed for internal items
|
|
59
|
+
*/
|
|
60
|
+
canUpsertInternalItems(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Check if SpecWeave can UPDATE work items created externally
|
|
63
|
+
*
|
|
64
|
+
* UPDATE = Full content updates (title, description, ACs, tasks, comments)
|
|
65
|
+
* - Controls: FULL content updates of EXTERNAL items
|
|
66
|
+
* - Flow: increment progress → living spec → UPDATE external tool (full sync)
|
|
67
|
+
* - If false: External items remain read-only snapshots (no sync back)
|
|
68
|
+
*
|
|
69
|
+
* @returns true if UPDATE is allowed for external items (full content updates)
|
|
70
|
+
*/
|
|
71
|
+
canUpdateExternalItems(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Check if SpecWeave can UPDATE status of work items
|
|
74
|
+
*
|
|
75
|
+
* STATUS = Status field ONLY (for BOTH internal AND external items)
|
|
76
|
+
* - Controls: Status field updates after all ACs/tasks complete
|
|
77
|
+
* - Flow: Both flows (internal and external items)
|
|
78
|
+
* - If false: No status updates regardless of item origin (manual status management)
|
|
79
|
+
*
|
|
80
|
+
* @returns true if status updates are allowed
|
|
81
|
+
*/
|
|
82
|
+
canUpdateStatus(): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Get all permission settings (for logging/debugging)
|
|
85
|
+
* @returns Current permission settings
|
|
86
|
+
*/
|
|
87
|
+
getSettings(): Readonly<SyncSettings>;
|
|
88
|
+
/**
|
|
89
|
+
* Get human-readable description of current permissions
|
|
90
|
+
* @returns Permission summary string
|
|
91
|
+
*/
|
|
92
|
+
getPermissionSummary(): string;
|
|
93
|
+
/**
|
|
94
|
+
* Validate that operation is allowed, throw error if not
|
|
95
|
+
* @param operation - Operation type
|
|
96
|
+
* @throws Error if operation not allowed
|
|
97
|
+
*/
|
|
98
|
+
requirePermission(operation: 'upsert-internal' | 'update-external' | 'update-status'): void;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=permission-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-checker.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/permission-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,YAAY,EAA+C,MAAM,2BAA2B,CAAC;AAEtG;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;YAEjC,aAAa,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;YAE5C,iBAAiB,CAAC,EAAE,OAAO,CAAC;YAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;SAC/B,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAe;IAE/B;;;OAGG;gBACS,QAAQ,EAAE,YAAY;IAIlC;;;;OAIG;WACU,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8BlE;;;;;;;;;OASG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;;;;;;;;OASG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;;;;;;;;OASG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACH,WAAW,IAAI,QAAQ,CAAC,YAAY,CAAC;IAIrC;;;OAGG;IACH,oBAAoB,IAAI,MAAM;IAwB9B;;;;OAIG;IACH,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,GAAG,IAAI;CAiC5F"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Checker - Controls what SpecWeave can modify in external tools
|
|
3
|
+
*
|
|
4
|
+
* Provides centralized permission checking for external tool sync operations.
|
|
5
|
+
* All permissions default to false (explicit opt-in required).
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const checker = await PermissionChecker.load(projectRoot);
|
|
10
|
+
*
|
|
11
|
+
* if (checker.canUpsertInternalItems()) {
|
|
12
|
+
* await createGitHubIssue(item);
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* if (checker.canUpdateStatus()) {
|
|
16
|
+
* await updateIssueStatus(issueNumber, 'Done');
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import fs from 'fs-extra';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { DEFAULT_SYNC_SETTINGS, migrateSyncDirection } from '../types/sync-settings.js';
|
|
23
|
+
/**
|
|
24
|
+
* Permission checker for external tool sync operations
|
|
25
|
+
*/
|
|
26
|
+
export class PermissionChecker {
|
|
27
|
+
/**
|
|
28
|
+
* Create permission checker with explicit settings
|
|
29
|
+
* @param settings - Sync permission settings
|
|
30
|
+
*/
|
|
31
|
+
constructor(settings) {
|
|
32
|
+
this.settings = settings;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load permission settings from .specweave/config.json
|
|
36
|
+
* @param projectRoot - Project root directory
|
|
37
|
+
* @returns Permission checker instance
|
|
38
|
+
*/
|
|
39
|
+
static async load(projectRoot) {
|
|
40
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
41
|
+
try {
|
|
42
|
+
const configContent = await fs.readFile(configPath, 'utf-8');
|
|
43
|
+
const config = JSON.parse(configContent);
|
|
44
|
+
// Extract sync settings
|
|
45
|
+
const syncSettings = config.sync?.settings || {};
|
|
46
|
+
// Handle migration from old syncDirection format
|
|
47
|
+
if ('syncDirection' in syncSettings && syncSettings.syncDirection) {
|
|
48
|
+
const migratedSettings = migrateSyncDirection(syncSettings.syncDirection);
|
|
49
|
+
return new PermissionChecker(migratedSettings);
|
|
50
|
+
}
|
|
51
|
+
// Use new permission settings (with defaults)
|
|
52
|
+
const settings = {
|
|
53
|
+
canUpsertInternalItems: syncSettings.canUpsertInternalItems ?? DEFAULT_SYNC_SETTINGS.canUpsertInternalItems,
|
|
54
|
+
canUpdateExternalItems: syncSettings.canUpdateExternalItems ?? DEFAULT_SYNC_SETTINGS.canUpdateExternalItems,
|
|
55
|
+
canUpdateStatus: syncSettings.canUpdateStatus ?? DEFAULT_SYNC_SETTINGS.canUpdateStatus,
|
|
56
|
+
};
|
|
57
|
+
return new PermissionChecker(settings);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// If config.json doesn't exist or is invalid, use safe defaults (all false)
|
|
61
|
+
return new PermissionChecker(DEFAULT_SYNC_SETTINGS);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if SpecWeave can CREATE and UPDATE internal work items in external tools
|
|
66
|
+
*
|
|
67
|
+
* UPSERT = CREATE initially + UPDATE as work progresses
|
|
68
|
+
* - Controls: Title, Description/Body, Acceptance Criteria for INTERNAL items
|
|
69
|
+
* - Flow: increment → living spec → CREATE external item → UPDATE on task completion
|
|
70
|
+
* - If false: Stops before external item creation (local-only workflow)
|
|
71
|
+
*
|
|
72
|
+
* @returns true if UPSERT (CREATE + UPDATE) is allowed for internal items
|
|
73
|
+
*/
|
|
74
|
+
canUpsertInternalItems() {
|
|
75
|
+
return this.settings.canUpsertInternalItems;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if SpecWeave can UPDATE work items created externally
|
|
79
|
+
*
|
|
80
|
+
* UPDATE = Full content updates (title, description, ACs, tasks, comments)
|
|
81
|
+
* - Controls: FULL content updates of EXTERNAL items
|
|
82
|
+
* - Flow: increment progress → living spec → UPDATE external tool (full sync)
|
|
83
|
+
* - If false: External items remain read-only snapshots (no sync back)
|
|
84
|
+
*
|
|
85
|
+
* @returns true if UPDATE is allowed for external items (full content updates)
|
|
86
|
+
*/
|
|
87
|
+
canUpdateExternalItems() {
|
|
88
|
+
return this.settings.canUpdateExternalItems;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if SpecWeave can UPDATE status of work items
|
|
92
|
+
*
|
|
93
|
+
* STATUS = Status field ONLY (for BOTH internal AND external items)
|
|
94
|
+
* - Controls: Status field updates after all ACs/tasks complete
|
|
95
|
+
* - Flow: Both flows (internal and external items)
|
|
96
|
+
* - If false: No status updates regardless of item origin (manual status management)
|
|
97
|
+
*
|
|
98
|
+
* @returns true if status updates are allowed
|
|
99
|
+
*/
|
|
100
|
+
canUpdateStatus() {
|
|
101
|
+
return this.settings.canUpdateStatus;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get all permission settings (for logging/debugging)
|
|
105
|
+
* @returns Current permission settings
|
|
106
|
+
*/
|
|
107
|
+
getSettings() {
|
|
108
|
+
return { ...this.settings };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get human-readable description of current permissions
|
|
112
|
+
* @returns Permission summary string
|
|
113
|
+
*/
|
|
114
|
+
getPermissionSummary() {
|
|
115
|
+
const permissions = [];
|
|
116
|
+
if (this.canUpsertInternalItems()) {
|
|
117
|
+
permissions.push('✅ Can CREATE and UPDATE internal items');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
permissions.push('❌ Cannot create internal items (local-only)');
|
|
121
|
+
}
|
|
122
|
+
if (this.canUpdateExternalItems()) {
|
|
123
|
+
permissions.push('✅ Can UPDATE external items (full content)');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
permissions.push('❌ Cannot update external items (read-only)');
|
|
127
|
+
}
|
|
128
|
+
if (this.canUpdateStatus()) {
|
|
129
|
+
permissions.push('✅ Can UPDATE status (both internal & external)');
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
permissions.push('❌ Cannot update status (manual only)');
|
|
133
|
+
}
|
|
134
|
+
return permissions.join('\n');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validate that operation is allowed, throw error if not
|
|
138
|
+
* @param operation - Operation type
|
|
139
|
+
* @throws Error if operation not allowed
|
|
140
|
+
*/
|
|
141
|
+
requirePermission(operation) {
|
|
142
|
+
switch (operation) {
|
|
143
|
+
case 'upsert-internal':
|
|
144
|
+
if (!this.canUpsertInternalItems()) {
|
|
145
|
+
throw new Error('Permission denied: canUpsertInternalItems=false. ' +
|
|
146
|
+
'Enable in .specweave/config.json under sync.settings to create external items.');
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
case 'update-external':
|
|
150
|
+
if (!this.canUpdateExternalItems()) {
|
|
151
|
+
throw new Error('Permission denied: canUpdateExternalItems=false. ' +
|
|
152
|
+
'Enable in .specweave/config.json under sync.settings to update external items.');
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
case 'update-status':
|
|
156
|
+
if (!this.canUpdateStatus()) {
|
|
157
|
+
throw new Error('Permission denied: canUpdateStatus=false. ' +
|
|
158
|
+
'Enable in .specweave/config.json under sync.settings to update status.');
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(`Unknown operation: ${operation}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=permission-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-checker.js","sourceRoot":"","sources":["../../../../src/core/utils/permission-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,9 +74,9 @@ function extractUserStories(lines) {
|
|
|
74
74
|
const userStories = [];
|
|
75
75
|
let currentUS = null;
|
|
76
76
|
let inACSection = false;
|
|
77
|
-
// Regex patterns
|
|
78
|
-
const usHeaderRegex = /^###?\s+(US-\d{3}):\s*(.+)$/; // ### US-
|
|
79
|
-
const acRegex = /^-\s*\[[x ]\]\s*\*\*(AC-US\d
|
|
77
|
+
// Regex patterns (T-029: Support E suffix for external IDs)
|
|
78
|
+
const usHeaderRegex = /^###?\s+(US-\d{3}E?):\s*(.+)$/; // ### US-001E: Title or ## US-001: Title
|
|
79
|
+
const acRegex = /^-\s*\[[x ]\]\s*\*\*(AC-US\d+E?-\d{2})\*\*/; // - [ ] **AC-US1E-01**
|
|
80
80
|
const priorityRegex = /\*\*Priority\*\*:\s*(P[0-3])/;
|
|
81
81
|
for (let i = 0; i < lines.length; i++) {
|
|
82
82
|
const line = lines[i];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-parser.js","sourceRoot":"","sources":["../../../../src/generators/spec/spec-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AA2ClC;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,kDAAkD;QAClD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEvD,uBAAuB;QACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAE9C,qBAAqB;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QAElE,OAAO;YACL,WAAW;YACX,KAAK;YACL,WAAW;YACX,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAe;IACvC,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,IAAI,CAAC;gBACrB,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,qBAAqB;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzD,IAAI,cAAc,EAAE,CAAC;gBACnB,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5D,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAe;IACzC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,IAAI,SAAS,GAAqB,IAAI,CAAC;IACvC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,
|
|
1
|
+
{"version":3,"file":"spec-parser.js","sourceRoot":"","sources":["../../../../src/generators/spec/spec-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,10 @@ export function parseTasksWithUSLinks(tasksPath) {
|
|
|
21
21
|
const tasks = {};
|
|
22
22
|
// Split content into lines for line number tracking
|
|
23
23
|
const lines = content.split('\n');
|
|
24
|
-
// Regex patterns for task parsing
|
|
25
|
-
const taskHeaderRegex = /^###\s+(T-\d{3}):\s*(.+)$/;
|
|
26
|
-
const userStoryRegex = /^\*\*User Story\*\*:\s*(US-\d{3})/;
|
|
27
|
-
const satisfiesACsRegex = /^\*\*Satisfies ACs\*\*:\s*(AC-US\d
|
|
24
|
+
// Regex patterns for task parsing (T-029: Support E suffix for external IDs)
|
|
25
|
+
const taskHeaderRegex = /^###\s+(T-\d{3}E?):\s*(.+)$/;
|
|
26
|
+
const userStoryRegex = /^\*\*User Story\*\*:\s*(US-\d{3}E?)/;
|
|
27
|
+
const satisfiesACsRegex = /^\*\*Satisfies ACs\*\*:\s*(AC-US\d+E?-\d{2}(?:,\s*AC-US\d+E?-\d{2})*)/;
|
|
28
28
|
const statusRegex = /^\*\*Status\*\*:\s*\[([x ])\]\s*(\w+)/;
|
|
29
29
|
const priorityRegex = /^\*\*Priority\*\*:\s*(.+)/;
|
|
30
30
|
const estimatedEffortRegex = /^\*\*Estimated Effort\*\*:\s*(.+)/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../../../src/generators/spec/task-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAgElC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAqB,EAAE,CAAC;QAEnC,oDAAoD;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,
|
|
1
|
+
{"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../../../src/generators/spec/task-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task ID Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates unique Task IDs with support for both internal and external origins.
|
|
5
|
+
* - Internal IDs: T-001, T-002, T-003 (no suffix)
|
|
6
|
+
* - External IDs: T-001E, T-002E, T-003E (E suffix)
|
|
7
|
+
*
|
|
8
|
+
* ID generation strategy:
|
|
9
|
+
* 1. Extract numeric part from all existing IDs (ignoring suffix)
|
|
10
|
+
* 2. Find maximum number across both internal and external IDs
|
|
11
|
+
* 3. Increment to get next sequential number
|
|
12
|
+
* 4. Add E suffix for external origin, no suffix for internal
|
|
13
|
+
*/
|
|
14
|
+
export type Origin = 'internal' | 'external';
|
|
15
|
+
export interface ParsedTaskId {
|
|
16
|
+
/** Full ID string (e.g., "T-003E") */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Numeric part (e.g., 3) */
|
|
19
|
+
number: number;
|
|
20
|
+
/** Origin type */
|
|
21
|
+
origin: Origin;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse Task ID to extract components
|
|
25
|
+
*
|
|
26
|
+
* @param id - Task ID (e.g., "T-001", "T-002E")
|
|
27
|
+
* @returns Parsed ID components
|
|
28
|
+
* @throws Error if ID format is invalid
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseTaskId(id: string): ParsedTaskId;
|
|
31
|
+
/**
|
|
32
|
+
* Get next sequential Task ID
|
|
33
|
+
*
|
|
34
|
+
* Finds maximum numeric ID across all existing IDs (internal + external)
|
|
35
|
+
* and generates next sequential ID with appropriate suffix.
|
|
36
|
+
*
|
|
37
|
+
* @param existingIds - Array of existing Task IDs
|
|
38
|
+
* @param origin - Origin type for new ID
|
|
39
|
+
* @returns Next sequential Task ID
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* getNextTaskId(['T-001', 'T-002E', 'T-003'], 'internal')
|
|
43
|
+
* // Returns: 'T-004'
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* getNextTaskId(['T-001', 'T-002E', 'T-003'], 'external')
|
|
47
|
+
* // Returns: 'T-004E'
|
|
48
|
+
*/
|
|
49
|
+
export declare function getNextTaskId(existingIds: string[], origin: Origin): string;
|
|
50
|
+
/**
|
|
51
|
+
* Validate ID uniqueness
|
|
52
|
+
*
|
|
53
|
+
* @param id - Task ID to check
|
|
54
|
+
* @param existingIds - Array of existing Task IDs
|
|
55
|
+
* @throws Error if ID already exists
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateTaskIdUniqueness(id: string, existingIds: string[]): void;
|
|
58
|
+
/**
|
|
59
|
+
* Detect origin from Task ID
|
|
60
|
+
*
|
|
61
|
+
* @param id - Task ID
|
|
62
|
+
* @returns Origin type ('internal' or 'external')
|
|
63
|
+
*/
|
|
64
|
+
export declare function getTaskIdOrigin(id: string): Origin;
|
|
65
|
+
/**
|
|
66
|
+
* Extract numeric part from Task ID
|
|
67
|
+
*
|
|
68
|
+
* @param id - Task ID
|
|
69
|
+
* @returns Numeric part
|
|
70
|
+
*/
|
|
71
|
+
export declare function getTaskIdNumber(id: string): number;
|
|
72
|
+
/**
|
|
73
|
+
* Check if ID is external (has E suffix)
|
|
74
|
+
*
|
|
75
|
+
* @param id - Task ID
|
|
76
|
+
* @returns true if external, false if internal
|
|
77
|
+
*/
|
|
78
|
+
export declare function isExternalTaskId(id: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Generate range of Task IDs
|
|
81
|
+
*
|
|
82
|
+
* @param start - Starting number
|
|
83
|
+
* @param count - Number of IDs to generate
|
|
84
|
+
* @param origin - Origin type
|
|
85
|
+
* @returns Array of Task IDs
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* generateTaskIdRange(1, 3, 'internal')
|
|
89
|
+
* // Returns: ['T-001', 'T-002', 'T-003']
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* generateTaskIdRange(5, 2, 'external')
|
|
93
|
+
* // Returns: ['T-005E', 'T-006E']
|
|
94
|
+
*/
|
|
95
|
+
export declare function generateTaskIdRange(start: number, count: number, origin: Origin): string[];
|
|
96
|
+
//# sourceMappingURL=task-id-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-id-generator.d.ts","sourceRoot":"","sources":["../../../src/id-generators/task-id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IAEX,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAgBpD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B3E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAIhF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAW1F"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task ID Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates unique Task IDs with support for both internal and external origins.
|
|
5
|
+
* - Internal IDs: T-001, T-002, T-003 (no suffix)
|
|
6
|
+
* - External IDs: T-001E, T-002E, T-003E (E suffix)
|
|
7
|
+
*
|
|
8
|
+
* ID generation strategy:
|
|
9
|
+
* 1. Extract numeric part from all existing IDs (ignoring suffix)
|
|
10
|
+
* 2. Find maximum number across both internal and external IDs
|
|
11
|
+
* 3. Increment to get next sequential number
|
|
12
|
+
* 4. Add E suffix for external origin, no suffix for internal
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Parse Task ID to extract components
|
|
16
|
+
*
|
|
17
|
+
* @param id - Task ID (e.g., "T-001", "T-002E")
|
|
18
|
+
* @returns Parsed ID components
|
|
19
|
+
* @throws Error if ID format is invalid
|
|
20
|
+
*/
|
|
21
|
+
export function parseTaskId(id) {
|
|
22
|
+
// Match: T-001 or T-001E
|
|
23
|
+
const match = id.match(/^T-(\d+)(E)?$/);
|
|
24
|
+
if (!match) {
|
|
25
|
+
throw new Error(`Invalid Task ID format: ${id}. Expected format: T-XXX or T-XXXE`);
|
|
26
|
+
}
|
|
27
|
+
const number = parseInt(match[1], 10);
|
|
28
|
+
const origin = match[2] === 'E' ? 'external' : 'internal';
|
|
29
|
+
return {
|
|
30
|
+
id,
|
|
31
|
+
number,
|
|
32
|
+
origin
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get next sequential Task ID
|
|
37
|
+
*
|
|
38
|
+
* Finds maximum numeric ID across all existing IDs (internal + external)
|
|
39
|
+
* and generates next sequential ID with appropriate suffix.
|
|
40
|
+
*
|
|
41
|
+
* @param existingIds - Array of existing Task IDs
|
|
42
|
+
* @param origin - Origin type for new ID
|
|
43
|
+
* @returns Next sequential Task ID
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* getNextTaskId(['T-001', 'T-002E', 'T-003'], 'internal')
|
|
47
|
+
* // Returns: 'T-004'
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* getNextTaskId(['T-001', 'T-002E', 'T-003'], 'external')
|
|
51
|
+
* // Returns: 'T-004E'
|
|
52
|
+
*/
|
|
53
|
+
export function getNextTaskId(existingIds, origin) {
|
|
54
|
+
if (existingIds.length === 0) {
|
|
55
|
+
return origin === 'external' ? 'T-001E' : 'T-001';
|
|
56
|
+
}
|
|
57
|
+
// Extract numeric parts from all IDs
|
|
58
|
+
const numbers = [];
|
|
59
|
+
for (const id of existingIds) {
|
|
60
|
+
try {
|
|
61
|
+
const parsed = parseTaskId(id);
|
|
62
|
+
numbers.push(parsed.number);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Skip invalid IDs (they'll be caught by validation elsewhere)
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Find maximum number
|
|
70
|
+
const maxNumber = numbers.length > 0 ? Math.max(...numbers) : 0;
|
|
71
|
+
// Generate next ID
|
|
72
|
+
const nextNumber = maxNumber + 1;
|
|
73
|
+
const formattedNumber = String(nextNumber).padStart(3, '0');
|
|
74
|
+
return origin === 'external' ? `T-${formattedNumber}E` : `T-${formattedNumber}`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate ID uniqueness
|
|
78
|
+
*
|
|
79
|
+
* @param id - Task ID to check
|
|
80
|
+
* @param existingIds - Array of existing Task IDs
|
|
81
|
+
* @throws Error if ID already exists
|
|
82
|
+
*/
|
|
83
|
+
export function validateTaskIdUniqueness(id, existingIds) {
|
|
84
|
+
if (existingIds.includes(id)) {
|
|
85
|
+
throw new Error(`ID collision detected: ${id} already exists`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Detect origin from Task ID
|
|
90
|
+
*
|
|
91
|
+
* @param id - Task ID
|
|
92
|
+
* @returns Origin type ('internal' or 'external')
|
|
93
|
+
*/
|
|
94
|
+
export function getTaskIdOrigin(id) {
|
|
95
|
+
const parsed = parseTaskId(id);
|
|
96
|
+
return parsed.origin;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract numeric part from Task ID
|
|
100
|
+
*
|
|
101
|
+
* @param id - Task ID
|
|
102
|
+
* @returns Numeric part
|
|
103
|
+
*/
|
|
104
|
+
export function getTaskIdNumber(id) {
|
|
105
|
+
const parsed = parseTaskId(id);
|
|
106
|
+
return parsed.number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if ID is external (has E suffix)
|
|
110
|
+
*
|
|
111
|
+
* @param id - Task ID
|
|
112
|
+
* @returns true if external, false if internal
|
|
113
|
+
*/
|
|
114
|
+
export function isExternalTaskId(id) {
|
|
115
|
+
return getTaskIdOrigin(id) === 'external';
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Generate range of Task IDs
|
|
119
|
+
*
|
|
120
|
+
* @param start - Starting number
|
|
121
|
+
* @param count - Number of IDs to generate
|
|
122
|
+
* @param origin - Origin type
|
|
123
|
+
* @returns Array of Task IDs
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* generateTaskIdRange(1, 3, 'internal')
|
|
127
|
+
* // Returns: ['T-001', 'T-002', 'T-003']
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* generateTaskIdRange(5, 2, 'external')
|
|
131
|
+
* // Returns: ['T-005E', 'T-006E']
|
|
132
|
+
*/
|
|
133
|
+
export function generateTaskIdRange(start, count, origin) {
|
|
134
|
+
const ids = [];
|
|
135
|
+
for (let i = 0; i < count; i++) {
|
|
136
|
+
const number = start + i;
|
|
137
|
+
const formattedNumber = String(number).padStart(3, '0');
|
|
138
|
+
const id = origin === 'external' ? `T-${formattedNumber}E` : `T-${formattedNumber}`;
|
|
139
|
+
ids.push(id);
|
|
140
|
+
}
|
|
141
|
+
return ids;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=task-id-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-id-generator.js","sourceRoot":"","sources":["../../../src/id-generators/task-id-generator.ts"],"names":[],"mappings":"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"}
|