specweave 1.0.485 → 1.0.487
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/skill-gen/drift-detector.d.ts +5 -5
- package/dist/src/core/skill-gen/drift-detector.d.ts.map +1 -1
- package/dist/src/core/skill-gen/drift-detector.js +31 -34
- package/dist/src/core/skill-gen/drift-detector.js.map +1 -1
- package/dist/src/core/skill-gen/signal-collector.d.ts +11 -13
- package/dist/src/core/skill-gen/signal-collector.d.ts.map +1 -1
- package/dist/src/core/skill-gen/signal-collector.js +186 -132
- package/dist/src/core/skill-gen/signal-collector.js.map +1 -1
- package/dist/src/core/skill-gen/suggestion-engine.d.ts +0 -2
- package/dist/src/core/skill-gen/suggestion-engine.d.ts.map +1 -1
- package/dist/src/core/skill-gen/suggestion-engine.js +15 -22
- package/dist/src/core/skill-gen/suggestion-engine.js.map +1 -1
- package/dist/src/core/skill-gen/types.d.ts +23 -7
- package/dist/src/core/skill-gen/types.d.ts.map +1 -1
- package/dist/src/core/skill-gen/types.js.map +1 -1
- package/dist/src/core/skill-gen/utils.d.ts +73 -0
- package/dist/src/core/skill-gen/utils.d.ts.map +1 -0
- package/dist/src/core/skill-gen/utils.js +120 -0
- package/dist/src/core/skill-gen/utils.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/hooks.json +10 -10
- package/plugins/specweave/hooks/universal/run-hook.sh +20 -0
- package/plugins/specweave/skills/do/SKILL.md +2 -2
- package/plugins/specweave/skills/increment/SKILL.md +3 -3
- package/plugins/specweave/skills/team-build/SKILL.md +1 -1
- package/plugins/specweave/skills/team-lead/SKILL.md +1 -1
- package/plugins/specweave/skills/validate/SKILL.md +1 -1
- package/plugins/specweave-github/commands/clone.md +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-collector.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/signal-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"signal-collector.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/signal-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggestion-engine.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-gen/suggestion-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"suggestion-engine.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-gen/suggestion-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAkDjB,UAAU;CAuBzB"}
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module core/skill-gen/suggestion-engine
|
|
8
8
|
*/
|
|
9
|
-
import { readFile
|
|
9
|
+
import { readFile } from 'fs/promises';
|
|
10
10
|
import { join } from 'path';
|
|
11
11
|
import { SKILL_GEN_DEFAULTS } from './types.js';
|
|
12
|
+
import { loadSignalStore, saveSignalStore } from './utils.js';
|
|
12
13
|
export class SuggestionEngine {
|
|
13
14
|
constructor(projectRoot) {
|
|
14
15
|
this.projectRoot = projectRoot;
|
|
@@ -23,17 +24,21 @@ export class SuggestionEngine {
|
|
|
23
24
|
if (!config.suggest) {
|
|
24
25
|
return;
|
|
25
26
|
}
|
|
26
|
-
const
|
|
27
|
+
const signalsPath = join(this.projectRoot, '.specweave', 'state', 'skill-signals.json');
|
|
28
|
+
const store = await loadSignalStore(signalsPath);
|
|
27
29
|
if (!store) {
|
|
28
30
|
return;
|
|
29
31
|
}
|
|
30
32
|
const minCount = config.minSignalCount ?? SKILL_GEN_DEFAULTS.minSignalCount;
|
|
31
33
|
const declined = new Set(config.declinedSuggestions ?? SKILL_GEN_DEFAULTS.declinedSuggestions);
|
|
32
|
-
// Filter qualifying signals
|
|
33
|
-
const qualifying = store.signals.filter((s) =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
// Filter qualifying signals using file-based confidence
|
|
35
|
+
const qualifying = store.signals.filter((s) => {
|
|
36
|
+
const qualifyingCount = s.uniqueSourceFiles?.length ?? s.incrementIds.length;
|
|
37
|
+
return (qualifyingCount >= minCount &&
|
|
38
|
+
!s.declined &&
|
|
39
|
+
!s.generated &&
|
|
40
|
+
!declined.has(s.id));
|
|
41
|
+
});
|
|
37
42
|
if (qualifying.length === 0) {
|
|
38
43
|
return;
|
|
39
44
|
}
|
|
@@ -41,10 +46,11 @@ export class SuggestionEngine {
|
|
|
41
46
|
qualifying.sort((a, b) => b.confidence - a.confidence);
|
|
42
47
|
const top = qualifying[0];
|
|
43
48
|
// Print suggestion
|
|
44
|
-
|
|
49
|
+
const sourceCount = top.uniqueSourceFiles?.length ?? top.incrementIds.length;
|
|
50
|
+
console.log(`\u{1F4A1} Skill suggestion: Detected "${top.pattern}" pattern across ${sourceCount} sources. Run /sw:skill-gen to generate project skills.`);
|
|
45
51
|
// Mark as suggested and save
|
|
46
52
|
top.suggested = true;
|
|
47
|
-
await
|
|
53
|
+
await saveSignalStore(signalsPath, store);
|
|
48
54
|
}
|
|
49
55
|
catch (error) {
|
|
50
56
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -75,18 +81,5 @@ export class SuggestionEngine {
|
|
|
75
81
|
};
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
|
-
async loadStore() {
|
|
79
|
-
try {
|
|
80
|
-
const signalsPath = join(this.projectRoot, '.specweave', 'state', 'skill-signals.json');
|
|
81
|
-
return JSON.parse(await readFile(signalsPath, 'utf-8'));
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
async saveStore(store) {
|
|
88
|
-
const signalsPath = join(this.projectRoot, '.specweave', 'state', 'skill-signals.json');
|
|
89
|
-
await writeFile(signalsPath, JSON.stringify(store, null, 2));
|
|
90
|
-
}
|
|
91
84
|
}
|
|
92
85
|
//# sourceMappingURL=suggestion-engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggestion-engine.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/suggestion-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"suggestion-engine.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/suggestion-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,6 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module core/skill-gen/types
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
9
|
-
* Signal categories for pattern classification.
|
|
10
|
-
* Uses semantic slugs for deduplication — not exact library names.
|
|
11
|
-
*/
|
|
12
|
-
export type SignalCategory = 'error-handling' | 'naming-conventions' | 'architecture-patterns' | 'testing-patterns' | 'integration-patterns' | 'data-model' | 'api-patterns' | 'auth-patterns' | 'state-management' | 'build-deploy' | string;
|
|
13
8
|
/**
|
|
14
9
|
* A single detected pattern signal
|
|
15
10
|
*/
|
|
@@ -18,8 +13,8 @@ export interface SignalEntry {
|
|
|
18
13
|
id: string;
|
|
19
14
|
/** Short human-readable pattern name (e.g., "error-boundary-pattern") */
|
|
20
15
|
pattern: string;
|
|
21
|
-
/** Category slug for deduplication */
|
|
22
|
-
category:
|
|
16
|
+
/** Category slug for deduplication — dynamic string discovered by LLM */
|
|
17
|
+
category: string;
|
|
23
18
|
/** Human-readable description of the detected pattern */
|
|
24
19
|
description: string;
|
|
25
20
|
/** Increment IDs where this pattern was observed */
|
|
@@ -38,6 +33,27 @@ export interface SignalEntry {
|
|
|
38
33
|
declined: boolean;
|
|
39
34
|
/** Whether a skill has been generated from this signal */
|
|
40
35
|
generated: boolean;
|
|
36
|
+
/** Distinct source file paths where this pattern was detected */
|
|
37
|
+
uniqueSourceFiles?: string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Structured result from DriftDetector.check()
|
|
41
|
+
*/
|
|
42
|
+
export interface DriftResult {
|
|
43
|
+
skillFile: string;
|
|
44
|
+
staleRefs: string[];
|
|
45
|
+
validRefs: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Structured response schema for LLM-based pattern extraction
|
|
49
|
+
*/
|
|
50
|
+
export interface LLMPatternResponse {
|
|
51
|
+
patterns: Array<{
|
|
52
|
+
category: string;
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
evidence: string[];
|
|
56
|
+
}>;
|
|
41
57
|
}
|
|
42
58
|
/**
|
|
43
59
|
* Top-level structure of skill-signals.json
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-gen/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-gen/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAGhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;yBAIF,MAAM,EAAE;;CAEpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiEH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,SAAS,EAAE,UAAmB;IAC9B,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,CAAC;IACjB,mBAAmB,EAAE,EAAc;IACnC,UAAU,EAAE,GAAG;CAChB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for skill-gen modules.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from signal-collector.ts, drift-detector.ts, and suggestion-engine.ts
|
|
5
|
+
* to eliminate duplication. All public functions are error-isolated (catch + warn).
|
|
6
|
+
*
|
|
7
|
+
* @module core/skill-gen/utils
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import type { SignalStore } from './types.js';
|
|
11
|
+
export declare const TOKEN_BUDGET = 50000;
|
|
12
|
+
export declare const MAX_EVIDENCE = 20;
|
|
13
|
+
export declare const MAX_STRING_LENGTH = 200;
|
|
14
|
+
export declare const SignalEntrySchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
pattern: z.ZodString;
|
|
17
|
+
category: z.ZodString;
|
|
18
|
+
description: z.ZodString;
|
|
19
|
+
incrementIds: z.ZodArray<z.ZodString>;
|
|
20
|
+
firstSeen: z.ZodString;
|
|
21
|
+
lastSeen: z.ZodString;
|
|
22
|
+
confidence: z.ZodNumber;
|
|
23
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
24
|
+
suggested: z.ZodBoolean;
|
|
25
|
+
declined: z.ZodBoolean;
|
|
26
|
+
generated: z.ZodBoolean;
|
|
27
|
+
uniqueSourceFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
export declare const SignalStoreSchema: z.ZodObject<{
|
|
30
|
+
version: z.ZodString;
|
|
31
|
+
signals: z.ZodArray<z.ZodObject<{
|
|
32
|
+
id: z.ZodString;
|
|
33
|
+
pattern: z.ZodString;
|
|
34
|
+
category: z.ZodString;
|
|
35
|
+
description: z.ZodString;
|
|
36
|
+
incrementIds: z.ZodArray<z.ZodString>;
|
|
37
|
+
firstSeen: z.ZodString;
|
|
38
|
+
lastSeen: z.ZodString;
|
|
39
|
+
confidence: z.ZodNumber;
|
|
40
|
+
evidence: z.ZodArray<z.ZodString>;
|
|
41
|
+
suggested: z.ZodBoolean;
|
|
42
|
+
declined: z.ZodBoolean;
|
|
43
|
+
generated: z.ZodBoolean;
|
|
44
|
+
uniqueSourceFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
45
|
+
}, z.core.$strip>>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
/**
|
|
48
|
+
* Recursively collect markdown files from a directory.
|
|
49
|
+
* Returns empty array if directory doesn't exist or is unreadable.
|
|
50
|
+
*/
|
|
51
|
+
export declare function collectMarkdownFiles(dir: string): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Load signal store from disk with Zod validation and corruption recovery.
|
|
54
|
+
* Returns empty store on missing/corrupted/invalid files with a logged warning.
|
|
55
|
+
*/
|
|
56
|
+
export declare function loadSignalStore(filePath: string): Promise<SignalStore>;
|
|
57
|
+
/**
|
|
58
|
+
* Save signal store to disk, creating parent directories as needed.
|
|
59
|
+
*/
|
|
60
|
+
export declare function saveSignalStore(filePath: string, store: SignalStore): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Strip control characters and truncate to maxLength.
|
|
63
|
+
*/
|
|
64
|
+
export declare function sanitizeString(input: string, maxLength?: number): string;
|
|
65
|
+
/**
|
|
66
|
+
* Estimate token count using the rough heuristic: ceil(chars / 4).
|
|
67
|
+
*/
|
|
68
|
+
export declare function estimateTokenCount(text: string): number;
|
|
69
|
+
/**
|
|
70
|
+
* Cap evidence array at max entries using FIFO eviction (oldest removed first).
|
|
71
|
+
*/
|
|
72
|
+
export declare function capEvidence(evidence: string[], max?: number): string[];
|
|
73
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/skill-gen/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAIrC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAc5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;iBAG5B,CAAC;AAIH;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBzE;AAID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoB5E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAA0B,GAAG,MAAM,CAI3F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAqB,GAAG,MAAM,EAAE,CAKpF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for skill-gen modules.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from signal-collector.ts, drift-detector.ts, and suggestion-engine.ts
|
|
5
|
+
* to eliminate duplication. All public functions are error-isolated (catch + warn).
|
|
6
|
+
*
|
|
7
|
+
* @module core/skill-gen/utils
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, writeFile, readdir, mkdir, copyFile } from 'fs/promises';
|
|
10
|
+
import { join, dirname } from 'path';
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { EMPTY_SIGNAL_STORE } from './types.js';
|
|
13
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
14
|
+
export const TOKEN_BUDGET = 50000;
|
|
15
|
+
export const MAX_EVIDENCE = 20;
|
|
16
|
+
export const MAX_STRING_LENGTH = 200;
|
|
17
|
+
// ── Zod Schemas ──────────────────────────────────────────────────────
|
|
18
|
+
export const SignalEntrySchema = z.object({
|
|
19
|
+
id: z.string(),
|
|
20
|
+
pattern: z.string(),
|
|
21
|
+
category: z.string(),
|
|
22
|
+
description: z.string(),
|
|
23
|
+
incrementIds: z.array(z.string()),
|
|
24
|
+
firstSeen: z.string(),
|
|
25
|
+
lastSeen: z.string(),
|
|
26
|
+
confidence: z.number(),
|
|
27
|
+
evidence: z.array(z.string()),
|
|
28
|
+
suggested: z.boolean(),
|
|
29
|
+
declined: z.boolean(),
|
|
30
|
+
generated: z.boolean(),
|
|
31
|
+
uniqueSourceFiles: z.array(z.string()).optional(),
|
|
32
|
+
});
|
|
33
|
+
export const SignalStoreSchema = z.object({
|
|
34
|
+
version: z.string(),
|
|
35
|
+
signals: z.array(SignalEntrySchema),
|
|
36
|
+
});
|
|
37
|
+
// ── File collection ──────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Recursively collect markdown files from a directory.
|
|
40
|
+
* Returns empty array if directory doesn't exist or is unreadable.
|
|
41
|
+
*/
|
|
42
|
+
export async function collectMarkdownFiles(dir) {
|
|
43
|
+
const results = [];
|
|
44
|
+
try {
|
|
45
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
const fullPath = join(dir, entry.name);
|
|
48
|
+
if (entry.isDirectory()) {
|
|
49
|
+
results.push(...(await collectMarkdownFiles(fullPath)));
|
|
50
|
+
}
|
|
51
|
+
else if (entry.name.endsWith('.md')) {
|
|
52
|
+
results.push(fullPath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Directory doesn't exist or is unreadable
|
|
58
|
+
}
|
|
59
|
+
return results;
|
|
60
|
+
}
|
|
61
|
+
// ── Store I/O ────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Load signal store from disk with Zod validation and corruption recovery.
|
|
64
|
+
* Returns empty store on missing/corrupted/invalid files with a logged warning.
|
|
65
|
+
*/
|
|
66
|
+
export async function loadSignalStore(filePath) {
|
|
67
|
+
try {
|
|
68
|
+
const content = await readFile(filePath, 'utf-8');
|
|
69
|
+
const parsed = JSON.parse(content);
|
|
70
|
+
const validated = SignalStoreSchema.parse(parsed);
|
|
71
|
+
return validated;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error?.code === 'ENOENT') {
|
|
75
|
+
return { ...EMPTY_SIGNAL_STORE, signals: [] };
|
|
76
|
+
}
|
|
77
|
+
// Corrupted or invalid — backup and start fresh
|
|
78
|
+
try {
|
|
79
|
+
await copyFile(filePath, filePath + '.bak');
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// backup failed, continue anyway
|
|
83
|
+
}
|
|
84
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
85
|
+
console.warn(`[skill-gen/utils] Invalid signal store, starting fresh: ${msg}`);
|
|
86
|
+
return { ...EMPTY_SIGNAL_STORE, signals: [] };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Save signal store to disk, creating parent directories as needed.
|
|
91
|
+
*/
|
|
92
|
+
export async function saveSignalStore(filePath, store) {
|
|
93
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
94
|
+
await writeFile(filePath, JSON.stringify(store, null, 2));
|
|
95
|
+
}
|
|
96
|
+
// ── String utilities ─────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Strip control characters and truncate to maxLength.
|
|
99
|
+
*/
|
|
100
|
+
export function sanitizeString(input, maxLength = MAX_STRING_LENGTH) {
|
|
101
|
+
// eslint-disable-next-line no-control-regex
|
|
102
|
+
const cleaned = input.replace(/[\x00-\x1F\x7F]/g, '');
|
|
103
|
+
return cleaned.slice(0, maxLength);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Estimate token count using the rough heuristic: ceil(chars / 4).
|
|
107
|
+
*/
|
|
108
|
+
export function estimateTokenCount(text) {
|
|
109
|
+
return Math.ceil(text.length / 4);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Cap evidence array at max entries using FIFO eviction (oldest removed first).
|
|
113
|
+
*/
|
|
114
|
+
export function capEvidence(evidence, max = MAX_EVIDENCE) {
|
|
115
|
+
if (evidence.length <= max) {
|
|
116
|
+
return evidence;
|
|
117
|
+
}
|
|
118
|
+
return evidence.slice(evidence.length - max);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/skill-gen/utils.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.487",
|
|
4
4
|
"description": "100+ domain-expert AI skills — PM, Architect, Frontend, QA, Security and more. Skills learn your team's patterns permanently. Spec-first planning, autonomous execution, multi-agent teams, synced to GitHub/JIRA. Claude Code, Cursor, Copilot & more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "bash
|
|
9
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" v2/dispatchers/pre-tool-use"
|
|
10
10
|
}
|
|
11
11
|
]
|
|
12
12
|
},
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hooks": [
|
|
16
16
|
{
|
|
17
17
|
"type": "command",
|
|
18
|
-
"command": "bash
|
|
18
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" v2/guards/increment-existence-guard"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hooks": [
|
|
26
26
|
{
|
|
27
27
|
"type": "command",
|
|
28
|
-
"command": "bash
|
|
28
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" v2/dispatchers/session-start continue"
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"hooks": [
|
|
36
36
|
{
|
|
37
37
|
"type": "command",
|
|
38
|
-
"command": "bash
|
|
38
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" user-prompt-submit approve"
|
|
39
39
|
}
|
|
40
40
|
]
|
|
41
41
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"hooks": [
|
|
46
46
|
{
|
|
47
47
|
"type": "command",
|
|
48
|
-
"command": "bash
|
|
48
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" pre-compact continue"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"hooks": [
|
|
58
58
|
{
|
|
59
59
|
"type": "command",
|
|
60
|
-
"command": "bash
|
|
60
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" v2/dispatchers/post-tool-use continue"
|
|
61
61
|
}
|
|
62
62
|
]
|
|
63
63
|
},
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"hooks": [
|
|
67
67
|
{
|
|
68
68
|
"type": "command",
|
|
69
|
-
"command": "bash
|
|
69
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" v2/dispatchers/post-tool-use-analytics continue"
|
|
70
70
|
}
|
|
71
71
|
]
|
|
72
72
|
}
|
|
@@ -76,17 +76,17 @@
|
|
|
76
76
|
"hooks": [
|
|
77
77
|
{
|
|
78
78
|
"type": "command",
|
|
79
|
-
"command": "bash
|
|
79
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" stop-reflect approve",
|
|
80
80
|
"timeout": 15000
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"type": "command",
|
|
84
|
-
"command": "bash
|
|
84
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" stop-auto-v5 approve",
|
|
85
85
|
"timeout": 15000
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"type": "command",
|
|
89
|
-
"command": "bash
|
|
89
|
+
"command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh\" stop-sync approve",
|
|
90
90
|
"timeout": 15000
|
|
91
91
|
}
|
|
92
92
|
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# run-hook.sh - Run a hook script through fail-fast-wrapper
|
|
3
|
+
# Usage: run-hook.sh <hook-path> [fallback: allow|approve|continue]
|
|
4
|
+
#
|
|
5
|
+
# hook-path: relative to $CLAUDE_PLUGIN_ROOT/hooks/ (without .sh)
|
|
6
|
+
# fallback: safe JSON response when wrapper is missing (default: allow)
|
|
7
|
+
|
|
8
|
+
HOOK_REL="$1"
|
|
9
|
+
FALLBACK="${2:-allow}"
|
|
10
|
+
ROOT="${CLAUDE_PLUGIN_ROOT}"
|
|
11
|
+
WRAPPER="$ROOT/hooks/universal/fail-fast-wrapper.sh"
|
|
12
|
+
HOOK="$ROOT/hooks/${HOOK_REL}.sh"
|
|
13
|
+
|
|
14
|
+
[[ -x "$WRAPPER" ]] && exec "$WRAPPER" "$HOOK"
|
|
15
|
+
cat >/dev/null
|
|
16
|
+
case "$FALLBACK" in
|
|
17
|
+
approve) printf '{"decision":"approve"}' ;;
|
|
18
|
+
continue) printf '{"continue":true}' ;;
|
|
19
|
+
*) printf '{"decision":"allow"}' ;;
|
|
20
|
+
esac
|
|
@@ -6,11 +6,11 @@ hooks:
|
|
|
6
6
|
- matcher: Edit
|
|
7
7
|
hooks:
|
|
8
8
|
- type: command
|
|
9
|
-
command: bash
|
|
9
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/task-ac-sync-guard
|
|
10
10
|
- matcher: Write
|
|
11
11
|
hooks:
|
|
12
12
|
- type: command
|
|
13
|
-
command: bash
|
|
13
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/task-ac-sync-guard
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
# Do Increment
|
|
@@ -7,14 +7,14 @@ hooks:
|
|
|
7
7
|
- matcher: Write
|
|
8
8
|
hooks:
|
|
9
9
|
- type: command
|
|
10
|
-
command: bash
|
|
10
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/interview-enforcement-guard
|
|
11
11
|
- type: command
|
|
12
|
-
command: bash
|
|
12
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/spec-template-enforcement-guard
|
|
13
13
|
PostToolUse:
|
|
14
14
|
- matcher: Write
|
|
15
15
|
hooks:
|
|
16
16
|
- type: command
|
|
17
|
-
command: bash
|
|
17
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/increment-duplicate-guard
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
# Plan Product Increment
|
|
@@ -5,7 +5,7 @@ hooks:
|
|
|
5
5
|
- matcher: TeamCreate
|
|
6
6
|
hooks:
|
|
7
7
|
- type: command
|
|
8
|
-
command: bash
|
|
8
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/increment-existence-guard
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Team Build
|
|
@@ -5,7 +5,7 @@ hooks:
|
|
|
5
5
|
- matcher: TeamCreate
|
|
6
6
|
hooks:
|
|
7
7
|
- type: command
|
|
8
|
-
command: bash
|
|
8
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/increment-existence-guard
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Team Lead
|
|
@@ -5,7 +5,7 @@ hooks:
|
|
|
5
5
|
Stop:
|
|
6
6
|
- hooks:
|
|
7
7
|
- type: command
|
|
8
|
-
command: bash
|
|
8
|
+
command: bash "${CLAUDE_PLUGIN_ROOT}/hooks/universal/run-hook.sh" v2/guards/spec-validation-guard approve
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Validate Increment
|