@mmerterden/multi-agent-pipeline 20.9.0 → 20.10.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/CHANGELOG.md CHANGED
@@ -16,6 +16,12 @@ Internal file-layout changes that don't affect the slash-command surface are sti
16
16
 
17
17
  ## [Unreleased]
18
18
 
19
+ ## [20.10.0] - 2026-09-28
20
+
21
+ ### Added
22
+
23
+ - The repo profile derives `di.validateMethod`, the registrar method that checks the wiring, separately from `di.registerMethod`, so a registrar with one of each yields both instead of whichever the count favours; `di.injectAttribute` recognises a keyed `@Dependency` wrapper. `validateMethod` is optional in `repo-profile.schema.json`, so a stored profile without it stays valid.
24
+
19
25
  ## [20.9.0] - 2026-09-27
20
26
 
21
27
  ### Changed
package/docs/facts.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "Generated by pipeline/scripts/gen-facts.mjs. Do not hand-edit: the site reads this, and a number edited here instead of at its source is the drift this file removes.",
3
- "generatedAt": "2026-09-27",
4
- "version": "20.9.0",
3
+ "generatedAt": "2026-09-28",
4
+ "version": "20.10.0",
5
5
  "phaseSchema": 2,
6
6
  "phases": [
7
7
  {
package/manifest.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.9.0",
4
- "commit": "6376813f716c832343373818aec8ff9353e1c2af",
5
- "generatedAt": "2026-09-27T13:51:52.309Z",
3
+ "version": "20.10.0",
4
+ "commit": "ffc4f8074972531eb3e882e932c29ff63f0ae845",
5
+ "generatedAt": "2026-09-28T10:25:30.524Z",
6
6
  "algorithm": "sha256",
7
7
  "fileCount": 1227,
8
8
  "files": {
9
- "CHANGELOG.md": "c20ea4d71f35454a3caff76fe8878f22b260c3ed8768c1c21f42603a6ea23d1d",
9
+ "CHANGELOG.md": "77f53924e2a1ba32035e9fa1690fc4ed95fefd6f84c318aedad0533d942a8e40",
10
10
  "LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
11
11
  "README.md": "0613eebb0b38062bd94c44043595d1950b5c9b470874dd8e402c052fd20960cf",
12
12
  "README.tr.md": "0c6b5e6943d6c3d3bf3a7ed99c705fb9a78d15d7722e6252f58404d3f6d3524d",
@@ -33,7 +33,7 @@
33
33
  "docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
34
34
  "docs/ecosystem.md": "e6c00f30e95b5e178f77bdfbefd686c8a4164f39c03865a89ab23465d1a37acf",
35
35
  "docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
36
- "docs/facts.json": "519125337473d715b0fd0467944aeefea2cc8e037e86cb1daf752b07f42f0485",
36
+ "docs/facts.json": "4cb62f5043b4010101e67069d0f99ee94d84e8f25c558c52f22628c63bc6b33e",
37
37
  "docs/features.md": "6c9f0efb00c683e6f611c440c87847b187f8b0eee59e9e812f3a241695bc2ae1",
38
38
  "docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
39
39
  "docs/recovery-guide.md": "59a8f1b66b34cb9ff5507b3d54dac3b9915e184aa044d9c758d18cac818d510e",
@@ -62,7 +62,7 @@
62
62
  "install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
63
63
  "install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
64
64
  "install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
65
- "package.json": "d11daaab9b0284f5068975a79484016c0c1ef93783255c0fbc29aea8d4e36abb",
65
+ "package.json": "a410a59d303611c205a5c870cf63d7ed642e3fa74242fdda73d109bf886d66f6",
66
66
  "pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
67
67
  "pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
68
68
  "pipeline/agents/bulk-reader.md": "6597052cd7d205bac2b1c7633f5232fe1a40730664a913b8eb77efd5a786dc25",
@@ -207,7 +207,7 @@
207
207
  "pipeline/lib/regular-file.mjs": "084dd2c98a664a1e4a937757cc5e5e5d7e162b6aa422f8c7cfdb27f7834c6cbc",
208
208
  "pipeline/lib/repo-cache.sh": "82bbdd3d61746042ad5341554a1077098d4b56f15caf6c5cc092377a273c8f45",
209
209
  "pipeline/lib/repo-hygiene.sh": "67f4227d2bc84198d51205f1f16d055e76a07fe11a4e5c2b8103559c44cefa04",
210
- "pipeline/lib/repo-profile-derive.mjs": "25f22468d6032e0be9b9e7e8f3266cb3b1029654f94706a546593524e4da0e8e",
210
+ "pipeline/lib/repo-profile-derive.mjs": "0a581bda0681edd83de9817bfc81c64a5c99fd0392fe4228c8b8300843c0e815",
211
211
  "pipeline/lib/repo-profile.mjs": "4da219c9f72f3d74cfe42d9ff8685d4f53a8426c347cef85f0c2a737ac275133",
212
212
  "pipeline/lib/require-jq.sh": "a137b4df202515c2b89d5b93c3e28b04c73c8bc2f7c42be9ca9a22926e042918",
213
213
  "pipeline/lib/review-watch.sh": "89a53f79aab902a39ab8301cabe6eb54c8dc854af4d97c024c6b3b1f3ab38a75",
@@ -274,7 +274,7 @@
274
274
  "pipeline/multi-agent-refs/features/plan-todos.md": "8780d80b4541daee2b05080759a0694ef7e6270abe9a4621deb92ec7bac94e8e",
275
275
  "pipeline/multi-agent-refs/features/prior-fix-detection.md": "9bd172fa116b0c334576ee3df2dc478810a7e282422410e045be74ac2299253d",
276
276
  "pipeline/multi-agent-refs/features/repo-map.md": "9102f95d5c819c3bce3dc992cc98c67657e83f1fbc77d2e9b3d16b040bfab9f6",
277
- "pipeline/multi-agent-refs/features/repo-profile.md": "6f9a33c28c37cb9ab8298c282617bbce165481b89cc40683dba884a42bf227b3",
277
+ "pipeline/multi-agent-refs/features/repo-profile.md": "6080ba20a4246c448d675d4712c63c16892b0baadca18cebdc6887696edb5e30",
278
278
  "pipeline/multi-agent-refs/features/research.md": "776c9f3b644f8ff355108000b4a7381ff173e38811e8e2a73ef66e756d60c169",
279
279
  "pipeline/multi-agent-refs/features/review-decision.md": "ac7bf33ec86c311680d9ae8a4d1d0d0b564d0bf0cfe80e270cc98d3abceb65cb",
280
280
  "pipeline/multi-agent-refs/features/review-delta.md": "740cbefbd705a013b708921f2265f12d54d96823f1c46b5c1e644ebbdf7a8f85",
@@ -391,7 +391,7 @@
391
391
  "pipeline/schemas/planning-output.schema.json": "bc6eda32ecd435cf84d846078f9d38347f8f741f8a427cff15913dd6c380d4b8",
392
392
  "pipeline/schemas/pr-request.schema.json": "ae75c4856349d62834802b1189af516bb6fb3d36646831b7ff2fa61d938afcd0",
393
393
  "pipeline/schemas/prefs.schema.json": "c327827b65c01cec5c73fdde0b4ad553daf157fb7786c4d0e97a335cfc687282",
394
- "pipeline/schemas/repo-profile.schema.json": "80d530f82a246c797397ab3f6ad040811e79137a4375d84a3efe9efc885b5d5a",
394
+ "pipeline/schemas/repo-profile.schema.json": "1a74ef8330da9a26a5a70955f6f9cbb20eda54a8615efaf86c7993d420a7f04e",
395
395
  "pipeline/schemas/research-output.schema.json": "54e3ba1b04fdc20fbaa84333b943a8ab95d1395c7b0e0aedc67929184cb49523",
396
396
  "pipeline/schemas/review-file-exclusions.json": "2e8c44b45d21d2c82fc95aa2bf76ad3fbf2d5c68180c7b2ebf89c4a926688d77",
397
397
  "pipeline/schemas/review-file-exclusions.schema.json": "d7310b4328ae14673f0971c9f823a697d3cafe054062a680ef0f020be1867ea3",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.9.0",
3
+ "version": "20.10.0",
4
4
  "description": "6-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -1188,8 +1188,16 @@ const DOMAIN_RE = {
1188
1188
  tokens: /token|colou?r|typograph|spacing|radius|font/i,
1189
1189
  };
1190
1190
  const INJECT_RE =
1191
- /@(Inject|Injected|LazyInjected|WeakLazyInjected|Injection|InjectedObject|Autowired)\b/g;
1192
- const INJECT_LITERALS = ["@Inject", "@LazyInjected", "@WeakLazyInjected", "@Autowired"];
1191
+ /@(Inject|Injected|LazyInjected|WeakLazyInjected|Injection|InjectedObject|Autowired|Dependency)\b/g;
1192
+ const INJECT_LITERALS = [
1193
+ "@Inject",
1194
+ "@LazyInjected",
1195
+ "@WeakLazyInjected",
1196
+ "@Autowired",
1197
+ "@Dependency",
1198
+ ];
1199
+ // A registrar method that checks the wiring rather than performing it.
1200
+ const VALIDATE_METHOD_RE = /^(?:validat|verif|check)/i;
1193
1201
  const MOCK_RE =
1194
1202
  /import (Mockingbird|Cuckoo|MockSwift|SwiftyMocky|Mockolo)\b|\b(io\.mockk|org\.mockito|jest\.mock|unittest\.mock|gomock|sinon)\b/g;
1195
1203
  const MOCK_LITERALS = [
@@ -1365,6 +1373,7 @@ function deriveDi(top, files, usage, conventions, language) {
1365
1373
  if (!family || list.length > family[1].length) family = [word, list];
1366
1374
  let registrarSuffix = role(null);
1367
1375
  let registerMethod = role(null);
1376
+ let validateMethod = role(null);
1368
1377
  const suffix =
1369
1378
  family && family[1].length >= 2
1370
1379
  ? commonSuffix(family[1].map((f) => posix.basename(f).replace(/\.\w+$/, "")))
@@ -1396,15 +1405,15 @@ function deriveDi(top, files, usage, conventions, language) {
1396
1405
  }
1397
1406
  });
1398
1407
  }
1399
- const top1 = topCount(methods);
1400
- if (top1 && top1[1] >= 2) {
1401
- registerMethod = role(
1402
- top1[0],
1403
- [where.get(top1[0])],
1404
- top1[1] >= 5 ? "high" : "medium",
1405
- `${top1[1]} registrars`,
1406
- );
1407
- }
1408
+ const pick = (keep) => {
1409
+ const m = new Map([...methods].filter(([name]) => keep(name)));
1410
+ const t = topCount(m);
1411
+ return t && t[1] >= 2
1412
+ ? role(t[0], [where.get(t[0])], t[1] >= 5 ? "high" : "medium", `${t[1]} registrars`)
1413
+ : role(null);
1414
+ };
1415
+ registerMethod = pick((name) => !VALIDATE_METHOD_RE.test(name));
1416
+ validateMethod = pick((name) => VALIDATE_METHOD_RE.test(name));
1408
1417
  }
1409
1418
  if (registrarSuffix.value === null && conventions?.diRegistration?.pattern) {
1410
1419
  registrarSuffix.note = `extract-conventions: ${conventions.diRegistration.pattern}`;
@@ -1424,7 +1433,7 @@ function deriveDi(top, files, usage, conventions, language) {
1424
1433
  a && a[1] >= 2
1425
1434
  ? role(a[0], where.get(a[0]), a[1] >= 20 ? "high" : "medium", `${a[1]} uses`)
1426
1435
  : role(null);
1427
- return { registrarSuffix, registerMethod, injectAttribute };
1436
+ return { registrarSuffix, registerMethod, validateMethod, injectAttribute };
1428
1437
  }
1429
1438
 
1430
1439
  const MANIFESTS = new Set([
@@ -19,7 +19,7 @@ Every role is `{ value, source, evidence, confidence }`. `source` is `derived`,
19
19
  | `commit.format` | last 200 non-merge, non-bot subjects: ticket `prefix` / `suffix` / `none` by majority, its style (`[KEY-123]`, `KEY-123:`), whether a conventional scope is required. A trailing `(#123)` is the host's PR number and is ignored |
20
20
  | `repo.workBranch`, `repo.defaultBranch` | `pull_request: branches:` targets in workflows, else `push: branches:` targets, else the most active of the usual integration branches, remote or local; `origin/HEAD` |
21
21
  | `build`, `test`, `lint` | CI `run:` steps, exact flags kept, continuations joined; `high` when a pull request triggers the step or it appears twice; `-testPlan` values and `*.xctestplan` files; `package.json` scripts as a low-confidence fallback |
22
- | `accessors.*`, `di.*` | top-level types a generated localization / testing-id / token tree declares, ranked by `<Root>.<Seg>.<Seg>` usage outside it; the registrar suffix is the compound most files of the commonest `Registrar` / `Configurator` / `Assembly` / `Container` / `Module` family end in, read from the file names; its common method; the inject attribute. `--conventions <file>` or `--with-conventions <platform>` folds in `extract-conventions.sh` buckets |
22
+ | `accessors.*`, `di.*` | top-level types a generated localization / testing-id / token tree declares, ranked by `<Root>.<Seg>.<Seg>` usage outside it; the registrar suffix is the compound most files of the commonest `Registrar` / `Configurator` / `Assembly` / `Container` / `Module` family end in, read from the file names; its commonest registration method (`registerMethod`) and, apart from it, its commonest `validate*` / `verify*` / `check*` method (`validateMethod`); the inject attribute (`@Inject`, `@Injected`, `@Dependency` and similar keyed wrappers). `--conventions <file>` or `--with-conventions <platform>` folds in `extract-conventions.sh` buckets |
23
23
  | `module`, `mock` | repeated module manifests as a glob; a module validator script or step; mock framework imports or a fixture tree; a `Custom*` tree beside a generated one. `mock.system` and `di.injectAttribute` count only files of the repo's dominant language and carry `file:line` evidence; otherwise they are `null` |
24
24
  | `hooks[]` | `.githooks/`, `scripts/git-hooks/`, `.husky/`, pre-commit and lefthook configs; side effects `amends-commit`, `stages-files`, `writes-files`, `network`; the script that sets `core.hooksPath` |
25
25
  | `requiredChecks[]`, `docs.authoritative[]`, `inRepoSkills[]` | workflow jobs with a `required` comment (always low); the documents `claude-md-links.mjs` admits from the repo's `CLAUDE.md` files (same bounds, evidence is the CLAUDE.md that points at it); `.claude/skills/*/SKILL.md` with `trigger: explicit` when `disable-model-invocation: true` |
@@ -752,7 +752,38 @@
752
752
  },
753
753
  "registerMethod": {
754
754
  "type": "object",
755
- "description": "Method a registrar implements.",
755
+ "description": "Method a registrar implements to perform the registration.",
756
+ "additionalProperties": false,
757
+ "required": ["value", "source", "evidence", "confidence"],
758
+ "properties": {
759
+ "value": {
760
+ "anyOf": [
761
+ {
762
+ "type": "string",
763
+ "minLength": 1
764
+ },
765
+ {
766
+ "type": "null"
767
+ }
768
+ ]
769
+ },
770
+ "source": {
771
+ "$ref": "#/$defs/source"
772
+ },
773
+ "evidence": {
774
+ "$ref": "#/$defs/evidence"
775
+ },
776
+ "confidence": {
777
+ "$ref": "#/$defs/confidence"
778
+ },
779
+ "note": {
780
+ "type": "string"
781
+ }
782
+ }
783
+ },
784
+ "validateMethod": {
785
+ "type": "object",
786
+ "description": "Method a registrar implements to check that what its units read is wired (validate, verify, check). Optional: profiles derived before it existed omit it.",
756
787
  "additionalProperties": false,
757
788
  "required": ["value", "source", "evidence", "confidence"],
758
789
  "properties": {