wabachi 0.2.0 → 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 +6 -0
- package/LICENSE +1 -1
- package/README.md +17 -21
- package/dist/architecture/cli.js +51 -36
- 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 +53 -14
- package/dist/cli.js.map +1 -1
- package/dist/command-contract.d.ts +78 -0
- package/dist/command-contract.js +194 -0
- package/dist/command-contract.js.map +1 -0
- 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/skill.d.ts +47 -0
- package/dist/skill.js +160 -0
- package/dist/skill.js.map +1 -0
- 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 +118 -0
- package/docs/examples/minimal-canon.json +24 -0
- package/package.json +14 -4
- package/skills/wabachi/SKILL.md +39 -0
|
@@ -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
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Wabachi usage
|
|
2
|
+
|
|
3
|
+
Wabachi is a deterministic repository-analysis and Architecture Canon CLI.
|
|
4
|
+
This manual explains the normal workflows for people. The installed command
|
|
5
|
+
contract is authoritative: use `wabachi --help`, progressive command help, and
|
|
6
|
+
`wabachi skill` for the exact current syntax.
|
|
7
|
+
|
|
8
|
+
## Install and discover
|
|
9
|
+
|
|
10
|
+
Wabachi requires Node.js 24 or newer.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install --global wabachi
|
|
14
|
+
wabachi --version
|
|
15
|
+
wabachi --help
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For an ephemeral run, use `npx --yes wabachi --help`. Agents can begin with
|
|
19
|
+
`wabachi skill` and then request one bounded playbook with
|
|
20
|
+
`wabachi skill <scenario>`. Add `--json` to skill or help when consuming the
|
|
21
|
+
projection from a script.
|
|
22
|
+
|
|
23
|
+
## Analyze a repository
|
|
24
|
+
|
|
25
|
+
`run` resolves a repository and executes the registered analysis providers. It
|
|
26
|
+
can use the default revision resolution or an explicit revision, and writes a
|
|
27
|
+
manifest plus provider output under a temporary directory unless `--out` is
|
|
28
|
+
provided.
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
wabachi run .
|
|
32
|
+
wabachi run . --revision HEAD --out ./artifacts/run
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Use a commit SHA or another stable ref when the result will be compared or
|
|
36
|
+
reviewed. The command prints the manifest path. Keep the directory named by
|
|
37
|
+
`--out` if downstream work needs the facts or provider outputs.
|
|
38
|
+
|
|
39
|
+
## Build a provider matrix
|
|
40
|
+
|
|
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
|
+
|
|
45
|
+
```bash
|
|
46
|
+
wabachi matrix . --revision 0123456789abcdef0123456789abcdef01234567 --out ./artifacts/matrix
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The command prints the report path. The output directory also contains the
|
|
50
|
+
supporting facts and correlation artifacts used to produce the report. For a
|
|
51
|
+
configured provider workflow, pass a JSON configuration file with the source,
|
|
52
|
+
revision, provider IDs, and addition order:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
wabachi matrix --config ./matrix-workflow.json --out ./artifacts/matrix
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The configured provider set must match the providers registered by the
|
|
59
|
+
installed Wabachi version.
|
|
60
|
+
|
|
61
|
+
## Architecture Canon
|
|
62
|
+
|
|
63
|
+
Architecture Canon authoring is an explicit file-editing step. Wabachi does
|
|
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:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
wabachi architecture --help
|
|
72
|
+
mkdir -p .wabachi
|
|
73
|
+
wabachi architecture example > ./.wabachi/architecture.json
|
|
74
|
+
```
|
|
75
|
+
|
|
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.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
wabachi architecture validate
|
|
83
|
+
wabachi architecture validate ./.wabachi/architecture.json --json
|
|
84
|
+
```
|
|
85
|
+
|
|
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`:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
wabachi architecture render --out ./artifacts/site
|
|
94
|
+
```
|
|
95
|
+
|
|
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.
|
|
100
|
+
|
|
101
|
+
## Common failures and recovery
|
|
102
|
+
|
|
103
|
+
- If a repository cannot be resolved, confirm the path or remote and retry
|
|
104
|
+
`run` with an explicit revision. Preserve the printed diagnostic when the
|
|
105
|
+
failure needs investigation.
|
|
106
|
+
- If `matrix` rejects a revision, use a full commit SHA and provide `--out`.
|
|
107
|
+
If a configuration is rejected, compare its provider IDs and addition order
|
|
108
|
+
with the installed provider set.
|
|
109
|
+
- If Canon validation fails, fix the reported document issue and validate the
|
|
110
|
+
same file again before rendering. `--json` is useful for automation.
|
|
111
|
+
- If rendering fails, validate the Canon and inspect the bounded output
|
|
112
|
+
directory. The render command does not invoke an external diagram executable.
|
|
113
|
+
- If syntax is uncertain, stop relying on a copied example and resolve the
|
|
114
|
+
current contract with `wabachi architecture --help` or the relevant leaf
|
|
115
|
+
help. Unsupported commands fail closed.
|
|
116
|
+
|
|
117
|
+
Generated outputs are ordinary retained files; Wabachi does not publish them
|
|
118
|
+
or activate an agent plugin as a side effect of npm installation.
|
|
@@ -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": {
|
|
@@ -9,19 +9,29 @@
|
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
11
|
"README.md",
|
|
12
|
-
"LICENSE"
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"docs/USAGE.md",
|
|
14
|
+
"docs/examples",
|
|
15
|
+
"skills",
|
|
16
|
+
".codex-plugin"
|
|
13
17
|
],
|
|
14
18
|
"dependencies": {
|
|
19
|
+
"@xyflow/react": "12.11.6",
|
|
15
20
|
"@sourcegraph/scip-typescript": "0.4.0",
|
|
21
|
+
"elkjs": "0.12.0",
|
|
22
|
+
"react": "19.3.0",
|
|
23
|
+
"react-dom": "19.3.0",
|
|
16
24
|
"typescript": "^6.0.3"
|
|
17
25
|
},
|
|
18
26
|
"devDependencies": {
|
|
19
27
|
"@types/node": "^26.5.1",
|
|
20
|
-
"
|
|
28
|
+
"@types/react": "19.3.0",
|
|
29
|
+
"@types/react-dom": "19.3.0",
|
|
30
|
+
"eslint": "10.10.0",
|
|
21
31
|
"js-yaml": "^4.1.0",
|
|
22
32
|
"prettier": "3.9.6",
|
|
23
33
|
"tsx": "^4.23.12",
|
|
24
|
-
"typescript-eslint": "8.
|
|
34
|
+
"typescript-eslint": "8.70.0"
|
|
25
35
|
},
|
|
26
36
|
"engines": {
|
|
27
37
|
"node": ">=24"
|