specweave 1.0.255 → 1.0.256

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.
Files changed (92) hide show
  1. package/CLAUDE.md +24 -24
  2. package/README.md +138 -203
  3. package/dist/src/core/ac-checkbox-formatter.d.ts +24 -0
  4. package/dist/src/core/ac-checkbox-formatter.d.ts.map +1 -0
  5. package/dist/src/core/ac-checkbox-formatter.js +35 -0
  6. package/dist/src/core/ac-checkbox-formatter.js.map +1 -0
  7. package/dist/src/core/ac-progress-sync.d.ts +116 -0
  8. package/dist/src/core/ac-progress-sync.d.ts.map +1 -0
  9. package/dist/src/core/ac-progress-sync.js +272 -0
  10. package/dist/src/core/ac-progress-sync.js.map +1 -0
  11. package/dist/src/core/fabric/registry-schema.d.ts +79 -0
  12. package/dist/src/core/fabric/registry-schema.d.ts.map +1 -0
  13. package/dist/src/core/fabric/registry-schema.js +6 -0
  14. package/dist/src/core/fabric/registry-schema.js.map +1 -0
  15. package/dist/src/core/fabric/security-scanner.d.ts +12 -0
  16. package/dist/src/core/fabric/security-scanner.d.ts.map +1 -0
  17. package/dist/src/core/fabric/security-scanner.js +219 -0
  18. package/dist/src/core/fabric/security-scanner.js.map +1 -0
  19. package/dist/src/core/types/sync-profile.d.ts +44 -0
  20. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  21. package/dist/src/core/types/sync-profile.js.map +1 -1
  22. package/package.json +1 -1
  23. package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +4 -4
  24. package/plugins/{specweave-github/hooks/github-ac-sync-handler.sh → specweave/hooks/v2/handlers/ac-sync-dispatcher.sh} +96 -92
  25. package/plugins/specweave/skills/architect/SKILL.md +1 -1
  26. package/plugins/specweave/skills/auto/SKILL.md +1 -1
  27. package/plugins/specweave/skills/cancel-auto/SKILL.md +1 -1
  28. package/plugins/specweave/skills/code-simplifier/SKILL.md +1 -1
  29. package/plugins/specweave/skills/do/SKILL.md +1 -1
  30. package/plugins/specweave/skills/docs/SKILL.md +1 -1
  31. package/plugins/specweave/skills/docs-updater/SKILL.md +1 -1
  32. package/plugins/specweave/skills/done/SKILL.md +13 -70
  33. package/plugins/specweave/skills/framework/SKILL.md +1 -1
  34. package/plugins/specweave/skills/grill/SKILL.md +1 -1
  35. package/plugins/specweave/skills/increment/SKILL.md +1 -1
  36. package/plugins/specweave/skills/increment-planner/SKILL.md +1 -1
  37. package/plugins/specweave/skills/lsp/SKILL.md +1 -1
  38. package/plugins/specweave/skills/pm/SKILL.md +1 -1
  39. package/plugins/specweave/skills/progress/SKILL.md +1 -1
  40. package/plugins/specweave/skills/save/SKILL.md +1 -1
  41. package/plugins/specweave/skills/security/SKILL.md +1 -1
  42. package/plugins/specweave/skills/security-patterns/SKILL.md +1 -1
  43. package/plugins/specweave/skills/tdd-cycle/SKILL.md +1 -1
  44. package/plugins/specweave/skills/tdd-green/SKILL.md +1 -1
  45. package/plugins/specweave/skills/tdd-orchestrator/SKILL.md +1 -1
  46. package/plugins/specweave/skills/tdd-red/SKILL.md +1 -1
  47. package/plugins/specweave/skills/validate/SKILL.md +1 -1
  48. package/plugins/specweave-github/commands/sync.md +1 -22
  49. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts +0 -205
  50. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.d.ts.map +0 -1
  51. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js +0 -685
  52. package/dist/plugins/specweave-github/lib/ThreeLayerSyncManager.js.map +0 -1
  53. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts +0 -12
  54. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts.map +0 -1
  55. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js +0 -28
  56. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js.map +0 -1
  57. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +0 -21
  58. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +0 -1
  59. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +0 -471
  60. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +0 -1
  61. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +0 -53
  62. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +0 -1
  63. package/dist/plugins/specweave-github/lib/github-status-sync.js +0 -120
  64. package/dist/plugins/specweave-github/lib/github-status-sync.js.map +0 -1
  65. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts +0 -18
  66. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +0 -1
  67. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +0 -297
  68. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +0 -1
  69. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +0 -94
  70. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +0 -1
  71. package/dist/plugins/specweave-github/lib/increment-issue-builder.js +0 -385
  72. package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +0 -1
  73. package/plugins/specweave-github/lib/ThreeLayerSyncManager.js +0 -611
  74. package/plugins/specweave-github/lib/ThreeLayerSyncManager.ts +0 -909
  75. package/plugins/specweave-github/lib/cli-sync-increment-changes.d.js +0 -1
  76. package/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts +0 -12
  77. package/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts.map +0 -1
  78. package/plugins/specweave-github/lib/cli-sync-increment-changes.js +0 -17
  79. package/plugins/specweave-github/lib/cli-sync-increment-changes.js.map +0 -1
  80. package/plugins/specweave-github/lib/cli-sync-increment-changes.ts +0 -33
  81. package/plugins/specweave-github/lib/github-increment-sync-cli.js +0 -474
  82. package/plugins/specweave-github/lib/github-increment-sync-cli.ts +0 -616
  83. package/plugins/specweave-github/lib/github-status-sync.js +0 -107
  84. package/plugins/specweave-github/lib/github-status-sync.ts +0 -163
  85. package/plugins/specweave-github/lib/github-sync-increment-changes.d.js +0 -0
  86. package/plugins/specweave-github/lib/github-sync-increment-changes.d.ts +0 -18
  87. package/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +0 -1
  88. package/plugins/specweave-github/lib/github-sync-increment-changes.js +0 -253
  89. package/plugins/specweave-github/lib/github-sync-increment-changes.js.map +0 -1
  90. package/plugins/specweave-github/lib/github-sync-increment-changes.ts +0 -391
  91. package/plugins/specweave-github/lib/increment-issue-builder.js +0 -402
  92. package/plugins/specweave-github/lib/increment-issue-builder.ts +0 -520
@@ -0,0 +1,35 @@
1
+ /**
2
+ * AC Checkbox Formatter — Provider-specific AC state formatting
3
+ *
4
+ * Formats acceptance criteria states into checkbox markup for:
5
+ * - GitHub: `- [x] **AC-ID**: description`
6
+ * - JIRA: `(/) AC-ID: description`
7
+ * - ADO: `<li>☑ AC-ID: description</li>`
8
+ *
9
+ * @module ac-checkbox-formatter
10
+ */
11
+ /**
12
+ * Format AC states into provider-specific checkbox markup.
13
+ *
14
+ * Returns empty string for empty acStates array.
15
+ * Includes a progress header with completed/total count and percentage.
16
+ */
17
+ export function formatACCheckboxes(acStates, format) {
18
+ if (acStates.length === 0)
19
+ return '';
20
+ const total = acStates.length;
21
+ const completed = acStates.filter(ac => ac.completed).length;
22
+ const percentage = Math.round((completed / total) * 100);
23
+ const header = `**Status**: ${completed}/${total} ACs complete (${percentage}%)`;
24
+ const formatters = {
25
+ github: (ac) => `- [${ac.completed ? 'x' : ' '}] **${ac.id}**: ${ac.description}`,
26
+ jira: (ac) => `${ac.completed ? '(/)' : '(x)'} ${ac.id}: ${ac.description}`,
27
+ ado: (ac) => `<li>${ac.completed ? '☑' : '☐'} ${ac.id}: ${ac.description}</li>`,
28
+ };
29
+ const lines = acStates.map(formatters[format]);
30
+ if (format === 'ado') {
31
+ return `${header}\n\n<ul>\n${lines.join('\n')}\n</ul>`;
32
+ }
33
+ return `${header}\n\n${lines.join('\n')}`;
34
+ }
35
+ //# sourceMappingURL=ac-checkbox-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ac-checkbox-formatter.js","sourceRoot":"","sources":["../../../src/core/ac-checkbox-formatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAmB,EACnB,MAAwB;IAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,eAAe,SAAS,IAAI,KAAK,kBAAkB,UAAU,IAAI,CAAC;IAEjF,MAAM,UAAU,GAAsD;QACpE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CACb,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE;QACnE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CACX,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE;QAC/D,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CACV,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,WAAW,OAAO;KACrE,CAAC;IAEF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,GAAG,MAAM,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IACzD,CAAC;IAED,OAAO,GAAG,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Provider-Agnostic AC Progress Sync
3
+ *
4
+ * Routes AC completion events to all enabled providers (GitHub, JIRA, ADO)
5
+ * using a simple function-map pattern. No adapter classes, no orchestrator.
6
+ *
7
+ * GitHub: delegates to existing 0193 modules (postACProgressComments + autoCloseCompletedUserStories)
8
+ * JIRA: calls JiraStatusSync for comments and transitions
9
+ * ADO: calls AdoClient for comments, AdoStatusSync for state transitions
10
+ *
11
+ * @module ac-progress-sync
12
+ */
13
+ import { type ACState } from './ac-checkbox-formatter.js';
14
+ import type { SyncProvider } from './types/sync-profile.js';
15
+ export interface ACProgressSyncConfig {
16
+ sync: {
17
+ github?: {
18
+ enabled?: boolean;
19
+ };
20
+ jira?: {
21
+ enabled?: boolean;
22
+ };
23
+ ado?: {
24
+ enabled?: boolean;
25
+ };
26
+ };
27
+ github?: {
28
+ owner?: string;
29
+ repo?: string;
30
+ token?: string;
31
+ };
32
+ jira?: {
33
+ domain?: string;
34
+ email?: string;
35
+ apiToken?: string;
36
+ projectKey?: string;
37
+ };
38
+ ado?: {
39
+ organization?: string;
40
+ project?: string;
41
+ pat?: string;
42
+ };
43
+ externalLinks?: {
44
+ github?: {
45
+ issues?: Record<string, {
46
+ issueNumber: number;
47
+ issueUrl: string;
48
+ status?: string;
49
+ }>;
50
+ };
51
+ jira?: {
52
+ userStories?: Record<string, {
53
+ issueKey: string;
54
+ issueUrl: string;
55
+ syncedAt?: string;
56
+ }>;
57
+ };
58
+ ado?: {
59
+ userStories?: Record<string, {
60
+ workItemId: number;
61
+ workItemUrl: string;
62
+ syncedAt?: string;
63
+ }>;
64
+ };
65
+ };
66
+ }
67
+ export interface ProviderSyncResult {
68
+ posted: Array<{
69
+ usId: string;
70
+ ref: string;
71
+ }>;
72
+ closed: Array<{
73
+ usId: string;
74
+ ref: string;
75
+ }>;
76
+ skipped: Array<{
77
+ usId: string;
78
+ reason: string;
79
+ }>;
80
+ errors: Array<{
81
+ usId: string;
82
+ error: string;
83
+ }>;
84
+ }
85
+ export type ACProgressSyncResult = Partial<Record<SyncProvider, ProviderSyncResult>>;
86
+ export interface ACProgressContext {
87
+ specPath: string;
88
+ specContent: string;
89
+ userStories: Map<string, {
90
+ acStates: ACState[];
91
+ }>;
92
+ }
93
+ /**
94
+ * Sync AC progress to all enabled providers.
95
+ *
96
+ * Reads config to determine which providers are enabled, then calls each
97
+ * provider's sync function. Errors are isolated per provider.
98
+ *
99
+ * @param incrementId - The increment ID
100
+ * @param affectedUSIds - User story IDs that have AC changes
101
+ * @param specPath - Path to spec.md
102
+ * @param config - Sync configuration with provider settings and external links
103
+ * @returns Per-provider results with posted, closed, skipped, and errors
104
+ */
105
+ export declare function syncACProgressToProviders(incrementId: string, affectedUSIds: string[], specPath: string, config: ACProgressSyncConfig): Promise<ACProgressSyncResult>;
106
+ /**
107
+ * Reset all circuit breakers (for testing only).
108
+ */
109
+ export declare function resetCircuitBreakers(): void;
110
+ /**
111
+ * Build AC progress context by parsing spec.md.
112
+ *
113
+ * Extracts AC states (id, description, completed) for each affected user story.
114
+ */
115
+ export declare function buildACProgressContext(specPath: string, affectedUSIds: string[]): Promise<ACProgressContext>;
116
+ //# sourceMappingURL=ac-progress-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ac-progress-sync.d.ts","sourceRoot":"","sources":["../../../src/core/ac-progress-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Provider-Agnostic AC Progress Sync
3
+ *
4
+ * Routes AC completion events to all enabled providers (GitHub, JIRA, ADO)
5
+ * using a simple function-map pattern. No adapter classes, no orchestrator.
6
+ *
7
+ * GitHub: delegates to existing 0193 modules (postACProgressComments + autoCloseCompletedUserStories)
8
+ * JIRA: calls JiraStatusSync for comments and transitions
9
+ * ADO: calls AdoClient for comments, AdoStatusSync for state transitions
10
+ *
11
+ * @module ac-progress-sync
12
+ */
13
+ import { readFile } from 'fs/promises';
14
+ import { formatACCheckboxes } from './ac-checkbox-formatter.js';
15
+ import { SyncCircuitBreaker } from './increment/sync-circuit-breaker.js';
16
+ // ============================================================================
17
+ // Shared Helpers
18
+ // ============================================================================
19
+ function emptyResult() {
20
+ return { posted: [], closed: [], skipped: [], errors: [] };
21
+ }
22
+ function serializeError(err) {
23
+ return err instanceof Error ? err.message : String(err);
24
+ }
25
+ function formatProgressText(acStates, format) {
26
+ const commentBody = formatACCheckboxes(acStates, format);
27
+ const total = acStates.length;
28
+ const completed = acStates.filter(ac => ac.completed).length;
29
+ return `AC Progress: ${completed}/${total}\n\n${commentBody}`;
30
+ }
31
+ function isAllComplete(acStates) {
32
+ return acStates.length > 0 && acStates.every(ac => ac.completed);
33
+ }
34
+ /**
35
+ * GitHub provider: delegates to existing 0193 modules directly.
36
+ */
37
+ async function syncGitHubACProgress(incrementId, affectedUSIds, ctx, config) {
38
+ const result = emptyResult();
39
+ const { postACProgressComments } = await import('../../plugins/specweave-github/lib/github-ac-comment-poster.js');
40
+ const { autoCloseCompletedUserStories } = await import('../../plugins/specweave-github/lib/github-us-auto-closer.js');
41
+ const options = {
42
+ owner: config.github?.owner || '',
43
+ repo: config.github?.repo || '',
44
+ token: config.github?.token,
45
+ };
46
+ // Post progress comments
47
+ const commentResult = await postACProgressComments(incrementId, affectedUSIds, ctx.specPath, options);
48
+ for (const posted of commentResult.posted) {
49
+ result.posted.push({ usId: posted.usId, ref: String(posted.issueNumber) });
50
+ }
51
+ for (const err of commentResult.errors) {
52
+ result.errors.push({ usId: err.usId, error: err.error });
53
+ }
54
+ // Auto-close completed user stories
55
+ const closeResult = await autoCloseCompletedUserStories(incrementId, affectedUSIds, ctx.specPath, options);
56
+ for (const closed of closeResult.closed) {
57
+ result.closed.push({ usId: closed.usId, ref: String(closed.issueNumber) });
58
+ }
59
+ for (const skipped of closeResult.skipped) {
60
+ result.skipped.push({ usId: skipped.usId, reason: skipped.reason });
61
+ }
62
+ for (const err of closeResult.errors) {
63
+ result.errors.push({ usId: err.usId, error: err.error });
64
+ }
65
+ return result;
66
+ }
67
+ /**
68
+ * JIRA provider: posts comments and transitions issues.
69
+ */
70
+ async function syncJiraACProgress(incrementId, affectedUSIds, ctx, config) {
71
+ const result = emptyResult();
72
+ const { JiraStatusSync } = await import('../../plugins/specweave-jira/lib/jira-status-sync.js');
73
+ const jiraSync = new JiraStatusSync(config.jira?.domain || '', config.jira?.email || '', config.jira?.apiToken || '', config.jira?.projectKey || '');
74
+ const jiraLinks = config.externalLinks?.jira?.userStories || {};
75
+ for (const usId of affectedUSIds) {
76
+ const link = jiraLinks[usId];
77
+ if (!link) {
78
+ result.skipped.push({ usId, reason: 'no-issue-link' });
79
+ continue;
80
+ }
81
+ const us = ctx.userStories.get(usId);
82
+ const acStates = us?.acStates || [];
83
+ try {
84
+ // Post progress comment
85
+ const progressText = formatProgressText(acStates, 'jira');
86
+ await jiraSync.postStatusComment(link.issueKey, 'in-progress', progressText);
87
+ result.posted.push({ usId, ref: link.issueKey });
88
+ // Auto-transition to Done if all ACs complete
89
+ if (isAllComplete(acStates)) {
90
+ const transitioned = await jiraSync.updateStatus(link.issueKey, { state: 'Done' });
91
+ if (transitioned) {
92
+ result.closed.push({ usId, ref: link.issueKey });
93
+ }
94
+ else {
95
+ result.skipped.push({ usId, reason: 'already-closed' });
96
+ }
97
+ }
98
+ }
99
+ catch (err) {
100
+ result.errors.push({ usId, error: serializeError(err) });
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ /**
106
+ * ADO provider: posts comments and transitions work items.
107
+ */
108
+ async function syncAdoACProgress(incrementId, affectedUSIds, ctx, config) {
109
+ const result = emptyResult();
110
+ const { AdoStatusSync } = await import('../../plugins/specweave-ado/lib/ado-status-sync.js');
111
+ const { AdoClient } = await import('../../plugins/specweave-ado/lib/ado-client.js');
112
+ const adoSync = new AdoStatusSync(config.ado?.organization || '', config.ado?.project || '', config.ado?.pat || '');
113
+ const adoClient = new AdoClient({
114
+ organization: config.ado?.organization || '',
115
+ project: config.ado?.project || '',
116
+ personalAccessToken: config.ado?.pat || '',
117
+ });
118
+ const adoLinks = config.externalLinks?.ado?.userStories || {};
119
+ for (const usId of affectedUSIds) {
120
+ const link = adoLinks[usId];
121
+ if (!link) {
122
+ result.skipped.push({ usId, reason: 'no-issue-link' });
123
+ continue;
124
+ }
125
+ const us = ctx.userStories.get(usId);
126
+ const acStates = us?.acStates || [];
127
+ try {
128
+ // Post progress comment
129
+ const commentText = formatProgressText(acStates, 'ado');
130
+ await adoClient.addComment(link.workItemId, commentText);
131
+ result.posted.push({ usId, ref: String(link.workItemId) });
132
+ // Auto-transition to Closed if all ACs complete
133
+ if (isAllComplete(acStates)) {
134
+ const currentStatus = await adoSync.getStatus(link.workItemId);
135
+ if (currentStatus.state === 'Closed') {
136
+ result.skipped.push({ usId, reason: 'already-closed' });
137
+ }
138
+ else {
139
+ await adoSync.updateStatus(link.workItemId, { state: 'Closed' });
140
+ result.closed.push({ usId, ref: String(link.workItemId) });
141
+ }
142
+ }
143
+ }
144
+ catch (err) {
145
+ result.errors.push({ usId, error: serializeError(err) });
146
+ }
147
+ }
148
+ return result;
149
+ }
150
+ // ============================================================================
151
+ // Provider Map
152
+ // ============================================================================
153
+ const PROVIDER_MAP = {
154
+ github: syncGitHubACProgress,
155
+ jira: syncJiraACProgress,
156
+ ado: syncAdoACProgress,
157
+ };
158
+ // Per-provider circuit breakers (module-level singletons)
159
+ const circuitBreakers = {
160
+ github: new SyncCircuitBreaker(),
161
+ jira: new SyncCircuitBreaker(),
162
+ ado: new SyncCircuitBreaker(),
163
+ };
164
+ // ============================================================================
165
+ // Main Entry Point
166
+ // ============================================================================
167
+ /**
168
+ * Sync AC progress to all enabled providers.
169
+ *
170
+ * Reads config to determine which providers are enabled, then calls each
171
+ * provider's sync function. Errors are isolated per provider.
172
+ *
173
+ * @param incrementId - The increment ID
174
+ * @param affectedUSIds - User story IDs that have AC changes
175
+ * @param specPath - Path to spec.md
176
+ * @param config - Sync configuration with provider settings and external links
177
+ * @returns Per-provider results with posted, closed, skipped, and errors
178
+ */
179
+ export async function syncACProgressToProviders(incrementId, affectedUSIds, specPath, config) {
180
+ const result = {};
181
+ if (affectedUSIds.length === 0) {
182
+ return result;
183
+ }
184
+ // Build context from spec.md
185
+ const ctx = await buildACProgressContext(specPath, affectedUSIds);
186
+ // Execute each enabled provider
187
+ const providers = ['github', 'jira', 'ado'];
188
+ for (const provider of providers) {
189
+ const providerConfig = config.sync?.[provider];
190
+ if (!providerConfig?.enabled)
191
+ continue;
192
+ // Check circuit breaker before calling provider
193
+ const breaker = circuitBreakers[provider];
194
+ if (!breaker.canSync()) {
195
+ const skippedResult = emptyResult();
196
+ for (const usId of affectedUSIds) {
197
+ skippedResult.skipped.push({ usId, reason: 'circuit-open' });
198
+ }
199
+ result[provider] = skippedResult;
200
+ continue;
201
+ }
202
+ const syncFn = PROVIDER_MAP[provider];
203
+ try {
204
+ const providerResult = await syncFn(incrementId, affectedUSIds, ctx, config);
205
+ result[provider] = providerResult;
206
+ // Record circuit breaker outcome based on provider errors
207
+ if (providerResult.errors.length > 0 && providerResult.posted.length === 0) {
208
+ breaker.recordFailure();
209
+ }
210
+ else {
211
+ breaker.recordSuccess();
212
+ }
213
+ }
214
+ catch (err) {
215
+ breaker.recordFailure();
216
+ // Top-level error isolation: if provider function throws unexpectedly
217
+ const providerResult = emptyResult();
218
+ providerResult.errors.push({
219
+ usId: affectedUSIds[0] || 'unknown',
220
+ error: serializeError(err),
221
+ });
222
+ result[provider] = providerResult;
223
+ }
224
+ }
225
+ return result;
226
+ }
227
+ /**
228
+ * Reset all circuit breakers (for testing only).
229
+ */
230
+ export function resetCircuitBreakers() {
231
+ for (const provider of Object.keys(circuitBreakers)) {
232
+ circuitBreakers[provider].reset();
233
+ }
234
+ }
235
+ /**
236
+ * Build AC progress context by parsing spec.md.
237
+ *
238
+ * Extracts AC states (id, description, completed) for each affected user story.
239
+ */
240
+ export async function buildACProgressContext(specPath, affectedUSIds) {
241
+ const content = await readFile(specPath, 'utf-8');
242
+ const userStories = new Map();
243
+ for (const usId of affectedUSIds) {
244
+ const acStates = parseACStatesForUS(content, usId);
245
+ userStories.set(usId, { acStates });
246
+ }
247
+ return {
248
+ specPath,
249
+ specContent: content,
250
+ userStories,
251
+ };
252
+ }
253
+ /**
254
+ * Extract AC states for a specific user story from spec.md content.
255
+ * Reuses the same parsing logic from github-ac-comment-poster.
256
+ */
257
+ function parseACStatesForUS(content, usId) {
258
+ const states = [];
259
+ // AC IDs use unpadded US number: US-001 → AC-US1-XX
260
+ const usNum = String(parseInt(usId.replace('US-', ''), 10));
261
+ const acPattern = new RegExp(`- \\[([ x])\\] \\*\\*AC-US${usNum}-(\\d+)\\*\\*:\\s*(.+)`, 'g');
262
+ let match;
263
+ while ((match = acPattern.exec(content)) !== null) {
264
+ states.push({
265
+ id: `AC-US${usNum}-${match[2]}`,
266
+ description: match[3].trim(),
267
+ completed: match[1] === 'x',
268
+ });
269
+ }
270
+ return states;
271
+ }
272
+ //# sourceMappingURL=ac-progress-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ac-progress-sync.js","sourceRoot":"","sources":["../../../src/core/ac-progress-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Skill Fabric Registry Schema
3
+ * Defines the structure for the curated skill registry.
4
+ */
5
+ /** Trust tier for a registry entry */
6
+ export type FabricTier = 'official' | 'verified' | 'community';
7
+ /** A single skill within a plugin */
8
+ export interface FabricSkillEntry {
9
+ /** Skill name (e.g., "component-generate") */
10
+ name: string;
11
+ /** Human-readable description */
12
+ description: string;
13
+ /** Tags for search/filtering */
14
+ tags: string[];
15
+ }
16
+ /** A plugin entry in the Fabric registry */
17
+ export interface FabricRegistryEntry {
18
+ /** Plugin name (e.g., "sw-frontend") */
19
+ name: string;
20
+ /** Human-readable display name */
21
+ displayName: string;
22
+ /** Plugin description */
23
+ description: string;
24
+ /** Author name or org */
25
+ author: string;
26
+ /** Trust tier */
27
+ tier: FabricTier;
28
+ /** Current version */
29
+ version: string;
30
+ /** Search tags */
31
+ tags: string[];
32
+ /** Individual skills provided by this plugin */
33
+ skills: FabricSkillEntry[];
34
+ /** Whether compatible with Agent Skills standard */
35
+ agentSkillsCompat: boolean;
36
+ /** Repository URL (optional) */
37
+ repository?: string;
38
+ /** Homepage URL (optional) */
39
+ homepage?: string;
40
+ /** Minimum SpecWeave version required */
41
+ minSpecweaveVersion?: string;
42
+ }
43
+ /** The complete Fabric registry */
44
+ export interface FabricRegistry {
45
+ /** Registry schema version */
46
+ version: string;
47
+ /** Last updated timestamp */
48
+ updatedAt: string;
49
+ /** All registry entries */
50
+ entries: FabricRegistryEntry[];
51
+ }
52
+ /** Search filters for registry queries */
53
+ export interface FabricSearchFilters {
54
+ /** Filter by trust tier */
55
+ tier?: FabricTier;
56
+ /** Filter by tag */
57
+ tag?: string;
58
+ /** Filter by author */
59
+ author?: string;
60
+ }
61
+ /** Result from security scan */
62
+ export interface FabricSecurityScanResult {
63
+ /** Whether the scan passed */
64
+ passed: boolean;
65
+ /** Individual findings */
66
+ findings: FabricSecurityFinding[];
67
+ }
68
+ /** A single security finding */
69
+ export interface FabricSecurityFinding {
70
+ /** Severity level */
71
+ severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
72
+ /** Finding category */
73
+ category: string;
74
+ /** Human-readable description */
75
+ message: string;
76
+ /** Line number in the file (if applicable) */
77
+ line?: number;
78
+ }
79
+ //# sourceMappingURL=registry-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-schema.d.ts","sourceRoot":"","sources":["../../../../src/core/fabric/registry-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAE/D,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,oDAAoD;IACpD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gCAAgC;AAChC,MAAM,WAAW,wBAAwB;IACvC,8BAA8B;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,gCAAgC;AAChC,MAAM,WAAW,qBAAqB;IACpC,qBAAqB;IACrB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Skill Fabric Registry Schema
3
+ * Defines the structure for the curated skill registry.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=registry-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-schema.js","sourceRoot":"","sources":["../../../../src/core/fabric/registry-schema.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Security scanner for SKILL.md files.
3
+ * Detects destructive commands, remote code execution, credential access,
4
+ * prompt injection, frontmatter issues, and network access patterns.
5
+ */
6
+ import { FabricSecurityScanResult } from './registry-schema.js';
7
+ /**
8
+ * Scans a SKILL.md file content for security issues.
9
+ * Returns pass/fail with detailed findings.
10
+ */
11
+ export declare function scanSkillContent(content: string): FabricSecurityScanResult;
12
+ //# sourceMappingURL=security-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../../../../src/core/fabric/security-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAyB,MAAM,sBAAsB,CAAC;AAmMvF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CAqC1E"}