wabachi 0.2.1 → 0.3.0
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/.codex-plugin/plugin.json +1 -1
- package/README.md +5 -0
- package/dist/architecture/cli.js +47 -32
- package/dist/architecture/cli.js.map +1 -1
- package/dist/architecture/documentation/react-flow.d.ts +23 -0
- package/dist/architecture/documentation/react-flow.js +436 -0
- package/dist/architecture/documentation/react-flow.js.map +1 -0
- package/dist/architecture/documentation/site.d.ts +10 -13
- package/dist/architecture/documentation/site.js +58 -24
- package/dist/architecture/documentation/site.js.map +1 -1
- package/dist/architecture/projection/react-flow.d.ts +96 -0
- package/dist/architecture/projection/react-flow.js +388 -0
- package/dist/architecture/projection/react-flow.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/command-contract.d.ts +3 -2
- package/dist/command-contract.js +6 -5
- package/dist/command-contract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/repository.d.ts +3 -0
- package/dist/runtime/repository.js +140 -16
- package/dist/runtime/repository.js.map +1 -1
- package/dist/runtime/run.js +3 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/working-set/codec.d.ts +7 -0
- package/dist/working-set/codec.js +53 -0
- package/dist/working-set/codec.js.map +1 -0
- package/dist/working-set/conflicts.d.ts +46 -0
- package/dist/working-set/conflicts.js +97 -0
- package/dist/working-set/conflicts.js.map +1 -0
- package/dist/working-set/derive.d.ts +34 -0
- package/dist/working-set/derive.js +634 -0
- package/dist/working-set/derive.js.map +1 -0
- package/dist/working-set/index.d.ts +3 -0
- package/dist/working-set/index.js +3 -0
- package/dist/working-set/index.js.map +1 -0
- package/dist/working-set/model.d.ts +93 -0
- package/dist/working-set/model.js +204 -0
- package/dist/working-set/model.js.map +1 -0
- package/dist/working-set/quality.d.ts +201 -0
- package/dist/working-set/quality.js +447 -0
- package/dist/working-set/quality.js.map +1 -0
- package/dist/working-set/seeds.d.ts +135 -0
- package/dist/working-set/seeds.js +433 -0
- package/dist/working-set/seeds.js.map +1 -0
- package/docs/USAGE.md +30 -22
- package/docs/examples/minimal-canon.json +24 -0
- package/package.json +10 -3
- package/skills/wabachi/SKILL.md +10 -1
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { createRepositoryMapping, normalizeRepositoryPath, } from "../architecture/canon/repository-mappings.js";
|
|
2
|
+
/** Version of the bounded task and entrypoint seed contract. */
|
|
3
|
+
export const WORKING_SET_SEED_SCHEMA_VERSION = 1;
|
|
4
|
+
export const WORKING_SET_SEED_KIND = "working-set-seeds";
|
|
5
|
+
export const WORKING_SET_SEED_RESOLUTION_KIND = "working-set-seed-resolution";
|
|
6
|
+
export const WORKING_SET_SEED_KINDS = ["path", "symbol-export", "architecture-component"];
|
|
7
|
+
/** V1 intent metadata is an identifier, not a task description or authority. */
|
|
8
|
+
export const WORKING_SET_TASK_INTENTS = ["implement", "investigate", "verify"];
|
|
9
|
+
export const WORKING_SET_SEED_LIMITS = Object.freeze({
|
|
10
|
+
maxSeeds: 128,
|
|
11
|
+
maxTaskIdLength: 128,
|
|
12
|
+
maxRepositoryFieldLength: 256,
|
|
13
|
+
maxRevisionLength: 64,
|
|
14
|
+
maxPathLength: 1024,
|
|
15
|
+
maxSymbolLength: 512,
|
|
16
|
+
maxExportNameLength: 512,
|
|
17
|
+
maxComponentIdLength: 512,
|
|
18
|
+
maxResolutionCandidates: 64,
|
|
19
|
+
maxResolutionEvidence: 64,
|
|
20
|
+
});
|
|
21
|
+
const seedKindOrder = Object.freeze({
|
|
22
|
+
path: 0,
|
|
23
|
+
"symbol-export": 1,
|
|
24
|
+
"architecture-component": 2,
|
|
25
|
+
});
|
|
26
|
+
const targetKindOrder = Object.freeze({
|
|
27
|
+
file: 0,
|
|
28
|
+
symbol: 1,
|
|
29
|
+
test: 2,
|
|
30
|
+
});
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function assertAllowedKeys(value, keys, label) {
|
|
35
|
+
const allowed = new Set(keys);
|
|
36
|
+
for (const key of Object.keys(value)) {
|
|
37
|
+
if (!allowed.has(key))
|
|
38
|
+
throw new TypeError(`${label} contains unknown field: ${key}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function normalizeIdentifier(value, label, maxLength) {
|
|
42
|
+
if (typeof value !== "string")
|
|
43
|
+
throw new TypeError(`${label} must be a string`);
|
|
44
|
+
const normalized = value.normalize("NFC").trim();
|
|
45
|
+
if (normalized.length === 0 ||
|
|
46
|
+
normalized.length > maxLength ||
|
|
47
|
+
/[\p{White_Space}\p{Cc}\p{Cf}\p{Cs}]/u.test(normalized)) {
|
|
48
|
+
throw new TypeError(`${label} is malformed or exceeds its bound`);
|
|
49
|
+
}
|
|
50
|
+
return normalized;
|
|
51
|
+
}
|
|
52
|
+
function normalizeRepositoryField(value, label) {
|
|
53
|
+
if (typeof value !== "string")
|
|
54
|
+
throw new TypeError(`${label} must be a string`);
|
|
55
|
+
const normalized = value.normalize("NFC");
|
|
56
|
+
if (normalized.length === 0 ||
|
|
57
|
+
normalized.length > WORKING_SET_SEED_LIMITS.maxRepositoryFieldLength ||
|
|
58
|
+
/[\p{White_Space}\p{Cc}\p{Cf}\p{Cs}]/u.test(normalized)) {
|
|
59
|
+
throw new TypeError(`${label} is malformed or exceeds its bound`);
|
|
60
|
+
}
|
|
61
|
+
return normalized;
|
|
62
|
+
}
|
|
63
|
+
function normalizeRevision(value) {
|
|
64
|
+
const revision = normalizeIdentifier(value, "revision", WORKING_SET_SEED_LIMITS.maxRevisionLength);
|
|
65
|
+
if (!/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/iu.test(revision)) {
|
|
66
|
+
throw new TypeError("revision must be a full immutable hexadecimal revision");
|
|
67
|
+
}
|
|
68
|
+
return revision.toLowerCase();
|
|
69
|
+
}
|
|
70
|
+
function normalizeRepository(value) {
|
|
71
|
+
if (!isRecord(value))
|
|
72
|
+
throw new TypeError("repository must be an object");
|
|
73
|
+
assertAllowedKeys(value, ["repositoryHost", "repositoryId", "repository"], "repository");
|
|
74
|
+
return Object.freeze({
|
|
75
|
+
repositoryHost: normalizeRepositoryField(value.repositoryHost, "repository repositoryHost"),
|
|
76
|
+
repositoryId: normalizeRepositoryField(value.repositoryId, "repository repositoryId"),
|
|
77
|
+
repository: normalizeRepositoryField(value.repository, "repository repository"),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
function normalizeTask(value) {
|
|
81
|
+
if (!isRecord(value))
|
|
82
|
+
throw new TypeError("task must be an object");
|
|
83
|
+
assertAllowedKeys(value, ["taskId", "intent"], "task");
|
|
84
|
+
if (!WORKING_SET_TASK_INTENTS.includes(value.intent)) {
|
|
85
|
+
throw new TypeError("task intent is unsupported");
|
|
86
|
+
}
|
|
87
|
+
return Object.freeze({
|
|
88
|
+
taskId: normalizeIdentifier(value.taskId, "task taskId", WORKING_SET_SEED_LIMITS.maxTaskIdLength),
|
|
89
|
+
intent: value.intent,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function normalizeSeedPath(value) {
|
|
93
|
+
if (typeof value !== "string" || value.length > WORKING_SET_SEED_LIMITS.maxPathLength) {
|
|
94
|
+
throw new TypeError("seed path is malformed or exceeds its bound");
|
|
95
|
+
}
|
|
96
|
+
return normalizeRepositoryPath(value);
|
|
97
|
+
}
|
|
98
|
+
function normalizeSeed(value) {
|
|
99
|
+
if (!isRecord(value))
|
|
100
|
+
throw new TypeError("working-set seed must be an object");
|
|
101
|
+
if (!WORKING_SET_SEED_KINDS.includes(value.kind)) {
|
|
102
|
+
throw new TypeError("working-set seed kind is unsupported");
|
|
103
|
+
}
|
|
104
|
+
switch (value.kind) {
|
|
105
|
+
case "path":
|
|
106
|
+
assertAllowedKeys(value, ["kind", "path"], "path seed");
|
|
107
|
+
return Object.freeze({ kind: "path", path: normalizeSeedPath(value.path) });
|
|
108
|
+
case "symbol-export":
|
|
109
|
+
assertAllowedKeys(value, ["kind", "path", "symbol", "exportName"], "symbol-export seed");
|
|
110
|
+
return Object.freeze({
|
|
111
|
+
kind: "symbol-export",
|
|
112
|
+
path: normalizeSeedPath(value.path),
|
|
113
|
+
symbol: normalizeIdentifier(value.symbol, "symbol-export seed symbol", WORKING_SET_SEED_LIMITS.maxSymbolLength),
|
|
114
|
+
...(value.exportName === undefined
|
|
115
|
+
? {}
|
|
116
|
+
: {
|
|
117
|
+
exportName: normalizeIdentifier(value.exportName, "symbol-export seed exportName", WORKING_SET_SEED_LIMITS.maxExportNameLength),
|
|
118
|
+
}),
|
|
119
|
+
});
|
|
120
|
+
case "architecture-component":
|
|
121
|
+
assertAllowedKeys(value, ["kind", "componentId"], "architecture-component seed");
|
|
122
|
+
return Object.freeze({
|
|
123
|
+
kind: "architecture-component",
|
|
124
|
+
componentId: normalizeIdentifier(value.componentId, "architecture-component seed componentId", WORKING_SET_SEED_LIMITS.maxComponentIdLength),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function compareSeeds(left, right) {
|
|
129
|
+
const kind = seedKindOrder[left.kind] - seedKindOrder[right.kind];
|
|
130
|
+
if (kind !== 0)
|
|
131
|
+
return kind;
|
|
132
|
+
if (left.kind === "path" && right.kind === "path")
|
|
133
|
+
return left.path.localeCompare(right.path);
|
|
134
|
+
if (left.kind === "architecture-component" && right.kind === "architecture-component") {
|
|
135
|
+
return left.componentId.localeCompare(right.componentId);
|
|
136
|
+
}
|
|
137
|
+
if (left.kind !== "symbol-export" || right.kind !== "symbol-export")
|
|
138
|
+
return 0;
|
|
139
|
+
return (left.path.localeCompare(right.path) ||
|
|
140
|
+
left.symbol.localeCompare(right.symbol) ||
|
|
141
|
+
(left.exportName ?? "").localeCompare(right.exportName ?? ""));
|
|
142
|
+
}
|
|
143
|
+
function seedKey(seed) {
|
|
144
|
+
if (seed.kind === "path")
|
|
145
|
+
return `path\u0000${seed.path}`;
|
|
146
|
+
if (seed.kind === "architecture-component")
|
|
147
|
+
return `architecture-component\u0000${seed.componentId}`;
|
|
148
|
+
return `symbol-export\u0000${seed.path}\u0000${seed.symbol}\u0000${seed.exportName ?? ""}`;
|
|
149
|
+
}
|
|
150
|
+
function normalizeInput(input, requireVersion) {
|
|
151
|
+
if (!isRecord(input))
|
|
152
|
+
throw new TypeError("working-set seed document must be an object");
|
|
153
|
+
assertAllowedKeys(input, ["kind", "schemaVersion", "task", "repository", "revision", "seeds"], "working-set seed document");
|
|
154
|
+
if (input.kind !== undefined && input.kind !== WORKING_SET_SEED_KIND) {
|
|
155
|
+
throw new TypeError("working-set seed document kind is unsupported");
|
|
156
|
+
}
|
|
157
|
+
if (requireVersion && input.schemaVersion !== WORKING_SET_SEED_SCHEMA_VERSION) {
|
|
158
|
+
throw new TypeError("working-set seed schema version is unsupported");
|
|
159
|
+
}
|
|
160
|
+
if (input.schemaVersion !== undefined && input.schemaVersion !== WORKING_SET_SEED_SCHEMA_VERSION) {
|
|
161
|
+
throw new TypeError("working-set seed schema version is unsupported");
|
|
162
|
+
}
|
|
163
|
+
if (!Array.isArray(input.seeds))
|
|
164
|
+
throw new TypeError("working-set seeds must be an array");
|
|
165
|
+
if (input.seeds.length > WORKING_SET_SEED_LIMITS.maxSeeds) {
|
|
166
|
+
throw new TypeError("working-set seeds exceed their bound");
|
|
167
|
+
}
|
|
168
|
+
const unique = new Map();
|
|
169
|
+
for (const value of input.seeds) {
|
|
170
|
+
const seed = normalizeSeed(value);
|
|
171
|
+
unique.set(seedKey(seed), seed);
|
|
172
|
+
}
|
|
173
|
+
const seeds = [...unique.values()].sort(compareSeeds);
|
|
174
|
+
return Object.freeze({
|
|
175
|
+
kind: WORKING_SET_SEED_KIND,
|
|
176
|
+
schemaVersion: WORKING_SET_SEED_SCHEMA_VERSION,
|
|
177
|
+
task: normalizeTask(input.task),
|
|
178
|
+
repository: normalizeRepository(input.repository),
|
|
179
|
+
revision: normalizeRevision(input.revision),
|
|
180
|
+
seeds: Object.freeze(seeds),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/** Creates and canonicalizes a bounded structured task/seed document. */
|
|
184
|
+
export function createWorkingSetSeeds(input) {
|
|
185
|
+
return normalizeInput(input, false);
|
|
186
|
+
}
|
|
187
|
+
/** Validates a serialized-shape seed document before semantic use. */
|
|
188
|
+
export function validateWorkingSetSeeds(input) {
|
|
189
|
+
return normalizeInput(input, true);
|
|
190
|
+
}
|
|
191
|
+
function canonicalDocument(document) {
|
|
192
|
+
return {
|
|
193
|
+
kind: WORKING_SET_SEED_KIND,
|
|
194
|
+
schemaVersion: WORKING_SET_SEED_SCHEMA_VERSION,
|
|
195
|
+
task: { taskId: document.task.taskId, intent: document.task.intent },
|
|
196
|
+
repository: {
|
|
197
|
+
repositoryHost: document.repository.repositoryHost,
|
|
198
|
+
repositoryId: document.repository.repositoryId,
|
|
199
|
+
repository: document.repository.repository,
|
|
200
|
+
},
|
|
201
|
+
revision: document.revision,
|
|
202
|
+
seeds: document.seeds.map((seed) => {
|
|
203
|
+
if (seed.kind === "path")
|
|
204
|
+
return { kind: "path", path: seed.path };
|
|
205
|
+
if (seed.kind === "architecture-component") {
|
|
206
|
+
return { kind: "architecture-component", componentId: seed.componentId };
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
kind: "symbol-export",
|
|
210
|
+
path: seed.path,
|
|
211
|
+
symbol: seed.symbol,
|
|
212
|
+
...(seed.exportName === undefined ? {} : { exportName: seed.exportName }),
|
|
213
|
+
};
|
|
214
|
+
}),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/** Deterministic JSON serialization of the bounded seed contract. */
|
|
218
|
+
export function serializeWorkingSetSeeds(input) {
|
|
219
|
+
const document = validateWorkingSetSeeds({ ...createWorkingSetSeeds(input), schemaVersion: 1 });
|
|
220
|
+
return JSON.stringify(canonicalDocument(document));
|
|
221
|
+
}
|
|
222
|
+
/** Parses JSON and rejects malformed or unsupported seed documents. */
|
|
223
|
+
export function parseWorkingSetSeeds(serialized) {
|
|
224
|
+
if (typeof serialized !== "string")
|
|
225
|
+
throw new TypeError("working-set seed serialization must be a string");
|
|
226
|
+
let parsed;
|
|
227
|
+
try {
|
|
228
|
+
parsed = JSON.parse(serialized);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
throw new TypeError("working-set seed serialization is malformed");
|
|
232
|
+
}
|
|
233
|
+
return validateWorkingSetSeeds(parsed);
|
|
234
|
+
}
|
|
235
|
+
export const decodeWorkingSetSeeds = parseWorkingSetSeeds;
|
|
236
|
+
function compareEvidence(left, right) {
|
|
237
|
+
return left.artifact.localeCompare(right.artifact) || left.reference.localeCompare(right.reference);
|
|
238
|
+
}
|
|
239
|
+
function canonicalEvidence(references) {
|
|
240
|
+
const unique = new Map();
|
|
241
|
+
for (const reference of references)
|
|
242
|
+
unique.set(`${reference.artifact}\u0000${reference.reference}`, reference);
|
|
243
|
+
return Object.freeze([...unique.values()]
|
|
244
|
+
.sort(compareEvidence)
|
|
245
|
+
.slice(0, WORKING_SET_SEED_LIMITS.maxResolutionEvidence)
|
|
246
|
+
.map((reference) => Object.freeze({ artifact: reference.artifact, reference: reference.reference })));
|
|
247
|
+
}
|
|
248
|
+
function compareTargets(left, right) {
|
|
249
|
+
return targetKindOrder[left.kind] - targetKindOrder[right.kind] || left.locator.localeCompare(right.locator);
|
|
250
|
+
}
|
|
251
|
+
function canonicalTargets(targets) {
|
|
252
|
+
const unique = new Map();
|
|
253
|
+
for (const target of targets)
|
|
254
|
+
unique.set(`${target.kind}\u0000${target.locator}`, target);
|
|
255
|
+
return Object.freeze([...unique.values()]
|
|
256
|
+
.sort(compareTargets)
|
|
257
|
+
.map((target) => Object.freeze({ kind: target.kind, locator: target.locator })));
|
|
258
|
+
}
|
|
259
|
+
function unresolved(seed, reason, candidates = [], evidence = []) {
|
|
260
|
+
return Object.freeze({
|
|
261
|
+
status: "unresolved",
|
|
262
|
+
seed,
|
|
263
|
+
reason,
|
|
264
|
+
candidates: Object.freeze([...new Set(candidates)].sort().slice(0, WORKING_SET_SEED_LIMITS.maxResolutionCandidates)),
|
|
265
|
+
evidence: canonicalEvidence(evidence),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
function resolved(seed, targets, evidence) {
|
|
269
|
+
const canonical = canonicalTargets(targets);
|
|
270
|
+
return canonical.length === 0
|
|
271
|
+
? unresolved(seed, "missing", [], evidence)
|
|
272
|
+
: Object.freeze({
|
|
273
|
+
status: "resolved",
|
|
274
|
+
seed,
|
|
275
|
+
targets: canonical,
|
|
276
|
+
evidence: canonicalEvidence(evidence),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
function compareRepository(left, right) {
|
|
280
|
+
return (left.repositoryHost === right.repositoryHost &&
|
|
281
|
+
left.repositoryId === right.repositoryId &&
|
|
282
|
+
left.repository === right.repository);
|
|
283
|
+
}
|
|
284
|
+
function normalizeContext(context) {
|
|
285
|
+
const repository = normalizeRepository(context.repository);
|
|
286
|
+
const revision = normalizeRevision(context.revision);
|
|
287
|
+
const resolvedRepository = context.resolvedRepository;
|
|
288
|
+
if (resolvedRepository === undefined) {
|
|
289
|
+
return { repository, revision, source: repository.repository, valid: true };
|
|
290
|
+
}
|
|
291
|
+
if (typeof resolvedRepository.source !== "string" || resolvedRepository.source.length === 0) {
|
|
292
|
+
throw new TypeError("resolved repository source is malformed");
|
|
293
|
+
}
|
|
294
|
+
const resolvedRevision = normalizeRevision(resolvedRepository.commitSha);
|
|
295
|
+
return {
|
|
296
|
+
repository,
|
|
297
|
+
revision,
|
|
298
|
+
source: resolvedRepository.source,
|
|
299
|
+
valid: resolvedRevision === revision,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function normalizedMappings(inputs) {
|
|
303
|
+
if (inputs === undefined)
|
|
304
|
+
return [];
|
|
305
|
+
if (!Array.isArray(inputs))
|
|
306
|
+
throw new TypeError("repository mappings must be an array");
|
|
307
|
+
return Object.freeze(inputs
|
|
308
|
+
.map((input) => createRepositoryMapping(input))
|
|
309
|
+
.sort((left, right) => left.canonId.localeCompare(right.canonId) || JSON.stringify(left).localeCompare(JSON.stringify(right))));
|
|
310
|
+
}
|
|
311
|
+
function mappingEvidence(mapping, kind, locator) {
|
|
312
|
+
return { artifact: "canon", reference: `${mapping.canonId}:${kind}:${locator}` };
|
|
313
|
+
}
|
|
314
|
+
function symbolLocator(path, symbol, exportName) {
|
|
315
|
+
return `${path}#${symbol}${exportName === undefined ? "" : `@${exportName}`}`;
|
|
316
|
+
}
|
|
317
|
+
function testLocator(path, selector) {
|
|
318
|
+
return `${path}#${selector}`;
|
|
319
|
+
}
|
|
320
|
+
function entityMatchesBinding(entity, source, revision) {
|
|
321
|
+
return entity.repository.source === source && entity.repository.commitSha.toLowerCase() === revision;
|
|
322
|
+
}
|
|
323
|
+
function memberMatchesSymbol(member, seed) {
|
|
324
|
+
const symbolValues = [member.nativeId, member.name, member.qualifiedName, ...member.aliases].filter((value) => value !== undefined);
|
|
325
|
+
if (!symbolValues.includes(seed.symbol))
|
|
326
|
+
return false;
|
|
327
|
+
if (seed.exportName === undefined)
|
|
328
|
+
return true;
|
|
329
|
+
return symbolValues.includes(seed.exportName);
|
|
330
|
+
}
|
|
331
|
+
function resolvePathSeed(seed, mappings) {
|
|
332
|
+
const evidence = [{ artifact: "repository-binding", reference: `path:${seed.path}` }];
|
|
333
|
+
for (const mapping of mappings) {
|
|
334
|
+
for (const path of mapping.paths) {
|
|
335
|
+
if (path.path === seed.path)
|
|
336
|
+
evidence.push(mappingEvidence(mapping, "path", path.path));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return resolved(seed, [{ kind: "file", locator: seed.path }], evidence);
|
|
340
|
+
}
|
|
341
|
+
function resolveSymbolSeed(seed, mappings, correlation, source, revision) {
|
|
342
|
+
const mappingMatches = mappings.flatMap((mapping) => mapping.symbols
|
|
343
|
+
.filter((symbol) => symbol.path === seed.path &&
|
|
344
|
+
symbol.symbol === seed.symbol &&
|
|
345
|
+
(symbol.exportName ?? "") === (seed.exportName ?? ""))
|
|
346
|
+
.map((symbol) => ({ mapping, symbol })));
|
|
347
|
+
const evidence = mappingMatches.map(({ mapping, symbol }) => mappingEvidence(mapping, "symbol", symbolLocator(symbol.path, symbol.symbol, symbol.exportName)));
|
|
348
|
+
const candidates = new Map();
|
|
349
|
+
for (const entity of correlation?.canonicalEntities ?? []) {
|
|
350
|
+
if (!entityMatchesBinding(entity, source, revision))
|
|
351
|
+
continue;
|
|
352
|
+
if (entity.members.some((member) => member.path === seed.path && memberMatchesSymbol(member, seed))) {
|
|
353
|
+
candidates.set(entity.canonicalId, entity);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
const candidateIds = [...candidates.keys()].sort();
|
|
357
|
+
for (const canonicalId of candidateIds) {
|
|
358
|
+
evidence.push({ artifact: "provider-correlation", reference: canonicalId });
|
|
359
|
+
}
|
|
360
|
+
const hasAmbiguousEntity = [...candidates.values()].some((entity) => entity.status === "ambiguous" || entity.candidateCanonicalIds.length > 0);
|
|
361
|
+
if (mappingMatches.length > 1 || candidateIds.length > 1 || hasAmbiguousEntity) {
|
|
362
|
+
return unresolved(seed, "ambiguous", candidateIds, evidence);
|
|
363
|
+
}
|
|
364
|
+
if (mappingMatches.length === 0 && candidateIds.length === 0)
|
|
365
|
+
return unresolved(seed, "missing");
|
|
366
|
+
const exportName = seed.exportName ?? mappingMatches[0]?.symbol.exportName;
|
|
367
|
+
return resolved(seed, [{ kind: "symbol", locator: symbolLocator(seed.path, seed.symbol, exportName) }], evidence);
|
|
368
|
+
}
|
|
369
|
+
function resolveComponentSeed(seed, mappings) {
|
|
370
|
+
const matches = mappings.filter((mapping) => mapping.canonId === seed.componentId);
|
|
371
|
+
const evidence = matches.map((mapping) => ({
|
|
372
|
+
artifact: "canon",
|
|
373
|
+
reference: mapping.canonId,
|
|
374
|
+
}));
|
|
375
|
+
if (matches.length === 0)
|
|
376
|
+
return unresolved(seed, "missing");
|
|
377
|
+
if (matches.length > 1)
|
|
378
|
+
return unresolved(seed, "ambiguous", matches.map((mapping) => mapping.canonId), evidence);
|
|
379
|
+
const [mapping] = matches;
|
|
380
|
+
const targets = [
|
|
381
|
+
...mapping.paths.map((path) => ({ kind: "file", locator: path.path })),
|
|
382
|
+
...mapping.symbols.map((symbol) => ({
|
|
383
|
+
kind: "symbol",
|
|
384
|
+
locator: symbolLocator(symbol.path, symbol.symbol, symbol.exportName),
|
|
385
|
+
})),
|
|
386
|
+
...mapping.tests.map((test) => ({ kind: "test", locator: testLocator(test.path, test.selector) })),
|
|
387
|
+
];
|
|
388
|
+
return resolved(seed, targets, evidence.concat(mapping.paths.map((path) => mappingEvidence(mapping, "path", path.path)), mapping.symbols.map((symbol) => mappingEvidence(mapping, "symbol", symbolLocator(symbol.path, symbol.symbol, symbol.exportName))), mapping.tests.map((test) => mappingEvidence(mapping, "test", testLocator(test.path, test.selector)))));
|
|
389
|
+
}
|
|
390
|
+
function resolveSeed(seed, mappings, context, correlation) {
|
|
391
|
+
if (seed.kind === "path")
|
|
392
|
+
return resolvePathSeed(seed, mappings);
|
|
393
|
+
if (seed.kind === "symbol-export") {
|
|
394
|
+
return resolveSymbolSeed(seed, mappings, correlation, context.source, context.revision);
|
|
395
|
+
}
|
|
396
|
+
return resolveComponentSeed(seed, mappings);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Resolves only the supplied bounded seeds against the pinned repository,
|
|
400
|
+
* existing Canon mappings, and supplied correlation evidence. It never scans
|
|
401
|
+
* the repository or treats seed metadata as execution authority.
|
|
402
|
+
*/
|
|
403
|
+
export function resolveWorkingSetSeeds(input, context) {
|
|
404
|
+
const document = createWorkingSetSeeds(input);
|
|
405
|
+
const normalizedContext = normalizeContext(context);
|
|
406
|
+
const mappings = normalizedMappings(context.repositoryMappings);
|
|
407
|
+
const binding = normalizedContext.valid &&
|
|
408
|
+
compareRepository(document.repository, normalizedContext.repository) &&
|
|
409
|
+
document.revision === normalizedContext.revision;
|
|
410
|
+
const resolutions = document.seeds.map((seed) => binding
|
|
411
|
+
? resolveSeed(seed, mappings, { source: normalizedContext.source, revision: normalizedContext.revision }, context.correlation)
|
|
412
|
+
: unresolved(seed, "repository-mismatch"));
|
|
413
|
+
return Object.freeze({
|
|
414
|
+
kind: WORKING_SET_SEED_RESOLUTION_KIND,
|
|
415
|
+
schemaVersion: WORKING_SET_SEED_SCHEMA_VERSION,
|
|
416
|
+
task: document.task,
|
|
417
|
+
repository: document.repository,
|
|
418
|
+
revision: document.revision,
|
|
419
|
+
binding: binding ? "matched" : "mismatch",
|
|
420
|
+
resolutions: Object.freeze(resolutions),
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
/** Resolves one already-canonical seed with the same bounded rules. */
|
|
424
|
+
export function resolveWorkingSetSeed(seed, context) {
|
|
425
|
+
const document = createWorkingSetSeeds({
|
|
426
|
+
task: { taskId: "single-seed", intent: "investigate" },
|
|
427
|
+
repository: context.repository,
|
|
428
|
+
revision: context.revision,
|
|
429
|
+
seeds: [seed],
|
|
430
|
+
});
|
|
431
|
+
return resolveWorkingSetSeeds(document, context).resolutions[0] ?? unresolved(document.seeds[0], "missing");
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=seeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/working-set/seeds.ts"],"names":[],"mappings":"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"}
|
package/docs/USAGE.md
CHANGED
|
@@ -38,9 +38,9 @@ reviewed. The command prints the manifest path. Keep the directory named by
|
|
|
38
38
|
|
|
39
39
|
## Build a provider matrix
|
|
40
40
|
|
|
41
|
-
`matrix` runs the matrix workflow for one revision and requires
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
`matrix` runs the matrix workflow for one explicit revision and requires a
|
|
42
|
+
retained output directory. Pass a full 40-character commit SHA with
|
|
43
|
+
`--revision`; unlike `run`, `matrix` never falls back to `HEAD`.
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
46
|
wabachi matrix . --revision 0123456789abcdef0123456789abcdef01234567 --out ./artifacts/matrix
|
|
@@ -52,7 +52,7 @@ configured provider workflow, pass a JSON configuration file with the source,
|
|
|
52
52
|
revision, provider IDs, and addition order:
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
wabachi matrix --config ./matrix-workflow.json
|
|
55
|
+
wabachi matrix --config ./matrix-workflow.json --out ./artifacts/matrix
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
The configured provider set must match the providers registered by the
|
|
@@ -61,33 +61,42 @@ installed Wabachi version.
|
|
|
61
61
|
## Architecture Canon
|
|
62
62
|
|
|
63
63
|
Architecture Canon authoring is an explicit file-editing step. Wabachi does
|
|
64
|
-
not provide an init or edit command. Create or revise the
|
|
65
|
-
the repository's documented
|
|
64
|
+
not provide an init or edit command. Create or revise the conventional
|
|
65
|
+
`.wabachi/architecture.json` document using the repository's documented
|
|
66
|
+
schema, then validate it before rendering. To discover the current Canon shape
|
|
67
|
+
and obtain a minimal valid starting document, run the read-only example command
|
|
68
|
+
and redirect it explicitly:
|
|
66
69
|
|
|
67
70
|
```bash
|
|
68
|
-
wabachi architecture
|
|
69
|
-
|
|
71
|
+
wabachi architecture --help
|
|
72
|
+
mkdir -p .wabachi
|
|
73
|
+
wabachi architecture example > ./.wabachi/architecture.json
|
|
70
74
|
```
|
|
71
75
|
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
The example is printed from the installed package and is not written by
|
|
77
|
+
Wabachi. It is a starting point for explicit authoring, not an implicit init or
|
|
78
|
+
edit workflow. Omitted-file validation and rendering resolve exactly
|
|
79
|
+
`.wabachi/architecture.json`; an explicit `<file>` remains an override.
|
|
74
80
|
|
|
75
81
|
```bash
|
|
76
|
-
wabachi architecture
|
|
82
|
+
wabachi architecture validate
|
|
83
|
+
wabachi architecture validate ./.wabachi/architecture.json --json
|
|
77
84
|
```
|
|
78
85
|
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
Rendering uses the bundled React Flow + ELK renderer and requires only the
|
|
87
|
+
supported Node.js/npm environment. No Java, Docker, Chromium, Structurizr,
|
|
88
|
+
CDN, or network access is required by the render command. Wabachi writes the
|
|
89
|
+
generated documentation and local static diagrams beneath the directory passed
|
|
90
|
+
to `--out`:
|
|
81
91
|
|
|
82
92
|
```bash
|
|
83
|
-
wabachi architecture render ./
|
|
84
|
-
--out ./artifacts/site \
|
|
85
|
-
--structurizr-command /opt/structurizr/structurizr.sh
|
|
93
|
+
wabachi architecture render --out ./artifacts/site
|
|
86
94
|
```
|
|
87
95
|
|
|
88
|
-
The normal documentation path is: author the
|
|
89
|
-
|
|
90
|
-
`wabachi skill architecture-documentation`.
|
|
96
|
+
The normal documentation path is: author the conventional Canon, validate it,
|
|
97
|
+
then render it into a retained site. The matching live playbook is
|
|
98
|
+
`wabachi skill architecture-documentation`. Passing an explicit Canon path to
|
|
99
|
+
either command preserves the same workflow for another file.
|
|
91
100
|
|
|
92
101
|
## Common failures and recovery
|
|
93
102
|
|
|
@@ -99,9 +108,8 @@ same file, then render it into a retained site. The matching live playbook is
|
|
|
99
108
|
with the installed provider set.
|
|
100
109
|
- If Canon validation fails, fix the reported document issue and validate the
|
|
101
110
|
same file again before rendering. `--json` is useful for automation.
|
|
102
|
-
- If rendering fails
|
|
103
|
-
|
|
104
|
-
executable override and inspect the retained output directory.
|
|
111
|
+
- If rendering fails, validate the Canon and inspect the bounded output
|
|
112
|
+
directory. The render command does not invoke an external diagram executable.
|
|
105
113
|
- If syntax is uncertain, stop relying on a copied example and resolve the
|
|
106
114
|
current contract with `wabachi architecture --help` or the relevant leaf
|
|
107
115
|
help. Unsupported commands fail closed.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"canonVersion": 1,
|
|
3
|
+
"documentId": "minimal-architecture-canon",
|
|
4
|
+
"root": { "kind": "architecture", "id": "architecture" },
|
|
5
|
+
"elements": [],
|
|
6
|
+
"interfaces": [],
|
|
7
|
+
"relationships": [],
|
|
8
|
+
"responsibilities": { "responsibilities": [] },
|
|
9
|
+
"authority": { "authority": [], "ownership": [] },
|
|
10
|
+
"boundaries": [],
|
|
11
|
+
"constraints": [],
|
|
12
|
+
"flows": [],
|
|
13
|
+
"deployment": {
|
|
14
|
+
"runtimeEnvironments": [],
|
|
15
|
+
"deploymentNodes": [],
|
|
16
|
+
"deploymentInstances": [],
|
|
17
|
+
"infrastructureReferences": [],
|
|
18
|
+
"mappings": []
|
|
19
|
+
},
|
|
20
|
+
"repositoryMappings": [],
|
|
21
|
+
"decisions": { "decisions": [], "references": [], "referenceAttachments": [] },
|
|
22
|
+
"views": [],
|
|
23
|
+
"globalIdentityRegistry": { "entries": [{ "id": "architecture", "namespace": "architecture" }] }
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wabachi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Repository analysis and Architecture Canon tooling for deterministic codebase understanding.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,20 +11,27 @@
|
|
|
11
11
|
"README.md",
|
|
12
12
|
"LICENSE",
|
|
13
13
|
"docs/USAGE.md",
|
|
14
|
+
"docs/examples",
|
|
14
15
|
"skills",
|
|
15
16
|
".codex-plugin"
|
|
16
17
|
],
|
|
17
18
|
"dependencies": {
|
|
19
|
+
"@xyflow/react": "12.11.6",
|
|
18
20
|
"@sourcegraph/scip-typescript": "0.4.0",
|
|
21
|
+
"elkjs": "0.12.0",
|
|
22
|
+
"react": "19.3.0",
|
|
23
|
+
"react-dom": "19.3.0",
|
|
19
24
|
"typescript": "^6.0.3"
|
|
20
25
|
},
|
|
21
26
|
"devDependencies": {
|
|
22
27
|
"@types/node": "^26.5.1",
|
|
23
|
-
"
|
|
28
|
+
"@types/react": "19.3.0",
|
|
29
|
+
"@types/react-dom": "19.3.0",
|
|
30
|
+
"eslint": "10.10.0",
|
|
24
31
|
"js-yaml": "^4.1.0",
|
|
25
32
|
"prettier": "3.9.6",
|
|
26
33
|
"tsx": "^4.23.12",
|
|
27
|
-
"typescript-eslint": "8.
|
|
34
|
+
"typescript-eslint": "8.70.0"
|
|
28
35
|
},
|
|
29
36
|
"engines": {
|
|
30
37
|
"node": ">=24"
|
package/skills/wabachi/SKILL.md
CHANGED
|
@@ -24,7 +24,16 @@ syntax for each command through its progressive help pointer, for example:
|
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
26
|
wabachi architecture --help
|
|
27
|
-
wabachi architecture
|
|
27
|
+
wabachi architecture example
|
|
28
|
+
wabachi architecture validate
|
|
29
|
+
wabachi architecture render --out ./artifacts/site
|
|
28
30
|
```
|
|
29
31
|
|
|
32
|
+
Omitted-file validation and rendering use `.wabachi/architecture.json` only.
|
|
33
|
+
Pass an explicit Canon path to either command when overriding that default.
|
|
34
|
+
|
|
35
|
+
Architecture rendering is npm-native and uses the bundled React Flow + ELK
|
|
36
|
+
renderer. The default render path does not require Java, Docker, Chromium,
|
|
37
|
+
Structurizr, CDN, or network access.
|
|
38
|
+
|
|
30
39
|
Use `--json` on `skill` or help when a machine-readable projection is needed.
|