specweave 0.22.12 → 0.22.14
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 +269 -51
- 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/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +313 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +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 +10 -10
- package/dist/src/core/living-docs/living-docs-sync.d.ts +2 -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 +10 -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/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-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/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 +90 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -0
- package/dist/src/importers/import-coordinator.js +182 -0
- package/dist/src/importers/import-coordinator.js.map +1 -0
- package/dist/src/importers/item-converter.d.ts +91 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -0
- package/dist/src/importers/item-converter.js +221 -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/init/repo/types.d.ts +2 -2
- 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/package.json +2 -2
- package/plugins/specweave/.claude-plugin/plugin.json +16 -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-import-docs.md +278 -88
- package/plugins/specweave/commands/specweave-progress.md +45 -97
- 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-task-completion.sh +64 -4
- package/plugins/specweave/lib/hooks/sync-cache.js +294 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +32 -1
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +23 -13
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -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/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-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- 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-release/hooks/.specweave/logs/dora-tracking.log +252 -0
- 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
|
@@ -0,0 +1,153 @@
|
|
|
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
|
+
export type Origin = 'internal' | 'external';
|
|
9
|
+
export type ExternalSource = 'github' | 'jira' | 'ado' | 'unknown';
|
|
10
|
+
/**
|
|
11
|
+
* External item metadata (stored in spec.md/tasks.md frontmatter)
|
|
12
|
+
*/
|
|
13
|
+
export interface ExternalItemMetadata {
|
|
14
|
+
/** User Story or Task ID (e.g., "US-004E", "T-010E") */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Origin type */
|
|
17
|
+
origin: 'external';
|
|
18
|
+
/** External tool source */
|
|
19
|
+
source: ExternalSource;
|
|
20
|
+
/** External ID in source system (e.g., "GH-#638", "JIRA-SPEC-789") */
|
|
21
|
+
external_id: string;
|
|
22
|
+
/** External URL (link to original item) */
|
|
23
|
+
external_url: string;
|
|
24
|
+
/** Timestamp when imported */
|
|
25
|
+
imported_at: string;
|
|
26
|
+
/** External title (original, may differ from SpecWeave format) */
|
|
27
|
+
external_title?: string;
|
|
28
|
+
/** Format preservation flag (if true, preserve original title/description) */
|
|
29
|
+
format_preservation?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extended spec frontmatter with external items
|
|
33
|
+
*/
|
|
34
|
+
export interface SpecFrontmatter {
|
|
35
|
+
increment: string;
|
|
36
|
+
title: string;
|
|
37
|
+
type: string;
|
|
38
|
+
priority?: string;
|
|
39
|
+
status?: string;
|
|
40
|
+
created?: string;
|
|
41
|
+
epic?: string;
|
|
42
|
+
test_mode?: string;
|
|
43
|
+
coverage_target?: number;
|
|
44
|
+
/** External items imported into this increment */
|
|
45
|
+
external_items?: ExternalItemMetadata[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extended task frontmatter with external items
|
|
49
|
+
*/
|
|
50
|
+
export interface TasksFrontmatter {
|
|
51
|
+
total_tasks: number;
|
|
52
|
+
completed: number;
|
|
53
|
+
by_user_story?: Record<string, number>;
|
|
54
|
+
test_mode?: string;
|
|
55
|
+
coverage_target?: number;
|
|
56
|
+
/** External items imported into tasks */
|
|
57
|
+
external_items?: ExternalItemMetadata[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Origin badge emojis for living docs
|
|
61
|
+
*/
|
|
62
|
+
export declare const ORIGIN_BADGES: Record<ExternalSource | 'internal', string>;
|
|
63
|
+
/**
|
|
64
|
+
* Get origin badge for display
|
|
65
|
+
*
|
|
66
|
+
* @param source - External source or 'internal'
|
|
67
|
+
* @returns Emoji badge
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* getOriginBadge('github') // Returns: '🔗'
|
|
71
|
+
* getOriginBadge('internal') // Returns: '🏠'
|
|
72
|
+
*/
|
|
73
|
+
export declare function getOriginBadge(source: ExternalSource | 'internal'): string;
|
|
74
|
+
/**
|
|
75
|
+
* Format origin for display in living docs
|
|
76
|
+
*
|
|
77
|
+
* @param metadata - External item metadata
|
|
78
|
+
* @returns Formatted origin string (e.g., "🔗 GitHub #638")
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* formatOrigin({
|
|
82
|
+
* id: 'US-004E',
|
|
83
|
+
* origin: 'external',
|
|
84
|
+
* source: 'github',
|
|
85
|
+
* external_id: 'GH-#638',
|
|
86
|
+
* external_url: 'https://github.com/...',
|
|
87
|
+
* imported_at: '2025-11-19T10:30:00Z'
|
|
88
|
+
* })
|
|
89
|
+
* // Returns: "🔗 [GitHub #638](https://github.com/...)"
|
|
90
|
+
*/
|
|
91
|
+
export declare function formatOrigin(metadata: ExternalItemMetadata): string;
|
|
92
|
+
/**
|
|
93
|
+
* Check if ID is from external source (has E suffix)
|
|
94
|
+
*
|
|
95
|
+
* @param id - User Story or Task ID
|
|
96
|
+
* @returns True if external, false if internal
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* isExternalId('US-004E') // Returns: true
|
|
100
|
+
* isExternalId('US-003') // Returns: false
|
|
101
|
+
* isExternalId('T-010E') // Returns: true
|
|
102
|
+
*/
|
|
103
|
+
export declare function isExternalId(id: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Extract origin from ID suffix
|
|
106
|
+
*
|
|
107
|
+
* @param id - User Story or Task ID
|
|
108
|
+
* @returns Origin type
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* getOriginFromId('US-004E') // Returns: 'external'
|
|
112
|
+
* getOriginFromId('US-003') // Returns: 'internal'
|
|
113
|
+
*/
|
|
114
|
+
export declare function getOriginFromId(id: string): Origin;
|
|
115
|
+
/**
|
|
116
|
+
* Parse external ID to extract source and number
|
|
117
|
+
*
|
|
118
|
+
* @param externalId - External ID (e.g., "GH-#638", "JIRA-SPEC-789")
|
|
119
|
+
* @returns Parsed components
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* parseExternalId('GH-#638')
|
|
123
|
+
* // Returns: { source: 'github', number: '638' }
|
|
124
|
+
*
|
|
125
|
+
* parseExternalId('JIRA-SPEC-789')
|
|
126
|
+
* // Returns: { source: 'jira', number: 'SPEC-789' }
|
|
127
|
+
*/
|
|
128
|
+
export declare function parseExternalId(externalId: string): {
|
|
129
|
+
source: ExternalSource;
|
|
130
|
+
number: string;
|
|
131
|
+
} | null;
|
|
132
|
+
/**
|
|
133
|
+
* Create external item metadata
|
|
134
|
+
*
|
|
135
|
+
* @param params - Creation parameters
|
|
136
|
+
* @returns External item metadata
|
|
137
|
+
*/
|
|
138
|
+
export declare function createExternalMetadata(params: {
|
|
139
|
+
id: string;
|
|
140
|
+
source: ExternalSource;
|
|
141
|
+
externalId: string;
|
|
142
|
+
externalUrl: string;
|
|
143
|
+
externalTitle?: string;
|
|
144
|
+
formatPreservation?: boolean;
|
|
145
|
+
}): ExternalItemMetadata;
|
|
146
|
+
/**
|
|
147
|
+
* Validate external item metadata
|
|
148
|
+
*
|
|
149
|
+
* @param metadata - External item metadata
|
|
150
|
+
* @throws Error if metadata is invalid
|
|
151
|
+
*/
|
|
152
|
+
export declare function validateExternalMetadata(metadata: ExternalItemMetadata): void;
|
|
153
|
+
//# sourceMappingURL=origin-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"origin-metadata.d.ts","sourceRoot":"","sources":["../../../../src/core/types/origin-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IAEX,kBAAkB;IAClB,MAAM,EAAE,UAAU,CAAC;IAEnB,2BAA2B;IAC3B,MAAM,EAAE,cAAc,CAAC;IAEvB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IAEpB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IAErB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IAEpB,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,yCAAyC;IACzC,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,cAAc,GAAG,UAAU,EAAE,MAAM,CAMrE,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,GAAG,MAAM,CAE1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAKnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;IACnD,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAiBP;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,oBAAoB,CAoBvB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAkC7E"}
|
|
@@ -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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"}
|
|
@@ -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"}
|
|
@@ -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
|