specweave 1.0.440 → 1.0.442
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/dist/src/core/doctor/checkers/plugins-checker.d.ts.map +1 -1
- package/dist/src/core/doctor/checkers/plugins-checker.js +71 -35
- package/dist/src/core/doctor/checkers/plugins-checker.js.map +1 -1
- package/dist/src/utils/plugin-copier.d.ts.map +1 -1
- package/dist/src/utils/plugin-copier.js +30 -4
- package/dist/src/utils/plugin-copier.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +1 -0
- package/plugins/specweave/hooks/.specweave/logs/auto-iterations.log +0 -1
- package/plugins/specweave/hooks/.specweave/logs/auto-stop-reasons.log +0 -1
- package/plugins/specweave/skills/.specweave/logs/reflect/auto-reflect.log +0 -15
- package/plugins/specweave/skills/.specweave/logs/reflect/reflect.log +0 -3
- package/plugins/specweave/skills/.specweave/logs/stop-auto.log +0 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -180
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -1266
- package/plugins/specweave-github/lib/enhanced-github-sync.js +0 -249
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -150
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -1260
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins-checker.d.ts","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/plugins-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAEd,aAAa,EACd,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugins-checker.d.ts","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/plugins-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAEd,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,SAAa;IACrB,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,CAAC,EAAE,qBAAqB;IAIlC,KAAK,CACT,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC;IAuB1B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,yBAAyB;IA2DjC,OAAO,CAAC,eAAe;CAoDxB"}
|
|
@@ -5,6 +5,10 @@ import * as fs from 'fs';
|
|
|
5
5
|
import * as path from 'path';
|
|
6
6
|
import * as os from 'os';
|
|
7
7
|
import { calculateOverallStatus } from '../types.js';
|
|
8
|
+
import { execFileNoThrowSync } from '../../../utils/execFileNoThrow.js';
|
|
9
|
+
import { findSpecweaveRoot } from '../../../utils/plugin-copier.js';
|
|
10
|
+
import { getDirname } from '../../../utils/esm-helpers.js';
|
|
11
|
+
const __dirname = getDirname(import.meta.url);
|
|
8
12
|
export class PluginsChecker {
|
|
9
13
|
constructor(opts) {
|
|
10
14
|
this.category = 'Plugins';
|
|
@@ -109,68 +113,100 @@ export class PluginsChecker {
|
|
|
109
113
|
};
|
|
110
114
|
}
|
|
111
115
|
}
|
|
112
|
-
checkMarketplaceDirectory(
|
|
113
|
-
const
|
|
114
|
-
|
|
116
|
+
checkMarketplaceDirectory(fix) {
|
|
117
|
+
const knownMarketplacesPath = path.join(this.homeDir, '.claude', 'plugins', 'known_marketplaces.json');
|
|
118
|
+
let isRegistered = false;
|
|
119
|
+
try {
|
|
120
|
+
const content = fs.readFileSync(knownMarketplacesPath, 'utf8');
|
|
121
|
+
const marketplaces = JSON.parse(content);
|
|
122
|
+
isRegistered = 'specweave' in marketplaces;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
isRegistered = false;
|
|
126
|
+
}
|
|
127
|
+
if (isRegistered) {
|
|
115
128
|
return {
|
|
116
129
|
name: 'SpecWeave marketplace',
|
|
117
|
-
status: '
|
|
118
|
-
message: '
|
|
119
|
-
fixSuggestion: 'Run: claude plugin marketplace add specweave/specweave-plugins',
|
|
130
|
+
status: 'pass',
|
|
131
|
+
message: 'registered in Claude Code',
|
|
120
132
|
};
|
|
121
133
|
}
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
if (!
|
|
134
|
+
if (fix) {
|
|
135
|
+
const specweaveRoot = findSpecweaveRoot(__dirname);
|
|
136
|
+
if (!specweaveRoot) {
|
|
125
137
|
return {
|
|
126
138
|
name: 'SpecWeave marketplace',
|
|
127
|
-
status: '
|
|
128
|
-
message: '
|
|
139
|
+
status: 'fail',
|
|
140
|
+
message: 'not registered — could not locate specweave installation to fix',
|
|
129
141
|
fixSuggestion: 'Run: specweave update',
|
|
130
142
|
};
|
|
131
143
|
}
|
|
132
|
-
const
|
|
144
|
+
const result = execFileNoThrowSync('claude', ['plugin', 'marketplace', 'add', specweaveRoot], { timeout: 10000 });
|
|
145
|
+
if (result.success) {
|
|
146
|
+
return {
|
|
147
|
+
name: 'SpecWeave marketplace',
|
|
148
|
+
status: 'pass',
|
|
149
|
+
message: 're-registered (was missing)',
|
|
150
|
+
fixSuggestion: 'Marketplace re-registered successfully',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
133
153
|
return {
|
|
134
154
|
name: 'SpecWeave marketplace',
|
|
135
|
-
status: '
|
|
136
|
-
message:
|
|
155
|
+
status: 'fail',
|
|
156
|
+
message: 'not registered, fix failed',
|
|
157
|
+
fixSuggestion: 'Run: specweave update',
|
|
137
158
|
};
|
|
138
159
|
}
|
|
160
|
+
return {
|
|
161
|
+
name: 'SpecWeave marketplace',
|
|
162
|
+
status: 'warn',
|
|
163
|
+
message: 'not registered in Claude Code',
|
|
164
|
+
fixSuggestion: 'Run: specweave doctor --fix (or specweave update)',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
checkCorePlugin(fix) {
|
|
168
|
+
const installedPluginsPath = path.join(this.homeDir, '.claude', 'plugins', 'installed_plugins.json');
|
|
169
|
+
let isInstalled = false;
|
|
170
|
+
try {
|
|
171
|
+
const content = fs.readFileSync(installedPluginsPath, 'utf8');
|
|
172
|
+
const data = JSON.parse(content);
|
|
173
|
+
const plugins = data.plugins ?? data;
|
|
174
|
+
isInstalled = !Array.isArray(plugins) && typeof plugins === 'object' && plugins !== null
|
|
175
|
+
&& 'sw@specweave' in plugins;
|
|
176
|
+
}
|
|
139
177
|
catch {
|
|
140
|
-
|
|
141
|
-
name: 'SpecWeave marketplace',
|
|
142
|
-
status: 'warn',
|
|
143
|
-
message: 'could not read marketplace',
|
|
144
|
-
};
|
|
178
|
+
isInstalled = false;
|
|
145
179
|
}
|
|
146
|
-
|
|
147
|
-
checkCorePlugin(_fix) {
|
|
148
|
-
const corePluginDir = path.join(this.homeDir, '.claude', 'plugins', 'marketplaces', 'specweave', 'plugins', 'specweave');
|
|
149
|
-
if (!fs.existsSync(corePluginDir)) {
|
|
180
|
+
if (isInstalled) {
|
|
150
181
|
return {
|
|
151
182
|
name: 'Core plugin (sw)',
|
|
152
|
-
status: '
|
|
153
|
-
message: '
|
|
154
|
-
fixSuggestion: 'Run: specweave update',
|
|
183
|
+
status: 'pass',
|
|
184
|
+
message: 'installed',
|
|
155
185
|
};
|
|
156
186
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
187
|
+
if (fix) {
|
|
188
|
+
// sw@specweave always uses user scope (per plugin-scope.ts override)
|
|
189
|
+
const result = execFileNoThrowSync('claude', ['plugin', 'install', 'sw@specweave', '--scope', 'user'], { timeout: 15000 });
|
|
190
|
+
if (result.success) {
|
|
191
|
+
return {
|
|
192
|
+
name: 'Core plugin (sw)',
|
|
193
|
+
status: 'pass',
|
|
194
|
+
message: 'installed (was missing)',
|
|
195
|
+
fixSuggestion: 'Installed sw@specweave successfully',
|
|
196
|
+
};
|
|
197
|
+
}
|
|
163
198
|
return {
|
|
164
199
|
name: 'Core plugin (sw)',
|
|
165
200
|
status: 'fail',
|
|
166
|
-
message: '
|
|
201
|
+
message: 'not installed, fix failed',
|
|
167
202
|
fixSuggestion: 'Run: specweave update',
|
|
168
203
|
};
|
|
169
204
|
}
|
|
170
205
|
return {
|
|
171
206
|
name: 'Core plugin (sw)',
|
|
172
|
-
status: '
|
|
173
|
-
message: 'installed',
|
|
207
|
+
status: 'warn',
|
|
208
|
+
message: 'not installed',
|
|
209
|
+
fixSuggestion: 'Run: specweave doctor --fix (or specweave update)',
|
|
174
210
|
};
|
|
175
211
|
}
|
|
176
212
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins-checker.js","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/plugins-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAOzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugins-checker.js","sourceRoot":"","sources":["../../../../../src/core/doctor/checkers/plugins-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAOzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAM9C,MAAM,OAAO,cAAc;IAIzB,YAAY,IAA4B;QAHxC,aAAQ,GAAG,SAAS,CAAC;QAInB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAK,CACT,WAAmB,EACnB,OAAsB;QAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC;QACjC,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,2BAA2B;QAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QAE1D,4BAA4B;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9C,iCAAiC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC;QAEjD,wBAAwB;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvC,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,sBAAsB,CAAC,MAAM,CAAC;YACtC,MAAM;SACP,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,WAAmB,EAAE,GAAY;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,qBAAqB,CACtB,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,wCAAwC;aAClD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAElC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;YAC1C,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,oBAAoB;gBAC9C,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,EAAE,CAAC;gBACR,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACzB,OAAO;oBACL,IAAI,EAAE,oBAAoB;oBAC1B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,4BAA4B;oBACrC,aAAa,EAAE,4BAA4B;iBAC5C,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,oBAAoB;gBAC7B,aAAa,EAAE,uBAAuB;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,GAAY;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QAE9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,iBAAiB;aAC3B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhE,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;gBAClB,IAAI,GAAG,EAAE,CAAC;oBACR,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBACzB,OAAO;wBACL,IAAI,EAAE,qBAAqB;wBAC3B,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,4BAA4B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ;wBACjE,aAAa,EAAE,0BAA0B;qBAC1C,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ;oBAC/C,aAAa,EAAE,uBAAuB;iBACvC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ;aAChD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,yBAAyB,CAAC,GAAY;QAC5C,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CACrC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,yBAAyB,CAC9D,CAAC;QAEF,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,YAAY,GAAG,WAAW,IAAI,YAAY,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,2BAA2B;aACrC,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,aAAa,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,IAAI,EAAE,uBAAuB;oBAC7B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,iEAAiE;oBAC1E,aAAa,EAAE,uBAAuB;iBACvC,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,mBAAmB,CAChC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,KAAM,EAAE,CAC/E,CAAC;YACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;oBACL,IAAI,EAAE,uBAAuB;oBAC7B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,6BAA6B;oBACtC,aAAa,EAAE,wCAAwC;iBACxD,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,4BAA4B;gBACrC,aAAa,EAAE,uBAAuB;aACvC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,+BAA+B;YACxC,aAAa,EAAE,mDAAmD;SACnE,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,GAAY;QAClC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CACpC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,wBAAwB,CAC7D,CAAC;QAEF,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;YACrC,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;mBACnF,cAAc,IAAI,OAAO,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,WAAW;aACrB,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,qEAAqE;YACrE,MAAM,MAAM,GAAG,mBAAmB,CAChC,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAM,EAAE,CACxF,CAAC;YACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO;oBACL,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,yBAAyB;oBAClC,aAAa,EAAE,qCAAqC;iBACrD,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,2BAA2B;gBACpC,aAAa,EAAE,uBAAuB;aACvC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,eAAe;YACxB,aAAa,EAAE,mDAAmD;SACnE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-copier.d.ts","sourceRoot":"","sources":["../../../src/utils/plugin-copier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwB3D;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1D;AAMD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAUpE;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQ3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAatD;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBjE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"plugin-copier.d.ts","sourceRoot":"","sources":["../../../src/utils/plugin-copier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqBH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwB3D;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1D;AAMD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAUpE;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQ3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAatD;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBjE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA6GlB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,sBAAgB,CAAC"}
|
|
@@ -217,15 +217,41 @@ export function installPlugin(pluginName, specweaveRoot, options = {}) {
|
|
|
217
217
|
if (!existsSync(sourceDir)) {
|
|
218
218
|
return { success: false, sha: '', error: `Source dir not found: ${sourceDir}` };
|
|
219
219
|
}
|
|
220
|
-
// 3.
|
|
220
|
+
// 3. Ensure marketplace is registered — runs before the hash check so that
|
|
221
|
+
// known_marketplaces.json is repaired even when the plugin content is unchanged.
|
|
222
|
+
// We check the file first to avoid a CLI spawn on every call when already healthy.
|
|
223
|
+
const knownMarketplacesPath = join(homedir(), '.claude', 'plugins', 'known_marketplaces.json');
|
|
224
|
+
let marketplaceRegistered = false;
|
|
225
|
+
try {
|
|
226
|
+
const mkts = JSON.parse(readFileSync(knownMarketplacesPath, 'utf-8'));
|
|
227
|
+
marketplaceRegistered = typeof mkts === 'object' && mkts !== null && 'specweave' in mkts;
|
|
228
|
+
}
|
|
229
|
+
catch { /* file missing or invalid — treat as not registered */ }
|
|
230
|
+
if (!marketplaceRegistered) {
|
|
231
|
+
execFileNoThrowSync('claude', ['plugin', 'marketplace', 'add', specweaveRoot], { timeout: 10000 });
|
|
232
|
+
}
|
|
233
|
+
// 4. Compute hash and check lockfile
|
|
221
234
|
const sha = computePluginHash(sourceDir);
|
|
222
235
|
const lockDir = getProjectRoot();
|
|
223
236
|
const lock = ensureLockfile(lockDir);
|
|
224
237
|
if (!options.force && lock.skills[pluginName]?.sha === sha) {
|
|
225
|
-
|
|
238
|
+
// Hash unchanged — but only skip if the plugin is actually installed in Claude Code.
|
|
239
|
+
// installed_plugins.json can be wiped by a Claude Code update, in which case we must
|
|
240
|
+
// reinstall even though the source content hasn't changed.
|
|
241
|
+
const installedPluginsPath = join(homedir(), '.claude', 'plugins', 'installed_plugins.json');
|
|
242
|
+
let isActuallyInstalled = false;
|
|
243
|
+
try {
|
|
244
|
+
const data = JSON.parse(readFileSync(installedPluginsPath, 'utf-8'));
|
|
245
|
+
const plugins = data.plugins ?? data;
|
|
246
|
+
isActuallyInstalled = !Array.isArray(plugins) && typeof plugins === 'object'
|
|
247
|
+
&& plugins !== null && `${pluginName}@specweave` in plugins;
|
|
248
|
+
}
|
|
249
|
+
catch { /* file missing — not installed */ }
|
|
250
|
+
if (isActuallyInstalled) {
|
|
251
|
+
return { success: true, sha, skipped: true };
|
|
252
|
+
}
|
|
253
|
+
// Plugin missing from installed_plugins.json — fall through to reinstall
|
|
226
254
|
}
|
|
227
|
-
// 4. Register marketplace with Claude CLI
|
|
228
|
-
execFileNoThrowSync('claude', ['plugin', 'marketplace', 'add', specweaveRoot], { timeout: 10000 });
|
|
229
255
|
// 5. Install via Claude Code's native plugin system (scope per plugin-scope config)
|
|
230
256
|
const scope = getPluginScope(pluginName, 'specweave');
|
|
231
257
|
const scopeArgs = getScopeArgs(scope);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-copier.js","sourceRoot":"","sources":["../../../src/utils/plugin-copier.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plugin-copier.js","sourceRoot":"","sources":["../../../src/utils/plugin-copier.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.442",
|
|
4
4
|
"description": "AI-assisted development, under control. Configure your standards once — spec-first, TDD, quality gates — and every AI interaction enforces them automatically. Works with Claude Code, Cursor, Copilot, Codex & more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"timestamp":"2026-01-04T16:11:43Z","event":"session_stop","reason":"No auto session active","details":"approve_called:main","success":false,"iteration":0,"increment":"none"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"timestamp":"2026-01-04T16:11:43Z","sessionId":"unknown","reason":"No auto session active","details":"approve_called:main","success":false,"iteration":0,"increment":"none","testsRun":false,"testsPassed":0,"testsFailed":0}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"ran": false,
|
|
3
|
-
"inputSummary": {
|
|
4
|
-
"transcriptLines": 266
|
|
5
|
-
},
|
|
6
|
-
"extracted": {
|
|
7
|
-
"skillLearnings": []
|
|
8
|
-
},
|
|
9
|
-
"written": {
|
|
10
|
-
"learningsAdded": 0,
|
|
11
|
-
"learningsSkippedDuplicate": 0
|
|
12
|
-
},
|
|
13
|
-
"durationMs": 1.4448749999999997,
|
|
14
|
-
"reason": "CLAUDE.md not found in project"
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[2026-02-03T22:03:06Z] APPROVE: No increments directory
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { AdoClientV2 } from "./ado-client-v2.js";
|
|
2
|
-
import { EnhancedContentBuilder } from "../../../src/core/sync/enhanced-content-builder.js";
|
|
3
|
-
import { SpecIncrementMapper } from "../../../src/core/sync/spec-increment-mapper.js";
|
|
4
|
-
import { parseSpecContent } from "../../../src/core/spec-content-sync.js";
|
|
5
|
-
import path from "path";
|
|
6
|
-
import fs from "fs/promises";
|
|
7
|
-
async function syncSpecToAdoWithEnhancedContent(options) {
|
|
8
|
-
const { specPath, organization, project, dryRun = false, verbose = false } = options;
|
|
9
|
-
try {
|
|
10
|
-
const baseSpec = await parseSpecContent(specPath);
|
|
11
|
-
if (!baseSpec) {
|
|
12
|
-
return {
|
|
13
|
-
success: false,
|
|
14
|
-
action: "error",
|
|
15
|
-
error: "Failed to parse spec content"
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
if (verbose) {
|
|
19
|
-
console.log(`\u{1F4C4} Parsed spec: ${baseSpec.identifier.compact}`);
|
|
20
|
-
}
|
|
21
|
-
const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
|
|
22
|
-
const rootDir = await findSpecWeaveRoot(specPath);
|
|
23
|
-
const mapper = new SpecIncrementMapper(rootDir);
|
|
24
|
-
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
25
|
-
if (verbose) {
|
|
26
|
-
console.log(`\u{1F517} Found ${mapping.increments.length} related increments`);
|
|
27
|
-
}
|
|
28
|
-
const taskMapping = buildTaskMapping(mapping.increments, organization, project);
|
|
29
|
-
const architectureDocs = await findArchitectureDocs(rootDir, specId);
|
|
30
|
-
const enhancedSpec = {
|
|
31
|
-
...baseSpec,
|
|
32
|
-
summary: baseSpec.description,
|
|
33
|
-
taskMapping,
|
|
34
|
-
architectureDocs
|
|
35
|
-
};
|
|
36
|
-
const builder = new EnhancedContentBuilder();
|
|
37
|
-
const description = builder.buildExternalDescription(enhancedSpec);
|
|
38
|
-
if (verbose) {
|
|
39
|
-
console.log(`\u{1F4DD} Generated description: ${description.length} characters`);
|
|
40
|
-
}
|
|
41
|
-
if (dryRun) {
|
|
42
|
-
console.log("\u{1F50D} DRY RUN - Would create/update feature with:");
|
|
43
|
-
console.log(` Title: ${baseSpec.title}`);
|
|
44
|
-
console.log(` Description length: ${description.length}`);
|
|
45
|
-
return {
|
|
46
|
-
success: true,
|
|
47
|
-
action: "no-change",
|
|
48
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
if (!organization || !project) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
action: "error",
|
|
55
|
-
error: "Azure DevOps organization/project not specified"
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const profile = {
|
|
59
|
-
provider: "ado",
|
|
60
|
-
displayName: `${organization}/${project}`,
|
|
61
|
-
config: {
|
|
62
|
-
organization,
|
|
63
|
-
project
|
|
64
|
-
},
|
|
65
|
-
timeRange: { default: "1M", max: "6M" }
|
|
66
|
-
};
|
|
67
|
-
const pat = process.env.AZURE_DEVOPS_PAT || "";
|
|
68
|
-
const client = new AdoClientV2(profile, pat);
|
|
69
|
-
const existingFeature = await findExistingFeature(client, baseSpec.identifier.compact);
|
|
70
|
-
let result;
|
|
71
|
-
if (existingFeature) {
|
|
72
|
-
await client.updateWorkItem(existingFeature.id, {
|
|
73
|
-
title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
|
|
74
|
-
description
|
|
75
|
-
});
|
|
76
|
-
result = {
|
|
77
|
-
success: true,
|
|
78
|
-
action: "updated",
|
|
79
|
-
featureId: existingFeature.id,
|
|
80
|
-
featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${existingFeature.id}`,
|
|
81
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
82
|
-
};
|
|
83
|
-
} else {
|
|
84
|
-
const feature = await client.createEpic({
|
|
85
|
-
title: `[${baseSpec.identifier.compact}] ${baseSpec.title}`,
|
|
86
|
-
description,
|
|
87
|
-
tags: ["spec", "external-tool-sync"]
|
|
88
|
-
});
|
|
89
|
-
result = {
|
|
90
|
-
success: true,
|
|
91
|
-
action: "created",
|
|
92
|
-
featureId: feature.id,
|
|
93
|
-
featureUrl: `https://dev.azure.com/${organization}/${project}/_workitems/edit/${feature.id}`,
|
|
94
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
if (verbose) {
|
|
98
|
-
console.log(`\u2705 ${result.action === "created" ? "Created" : "Updated"} feature #${result.featureId}`);
|
|
99
|
-
}
|
|
100
|
-
return result;
|
|
101
|
-
} catch (error) {
|
|
102
|
-
return {
|
|
103
|
-
success: false,
|
|
104
|
-
action: "error",
|
|
105
|
-
error: error.message
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
async function findSpecWeaveRoot(specPath) {
|
|
110
|
-
let currentDir = path.dirname(specPath);
|
|
111
|
-
while (true) {
|
|
112
|
-
const specweaveDir = path.join(currentDir, ".specweave");
|
|
113
|
-
try {
|
|
114
|
-
await fs.access(specweaveDir);
|
|
115
|
-
return currentDir;
|
|
116
|
-
} catch {
|
|
117
|
-
const parentDir = path.dirname(currentDir);
|
|
118
|
-
if (parentDir === currentDir) {
|
|
119
|
-
throw new Error(".specweave directory not found");
|
|
120
|
-
}
|
|
121
|
-
currentDir = parentDir;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
function buildTaskMapping(increments, organization, project) {
|
|
126
|
-
if (increments.length === 0) return void 0;
|
|
127
|
-
const firstIncrement = increments[0];
|
|
128
|
-
const tasks = firstIncrement.tasks.map((task) => ({
|
|
129
|
-
id: task.id,
|
|
130
|
-
title: task.title,
|
|
131
|
-
userStories: task.userStories
|
|
132
|
-
}));
|
|
133
|
-
// Derive repository name from git remote or fall back to project name
|
|
134
|
-
let repoName = project;
|
|
135
|
-
try {
|
|
136
|
-
const { execSync } = require("child_process");
|
|
137
|
-
const remoteUrl = execSync("git remote get-url origin", { encoding: "utf-8" }).trim();
|
|
138
|
-
const match = remoteUrl.match(/\/([^/]+?)(?:\.git)?$/);
|
|
139
|
-
if (match) repoName = match[1];
|
|
140
|
-
} catch {
|
|
141
|
-
// Fallback to project name if git is unavailable
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
incrementId: firstIncrement.id,
|
|
145
|
-
tasks,
|
|
146
|
-
tasksUrl: `https://dev.azure.com/${organization}/${project}/_git/${repoName}?path=/.specweave/increments/${firstIncrement.id}/tasks.md`
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
async function findArchitectureDocs(rootDir, specId) {
|
|
150
|
-
const docs = [];
|
|
151
|
-
const archDir = path.join(rootDir, ".specweave/docs/internal/architecture");
|
|
152
|
-
try {
|
|
153
|
-
const adrDir = path.join(archDir, "adr");
|
|
154
|
-
try {
|
|
155
|
-
const adrs = await fs.readdir(adrDir);
|
|
156
|
-
const relatedAdrs = adrs.filter((file) => file.includes(specId.replace("spec-", "")));
|
|
157
|
-
for (const adr of relatedAdrs) {
|
|
158
|
-
docs.push({
|
|
159
|
-
type: "adr",
|
|
160
|
-
path: path.join(adrDir, adr),
|
|
161
|
-
title: adr.replace(".md", "").replace(/-/g, " ")
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
} catch {
|
|
165
|
-
}
|
|
166
|
-
} catch {
|
|
167
|
-
}
|
|
168
|
-
return docs;
|
|
169
|
-
}
|
|
170
|
-
async function findExistingFeature(client, specId) {
|
|
171
|
-
try {
|
|
172
|
-
const features = await client.queryWorkItems(`[System.Title] Contains '[${specId}]' AND [System.WorkItemType] = 'Feature'`);
|
|
173
|
-
return features[0] || null;
|
|
174
|
-
} catch {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
export {
|
|
179
|
-
syncSpecToAdoWithEnhancedContent
|
|
180
|
-
};
|