@productbrain/cli 0.1.0-beta.26 → 0.1.0-beta.28
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/__tests__/capture.test.js +11 -3
- package/dist/__tests__/capture.test.js.map +1 -1
- package/dist/__tests__/relate.test.js +15 -0
- package/dist/__tests__/relate.test.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +42 -2
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/collections.d.ts +16 -0
- package/dist/commands/collections.d.ts.map +1 -0
- package/dist/commands/collections.js +59 -0
- package/dist/commands/collections.js.map +1 -0
- package/dist/commands/handshake.d.ts +2 -0
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +37 -1
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/orient.d.ts +1 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +10 -1
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +10 -3
- package/dist/commands/relate.js.map +1 -1
- package/dist/formatters/collections.d.ts +40 -0
- package/dist/formatters/collections.d.ts.map +1 -0
- package/dist/formatters/collections.js +93 -0
- package/dist/formatters/collections.js.map +1 -0
- package/dist/formatters/handshake.d.ts +5 -0
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +9 -0
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/relate.d.ts +2 -0
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +3 -0
- package/dist/formatters/relate.js.map +1 -1
- package/dist/generators/archetypes.d.ts +52 -0
- package/dist/generators/archetypes.d.ts.map +1 -0
- package/dist/generators/archetypes.js +153 -0
- package/dist/generators/archetypes.js.map +1 -0
- package/dist/generators/archetypes.test.d.ts +2 -0
- package/dist/generators/archetypes.test.d.ts.map +1 -0
- package/dist/generators/archetypes.test.js +237 -0
- package/dist/generators/archetypes.test.js.map +1 -0
- package/dist/generators/chain-classifier.d.ts +49 -0
- package/dist/generators/chain-classifier.d.ts.map +1 -0
- package/dist/generators/chain-classifier.js +180 -0
- package/dist/generators/chain-classifier.js.map +1 -0
- package/dist/generators/chain-classifier.test.d.ts +2 -0
- package/dist/generators/chain-classifier.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier.test.js +257 -0
- package/dist/generators/chain-classifier.test.js.map +1 -0
- package/dist/generators/chain-rules.d.ts +42 -0
- package/dist/generators/chain-rules.d.ts.map +1 -0
- package/dist/generators/chain-rules.js +144 -0
- package/dist/generators/chain-rules.js.map +1 -0
- package/dist/generators/chain-rules.test.d.ts +2 -0
- package/dist/generators/chain-rules.test.d.ts.map +1 -0
- package/dist/generators/chain-rules.test.js +179 -0
- package/dist/generators/chain-rules.test.js.map +1 -0
- package/dist/generators/handshake-diff.d.ts +67 -0
- package/dist/generators/handshake-diff.d.ts.map +1 -0
- package/dist/generators/handshake-diff.js +183 -0
- package/dist/generators/handshake-diff.js.map +1 -0
- package/dist/generators/handshake-diff.test.d.ts +2 -0
- package/dist/generators/handshake-diff.test.d.ts.map +1 -0
- package/dist/generators/handshake-diff.test.js +265 -0
- package/dist/generators/handshake-diff.test.js.map +1 -0
- package/dist/index.js +50 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/templates/archetypes/boundary.md +23 -0
- package/templates/archetypes/constraint.md +23 -0
- package/templates/archetypes/convention.md +23 -0
- package/templates/archetypes/policy.md +23 -0
- package/templates/archetypes/quality-gate.md +23 -0
- package/templates/archetypes/workflow.md +23 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.js +0 -89
- package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-rules.test.js","sourceRoot":"","sources":["../../src/generators/chain-rules.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handshake Diff — BET-286 Slice 4
|
|
3
|
+
*
|
|
4
|
+
* Persists handshake --generate state between runs and produces a diff
|
|
5
|
+
* showing what changed (added, removed, changed rules) since the last run.
|
|
6
|
+
*
|
|
7
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
8
|
+
*/
|
|
9
|
+
import type { CanonicalRule } from './portable-knowledge.js';
|
|
10
|
+
import type { ClassifiedGovernance } from './chain-classifier.js';
|
|
11
|
+
/** Persisted record of a single generated rule from a handshake --generate run. */
|
|
12
|
+
export interface HandshakeStateRule {
|
|
13
|
+
name: string;
|
|
14
|
+
/** Governance function key, e.g. 'constraint', 'boundary' */
|
|
15
|
+
functionKey: string;
|
|
16
|
+
/** Source path, always 'chain://<functionKey>' for generated rules */
|
|
17
|
+
sourcePath: string;
|
|
18
|
+
/** Classifier confidence for the winning function (averaged across contributing entries) */
|
|
19
|
+
confidence: number;
|
|
20
|
+
/** Entry IDs that contributed to this rule */
|
|
21
|
+
entryIds: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Persisted state written after each handshake --generate run. */
|
|
24
|
+
export interface HandshakeState {
|
|
25
|
+
timestamp: string;
|
|
26
|
+
rules: HandshakeStateRule[];
|
|
27
|
+
}
|
|
28
|
+
/** A single rule change detected by diffHandshakeState(). */
|
|
29
|
+
export interface RuleDiff {
|
|
30
|
+
name: string;
|
|
31
|
+
change: 'added' | 'removed' | 'changed';
|
|
32
|
+
/** Human-readable change detail, e.g. "confidence: 0.7 → 0.9" or "entries: +STD-22, -STD-7" */
|
|
33
|
+
details?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Full diff result comparing current state to previous state. */
|
|
36
|
+
export interface HandshakeDiff {
|
|
37
|
+
added: RuleDiff[];
|
|
38
|
+
removed: RuleDiff[];
|
|
39
|
+
changed: RuleDiff[];
|
|
40
|
+
isFirstRun: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Build a HandshakeState in memory from rules and classified entries.
|
|
44
|
+
* Only includes chain:// sourced rules (ignores manual rules).
|
|
45
|
+
* Filters out the sentinel rule (chain://_sentinel) to avoid diff noise.
|
|
46
|
+
*/
|
|
47
|
+
export declare function buildCurrentState(rules: CanonicalRule[], classified: ClassifiedGovernance[]): HandshakeState;
|
|
48
|
+
/**
|
|
49
|
+
* Save current handshake state to .productbrain/.handshake-state.json.
|
|
50
|
+
* Only persists chain:// sourced rules (ignores manual rules and sentinel).
|
|
51
|
+
*/
|
|
52
|
+
export declare function saveHandshakeState(pbDir: string, rules: CanonicalRule[], classified: ClassifiedGovernance[]): void;
|
|
53
|
+
/**
|
|
54
|
+
* Load previous handshake state from .productbrain/.handshake-state.json.
|
|
55
|
+
* Returns null if no previous state exists or the file cannot be parsed.
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadPreviousState(pbDir: string): HandshakeState | null;
|
|
58
|
+
/**
|
|
59
|
+
* Compare current rules against previous state and produce a diff.
|
|
60
|
+
* When previous is null, all current rules are reported as added (first run).
|
|
61
|
+
*/
|
|
62
|
+
export declare function diffHandshakeState(current: HandshakeState, previous: HandshakeState | null): HandshakeDiff;
|
|
63
|
+
/**
|
|
64
|
+
* Format a HandshakeDiff for console output.
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatDiff(diff: HandshakeDiff): string;
|
|
67
|
+
//# sourceMappingURL=handshake-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-diff.d.ts","sourceRoot":"","sources":["../../src/generators/handshake-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,mFAAmF;AACnF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAyCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EAAE,EACtB,UAAU,EAAE,oBAAoB,EAAE,GACjC,cAAc,CAShB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,aAAa,EAAE,EACtB,UAAU,EAAE,oBAAoB,EAAE,GACjC,IAAI,CAGN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAWtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,GAAG,IAAI,GAC9B,aAAa,CAuDf;AA+BD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA4BtD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handshake Diff — BET-286 Slice 4
|
|
3
|
+
*
|
|
4
|
+
* Persists handshake --generate state between runs and produces a diff
|
|
5
|
+
* showing what changed (added, removed, changed rules) since the last run.
|
|
6
|
+
*
|
|
7
|
+
* Chain: BET-286 (Chain-Derived Agent Configuration)
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
// ── State file path ────────────────────────────────────────────────────
|
|
12
|
+
const STATE_FILENAME = '.handshake-state.json';
|
|
13
|
+
function stateFilePath(pbDir) {
|
|
14
|
+
return join(pbDir, STATE_FILENAME);
|
|
15
|
+
}
|
|
16
|
+
// ── State builder ─────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Build a HandshakeStateRule from a CanonicalRule and classified governance entries.
|
|
19
|
+
* Only applies to chain:// sourced rules.
|
|
20
|
+
*/
|
|
21
|
+
function buildStateRule(rule, classified) {
|
|
22
|
+
// Extract function key from sourcePath ('chain://<functionKey>')
|
|
23
|
+
const functionKey = rule.sourcePath.replace('chain://', '');
|
|
24
|
+
// Find all entries that classified to this governance function
|
|
25
|
+
const matching = classified.filter((e) => e.governanceFunction === functionKey);
|
|
26
|
+
const entryIds = matching.map((e) => e.entryId);
|
|
27
|
+
// Average confidence across contributing entries (0 if none matched)
|
|
28
|
+
const confidence = matching.length > 0
|
|
29
|
+
? Math.round((matching.reduce((sum, e) => sum + e.confidence, 0) / matching.length) * 100) / 100
|
|
30
|
+
: 0;
|
|
31
|
+
return {
|
|
32
|
+
name: rule.name,
|
|
33
|
+
functionKey,
|
|
34
|
+
sourcePath: rule.sourcePath,
|
|
35
|
+
confidence,
|
|
36
|
+
entryIds,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// ── Public API ─────────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Build a HandshakeState in memory from rules and classified entries.
|
|
42
|
+
* Only includes chain:// sourced rules (ignores manual rules).
|
|
43
|
+
* Filters out the sentinel rule (chain://_sentinel) to avoid diff noise.
|
|
44
|
+
*/
|
|
45
|
+
export function buildCurrentState(rules, classified) {
|
|
46
|
+
const chainRules = rules.filter((r) => r.sourcePath.startsWith('chain://') && r.sourcePath !== 'chain://_sentinel');
|
|
47
|
+
return {
|
|
48
|
+
timestamp: new Date().toISOString(),
|
|
49
|
+
rules: chainRules.map((r) => buildStateRule(r, classified)),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Save current handshake state to .productbrain/.handshake-state.json.
|
|
54
|
+
* Only persists chain:// sourced rules (ignores manual rules and sentinel).
|
|
55
|
+
*/
|
|
56
|
+
export function saveHandshakeState(pbDir, rules, classified) {
|
|
57
|
+
const state = buildCurrentState(rules, classified);
|
|
58
|
+
writeFileSync(stateFilePath(pbDir), JSON.stringify(state, null, 2) + '\n');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load previous handshake state from .productbrain/.handshake-state.json.
|
|
62
|
+
* Returns null if no previous state exists or the file cannot be parsed.
|
|
63
|
+
*/
|
|
64
|
+
export function loadPreviousState(pbDir) {
|
|
65
|
+
const filePath = stateFilePath(pbDir);
|
|
66
|
+
if (!existsSync(filePath))
|
|
67
|
+
return null;
|
|
68
|
+
try {
|
|
69
|
+
const raw = readFileSync(filePath, 'utf8');
|
|
70
|
+
return JSON.parse(raw);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
process.stderr.write(`Warning: failed to parse ${filePath} — ${err instanceof Error ? err.message : err}\n`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Compare current rules against previous state and produce a diff.
|
|
79
|
+
* When previous is null, all current rules are reported as added (first run).
|
|
80
|
+
*/
|
|
81
|
+
export function diffHandshakeState(current, previous) {
|
|
82
|
+
if (previous === null) {
|
|
83
|
+
return {
|
|
84
|
+
added: current.rules.map((r) => ({
|
|
85
|
+
name: r.name,
|
|
86
|
+
change: 'added',
|
|
87
|
+
details: `confidence: ${r.confidence}, ${r.entryIds.length} entries`,
|
|
88
|
+
})),
|
|
89
|
+
removed: [],
|
|
90
|
+
changed: [],
|
|
91
|
+
isFirstRun: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const currentByName = new Map(current.rules.map((r) => [r.name, r]));
|
|
95
|
+
const previousByName = new Map(previous.rules.map((r) => [r.name, r]));
|
|
96
|
+
const added = [];
|
|
97
|
+
const removed = [];
|
|
98
|
+
const changed = [];
|
|
99
|
+
// Added: in current but not previous
|
|
100
|
+
for (const [name, rule] of currentByName) {
|
|
101
|
+
if (!previousByName.has(name)) {
|
|
102
|
+
added.push({
|
|
103
|
+
name,
|
|
104
|
+
change: 'added',
|
|
105
|
+
details: `confidence: ${rule.confidence}, ${rule.entryIds.length} entries`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Removed: in previous but not current
|
|
110
|
+
for (const [name] of previousByName) {
|
|
111
|
+
if (!currentByName.has(name)) {
|
|
112
|
+
removed.push({
|
|
113
|
+
name,
|
|
114
|
+
change: 'removed',
|
|
115
|
+
details: 'removed — no matching entries',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Changed: in both but different
|
|
120
|
+
for (const [name, curr] of currentByName) {
|
|
121
|
+
const prev = previousByName.get(name);
|
|
122
|
+
if (!prev)
|
|
123
|
+
continue; // handled as added above
|
|
124
|
+
const details = buildChangedDetails(prev, curr);
|
|
125
|
+
if (details !== null) {
|
|
126
|
+
changed.push({ name, change: 'changed', details });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { added, removed, changed, isFirstRun: false };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Build a details string for a changed rule. Returns null if no meaningful change detected.
|
|
133
|
+
*/
|
|
134
|
+
function buildChangedDetails(prev, curr) {
|
|
135
|
+
const parts = [];
|
|
136
|
+
// Confidence delta — only report if it changed
|
|
137
|
+
if (prev.confidence !== curr.confidence) {
|
|
138
|
+
parts.push(`confidence: ${prev.confidence} → ${curr.confidence}`);
|
|
139
|
+
}
|
|
140
|
+
// Entry changes — compute added/removed entry IDs
|
|
141
|
+
const prevSet = new Set(prev.entryIds);
|
|
142
|
+
const currSet = new Set(curr.entryIds);
|
|
143
|
+
const addedEntries = curr.entryIds.filter((id) => !prevSet.has(id));
|
|
144
|
+
const removedEntries = prev.entryIds.filter((id) => !currSet.has(id));
|
|
145
|
+
if (addedEntries.length > 0 || removedEntries.length > 0) {
|
|
146
|
+
const entryParts = [];
|
|
147
|
+
if (addedEntries.length > 0)
|
|
148
|
+
entryParts.push(...addedEntries.map((id) => `+${id}`));
|
|
149
|
+
if (removedEntries.length > 0)
|
|
150
|
+
entryParts.push(...removedEntries.map((id) => `-${id}`));
|
|
151
|
+
parts.push(`entries: ${entryParts.join(', ')}`);
|
|
152
|
+
}
|
|
153
|
+
if (parts.length === 0)
|
|
154
|
+
return null;
|
|
155
|
+
return parts.join(', ');
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Format a HandshakeDiff for console output.
|
|
159
|
+
*/
|
|
160
|
+
export function formatDiff(diff) {
|
|
161
|
+
if (diff.isFirstRun) {
|
|
162
|
+
return 'First run — no previous state to compare.';
|
|
163
|
+
}
|
|
164
|
+
const hasChanges = diff.added.length > 0 || diff.removed.length > 0 || diff.changed.length > 0;
|
|
165
|
+
if (!hasChanges) {
|
|
166
|
+
return 'No changes.';
|
|
167
|
+
}
|
|
168
|
+
const lines = ['Handshake diff (vs previous run):'];
|
|
169
|
+
for (const rule of diff.added) {
|
|
170
|
+
const detail = rule.details ? ` (${rule.details})` : '';
|
|
171
|
+
lines.push(` + ${rule.name}${detail}`);
|
|
172
|
+
}
|
|
173
|
+
for (const rule of diff.removed) {
|
|
174
|
+
const detail = rule.details ? ` (${rule.details})` : '';
|
|
175
|
+
lines.push(` - ${rule.name}${detail}`);
|
|
176
|
+
}
|
|
177
|
+
for (const rule of diff.changed) {
|
|
178
|
+
const detail = rule.details ? ` (${rule.details})` : '';
|
|
179
|
+
lines.push(` ~ ${rule.name}${detail}`);
|
|
180
|
+
}
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=handshake-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-diff.js","sourceRoot":"","sources":["../../src/generators/handshake-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-diff.test.d.ts","sourceRoot":"","sources":["../../src/generators/handshake-diff.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* handshake-diff — unit tests.
|
|
3
|
+
* BET-286 Slice 4: diff engine for handshake --generate runs.
|
|
4
|
+
*/
|
|
5
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { existsSync, mkdirSync, rmSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
import { saveHandshakeState, loadPreviousState, diffHandshakeState, formatDiff, } from './handshake-diff.js';
|
|
10
|
+
// ── Helpers ────────────────────────────────────────────────────────────
|
|
11
|
+
function makeTempDir() {
|
|
12
|
+
const dir = join(tmpdir(), `handshake-diff-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
13
|
+
mkdirSync(dir, { recursive: true });
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
function makeCanonicalRule(overrides) {
|
|
17
|
+
return {
|
|
18
|
+
description: 'A rule description',
|
|
19
|
+
body: 'Rule body content',
|
|
20
|
+
autoApply: true,
|
|
21
|
+
level: 'core',
|
|
22
|
+
scope: undefined,
|
|
23
|
+
targets: undefined,
|
|
24
|
+
...overrides,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function makeClassifiedEntry(overrides) {
|
|
28
|
+
return {
|
|
29
|
+
name: `Entry ${overrides.entryId}`,
|
|
30
|
+
collectionSlug: 'standards',
|
|
31
|
+
confidence: 0.65,
|
|
32
|
+
matchedSignals: ['collection \'standards\' → constraint'],
|
|
33
|
+
data: null,
|
|
34
|
+
relations: [],
|
|
35
|
+
...overrides,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function makeHandshakeState(rules, timestamp = '2024-01-01T00:00:00.000Z') {
|
|
39
|
+
return { timestamp, rules };
|
|
40
|
+
}
|
|
41
|
+
function makeStateRule(overrides) {
|
|
42
|
+
return {
|
|
43
|
+
functionKey: 'constraint',
|
|
44
|
+
sourcePath: 'chain://constraint',
|
|
45
|
+
confidence: 0.65,
|
|
46
|
+
entryIds: ['STD-1'],
|
|
47
|
+
...overrides,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Track temp dirs for cleanup
|
|
51
|
+
const tempDirs = [];
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
for (const dir of tempDirs) {
|
|
54
|
+
if (existsSync(dir))
|
|
55
|
+
rmSync(dir, { recursive: true, force: true });
|
|
56
|
+
}
|
|
57
|
+
tempDirs.length = 0;
|
|
58
|
+
});
|
|
59
|
+
// ── Tests ──────────────────────────────────────────────────────────────
|
|
60
|
+
describe('loadPreviousState', () => {
|
|
61
|
+
it('returns null when no state file exists', () => {
|
|
62
|
+
const dir = makeTempDir();
|
|
63
|
+
tempDirs.push(dir);
|
|
64
|
+
const result = loadPreviousState(dir);
|
|
65
|
+
expect(result).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
it('returns null when state file contains invalid JSON', () => {
|
|
68
|
+
const dir = makeTempDir();
|
|
69
|
+
tempDirs.push(dir);
|
|
70
|
+
const { writeFileSync } = require('fs');
|
|
71
|
+
writeFileSync(join(dir, '.handshake-state.json'), 'not valid json', 'utf8');
|
|
72
|
+
const result = loadPreviousState(dir);
|
|
73
|
+
expect(result).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('saveHandshakeState', () => {
|
|
77
|
+
it('creates a valid JSON state file', () => {
|
|
78
|
+
const dir = makeTempDir();
|
|
79
|
+
tempDirs.push(dir);
|
|
80
|
+
const rules = [
|
|
81
|
+
makeCanonicalRule({ name: 'chain-constraints', sourcePath: 'chain://constraint' }),
|
|
82
|
+
];
|
|
83
|
+
const classified = [
|
|
84
|
+
makeClassifiedEntry({ entryId: 'STD-1', governanceFunction: 'constraint', confidence: 0.65 }),
|
|
85
|
+
];
|
|
86
|
+
saveHandshakeState(dir, rules, classified);
|
|
87
|
+
const loaded = loadPreviousState(dir);
|
|
88
|
+
expect(loaded).not.toBeNull();
|
|
89
|
+
expect(loaded.rules).toHaveLength(1);
|
|
90
|
+
expect(loaded.rules[0].name).toBe('chain-constraints');
|
|
91
|
+
expect(loaded.rules[0].functionKey).toBe('constraint');
|
|
92
|
+
expect(loaded.rules[0].sourcePath).toBe('chain://constraint');
|
|
93
|
+
expect(loaded.rules[0].entryIds).toEqual(['STD-1']);
|
|
94
|
+
expect(loaded.rules[0].confidence).toBe(0.65);
|
|
95
|
+
expect(typeof loaded.timestamp).toBe('string');
|
|
96
|
+
});
|
|
97
|
+
it('only saves chain:// rules (ignores manual rules)', () => {
|
|
98
|
+
const dir = makeTempDir();
|
|
99
|
+
tempDirs.push(dir);
|
|
100
|
+
const rules = [
|
|
101
|
+
makeCanonicalRule({ name: 'chain-constraints', sourcePath: 'chain://constraint' }),
|
|
102
|
+
makeCanonicalRule({ name: 'my-manual-rule', sourcePath: '.productbrain/rules/my-manual-rule.md' }),
|
|
103
|
+
];
|
|
104
|
+
const classified = [];
|
|
105
|
+
saveHandshakeState(dir, rules, classified);
|
|
106
|
+
const loaded = loadPreviousState(dir);
|
|
107
|
+
expect(loaded.rules).toHaveLength(1);
|
|
108
|
+
expect(loaded.rules[0].name).toBe('chain-constraints');
|
|
109
|
+
});
|
|
110
|
+
it('averages confidence across multiple entries for the same function', () => {
|
|
111
|
+
const dir = makeTempDir();
|
|
112
|
+
tempDirs.push(dir);
|
|
113
|
+
const rules = [
|
|
114
|
+
makeCanonicalRule({ name: 'chain-constraints', sourcePath: 'chain://constraint' }),
|
|
115
|
+
];
|
|
116
|
+
const classified = [
|
|
117
|
+
makeClassifiedEntry({ entryId: 'STD-1', governanceFunction: 'constraint', confidence: 0.5 }),
|
|
118
|
+
makeClassifiedEntry({ entryId: 'STD-2', governanceFunction: 'constraint', confidence: 0.9 }),
|
|
119
|
+
];
|
|
120
|
+
saveHandshakeState(dir, rules, classified);
|
|
121
|
+
const loaded = loadPreviousState(dir);
|
|
122
|
+
expect(loaded.rules[0].confidence).toBe(0.7); // (0.5 + 0.9) / 2 = 0.7
|
|
123
|
+
expect(loaded.rules[0].entryIds).toContain('STD-1');
|
|
124
|
+
expect(loaded.rules[0].entryIds).toContain('STD-2');
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('diffHandshakeState', () => {
|
|
128
|
+
it('first run: isFirstRun is true, all current rules are added', () => {
|
|
129
|
+
const current = makeHandshakeState([
|
|
130
|
+
makeStateRule({ name: 'chain-constraints' }),
|
|
131
|
+
makeStateRule({ name: 'chain-boundary', functionKey: 'boundary', sourcePath: 'chain://boundary' }),
|
|
132
|
+
]);
|
|
133
|
+
const diff = diffHandshakeState(current, null);
|
|
134
|
+
expect(diff.isFirstRun).toBe(true);
|
|
135
|
+
expect(diff.added).toHaveLength(2);
|
|
136
|
+
expect(diff.removed).toHaveLength(0);
|
|
137
|
+
expect(diff.changed).toHaveLength(0);
|
|
138
|
+
expect(diff.added.map((r) => r.name)).toContain('chain-constraints');
|
|
139
|
+
expect(diff.added.map((r) => r.name)).toContain('chain-boundary');
|
|
140
|
+
});
|
|
141
|
+
it('no changes: added/removed/changed all empty', () => {
|
|
142
|
+
const rules = [makeStateRule({ name: 'chain-constraints', confidence: 0.65, entryIds: ['STD-1'] })];
|
|
143
|
+
const current = makeHandshakeState(rules);
|
|
144
|
+
const previous = makeHandshakeState(rules);
|
|
145
|
+
const diff = diffHandshakeState(current, previous);
|
|
146
|
+
expect(diff.isFirstRun).toBe(false);
|
|
147
|
+
expect(diff.added).toHaveLength(0);
|
|
148
|
+
expect(diff.removed).toHaveLength(0);
|
|
149
|
+
expect(diff.changed).toHaveLength(0);
|
|
150
|
+
});
|
|
151
|
+
it('added rule detected', () => {
|
|
152
|
+
const previous = makeHandshakeState([
|
|
153
|
+
makeStateRule({ name: 'chain-constraints' }),
|
|
154
|
+
]);
|
|
155
|
+
const current = makeHandshakeState([
|
|
156
|
+
makeStateRule({ name: 'chain-constraints' }),
|
|
157
|
+
makeStateRule({ name: 'chain-boundary', functionKey: 'boundary', sourcePath: 'chain://boundary', entryIds: ['ARCH-1'] }),
|
|
158
|
+
]);
|
|
159
|
+
const diff = diffHandshakeState(current, previous);
|
|
160
|
+
expect(diff.added).toHaveLength(1);
|
|
161
|
+
expect(diff.added[0].name).toBe('chain-boundary');
|
|
162
|
+
expect(diff.added[0].change).toBe('added');
|
|
163
|
+
expect(diff.removed).toHaveLength(0);
|
|
164
|
+
expect(diff.changed).toHaveLength(0);
|
|
165
|
+
});
|
|
166
|
+
it('removed rule detected', () => {
|
|
167
|
+
const previous = makeHandshakeState([
|
|
168
|
+
makeStateRule({ name: 'chain-constraints' }),
|
|
169
|
+
makeStateRule({ name: 'chain-workflow', functionKey: 'workflow', sourcePath: 'chain://workflow' }),
|
|
170
|
+
]);
|
|
171
|
+
const current = makeHandshakeState([
|
|
172
|
+
makeStateRule({ name: 'chain-constraints' }),
|
|
173
|
+
]);
|
|
174
|
+
const diff = diffHandshakeState(current, previous);
|
|
175
|
+
expect(diff.removed).toHaveLength(1);
|
|
176
|
+
expect(diff.removed[0].name).toBe('chain-workflow');
|
|
177
|
+
expect(diff.removed[0].change).toBe('removed');
|
|
178
|
+
expect(diff.added).toHaveLength(0);
|
|
179
|
+
expect(diff.changed).toHaveLength(0);
|
|
180
|
+
});
|
|
181
|
+
it('changed confidence detected with correct details string', () => {
|
|
182
|
+
const previous = makeHandshakeState([
|
|
183
|
+
makeStateRule({ name: 'chain-constraints', confidence: 0.5, entryIds: ['STD-1'] }),
|
|
184
|
+
]);
|
|
185
|
+
const current = makeHandshakeState([
|
|
186
|
+
makeStateRule({ name: 'chain-constraints', confidence: 0.9, entryIds: ['STD-1'] }),
|
|
187
|
+
]);
|
|
188
|
+
const diff = diffHandshakeState(current, previous);
|
|
189
|
+
expect(diff.changed).toHaveLength(1);
|
|
190
|
+
expect(diff.changed[0].name).toBe('chain-constraints');
|
|
191
|
+
expect(diff.changed[0].change).toBe('changed');
|
|
192
|
+
expect(diff.changed[0].details).toContain('confidence: 0.5 → 0.9');
|
|
193
|
+
expect(diff.added).toHaveLength(0);
|
|
194
|
+
expect(diff.removed).toHaveLength(0);
|
|
195
|
+
});
|
|
196
|
+
it('changed entries detected with +/- notation', () => {
|
|
197
|
+
const previous = makeHandshakeState([
|
|
198
|
+
makeStateRule({ name: 'chain-constraints', confidence: 0.65, entryIds: ['STD-1', 'STD-7'] }),
|
|
199
|
+
]);
|
|
200
|
+
const current = makeHandshakeState([
|
|
201
|
+
makeStateRule({ name: 'chain-constraints', confidence: 0.65, entryIds: ['STD-1', 'STD-22'] }),
|
|
202
|
+
]);
|
|
203
|
+
const diff = diffHandshakeState(current, previous);
|
|
204
|
+
expect(diff.changed).toHaveLength(1);
|
|
205
|
+
expect(diff.changed[0].details).toContain('+STD-22');
|
|
206
|
+
expect(diff.changed[0].details).toContain('-STD-7');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('formatDiff', () => {
|
|
210
|
+
it('outputs "First run" message when isFirstRun is true', () => {
|
|
211
|
+
const diff = { added: [], removed: [], changed: [], isFirstRun: true };
|
|
212
|
+
const output = formatDiff(diff);
|
|
213
|
+
expect(output).toBe('First run — no previous state to compare.');
|
|
214
|
+
});
|
|
215
|
+
it('outputs "No changes." when diff is empty', () => {
|
|
216
|
+
const diff = { added: [], removed: [], changed: [], isFirstRun: false };
|
|
217
|
+
const output = formatDiff(diff);
|
|
218
|
+
expect(output).toBe('No changes.');
|
|
219
|
+
});
|
|
220
|
+
it('formats added rules with + prefix', () => {
|
|
221
|
+
const diff = {
|
|
222
|
+
added: [{ name: 'chain-constraints', change: 'added', details: 'confidence: 0.65, 3 entries' }],
|
|
223
|
+
removed: [],
|
|
224
|
+
changed: [],
|
|
225
|
+
isFirstRun: false,
|
|
226
|
+
};
|
|
227
|
+
const output = formatDiff(diff);
|
|
228
|
+
expect(output).toContain('Handshake diff (vs previous run):');
|
|
229
|
+
expect(output).toContain(' + chain-constraints (confidence: 0.65, 3 entries)');
|
|
230
|
+
});
|
|
231
|
+
it('formats removed rules with - prefix', () => {
|
|
232
|
+
const diff = {
|
|
233
|
+
added: [],
|
|
234
|
+
removed: [{ name: 'chain-workflow', change: 'removed', details: 'removed — no matching entries' }],
|
|
235
|
+
changed: [],
|
|
236
|
+
isFirstRun: false,
|
|
237
|
+
};
|
|
238
|
+
const output = formatDiff(diff);
|
|
239
|
+
expect(output).toContain(' - chain-workflow (removed — no matching entries)');
|
|
240
|
+
});
|
|
241
|
+
it('formats changed rules with ~ prefix', () => {
|
|
242
|
+
const diff = {
|
|
243
|
+
added: [],
|
|
244
|
+
removed: [],
|
|
245
|
+
changed: [{ name: 'chain-boundary', change: 'changed', details: 'confidence: 0.50 → 0.70, entries: +ARCH-5' }],
|
|
246
|
+
isFirstRun: false,
|
|
247
|
+
};
|
|
248
|
+
const output = formatDiff(diff);
|
|
249
|
+
expect(output).toContain(' ~ chain-boundary (confidence: 0.50 → 0.70, entries: +ARCH-5)');
|
|
250
|
+
});
|
|
251
|
+
it('outputs readable console text with all change types', () => {
|
|
252
|
+
const diff = {
|
|
253
|
+
added: [{ name: 'chain-constraints', change: 'added', details: 'confidence: 0.65, 3 entries' }],
|
|
254
|
+
removed: [{ name: 'chain-workflow', change: 'removed', details: 'removed — no matching entries' }],
|
|
255
|
+
changed: [{ name: 'chain-boundary', change: 'changed', details: 'confidence: 0.50 → 0.70' }],
|
|
256
|
+
isFirstRun: false,
|
|
257
|
+
};
|
|
258
|
+
const output = formatDiff(diff);
|
|
259
|
+
expect(output).toContain('Handshake diff (vs previous run):');
|
|
260
|
+
expect(output).toContain(' + chain-constraints');
|
|
261
|
+
expect(output).toContain(' - chain-workflow');
|
|
262
|
+
expect(output).toContain(' ~ chain-boundary');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
//# sourceMappingURL=handshake-diff.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-diff.test.js","sourceRoot":"","sources":["../../src/generators/handshake-diff.test.ts"],"names":[],"mappings":"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"}
|