@yourtechtribe-labs/koncept-core 0.2.0-alpha.2 → 0.2.0-alpha.4
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/affected.d.ts +10 -16
- package/dist/affected.d.ts.map +1 -1
- package/dist/affected.js +12 -27
- package/dist/affected.js.map +1 -1
- package/dist/checker.d.ts +12 -2
- package/dist/checker.d.ts.map +1 -1
- package/dist/checker.js +114 -1
- package/dist/checker.js.map +1 -1
- package/dist/classify.d.ts +35 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +50 -0
- package/dist/classify.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/load-concepts.d.ts +19 -0
- package/dist/load-concepts.d.ts.map +1 -0
- package/dist/load-concepts.js +34 -0
- package/dist/load-concepts.js.map +1 -0
- package/dist/review.d.ts +56 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +128 -0
- package/dist/review.js.map +1 -0
- package/dist/schema.d.ts +111 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +35 -1
- package/dist/schema.js.map +1 -1
- package/package.json +2 -2
package/dist/affected.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* on `core.ignorecase=true` may surface either case). Matching is exact after
|
|
8
8
|
* normalization — no glob, no prefix.
|
|
9
9
|
*/
|
|
10
|
+
import { type AffectedSummary, type InvariantClass } from './classify.js';
|
|
10
11
|
import type { AutomatedCheck, Concept, ConceptType, Role, Severity } from './schema.js';
|
|
11
12
|
export type MatchedRole = Role | 'source_of_truth';
|
|
12
13
|
export interface AffectedInvariant {
|
|
@@ -16,6 +17,9 @@ export interface AffectedInvariant {
|
|
|
16
17
|
description: string;
|
|
17
18
|
severity: Severity;
|
|
18
19
|
check: AutomatedCheck;
|
|
20
|
+
klass: InvariantClass;
|
|
21
|
+
/** Only populated in ack-mode (acks passed to computeAffected); advisory only. */
|
|
22
|
+
acknowledged?: boolean;
|
|
19
23
|
}
|
|
20
24
|
export interface AffectedConcept {
|
|
21
25
|
id: string;
|
|
@@ -33,6 +37,7 @@ export interface AffectedReport {
|
|
|
33
37
|
changed_files: string[];
|
|
34
38
|
concepts: AffectedConcept[];
|
|
35
39
|
unmatched_files: string[];
|
|
40
|
+
summary: AffectedSummary;
|
|
36
41
|
}
|
|
37
42
|
/**
|
|
38
43
|
* Extracts the bare ids from `related_concepts`, normalizing the union
|
|
@@ -42,21 +47,10 @@ export interface AffectedReport {
|
|
|
42
47
|
export declare function resolveRelatedIds(concept: Concept): string[];
|
|
43
48
|
/**
|
|
44
49
|
* Pure computation: which concepts are touched by `changedFiles`?
|
|
50
|
+
*
|
|
51
|
+
* `acks` (optional) turns on ack-mode: when provided (even empty), each
|
|
52
|
+
* advisory invariant gets an `acknowledged` flag and the summary reports
|
|
53
|
+
* `unacknowledged_high`. Omitted → ack-mode off (MCP enumeration path).
|
|
45
54
|
*/
|
|
46
|
-
export declare function computeAffected(concepts: Concept[], changedFiles: string[]): AffectedReport;
|
|
47
|
-
/**
|
|
48
|
-
* Convenience loader: parse every YAML under `.koncept/concepts/` and return
|
|
49
|
-
* the valid Concept[] plus any parse errors. CLI/MCP server uses this when
|
|
50
|
-
* they don't already have a parsed list (otherwise call `computeAffected`
|
|
51
|
-
* directly with the concepts they hold).
|
|
52
|
-
*/
|
|
53
|
-
export interface LoadConceptsResult {
|
|
54
|
-
concepts: Concept[];
|
|
55
|
-
parseErrors: Array<{
|
|
56
|
-
filePath: string;
|
|
57
|
-
message: string;
|
|
58
|
-
field?: string;
|
|
59
|
-
}>;
|
|
60
|
-
}
|
|
61
|
-
export declare function loadConcepts(rootDir: string): Promise<LoadConceptsResult>;
|
|
55
|
+
export declare function computeAffected(concepts: Concept[], changedFiles: string[], acks?: ReadonlySet<string>): AffectedReport;
|
|
62
56
|
//# sourceMappingURL=affected.d.ts.map
|
package/dist/affected.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affected.d.ts","sourceRoot":"","sources":["../src/affected.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"affected.d.ts","sourceRoot":"","sources":["../src/affected.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,WAAW,EACX,IAAI,EACJ,QAAQ,EACT,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,iBAAiB,CAAA;AAElD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,cAAc,CAAA;IACrB,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IACzD,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,YAAY,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,eAAe,CAAA;CACzB;AAQD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,cAAc,CAqBhB"}
|
package/dist/affected.js
CHANGED
|
@@ -7,8 +7,7 @@
|
|
|
7
7
|
* on `core.ignorecase=true` may surface either case). Matching is exact after
|
|
8
8
|
* normalization — no glob, no prefix.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
11
|
-
import { parseConceptFile } from './parser.js';
|
|
10
|
+
import { annotateAcks, classifyCheck, computeSummary, } from './classify.js';
|
|
12
11
|
import { normalizeForward } from './paths.js';
|
|
13
12
|
const SEVERITY_RANK = { high: 3, medium: 2, low: 1 };
|
|
14
13
|
function normalizeKey(p) {
|
|
@@ -24,20 +23,28 @@ export function resolveRelatedIds(concept) {
|
|
|
24
23
|
}
|
|
25
24
|
/**
|
|
26
25
|
* Pure computation: which concepts are touched by `changedFiles`?
|
|
26
|
+
*
|
|
27
|
+
* `acks` (optional) turns on ack-mode: when provided (even empty), each
|
|
28
|
+
* advisory invariant gets an `acknowledged` flag and the summary reports
|
|
29
|
+
* `unacknowledged_high`. Omitted → ack-mode off (MCP enumeration path).
|
|
27
30
|
*/
|
|
28
|
-
export function computeAffected(concepts, changedFiles) {
|
|
31
|
+
export function computeAffected(concepts, changedFiles, acks) {
|
|
29
32
|
const normalizedChanged = changedFiles.map(normalizeKey);
|
|
30
33
|
const fileToConcepts = buildFileIndex(concepts);
|
|
31
34
|
const { matched, matchedKeys } = matchChangedFiles(fileToConcepts, changedFiles, normalizedChanged);
|
|
32
35
|
for (const affected of matched.values()) {
|
|
33
36
|
const concept = concepts.find((c) => c.id === affected.id);
|
|
34
37
|
affected.other_participants = computeOtherParticipants(concept, affected);
|
|
38
|
+
if (acks !== undefined)
|
|
39
|
+
annotateAcks(affected, acks);
|
|
35
40
|
}
|
|
36
41
|
const unmatched = changedFiles.filter((_, i) => !matchedKeys.has(normalizedChanged[i]));
|
|
42
|
+
const concepts_ = [...matched.values()].sort(byMaxSeverityThenId);
|
|
37
43
|
return {
|
|
38
44
|
changed_files: changedFiles.map(normalizeForward),
|
|
39
|
-
concepts:
|
|
45
|
+
concepts: concepts_,
|
|
40
46
|
unmatched_files: unmatched.map(normalizeForward),
|
|
47
|
+
summary: computeSummary(concepts_, acks !== undefined),
|
|
41
48
|
};
|
|
42
49
|
}
|
|
43
50
|
function buildFileIndex(concepts) {
|
|
@@ -88,6 +95,7 @@ function makeAffected(concept) {
|
|
|
88
95
|
description: inv.description,
|
|
89
96
|
severity: inv.severity,
|
|
90
97
|
check: inv.check,
|
|
98
|
+
klass: classifyCheck(inv.check),
|
|
91
99
|
}));
|
|
92
100
|
invariants.sort((a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity]);
|
|
93
101
|
const maxSev = invariants.length > 0 ? invariants[0].severity : null;
|
|
@@ -108,27 +116,4 @@ function byMaxSeverityThenId(a, b) {
|
|
|
108
116
|
return bv - av;
|
|
109
117
|
return a.id.localeCompare(b.id);
|
|
110
118
|
}
|
|
111
|
-
const CONCEPTS_GLOB = '.koncept/concepts/*.yaml';
|
|
112
|
-
export async function loadConcepts(rootDir) {
|
|
113
|
-
const files = await glob(CONCEPTS_GLOB, {
|
|
114
|
-
cwd: rootDir,
|
|
115
|
-
absolute: true,
|
|
116
|
-
nodir: true,
|
|
117
|
-
posix: true,
|
|
118
|
-
});
|
|
119
|
-
const parsed = await Promise.all(files.map((f) => parseConceptFile(f)));
|
|
120
|
-
const concepts = [];
|
|
121
|
-
const parseErrors = [];
|
|
122
|
-
for (const r of parsed) {
|
|
123
|
-
if (r.concept !== null) {
|
|
124
|
-
concepts.push(r.concept);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
for (const e of r.errors) {
|
|
128
|
-
parseErrors.push({ filePath: r.filePath, message: e.message, field: e.field });
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return { concepts, parseErrors };
|
|
133
|
-
}
|
|
134
119
|
//# sourceMappingURL=affected.js.map
|
package/dist/affected.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affected.js","sourceRoot":"","sources":["../src/affected.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"affected.js","sourceRoot":"","sources":["../src/affected.ts"],"names":[],"mappings":"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"}
|
package/dist/checker.d.ts
CHANGED
|
@@ -6,18 +6,28 @@
|
|
|
6
6
|
* to .koncept/ (D-002 invariant preserved).
|
|
7
7
|
*/
|
|
8
8
|
export interface CheckOptions {
|
|
9
|
-
/** Repo root — used to locate .koncept/concepts/ AND resolve grep
|
|
9
|
+
/** Repo root — used to locate .koncept/concepts/ AND resolve participant/grep paths. */
|
|
10
10
|
cwd: string;
|
|
11
11
|
/** If set, only check invariants belonging to this concept id. */
|
|
12
12
|
filterId?: string;
|
|
13
|
+
/**
|
|
14
|
+
* If true, `kind: command` invariants are skipped (status 'skip') instead of
|
|
15
|
+
* executed. The static kinds (grep, implication, symbol_present, forbidden)
|
|
16
|
+
* still run. Used by `koncepto verify` so the default gate stays hook-safe
|
|
17
|
+
* (no arbitrary shell). Default false — `koncepto check` runs everything.
|
|
18
|
+
*/
|
|
19
|
+
staticOnly?: boolean;
|
|
13
20
|
}
|
|
14
21
|
export type CheckStatus = 'pass' | 'fail' | 'skip' | 'error';
|
|
22
|
+
export type CheckKind = 'none' | 'grep' | 'command' | 'implication' | 'symbol_present' | 'forbidden';
|
|
15
23
|
export interface InvariantCheckResult {
|
|
16
24
|
conceptId: string;
|
|
17
25
|
invariantId: string;
|
|
18
|
-
kind:
|
|
26
|
+
kind: CheckKind;
|
|
19
27
|
status: CheckStatus;
|
|
20
28
|
detail?: string;
|
|
29
|
+
/** The invariant description — surfaced as a remediation hint in verify output. */
|
|
30
|
+
description?: string;
|
|
21
31
|
}
|
|
22
32
|
export interface CheckResult {
|
|
23
33
|
results: InvariantCheckResult[];
|
package/dist/checker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,WAAW,YAAY;IAC3B,wFAAwF;IACxF,GAAG,EAAE,MAAM,CAAA;IACX,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE5D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,gBAAgB,GAAG,WAAW,CAAA;AAEpG,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,WAAW,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,oBAAoB,EAAE,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAA;CACf;AAID,wBAAsB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAgExE"}
|
package/dist/checker.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { readFileSync } from 'node:fs';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { spawnSync } from 'node:child_process';
|
|
11
|
-
import { loadConcepts } from './
|
|
11
|
+
import { loadConcepts } from './load-concepts.js';
|
|
12
12
|
// ─── Main entry point ─────────────────────────────────────────────────────────
|
|
13
13
|
export async function runChecks(opts) {
|
|
14
14
|
const loaded = await loadConcepts(opts.cwd);
|
|
@@ -45,9 +45,24 @@ export async function runChecks(opts) {
|
|
|
45
45
|
else if (check.kind === 'grep') {
|
|
46
46
|
result = executeGrep(concept.id, inv.id, check.pattern, check.in, check.should_match, opts.cwd);
|
|
47
47
|
}
|
|
48
|
+
else if (check.kind === 'implication') {
|
|
49
|
+
result = executeImplication(concept, inv.id, check.over, check.if, check.then, opts.cwd);
|
|
50
|
+
}
|
|
51
|
+
else if (check.kind === 'symbol_present') {
|
|
52
|
+
result = executePresence(concept, inv.id, 'symbol_present', check.over, check.pattern, opts.cwd);
|
|
53
|
+
}
|
|
54
|
+
else if (check.kind === 'forbidden') {
|
|
55
|
+
result = executePresence(concept, inv.id, 'forbidden', check.over, check.pattern, opts.cwd);
|
|
56
|
+
}
|
|
57
|
+
else if (opts.staticOnly === true) {
|
|
58
|
+
// kind: command — never run by the static gate (verify). Skip, don't execute.
|
|
59
|
+
result = { conceptId: concept.id, invariantId: inv.id, kind: 'command', status: 'skip' };
|
|
60
|
+
}
|
|
48
61
|
else {
|
|
49
62
|
result = executeCommand(concept.id, inv.id, check.cmd, opts.cwd);
|
|
50
63
|
}
|
|
64
|
+
// Surface the invariant description as a remediation hint on every result.
|
|
65
|
+
result.description = inv.description;
|
|
51
66
|
results.push(result);
|
|
52
67
|
}
|
|
53
68
|
}
|
|
@@ -124,6 +139,104 @@ function executeCommand(conceptId, invariantId, cmd, cwd) {
|
|
|
124
139
|
const detail = raw.length > 500 ? raw.slice(0, 500) + '…' : raw;
|
|
125
140
|
return { conceptId, invariantId, kind: 'command', status: 'fail', detail };
|
|
126
141
|
}
|
|
142
|
+
// ─── #36 static enforcement helpers ─────────────────────────────────────────
|
|
143
|
+
/** Filter a concept's declared participants by an optional `over` selector.
|
|
144
|
+
* No filesystem glob — pure filter over the known list (cheap, hook-safe). */
|
|
145
|
+
function selectParticipants(concept, over) {
|
|
146
|
+
if (over?.role === undefined)
|
|
147
|
+
return concept.participants;
|
|
148
|
+
return concept.participants.filter((p) => p.role === over.role);
|
|
149
|
+
}
|
|
150
|
+
/** Compile a RegExp source; returns null on invalid pattern. */
|
|
151
|
+
function compileRegex(src) {
|
|
152
|
+
try {
|
|
153
|
+
return new RegExp(src);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Reads each selected participant. Returns either the [file, content] pairs or
|
|
160
|
+
* an early error result (empty selection, missing file). */
|
|
161
|
+
function readSelected(concept, invariantId, kind, over, cwd) {
|
|
162
|
+
const selected = selectParticipants(concept, over);
|
|
163
|
+
if (selected.length === 0) {
|
|
164
|
+
return {
|
|
165
|
+
error: {
|
|
166
|
+
conceptId: concept.id,
|
|
167
|
+
invariantId,
|
|
168
|
+
kind,
|
|
169
|
+
status: 'error',
|
|
170
|
+
detail: 'no participants match selector',
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const files = [];
|
|
175
|
+
for (const p of selected) {
|
|
176
|
+
try {
|
|
177
|
+
files.push([p.file, readFileSync(join(cwd, p.file), 'utf-8')]);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return {
|
|
181
|
+
error: {
|
|
182
|
+
conceptId: concept.id,
|
|
183
|
+
invariantId,
|
|
184
|
+
kind,
|
|
185
|
+
status: 'error',
|
|
186
|
+
detail: `file not found: ${p.file}`,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { files };
|
|
192
|
+
}
|
|
193
|
+
/** Builds an InvariantCheckResult for a fixed concept/invariant/kind. The execute*
|
|
194
|
+
* helpers close over this so each return is just `(status, detail?)`. */
|
|
195
|
+
function resultFor(concept, invariantId, kind) {
|
|
196
|
+
return (status, detail) => ({
|
|
197
|
+
conceptId: concept.id,
|
|
198
|
+
invariantId,
|
|
199
|
+
kind,
|
|
200
|
+
status,
|
|
201
|
+
detail,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function executeImplication(concept, invariantId, over, ifSrc, thenSrc, cwd) {
|
|
205
|
+
const r = resultFor(concept, invariantId, 'implication');
|
|
206
|
+
const reIf = compileRegex(ifSrc);
|
|
207
|
+
const reThen = compileRegex(thenSrc);
|
|
208
|
+
if (reIf === null || reThen === null) {
|
|
209
|
+
return r('error', `invalid regex: ${reIf === null ? ifSrc : thenSrc}`);
|
|
210
|
+
}
|
|
211
|
+
const read = readSelected(concept, invariantId, 'implication', over, cwd);
|
|
212
|
+
if ('error' in read)
|
|
213
|
+
return read.error;
|
|
214
|
+
const offenders = read.files
|
|
215
|
+
.filter(([, content]) => reIf.test(content) && !reThen.test(content))
|
|
216
|
+
.map(([file]) => file);
|
|
217
|
+
return offenders.length === 0
|
|
218
|
+
? r('pass')
|
|
219
|
+
: r('fail', `matches /${ifSrc}/ but not /${thenSrc}/ in: ${offenders.join(', ')}`);
|
|
220
|
+
}
|
|
221
|
+
/** Shared per-file presence/absence evaluator for symbol_present | forbidden. */
|
|
222
|
+
function executePresence(concept, invariantId, kind, over, pattern, cwd) {
|
|
223
|
+
const r = resultFor(concept, invariantId, kind);
|
|
224
|
+
const re = compileRegex(pattern);
|
|
225
|
+
if (re === null)
|
|
226
|
+
return r('error', `invalid regex: ${pattern}`);
|
|
227
|
+
const read = readSelected(concept, invariantId, kind, over, cwd);
|
|
228
|
+
if ('error' in read)
|
|
229
|
+
return read.error;
|
|
230
|
+
// symbol_present: offender = file MISSING the pattern. forbidden: offender = file WITH it.
|
|
231
|
+
const wantPresent = kind === 'symbol_present';
|
|
232
|
+
const offenders = read.files
|
|
233
|
+
.filter(([, content]) => re.test(content) !== wantPresent)
|
|
234
|
+
.map(([file]) => file);
|
|
235
|
+
if (offenders.length === 0)
|
|
236
|
+
return r('pass');
|
|
237
|
+
const verb = wantPresent ? 'missing in' : 'present in';
|
|
238
|
+
return r('fail', `pattern '${pattern}' ${verb}: ${offenders.join(', ')}`);
|
|
239
|
+
}
|
|
127
240
|
function tally(results) {
|
|
128
241
|
let passed = 0;
|
|
129
242
|
let failed = 0;
|
package/dist/checker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invariant classification & sign-off — the projection layer on top of the
|
|
3
|
+
* raw affected graph. `klass` derives from `check.kind`; the summary + ack
|
|
4
|
+
* annotation power `koncepto affected --require-ack`. Kept out of affected.ts
|
|
5
|
+
* so that file stays a focused graph computation under the size budget.
|
|
6
|
+
*
|
|
7
|
+
* Type-only imports from affected.ts (AffectedConcept) erase at runtime, so
|
|
8
|
+
* there is no import cycle: affected.ts → classify.ts is the only value edge.
|
|
9
|
+
*/
|
|
10
|
+
import type { AffectedConcept } from './affected.js';
|
|
11
|
+
import type { AutomatedCheck } from './schema.js';
|
|
12
|
+
/**
|
|
13
|
+
* Derived from `check.kind`: `none` invariants need human/LLM judgment
|
|
14
|
+
* (advisory); every other kind is machine-verified (automated) — grep/command via
|
|
15
|
+
* `koncepto check`, and the static kinds (implication/symbol_present/forbidden, #36)
|
|
16
|
+
* also via `koncepto verify`. A pure projection of existing data — no schema field.
|
|
17
|
+
*
|
|
18
|
+
* NOTE: the rule is `kind !== 'none'`, deliberately NOT an allowlist — a new
|
|
19
|
+
* enforcement kind is automatically `automated` without touching this file.
|
|
20
|
+
*/
|
|
21
|
+
export type InvariantClass = 'automated' | 'advisory';
|
|
22
|
+
export declare function classifyCheck(check: AutomatedCheck): InvariantClass;
|
|
23
|
+
/** Ack key for an invariant: `"<concept-id>:<invariant-id>"`. */
|
|
24
|
+
export declare function ackKey(conceptId: string, invariantId: string): string;
|
|
25
|
+
export interface AffectedSummary {
|
|
26
|
+
automated: number;
|
|
27
|
+
advisory: number;
|
|
28
|
+
advisory_high: number;
|
|
29
|
+
/** advisory_high not acked; always 0 unless acks were passed (ack-mode). */
|
|
30
|
+
unacknowledged_high: number;
|
|
31
|
+
}
|
|
32
|
+
/** Sets `acknowledged` on every advisory invariant (ack-mode only). */
|
|
33
|
+
export declare function annotateAcks(affected: AffectedConcept, acks: ReadonlySet<string>): void;
|
|
34
|
+
export declare function computeSummary(concepts: AffectedConcept[], ackMode: boolean): AffectedSummary;
|
|
35
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,CAAA;AAErD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAEnE;AAED,iEAAiE;AACjE,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAKvF;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,EAAE,OAAO,GACf,eAAe,CAqBjB"}
|
package/dist/classify.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invariant classification & sign-off — the projection layer on top of the
|
|
3
|
+
* raw affected graph. `klass` derives from `check.kind`; the summary + ack
|
|
4
|
+
* annotation power `koncepto affected --require-ack`. Kept out of affected.ts
|
|
5
|
+
* so that file stays a focused graph computation under the size budget.
|
|
6
|
+
*
|
|
7
|
+
* Type-only imports from affected.ts (AffectedConcept) erase at runtime, so
|
|
8
|
+
* there is no import cycle: affected.ts → classify.ts is the only value edge.
|
|
9
|
+
*/
|
|
10
|
+
export function classifyCheck(check) {
|
|
11
|
+
return check.kind === 'none' ? 'advisory' : 'automated';
|
|
12
|
+
}
|
|
13
|
+
/** Ack key for an invariant: `"<concept-id>:<invariant-id>"`. */
|
|
14
|
+
export function ackKey(conceptId, invariantId) {
|
|
15
|
+
return `${conceptId}:${invariantId}`;
|
|
16
|
+
}
|
|
17
|
+
/** Sets `acknowledged` on every advisory invariant (ack-mode only). */
|
|
18
|
+
export function annotateAcks(affected, acks) {
|
|
19
|
+
for (const inv of affected.invariants) {
|
|
20
|
+
if (inv.klass !== 'advisory')
|
|
21
|
+
continue;
|
|
22
|
+
inv.acknowledged = acks.has(ackKey(inv.concept_id, inv.invariant_id));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function computeSummary(concepts, ackMode) {
|
|
26
|
+
let automated = 0;
|
|
27
|
+
let advisory = 0;
|
|
28
|
+
let advisoryHigh = 0;
|
|
29
|
+
let unacknowledgedHigh = 0;
|
|
30
|
+
for (const c of concepts) {
|
|
31
|
+
for (const inv of c.invariants) {
|
|
32
|
+
if (inv.klass === 'automated')
|
|
33
|
+
automated++;
|
|
34
|
+
else
|
|
35
|
+
advisory++;
|
|
36
|
+
if (inv.klass === 'advisory' && inv.severity === 'high') {
|
|
37
|
+
advisoryHigh++;
|
|
38
|
+
if (ackMode && inv.acknowledged === false)
|
|
39
|
+
unacknowledgedHigh++;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
automated,
|
|
45
|
+
advisory,
|
|
46
|
+
advisory_high: advisoryHigh,
|
|
47
|
+
unacknowledged_high: ackMode ? unacknowledgedHigh : 0,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../src/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,MAAM,UAAU,aAAa,CAAC,KAAqB;IACjD,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAA;AACzD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,MAAM,CAAC,SAAiB,EAAE,WAAmB;IAC3D,OAAO,GAAG,SAAS,IAAI,WAAW,EAAE,CAAA;AACtC,CAAC;AAUD,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,QAAyB,EAAE,IAAyB;IAC/E,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU;YAAE,SAAQ;QACtC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAA;IACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,OAAgB;IAEhB,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,kBAAkB,GAAG,CAAC,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;gBAAE,SAAS,EAAE,CAAA;;gBACrC,QAAQ,EAAE,CAAA;YACf,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxD,YAAY,EAAE,CAAA;gBACd,IAAI,OAAO,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK;oBAAE,kBAAkB,EAAE,CAAA;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,SAAS;QACT,QAAQ;QACR,aAAa,EAAE,YAAY;QAC3B,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;KACtD,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
export { VERSION } from './version.js';
|
|
2
|
-
export { ConceptSchema, IndexEntrySchema, RoleEnum, ConceptTypeEnum, SeverityEnum, StatusEnum, AutomatedCheckSchema, LinkTypeEnum, LinkRefSchema, } from './schema.js';
|
|
3
|
-
export type { Concept, IndexEntry, Participant, Invariant, SourceOfTruth, Role, ConceptType, Severity, Status, AutomatedCheck, LinkType, LinkRef, } from './schema.js';
|
|
2
|
+
export { ConceptSchema, IndexEntrySchema, RoleEnum, ConceptTypeEnum, SeverityEnum, StatusEnum, AutomatedCheckSchema, ParticipantSelectorSchema, LinkTypeEnum, LinkRefSchema, } from './schema.js';
|
|
3
|
+
export type { Concept, IndexEntry, Participant, Invariant, SourceOfTruth, Role, ConceptType, Severity, Status, AutomatedCheck, ParticipantSelector, LinkType, LinkRef, } from './schema.js';
|
|
4
4
|
export { parseConceptString, parseConceptFile } from './parser.js';
|
|
5
5
|
export type { ParseResult, ParseError, ParseErrorType } from './parser.js';
|
|
6
6
|
export { indexConcepts, writeIndex, isIndexClean } from './indexer.js';
|
|
7
7
|
export type { IndexResult, IndexErrorEntry, DuplicateId, UnresolvedRelated, MissingFile, } from './indexer.js';
|
|
8
8
|
export { searchEntries } from './search.js';
|
|
9
9
|
export type { SearchHit, MatchField } from './search.js';
|
|
10
|
-
export { computeAffected,
|
|
11
|
-
export type { AffectedReport, AffectedConcept, AffectedInvariant, MatchedRole,
|
|
10
|
+
export { computeAffected, resolveRelatedIds } from './affected.js';
|
|
11
|
+
export type { AffectedReport, AffectedConcept, AffectedInvariant, MatchedRole, } from './affected.js';
|
|
12
|
+
export { classifyCheck, ackKey } from './classify.js';
|
|
13
|
+
export type { InvariantClass, AffectedSummary } from './classify.js';
|
|
14
|
+
export { loadConcepts } from './load-concepts.js';
|
|
15
|
+
export type { LoadConceptsResult } from './load-concepts.js';
|
|
12
16
|
export { suggestLinks } from './suggest-links.js';
|
|
13
17
|
export type { LinkSuggestion, SuggestLinksOptions } from './suggest-links.js';
|
|
14
18
|
export { runChecks } from './checker.js';
|
|
15
19
|
export type { CheckOptions, CheckStatus, InvariantCheckResult, CheckResult, } from './checker.js';
|
|
20
|
+
export { parseVerdict, reviewAffected, buildPrompt } from './review.js';
|
|
21
|
+
export type { Verdict, InvariantReview, ReviewResult, ReviewOptions, } from './review.js';
|
|
16
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,MAAM,EACN,cAAc,EACd,QAAQ,EACR,OAAO,GACR,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG1E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxD,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,OAAO,GACR,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAG1E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AACtE,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAClE,YAAY,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,GACZ,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACrD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGpE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,YAAY,EACV,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,WAAW,GACZ,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACvE,YAAY,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
export { VERSION } from './version.js';
|
|
5
5
|
// Schema — top-level types + main schemas. Sub-schemas (Participant, Invariant,
|
|
6
6
|
// SourceOfTruth) and the kebab-id regex stay internal.
|
|
7
|
-
export { ConceptSchema, IndexEntrySchema, RoleEnum, ConceptTypeEnum, SeverityEnum, StatusEnum, AutomatedCheckSchema, LinkTypeEnum, LinkRefSchema, } from './schema.js';
|
|
7
|
+
export { ConceptSchema, IndexEntrySchema, RoleEnum, ConceptTypeEnum, SeverityEnum, StatusEnum, AutomatedCheckSchema, ParticipantSelectorSchema, LinkTypeEnum, LinkRefSchema, } from './schema.js';
|
|
8
8
|
// Parser
|
|
9
9
|
export { parseConceptString, parseConceptFile } from './parser.js';
|
|
10
10
|
// Indexer
|
|
@@ -12,9 +12,15 @@ export { indexConcepts, writeIndex, isIndexClean } from './indexer.js';
|
|
|
12
12
|
// Search
|
|
13
13
|
export { searchEntries } from './search.js';
|
|
14
14
|
// Affected (impact analysis)
|
|
15
|
-
export { computeAffected,
|
|
15
|
+
export { computeAffected, resolveRelatedIds } from './affected.js';
|
|
16
|
+
// Classification & sign-off (klass, summary, acks)
|
|
17
|
+
export { classifyCheck, ackKey } from './classify.js';
|
|
18
|
+
// Concept loader (fs bridge for the pure graph functions)
|
|
19
|
+
export { loadConcepts } from './load-concepts.js';
|
|
16
20
|
// Auto-link inference
|
|
17
21
|
export { suggestLinks } from './suggest-links.js';
|
|
18
22
|
// Checker (invariant.check executor)
|
|
19
23
|
export { runChecks } from './checker.js';
|
|
24
|
+
// Review (LLM semantic reviewer — pure; llm + diff injected by the CLI)
|
|
25
|
+
export { parseVerdict, reviewAffected, buildPrompt } from './review.js';
|
|
20
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,uEAAuE;AACvE,4CAA4C;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,gFAAgF;AAChF,uDAAuD;AACvD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,uEAAuE;AACvE,4CAA4C;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,gFAAgF;AAChF,uDAAuD;AACvD,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,yBAAyB,EACzB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAA;AAiBpB,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGlE,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAStE,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,6BAA6B;AAC7B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAQlE,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAGrD,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,qCAAqC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAQxC,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concept loader — the one fs-touching helper that bridges the pure graph
|
|
3
|
+
* functions (computeAffected, runChecks) and the YAML registry on disk.
|
|
4
|
+
*
|
|
5
|
+
* Kept separate from affected.ts so that file stays a pure computation over an
|
|
6
|
+
* already-parsed Concept[] (no glob, no fs). CLI / MCP server call this when
|
|
7
|
+
* they don't already hold a parsed list.
|
|
8
|
+
*/
|
|
9
|
+
import type { Concept } from './schema.js';
|
|
10
|
+
export interface LoadConceptsResult {
|
|
11
|
+
concepts: Concept[];
|
|
12
|
+
parseErrors: Array<{
|
|
13
|
+
filePath: string;
|
|
14
|
+
message: string;
|
|
15
|
+
field?: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export declare function loadConcepts(rootDir: string): Promise<LoadConceptsResult>;
|
|
19
|
+
//# sourceMappingURL=load-concepts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-concepts.d.ts","sourceRoot":"","sources":["../src/load-concepts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1E;AAID,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoB/E"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Concept loader — the one fs-touching helper that bridges the pure graph
|
|
3
|
+
* functions (computeAffected, runChecks) and the YAML registry on disk.
|
|
4
|
+
*
|
|
5
|
+
* Kept separate from affected.ts so that file stays a pure computation over an
|
|
6
|
+
* already-parsed Concept[] (no glob, no fs). CLI / MCP server call this when
|
|
7
|
+
* they don't already hold a parsed list.
|
|
8
|
+
*/
|
|
9
|
+
import { glob } from 'glob';
|
|
10
|
+
import { parseConceptFile } from './parser.js';
|
|
11
|
+
const CONCEPTS_GLOB = '.koncept/concepts/*.yaml';
|
|
12
|
+
export async function loadConcepts(rootDir) {
|
|
13
|
+
const files = await glob(CONCEPTS_GLOB, {
|
|
14
|
+
cwd: rootDir,
|
|
15
|
+
absolute: true,
|
|
16
|
+
nodir: true,
|
|
17
|
+
posix: true,
|
|
18
|
+
});
|
|
19
|
+
const parsed = await Promise.all(files.map((f) => parseConceptFile(f)));
|
|
20
|
+
const concepts = [];
|
|
21
|
+
const parseErrors = [];
|
|
22
|
+
for (const r of parsed) {
|
|
23
|
+
if (r.concept !== null) {
|
|
24
|
+
concepts.push(r.concept);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
for (const e of r.errors) {
|
|
28
|
+
parseErrors.push({ filePath: r.filePath, message: e.message, field: e.field });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { concepts, parseErrors };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=load-concepts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-concepts.js","sourceRoot":"","sources":["../src/load-concepts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAQ9C,MAAM,aAAa,GAAG,0BAA0B,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe;IAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;QACtC,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAc,EAAE,CAAA;IAC9B,MAAM,WAAW,GAAsC,EAAE,CAAA;IACzD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;AAClC,CAAC"}
|
package/dist/review.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic invariant review (Phase 2) — for each touched ADVISORY invariant,
|
|
3
|
+
* ask an injected LLM whether the change still upholds it. Pure: the LLM
|
|
4
|
+
* provider and the per-file diff are injected by the CLI (mirrors how
|
|
5
|
+
* checker.ts injects cwd), so unit tests run with a fake llm and no network.
|
|
6
|
+
*
|
|
7
|
+
* Boundary (D-002 / D-004): network + cost live in the CLI, never the MCP
|
|
8
|
+
* server. This module only shapes prompts and tallies verdicts.
|
|
9
|
+
*/
|
|
10
|
+
import { type AffectedConcept, type AffectedInvariant } from './affected.js';
|
|
11
|
+
import type { Concept, Severity } from './schema.js';
|
|
12
|
+
export type Verdict = 'holds' | 'violated' | 'uncertain';
|
|
13
|
+
export interface InvariantReview {
|
|
14
|
+
conceptId: string;
|
|
15
|
+
invariantId: string;
|
|
16
|
+
severity: Severity;
|
|
17
|
+
verdict: Verdict;
|
|
18
|
+
rationale: string;
|
|
19
|
+
files: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ReviewResult {
|
|
22
|
+
reviews: InvariantReview[];
|
|
23
|
+
holds: number;
|
|
24
|
+
violated: number;
|
|
25
|
+
uncertain: number;
|
|
26
|
+
/** automated invariants + advisory invariants below --severity */
|
|
27
|
+
skipped: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ReviewOptions {
|
|
30
|
+
rootDir: string;
|
|
31
|
+
changedFiles: string[];
|
|
32
|
+
/** Injected: unified diff text for a single file (sync, like spawnSync). */
|
|
33
|
+
diff: (file: string) => string;
|
|
34
|
+
minSeverity: Severity;
|
|
35
|
+
/** Injected provider: prompt → raw model text. Throws propagate (→ exit 2). */
|
|
36
|
+
llm: (prompt: string) => Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Lenient parse of the model's reply: prefer an embedded JSON object
|
|
40
|
+
* `{verdict, rationale}`; fall back to scanning prose for a verdict keyword;
|
|
41
|
+
* otherwise coerce to `uncertain` (never throws — unparseable ≠ failure).
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseVerdict(raw: string): {
|
|
44
|
+
verdict: Verdict;
|
|
45
|
+
rationale: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* For each ADVISORY invariant touched by the diff and at/above `minSeverity`,
|
|
49
|
+
* one LLM call judges whether the change still upholds it. Automated and
|
|
50
|
+
* below-threshold invariants are counted in `skipped`. LLM *errors* propagate
|
|
51
|
+
* (tagged `concept:invariant`) so the CLI can exit 2; unparseable *replies*
|
|
52
|
+
* are coerced to `uncertain` and continue.
|
|
53
|
+
*/
|
|
54
|
+
export declare function reviewAffected(concepts: Concept[], opts: ReviewOptions): Promise<ReviewResult>;
|
|
55
|
+
export declare function buildPrompt(affected: AffectedConcept, inv: AffectedInvariant, files: string[], diff: (file: string) => string): string;
|
|
56
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAmB,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC7F,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAA;AAMxD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,4EAA4E;IAC5E,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9B,WAAW,EAAE,QAAQ,CAAA;IACrB,+EAA+E;IAC/E,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACzC;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAOjF;AA8BD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,YAAY,CAAC,CAiBvB;AA+BD,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CAUR"}
|
package/dist/review.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic invariant review (Phase 2) — for each touched ADVISORY invariant,
|
|
3
|
+
* ask an injected LLM whether the change still upholds it. Pure: the LLM
|
|
4
|
+
* provider and the per-file diff are injected by the CLI (mirrors how
|
|
5
|
+
* checker.ts injects cwd), so unit tests run with a fake llm and no network.
|
|
6
|
+
*
|
|
7
|
+
* Boundary (D-002 / D-004): network + cost live in the CLI, never the MCP
|
|
8
|
+
* server. This module only shapes prompts and tallies verdicts.
|
|
9
|
+
*/
|
|
10
|
+
import { computeAffected } from './affected.js';
|
|
11
|
+
const VERDICTS = ['holds', 'violated', 'uncertain'];
|
|
12
|
+
const NO_RATIONALE = '(no rationale provided)';
|
|
13
|
+
const SEVERITY_RANK = { high: 3, medium: 2, low: 1 };
|
|
14
|
+
// ─── Verdict parsing ────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Lenient parse of the model's reply: prefer an embedded JSON object
|
|
17
|
+
* `{verdict, rationale}`; fall back to scanning prose for a verdict keyword;
|
|
18
|
+
* otherwise coerce to `uncertain` (never throws — unparseable ≠ failure).
|
|
19
|
+
*/
|
|
20
|
+
export function parseVerdict(raw) {
|
|
21
|
+
const text = raw.trim();
|
|
22
|
+
const fromJson = verdictFromJson(text);
|
|
23
|
+
if (fromJson)
|
|
24
|
+
return fromJson;
|
|
25
|
+
const scanned = text.match(/\b(holds|violated|uncertain)\b/);
|
|
26
|
+
if (scanned)
|
|
27
|
+
return { verdict: scanned[1], rationale: truncate(text) };
|
|
28
|
+
return { verdict: 'uncertain', rationale: 'unparseable model output' };
|
|
29
|
+
}
|
|
30
|
+
function verdictFromJson(text) {
|
|
31
|
+
const start = text.indexOf('{');
|
|
32
|
+
const end = text.lastIndexOf('}');
|
|
33
|
+
if (start === -1 || end <= start)
|
|
34
|
+
return null;
|
|
35
|
+
let parsed;
|
|
36
|
+
try {
|
|
37
|
+
parsed = JSON.parse(text.slice(start, end + 1));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
43
|
+
return null;
|
|
44
|
+
const obj = parsed;
|
|
45
|
+
if (typeof obj.verdict !== 'string' || !VERDICTS.includes(obj.verdict)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const rationale = typeof obj.rationale === 'string' && obj.rationale.trim().length > 0
|
|
49
|
+
? obj.rationale.trim()
|
|
50
|
+
: NO_RATIONALE;
|
|
51
|
+
return { verdict: obj.verdict, rationale };
|
|
52
|
+
}
|
|
53
|
+
function truncate(s, max = 300) {
|
|
54
|
+
return s.length > max ? s.slice(0, max) + '…' : s;
|
|
55
|
+
}
|
|
56
|
+
// ─── Review orchestration ─────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* For each ADVISORY invariant touched by the diff and at/above `minSeverity`,
|
|
59
|
+
* one LLM call judges whether the change still upholds it. Automated and
|
|
60
|
+
* below-threshold invariants are counted in `skipped`. LLM *errors* propagate
|
|
61
|
+
* (tagged `concept:invariant`) so the CLI can exit 2; unparseable *replies*
|
|
62
|
+
* are coerced to `uncertain` and continue.
|
|
63
|
+
*/
|
|
64
|
+
export async function reviewAffected(concepts, opts) {
|
|
65
|
+
const report = computeAffected(concepts, opts.changedFiles);
|
|
66
|
+
const reviews = [];
|
|
67
|
+
let skipped = 0;
|
|
68
|
+
for (const affected of report.concepts) {
|
|
69
|
+
const files = affected.matched_files.map((m) => m.file);
|
|
70
|
+
for (const inv of affected.invariants) {
|
|
71
|
+
if (!isReviewable(inv, opts.minSeverity)) {
|
|
72
|
+
skipped++;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
reviews.push(await reviewOne(affected, inv, files, opts));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return tally(reviews, skipped);
|
|
79
|
+
}
|
|
80
|
+
function isReviewable(inv, minSeverity) {
|
|
81
|
+
return inv.klass === 'advisory' && SEVERITY_RANK[inv.severity] >= SEVERITY_RANK[minSeverity];
|
|
82
|
+
}
|
|
83
|
+
async function reviewOne(affected, inv, files, opts) {
|
|
84
|
+
const prompt = buildPrompt(affected, inv, files, opts.diff);
|
|
85
|
+
let raw;
|
|
86
|
+
try {
|
|
87
|
+
raw = await opts.llm(prompt);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
91
|
+
throw new Error(`review failed for ${inv.concept_id}:${inv.invariant_id}: ${detail}`);
|
|
92
|
+
}
|
|
93
|
+
const { verdict, rationale } = parseVerdict(raw);
|
|
94
|
+
return {
|
|
95
|
+
conceptId: inv.concept_id,
|
|
96
|
+
invariantId: inv.invariant_id,
|
|
97
|
+
severity: inv.severity,
|
|
98
|
+
verdict,
|
|
99
|
+
rationale,
|
|
100
|
+
files,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function buildPrompt(affected, inv, files, diff) {
|
|
104
|
+
const diffs = files.map((f) => `--- ${f} ---\n${diff(f)}`).join('\n\n');
|
|
105
|
+
return [
|
|
106
|
+
'You are reviewing whether a code change still upholds a documented semantic invariant.',
|
|
107
|
+
`\nConcept: ${affected.name}\n${affected.type}`,
|
|
108
|
+
`\nInvariant (${inv.severity}): ${inv.description}`,
|
|
109
|
+
`\nChanged files:\n${diffs}`,
|
|
110
|
+
'\nDoes the change uphold the invariant? Reply with a JSON object',
|
|
111
|
+
'{"verdict": "holds" | "violated" | "uncertain", "rationale": "<1-3 sentences>"}.',
|
|
112
|
+
].join('\n');
|
|
113
|
+
}
|
|
114
|
+
function tally(reviews, skipped) {
|
|
115
|
+
let holds = 0;
|
|
116
|
+
let violated = 0;
|
|
117
|
+
let uncertain = 0;
|
|
118
|
+
for (const r of reviews) {
|
|
119
|
+
if (r.verdict === 'holds')
|
|
120
|
+
holds++;
|
|
121
|
+
else if (r.verdict === 'violated')
|
|
122
|
+
violated++;
|
|
123
|
+
else
|
|
124
|
+
uncertain++;
|
|
125
|
+
}
|
|
126
|
+
return { reviews, holds, violated, uncertain, skipped };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -54,6 +54,15 @@ export declare const ParticipantSchema: z.ZodObject<{
|
|
|
54
54
|
purpose: z.ZodString;
|
|
55
55
|
}, z.core.$strip>;
|
|
56
56
|
export type Participant = z.infer<typeof ParticipantSchema>;
|
|
57
|
+
export declare const ParticipantSelectorSchema: z.ZodObject<{
|
|
58
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
59
|
+
writer: "writer";
|
|
60
|
+
reader: "reader";
|
|
61
|
+
tester: "tester";
|
|
62
|
+
docs: "docs";
|
|
63
|
+
}>>;
|
|
64
|
+
}, z.core.$strip>;
|
|
65
|
+
export type ParticipantSelector = z.infer<typeof ParticipantSelectorSchema>;
|
|
57
66
|
export declare const AutomatedCheckSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
58
67
|
kind: z.ZodLiteral<"none">;
|
|
59
68
|
}, z.core.$strip>, z.ZodObject<{
|
|
@@ -64,6 +73,40 @@ export declare const AutomatedCheckSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
|
|
|
64
73
|
}, z.core.$strip>, z.ZodObject<{
|
|
65
74
|
kind: z.ZodLiteral<"command">;
|
|
66
75
|
cmd: z.ZodString;
|
|
76
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
77
|
+
kind: z.ZodLiteral<"implication">;
|
|
78
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
79
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
80
|
+
writer: "writer";
|
|
81
|
+
reader: "reader";
|
|
82
|
+
tester: "tester";
|
|
83
|
+
docs: "docs";
|
|
84
|
+
}>>;
|
|
85
|
+
}, z.core.$strip>>;
|
|
86
|
+
if: z.ZodString;
|
|
87
|
+
then: z.ZodString;
|
|
88
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
89
|
+
kind: z.ZodLiteral<"symbol_present">;
|
|
90
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
91
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
92
|
+
writer: "writer";
|
|
93
|
+
reader: "reader";
|
|
94
|
+
tester: "tester";
|
|
95
|
+
docs: "docs";
|
|
96
|
+
}>>;
|
|
97
|
+
}, z.core.$strip>>;
|
|
98
|
+
pattern: z.ZodString;
|
|
99
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
100
|
+
kind: z.ZodLiteral<"forbidden">;
|
|
101
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
102
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
103
|
+
writer: "writer";
|
|
104
|
+
reader: "reader";
|
|
105
|
+
tester: "tester";
|
|
106
|
+
docs: "docs";
|
|
107
|
+
}>>;
|
|
108
|
+
}, z.core.$strip>>;
|
|
109
|
+
pattern: z.ZodString;
|
|
67
110
|
}, z.core.$strip>], "kind">;
|
|
68
111
|
export type AutomatedCheck = z.infer<typeof AutomatedCheckSchema>;
|
|
69
112
|
export declare const InvariantSchema: z.ZodObject<{
|
|
@@ -84,6 +127,40 @@ export declare const InvariantSchema: z.ZodObject<{
|
|
|
84
127
|
}, z.core.$strip>, z.ZodObject<{
|
|
85
128
|
kind: z.ZodLiteral<"command">;
|
|
86
129
|
cmd: z.ZodString;
|
|
130
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
131
|
+
kind: z.ZodLiteral<"implication">;
|
|
132
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
133
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
134
|
+
writer: "writer";
|
|
135
|
+
reader: "reader";
|
|
136
|
+
tester: "tester";
|
|
137
|
+
docs: "docs";
|
|
138
|
+
}>>;
|
|
139
|
+
}, z.core.$strip>>;
|
|
140
|
+
if: z.ZodString;
|
|
141
|
+
then: z.ZodString;
|
|
142
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
143
|
+
kind: z.ZodLiteral<"symbol_present">;
|
|
144
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
145
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
146
|
+
writer: "writer";
|
|
147
|
+
reader: "reader";
|
|
148
|
+
tester: "tester";
|
|
149
|
+
docs: "docs";
|
|
150
|
+
}>>;
|
|
151
|
+
}, z.core.$strip>>;
|
|
152
|
+
pattern: z.ZodString;
|
|
153
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
154
|
+
kind: z.ZodLiteral<"forbidden">;
|
|
155
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
156
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
157
|
+
writer: "writer";
|
|
158
|
+
reader: "reader";
|
|
159
|
+
tester: "tester";
|
|
160
|
+
docs: "docs";
|
|
161
|
+
}>>;
|
|
162
|
+
}, z.core.$strip>>;
|
|
163
|
+
pattern: z.ZodString;
|
|
87
164
|
}, z.core.$strip>], "kind">>;
|
|
88
165
|
}, z.core.$strip>;
|
|
89
166
|
export type Invariant = z.infer<typeof InvariantSchema>;
|
|
@@ -156,6 +233,40 @@ export declare const ConceptSchema: z.ZodObject<{
|
|
|
156
233
|
}, z.core.$strip>, z.ZodObject<{
|
|
157
234
|
kind: z.ZodLiteral<"command">;
|
|
158
235
|
cmd: z.ZodString;
|
|
236
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
237
|
+
kind: z.ZodLiteral<"implication">;
|
|
238
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
239
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
240
|
+
writer: "writer";
|
|
241
|
+
reader: "reader";
|
|
242
|
+
tester: "tester";
|
|
243
|
+
docs: "docs";
|
|
244
|
+
}>>;
|
|
245
|
+
}, z.core.$strip>>;
|
|
246
|
+
if: z.ZodString;
|
|
247
|
+
then: z.ZodString;
|
|
248
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
249
|
+
kind: z.ZodLiteral<"symbol_present">;
|
|
250
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
251
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
252
|
+
writer: "writer";
|
|
253
|
+
reader: "reader";
|
|
254
|
+
tester: "tester";
|
|
255
|
+
docs: "docs";
|
|
256
|
+
}>>;
|
|
257
|
+
}, z.core.$strip>>;
|
|
258
|
+
pattern: z.ZodString;
|
|
259
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
260
|
+
kind: z.ZodLiteral<"forbidden">;
|
|
261
|
+
over: z.ZodOptional<z.ZodObject<{
|
|
262
|
+
role: z.ZodOptional<z.ZodEnum<{
|
|
263
|
+
writer: "writer";
|
|
264
|
+
reader: "reader";
|
|
265
|
+
tester: "tester";
|
|
266
|
+
docs: "docs";
|
|
267
|
+
}>>;
|
|
268
|
+
}, z.core.$strip>>;
|
|
269
|
+
pattern: z.ZodString;
|
|
159
270
|
}, z.core.$strip>], "kind">>;
|
|
160
271
|
}, z.core.$strip>>>;
|
|
161
272
|
risks_if_broken: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAsB,CAAA;AAQjD,eAAO,MAAM,QAAQ;;;;;EAAiD,CAAA;AACtE,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE3C,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAEzD,eAAO,MAAM,YAAY;;;;EAAoC,CAAA;AAC7D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEnD,eAAO,MAAM,UAAU;;;;EAAiD,CAAA;AACxE,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAI/C,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,iBAAiB;;;;;;;;;iBAI5B,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAsB,CAAA;AAQjD,eAAO,MAAM,QAAQ;;;;;EAAiD,CAAA;AACtE,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE3C,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAEzD,eAAO,MAAM,YAAY;;;;EAAoC,CAAA;AAC7D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEnD,eAAO,MAAM,UAAU;;;;EAAiD,CAAA;AACxE,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAI/C,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,iBAAiB;;;;;;;;;iBAI5B,CAAA;AACF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAO3D,eAAO,MAAM,yBAAyB;;;;;;;iBAEpC,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAgB3E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA4B/B,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK1B,CAAA;AACF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAIvD,eAAO,MAAM,YAAY;;;;;;;EAOvB,CAAA;AACF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AAEnD,eAAO,MAAM,aAAa;;;;;;;;;;mBAGxB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAInD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBxB,CAAA;AACF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAInD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;iBAQ3B,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
|
package/dist/schema.js
CHANGED
|
@@ -36,10 +36,28 @@ export const ParticipantSchema = z.object({
|
|
|
36
36
|
role: RoleEnum,
|
|
37
37
|
purpose: z.string().min(1),
|
|
38
38
|
});
|
|
39
|
+
// ParticipantSelector — selects WHICH of a concept's declared participants a
|
|
40
|
+
// static check runs over (#36). v1: an optional `role` filter over the already-
|
|
41
|
+
// declared participant list. Absent selector → all participants. NO filesystem
|
|
42
|
+
// glob in v1 — that would need a glob dep (CONTRIBUTING "no new runtime deps")
|
|
43
|
+
// and an fs walk, breaking the cheap/hook-safe property that lets verify run it.
|
|
44
|
+
export const ParticipantSelectorSchema = z.object({
|
|
45
|
+
role: RoleEnum.optional(),
|
|
46
|
+
});
|
|
39
47
|
// AutomatedCheck — discriminated union describing HOW (if at all) the
|
|
40
48
|
// invariant is verified. `kind: none` = manual reviewer (default).
|
|
41
|
-
// `kind: grep` = regex over
|
|
49
|
+
// `kind: grep` = regex over an explicit file list. `kind: command` = escape hatch
|
|
42
50
|
// running an arbitrary shell command (the runner decides safety policy).
|
|
51
|
+
//
|
|
52
|
+
// #36 static enforcement kinds run over the concept's PARTICIPANTS (per-file),
|
|
53
|
+
// are fast/read-only/deterministic, and are evaluated by `koncepto verify` by
|
|
54
|
+
// default (unlike `command`, which stays exclusive to `koncepto check`):
|
|
55
|
+
// - `implication` — per file: if it matches `if`, it must also match `then`.
|
|
56
|
+
// - `symbol_present` — every selected file must match `pattern`.
|
|
57
|
+
// - `forbidden` — no selected file may match `pattern`.
|
|
58
|
+
// `symbol_present`/`forbidden` are exact sugar for per-file presence/absence
|
|
59
|
+
// using the same RegExp engine as `grep`; they differ only in source set
|
|
60
|
+
// (participants, not an explicit `in[]`) and aggregation (per-file, not any-file).
|
|
43
61
|
export const AutomatedCheckSchema = z.discriminatedUnion('kind', [
|
|
44
62
|
z.object({ kind: z.literal('none') }),
|
|
45
63
|
z.object({
|
|
@@ -52,6 +70,22 @@ export const AutomatedCheckSchema = z.discriminatedUnion('kind', [
|
|
|
52
70
|
kind: z.literal('command'),
|
|
53
71
|
cmd: z.string().min(1),
|
|
54
72
|
}),
|
|
73
|
+
z.object({
|
|
74
|
+
kind: z.literal('implication'),
|
|
75
|
+
over: ParticipantSelectorSchema.optional(),
|
|
76
|
+
if: z.string().min(1),
|
|
77
|
+
then: z.string().min(1),
|
|
78
|
+
}),
|
|
79
|
+
z.object({
|
|
80
|
+
kind: z.literal('symbol_present'),
|
|
81
|
+
over: ParticipantSelectorSchema.optional(),
|
|
82
|
+
pattern: z.string().min(1),
|
|
83
|
+
}),
|
|
84
|
+
z.object({
|
|
85
|
+
kind: z.literal('forbidden'),
|
|
86
|
+
over: ParticipantSelectorSchema.optional(),
|
|
87
|
+
pattern: z.string().min(1),
|
|
88
|
+
}),
|
|
55
89
|
]);
|
|
56
90
|
export const InvariantSchema = z.object({
|
|
57
91
|
id: KebabId,
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yourtechtribe-labs/koncept-core",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.4",
|
|
4
4
|
"description": "Core schema, parser, and indexer for koncepto semantic concept graphs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"yaml",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"glob": "13.0.6",
|
|
31
|
-
"yaml": "2.
|
|
31
|
+
"yaml": "2.9.0",
|
|
32
32
|
"zod": "4.4.3"
|
|
33
33
|
},
|
|
34
34
|
"publishConfig": {
|