@event4u/agent-config 17.1.0 → 17.2.1

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.
Files changed (73) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +92 -0
  5. package/README.md +2 -2
  6. package/dist/agent-src/commands/project/analyze.md +9 -6
  7. package/dist/agent-src/commands/project/map.md +58 -0
  8. package/dist/agent-src/commands/project.md +5 -3
  9. package/dist/agent-src/skills/code-intelligence/SKILL.md +6 -0
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/cli/registry.js +1 -1
  12. package/dist/cli-delegate/cmd_conformance.js +23 -39
  13. package/dist/discovery/deprecation-report.md +1 -1
  14. package/dist/discovery/discovery-manifest.json +39 -13
  15. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  16. package/dist/discovery/discovery-manifest.summary.md +3 -3
  17. package/dist/discovery/dormancy-report.md +1 -1
  18. package/dist/discovery/orphan-report.md +1 -1
  19. package/dist/discovery/packs.json +6 -5
  20. package/dist/discovery/trust-report.md +2 -2
  21. package/dist/discovery/workspaces.json +5 -4
  22. package/dist/hooks/dispatch.js +65 -74
  23. package/dist/hooks/dispatch.sha256 +1 -1
  24. package/dist/hooks/instructions_observer.chunk.cjs +301 -0
  25. package/dist/hooks/instructions_observer.chunk.cjs.sha256 +1 -0
  26. package/dist/mcp/registry-manifest.json +2 -2
  27. package/dist/mcp/server.json +2 -2
  28. package/dist/mcp/server.mjs +33058 -22930
  29. package/package.json +4 -1
  30. package/src/config/continuity-surface.json +7 -0
  31. package/src/config/evaluator-budgets.json +4 -4
  32. package/src/config/gate-violation-baselines.json +3 -3
  33. package/src/config/gitignore-block.txt +6 -0
  34. package/src/config/hook-bundle-budget.json +17 -2
  35. package/src/config/hook-token-budget.json +1 -1
  36. package/src/config/packed-binary-manifest.json +27 -0
  37. package/src/config/skill-body-budget.json +7 -1
  38. package/src/scripts/_lib/bench_ab_complexity.ts +14 -2
  39. package/src/scripts/_lib/collector_record.ts +1 -0
  40. package/src/scripts/_lib/runtime_journal.ts +7 -7
  41. package/src/scripts/code_graph/build.ts +210 -10
  42. package/src/scripts/code_graph/cli.ts +168 -46
  43. package/src/scripts/code_graph/detect.ts +5 -4
  44. package/src/scripts/code_graph/docs_layer.ts +57 -0
  45. package/src/scripts/code_graph/extract.ts +58 -13
  46. package/src/scripts/code_graph/extract_more.ts +314 -0
  47. package/src/scripts/code_graph/laravel_overlay.ts +454 -0
  48. package/src/scripts/code_graph/map.ts +846 -0
  49. package/src/scripts/code_graph/map_model.ts +977 -0
  50. package/src/scripts/code_graph/map_verify.ts +140 -0
  51. package/src/scripts/code_graph/map_viewer/viewer.css +278 -0
  52. package/src/scripts/code_graph/map_viewer/viewer.js +756 -0
  53. package/src/scripts/code_graph/scip_reader.ts +201 -0
  54. package/src/scripts/code_graph/sqlite_store.ts +8 -1
  55. package/src/scripts/code_graph/types.ts +81 -15
  56. package/src/scripts/code_graph/validate.ts +16 -26
  57. package/src/scripts/code_graph/verbs.ts +7 -0
  58. package/src/scripts/hook_chunks.mjs +7 -0
  59. package/src/scripts/hook_manifest.json +1 -1
  60. package/src/scripts/hook_manifest.yaml +20 -0
  61. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  62. package/src/scripts/hooks/instructions_observer_hook.ts +25 -6
  63. package/src/scripts/hooks/lazy_concern.ts +4 -0
  64. package/src/scripts/install-hooks.sh +5 -0
  65. package/src/scripts/lint_agents_layout.ts +2 -0
  66. package/src/scripts/lint_hook_manifest.ts +1 -0
  67. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -6
  68. package/src/scripts/mcp_server/graph_tools.ts +73 -1
  69. package/src/scripts/mcp_server/tools.ts +19 -36
  70. package/src/vendor/grammars/README.md +10 -5
  71. package/src/vendor/grammars/tree-sitter-go.wasm +0 -0
  72. package/src/vendor/grammars/tree-sitter-java.wasm +0 -0
  73. package/src/vendor/grammars/tree-sitter-python.wasm +0 -0
@@ -1,8 +1,8 @@
1
1
  # Discovery Manifest — Summary
2
2
 
3
- - Generated: `2026-10-23T06:28:42Z`
3
+ - Generated: `2026-10-23T14:16:10Z`
4
4
  - Scanner: `de0a22b4ac4c`
5
- - Artefacts: **636**
5
+ - Artefacts: **637**
6
6
  - Unassigned: **0**
7
7
 
8
8
  ## `engineering` — Engineering
@@ -106,7 +106,7 @@
106
106
 
107
107
  | Pack | Artefacts |
108
108
  |---|---|
109
- | `meta` — Meta | 307 |
109
+ | `meta` — Meta | 308 |
110
110
  | `memory` — Memory | 8 |
111
111
  | `analytics` — Analytics | 4 |
112
112
  | `product-reasoning` — Product Reasoning | 12 |
@@ -1,6 +1,6 @@
1
1
  # Discovery — Dormancy Report
2
2
 
3
- - Generated: `2026-10-23T06:28:42Z`
3
+ - Generated: `2026-10-23T14:16:10Z`
4
4
  - Window: **6 months** without a commit
5
5
 
6
6
  > Dormancy triggers **review, never auto-deprecation**
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-10-23T06:28:42Z`
3
+ - Generated: `2026-10-23T14:16:10Z`
4
4
  - Orphan artefacts: **0**
5
5
 
6
6
  > An orphan is an artefact whose declared pack has no other members.
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:bd2c2d43c509910e8aefc47e34982aa12079b4cc772d9f1380226df82bb2b0e7",
3
- "generated_at": "2026-10-23T06:28:42Z",
2
+ "checksum": "sha256:78594c2e14f67a1cb0b14a85d62c2ccdc967977ab6bf4bf0f1a869d1a91d4e35",
3
+ "generated_at": "2026-10-23T14:16:10Z",
4
4
  "packs": [
5
5
  {
6
6
  "always_on": false,
@@ -1388,7 +1388,7 @@
1388
1388
  },
1389
1389
  {
1390
1390
  "always_on": true,
1391
- "artefact_count": 307,
1391
+ "artefact_count": 308,
1392
1392
  "artefacts": [
1393
1393
  "src/agent-src/templates/agents/proposal.example.md",
1394
1394
  "src/domains/ai-video/image/analyse/command.md",
@@ -1441,6 +1441,7 @@
1441
1441
  "src/domains/engineering-base/project/analyze/command.md",
1442
1442
  "src/domains/engineering-base/project/command.md",
1443
1443
  "src/domains/engineering-base/project/health/command.md",
1444
+ "src/domains/engineering-base/project/map/command.md",
1444
1445
  "src/domains/engineering-base/review/changes/command.md",
1445
1446
  "src/domains/engineering-base/review/command.md",
1446
1447
  "src/domains/engineering-base/review/routing/command.md",
@@ -1699,14 +1700,14 @@
1699
1700
  "src/skills/verify-repair-loop/SKILL.md"
1700
1701
  ],
1701
1702
  "by_lifecycle": {
1702
- "active": 306,
1703
+ "active": 307,
1703
1704
  "archived": 0,
1704
1705
  "deprecated": 0,
1705
1706
  "experimental": 1
1706
1707
  },
1707
1708
  "by_trust_level": {
1708
1709
  "advisory": 0,
1709
- "core": 305,
1710
+ "core": 306,
1710
1711
  "experimental": 2,
1711
1712
  "professional": 0,
1712
1713
  "restricted": 0
@@ -1,6 +1,6 @@
1
1
  # Discovery — Trust Report
2
2
 
3
- - Generated: `2026-10-23T06:28:42Z`
3
+ - Generated: `2026-10-23T14:16:10Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  | Workspace | core | professional | experimental | advisory | restricted |
10
10
  |---|---|---|---|---|---|
11
- | `agent-config-maintainer` | 338 | 0 | 3 | 0 | 0 |
11
+ | `agent-config-maintainer` | 339 | 0 | 3 | 0 | 0 |
12
12
  | `construction` | 27 | 0 | 0 | 0 | 0 |
13
13
  | `engineering` | 207 | 63 | 5 | 0 | 0 |
14
14
  | `finance` | 30 | 4 | 0 | 1 | 0 |
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:bd2c2d43c509910e8aefc47e34982aa12079b4cc772d9f1380226df82bb2b0e7",
3
- "generated_at": "2026-10-23T06:28:42Z",
2
+ "checksum": "sha256:78594c2e14f67a1cb0b14a85d62c2ccdc967977ab6bf4bf0f1a869d1a91d4e35",
3
+ "generated_at": "2026-10-23T14:16:10Z",
4
4
  "scanner_version": "de0a22b4ac4c",
5
5
  "workspaces": [
6
6
  {
@@ -655,7 +655,7 @@
655
655
  ]
656
656
  },
657
657
  {
658
- "artefact_count": 331,
658
+ "artefact_count": 332,
659
659
  "default_packs": [
660
660
  "meta",
661
661
  "memory",
@@ -668,7 +668,7 @@
668
668
  "optional_packs": [],
669
669
  "packs": [
670
670
  {
671
- "artefact_count": 307,
671
+ "artefact_count": 308,
672
672
  "artefacts": [
673
673
  "src/agent-src/templates/agents/proposal.example.md",
674
674
  "src/domains/ai-video/image/analyse/command.md",
@@ -721,6 +721,7 @@
721
721
  "src/domains/engineering-base/project/analyze/command.md",
722
722
  "src/domains/engineering-base/project/command.md",
723
723
  "src/domains/engineering-base/project/health/command.md",
724
+ "src/domains/engineering-base/project/map/command.md",
724
725
  "src/domains/engineering-base/review/changes/command.md",
725
726
  "src/domains/engineering-base/review/command.md",
726
727
  "src/domains/engineering-base/review/routing/command.md",
@@ -9073,9 +9073,9 @@ function observeAssetRender(root, command, exitCode, shellCwd = root) {
9073
9073
  if (cd && !PLAIN_WORD.test(cd[1].trim())) return null;
9074
9074
  const cwd = path8.resolve(shellCwd, cd ? unquote(cd[1].trim()) : ".");
9075
9075
  const head = command.replace(/^\s*cd\s+[^;&|<>`$\n]+&&\s*/, "").replace(/\s\d?>&\d\b/g, " ").replace(/\s2>\s*\/dev\/null\b/g, " ").split("|")[0] ?? "";
9076
- const words2 = head.trim().split(/\s+/);
9077
- if (!words2.every((w) => PLAIN_WORD.test(w))) return null;
9078
- const tokens = words2.map(unquote);
9076
+ const words3 = head.trim().split(/\s+/);
9077
+ if (!words3.every((w) => PLAIN_WORD.test(w))) return null;
9078
+ const tokens = words3.map(unquote);
9079
9079
  const at = tokens.findIndex((t) => t === "ui:render");
9080
9080
  if (at === -1) return null;
9081
9081
  const opts = /* @__PURE__ */ new Map();
@@ -27729,8 +27729,8 @@ var VISUAL_RUNNERS = /* @__PURE__ */ new Set(["playwright", "test-storybook"]);
27729
27729
  var LAUNCHERS = /* @__PURE__ */ new Set(["npx", "bunx", "pnpx"]);
27730
27730
  var PACKAGE_MANAGERS = /* @__PURE__ */ new Set(["npm", "pnpm", "yarn", "bun"]);
27731
27731
  var VALUE_OPTIONS2 = /* @__PURE__ */ new Set(["-p", "--package", "--filter", "-F", "-C", "--dir", "--cwd", "-u", "--unset", "--chdir"]);
27732
- function runsSnapshotUpdate(words2) {
27733
- const at = (k) => words2[k] ?? "";
27732
+ function runsSnapshotUpdate(words3) {
27733
+ const at = (k) => words3[k] ?? "";
27734
27734
  let i = 0;
27735
27735
  const skipOptions = () => {
27736
27736
  while (at(i).startsWith("-") || /^[A-Za-z_]\w*=/.test(at(i))) i += VALUE_OPTIONS2.has(at(i)) ? 2 : 1;
@@ -27754,22 +27754,22 @@ function runsSnapshotUpdate(words2) {
27754
27754
  }
27755
27755
  skipOptions();
27756
27756
  if (!VISUAL_RUNNERS.has(at(i).split("/").pop() ?? "")) return false;
27757
- const args = words2.slice(i + 1);
27757
+ const args = words3.slice(i + 1);
27758
27758
  return !args.some((w) => /^(--list|--help|-h|--version)$/.test(w)) && args.some((w) => w === "-u" || /^--update-snapshots(=(?!(false|none)$).+)?$/.test(w));
27759
27759
  }
27760
27760
  function shellSegments(command) {
27761
27761
  const segments = [];
27762
- let words2 = [];
27762
+ let words3 = [];
27763
27763
  let word = null;
27764
27764
  let quote = null;
27765
27765
  const endWord = () => {
27766
- if (word !== null) words2.push(word);
27766
+ if (word !== null) words3.push(word);
27767
27767
  word = null;
27768
27768
  };
27769
27769
  const endSegment = () => {
27770
27770
  endWord();
27771
- if (words2.length > 0) segments.push(words2);
27772
- words2 = [];
27771
+ if (words3.length > 0) segments.push(words3);
27772
+ words3 = [];
27773
27773
  };
27774
27774
  for (let i = 0; i < command.length; i++) {
27775
27775
  const c = command[i] ?? "";
@@ -28444,13 +28444,13 @@ var WRAPPERS = /* @__PURE__ */ new Set([
28444
28444
  ]);
28445
28445
  var NON_READING_GIT = /* @__PURE__ */ new Set(["add", "rm", "mv", "check-ignore", "ls-files", "status"]);
28446
28446
  function commandWords(segment) {
28447
- const words2 = [];
28447
+ const words3 = [];
28448
28448
  let word = "";
28449
28449
  let inWord = false;
28450
28450
  for (let i = 0; i < segment.length; i += 1) {
28451
28451
  const ch = segment[i];
28452
28452
  if (/\s/.test(ch)) {
28453
- if (inWord) words2.push(word);
28453
+ if (inWord) words3.push(word);
28454
28454
  word = "";
28455
28455
  inWord = false;
28456
28456
  continue;
@@ -28478,8 +28478,8 @@ function commandWords(segment) {
28478
28478
  word += ch;
28479
28479
  }
28480
28480
  }
28481
- if (inWord) words2.push(word);
28482
- return words2;
28481
+ if (inWord) words3.push(word);
28482
+ return words3;
28483
28483
  }
28484
28484
  var ASSIGNMENT = /^[A-Za-z_][A-Za-z0-9_]*=/;
28485
28485
  var VARIABLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
@@ -28512,8 +28512,8 @@ function mentionIn(text, host2) {
28512
28512
  }
28513
28513
  return null;
28514
28514
  }
28515
- function credentialAmong(words2, host2) {
28516
- for (const w of words2) {
28515
+ function credentialAmong(words3, host2) {
28516
+ for (const w of words3) {
28517
28517
  const v = mentionIn(w, host2);
28518
28518
  if (v !== null) return v;
28519
28519
  }
@@ -28571,11 +28571,11 @@ function copySources(args) {
28571
28571
  return targetGiven ? operands : operands.slice(0, -1);
28572
28572
  }
28573
28573
  function segmentVerdict(segment, host2 = HOST, depth = 0) {
28574
- const words2 = commandWords(segment);
28574
+ const words3 = commandWords(segment);
28575
28575
  let i = 0;
28576
- while (i < words2.length && ASSIGNMENT.test(words2[i])) i += 1;
28577
- const cmd = base(words2[i] ?? "");
28578
- const args = words2.slice(i + 1);
28576
+ while (i < words3.length && ASSIGNMENT.test(words3[i])) i += 1;
28577
+ const cmd = base(words3[i] ?? "");
28578
+ const args = words3.slice(i + 1);
28579
28579
  if (WRAPPERS.has(cmd)) {
28580
28580
  if (args.some((a) => base(a) === "env" || base(a) === "printenv")) {
28581
28581
  return { class: "process-environment", what: `\`${cmd} \u2026 env\`` };
@@ -30136,10 +30136,10 @@ var SLOP_RULES = [
30136
30136
  message: "Em-dash density above ~2 per 500 words is the #1 LLM syntactic tell (CP1).",
30137
30137
  detect: ({ content, ext }) => {
30138
30138
  const text = visibleText(content, ext);
30139
- const words2 = (text.match(/\S+/g) ?? []).length;
30139
+ const words3 = (text.match(/\S+/g) ?? []).length;
30140
30140
  const dashes = (text.match(/—/g) ?? []).length;
30141
- if (words2 >= 80 && dashes > Math.max(2, Math.round(words2 / 500 * 2))) {
30142
- return [{ line: 1, snippet: `${dashes} em-dashes in ~${words2} words` }];
30141
+ if (words3 >= 80 && dashes > Math.max(2, Math.round(words3 / 500 * 2))) {
30142
+ return [{ line: 1, snippet: `${dashes} em-dashes in ~${words3} words` }];
30143
30143
  }
30144
30144
  return [];
30145
30145
  }
@@ -31088,19 +31088,11 @@ import * as fs82 from "node:fs";
31088
31088
  import * as path86 from "node:path";
31089
31089
 
31090
31090
  // src/scripts/code_graph/types.ts
31091
- var GUESS_RESOLVED_VIA = /* @__PURE__ */ new Set([
31092
- "name-lookup",
31093
- "dynamic",
31094
- // The accepted-edge filter is a DENYLIST, so a new value is accepted by
31095
- // default — which is exactly backwards for this one. `foreign` must be
31096
- // listed here or a consumer's graph would silently answer the gate verbs
31097
- // as if this package had resolved its edges.
31098
- "foreign"
31099
- ]);
31091
+ var GUESS_RESOLVED_VIA = /* @__PURE__ */ new Set(["name-lookup", "dynamic", "foreign"]);
31100
31092
  function isStatedResolution(resolved_via) {
31101
31093
  return !GUESS_RESOLVED_VIA.has(resolved_via);
31102
31094
  }
31103
- var SCHEMA_VERSION2 = 4;
31095
+ var SCHEMA_VERSION2 = 5;
31104
31096
  var EXT_LANG = {
31105
31097
  ".php": "php",
31106
31098
  ".ts": "typescript",
@@ -31110,37 +31102,24 @@ var EXT_LANG = {
31110
31102
  ".js": "javascript",
31111
31103
  ".jsx": "javascript",
31112
31104
  ".mjs": "javascript",
31113
- ".cjs": "javascript"
31105
+ ".cjs": "javascript",
31106
+ ".py": "python",
31107
+ ".go": "go",
31108
+ ".java": "java",
31109
+ ".vue": "typescript"
31114
31110
  };
31115
31111
 
31116
31112
  // src/scripts/code_graph/validate.ts
31117
- var RELATIONS = /* @__PURE__ */ new Set(["calls", "imports", "uses", "inherits", "member", "tests"]);
31113
+ var words2 = (s) => new Set(s.split(" "));
31114
+ var RELATIONS = words2(
31115
+ "calls imports uses inherits member tests routes-to renders includes reads migrates persists relates documents"
31116
+ );
31118
31117
  var CONFIDENCES = /* @__PURE__ */ new Set(["EXTRACTED", "INFERRED", "AMBIGUOUS"]);
31119
- var RESOLVED_VIA = /* @__PURE__ */ new Set([
31120
- "same-file",
31121
- "import-specifier",
31122
- "path-alias",
31123
- "psr4",
31124
- "route-table",
31125
- "test-import",
31126
- "name-lookup",
31127
- "dynamic",
31128
- // Adapted from a consumer's own graph file; see `foreign.ts`.
31129
- "foreign"
31130
- ]);
31131
- var PROVIDERS = /* @__PURE__ */ new Set(["native", "foreign"]);
31132
- var KINDS = /* @__PURE__ */ new Set([
31133
- "file",
31134
- "class",
31135
- "interface",
31136
- "trait",
31137
- "function",
31138
- "method",
31139
- "constant",
31140
- "type",
31141
- "enum",
31142
- "skipped"
31143
- ]);
31118
+ var RESOLVED_VIA = words2(
31119
+ "same-file import-specifier path-alias psr4 route-table directive-scan schema-call eloquent-relation compiler-index test-import name-lookup dynamic foreign"
31120
+ );
31121
+ var PROVIDERS = /* @__PURE__ */ new Set(["native", "foreign", "scip"]);
31122
+ var KINDS = words2("file class interface trait function method constant type enum skipped route table");
31144
31123
  function validateGraph(g) {
31145
31124
  const errors = [];
31146
31125
  const push = (m) => {
@@ -31159,6 +31138,7 @@ function validateGraph(g) {
31159
31138
  if (typeof n !== "object" || n === null) return push(`node[${i}] not an object`);
31160
31139
  const nn = n;
31161
31140
  if (typeof nn["id"] !== "string") push(`node[${i}].id must be a string`);
31141
+ else if (ids.has(nn["id"])) push(`node[${i}].id is a duplicate: ${nn["id"]}`);
31162
31142
  else ids.add(nn["id"]);
31163
31143
  if (!KINDS.has(nn["kind"])) push(`node[${i}].kind invalid: ${String(nn["kind"])}`);
31164
31144
  if (typeof nn["source_file"] !== "string") push(`node[${i}].source_file must be a string`);
@@ -31270,7 +31250,7 @@ function detectSources(root, nativeCache) {
31270
31250
  } catch {
31271
31251
  }
31272
31252
  const scip = scipCandidates.find((p) => fs82.existsSync(p));
31273
- if (scip) out.push({ kind: "scip", path: scip, present: true, note: "SCIP detected \u2014 peer tooling required (no owned reader)" });
31253
+ if (scip) out.push({ kind: "scip", path: scip, present: true, note: "SCIP \u2014 index.scip merges into the build" });
31274
31254
  if (fs82.existsSync(nativeCache)) out.push({ kind: "native", path: nativeCache, present: true, ...freshness(abs, nativeCache, null) });
31275
31255
  return out;
31276
31256
  }
@@ -31355,16 +31335,16 @@ var VALUE_TAKING = /* @__PURE__ */ new Set([
31355
31335
  ]);
31356
31336
  var NOT_A_SEARCH = /* @__PURE__ */ new Set(["--help", "-h", "--version", "-V", "--usage"]);
31357
31337
  var FIND_SUBJECT = /* @__PURE__ */ new Set(["-name", "-iname", "-path", "-ipath", "-regex"]);
31358
- function segmentSearchToken(words2) {
31359
- if (words2.length === 0) return null;
31338
+ function segmentSearchToken(words3) {
31339
+ if (words3.length === 0) return null;
31360
31340
  let i = 0;
31361
- let head = words2[0].split("/").pop();
31341
+ let head = words3[0].split("/").pop();
31362
31342
  if (head === "git") {
31363
31343
  let j = 1;
31364
- while (j < words2.length && words2[j].startsWith("-")) {
31365
- j += VALUE_TAKING.has(words2[j]) || words2[j] === "-C" ? 2 : 1;
31344
+ while (j < words3.length && words3[j].startsWith("-")) {
31345
+ j += VALUE_TAKING.has(words3[j]) || words3[j] === "-C" ? 2 : 1;
31366
31346
  }
31367
- if (words2[j] !== "grep") return null;
31347
+ if (words3[j] !== "grep") return null;
31368
31348
  head = "git grep";
31369
31349
  i = j + 1;
31370
31350
  } else if (SEARCH_HEADS.has(head)) {
@@ -31372,7 +31352,7 @@ function segmentSearchToken(words2) {
31372
31352
  } else {
31373
31353
  return null;
31374
31354
  }
31375
- const rest = words2.slice(i);
31355
+ const rest = words3.slice(i);
31376
31356
  if (rest.some((w) => NOT_A_SEARCH.has(w))) return null;
31377
31357
  if (head === "find") {
31378
31358
  const at = rest.findIndex((w) => FIND_SUBJECT.has(w));
@@ -31393,8 +31373,8 @@ function strip(w) {
31393
31373
  }
31394
31374
  function bashSearchToken(command) {
31395
31375
  for (const segment of command.split(/\||&&|;/)) {
31396
- const words2 = segment.trim().split(/\s+/).filter((w) => w !== "");
31397
- const hit = segmentSearchToken(words2);
31376
+ const words3 = segment.trim().split(/\s+/).filter((w) => w !== "");
31377
+ const hit = segmentSearchToken(words3);
31398
31378
  if (hit !== null) return hit;
31399
31379
  }
31400
31380
  return null;
@@ -36742,6 +36722,7 @@ function emitSqliteTwin(graph, serialized, jsonPath) {
36742
36722
  db.exec(
36743
36723
  "CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);CREATE TABLE nodes (id TEXT PRIMARY KEY, label TEXT NOT NULL, kind TEXT, source_file TEXT, l0 INTEGER, l1 INTEGER, l2 INTEGER, l3 INTEGER);CREATE TABLE edges (source TEXT NOT NULL, target TEXT NOT NULL, relation TEXT NOT NULL, confidence TEXT NOT NULL, candidates TEXT, ambiguity_reason TEXT, resolved_via TEXT, provider TEXT);CREATE INDEX edges_source ON edges(source);CREATE INDEX edges_target ON edges(target);CREATE INDEX nodes_label ON nodes(label);CREATE INDEX nodes_source_file ON nodes(source_file);"
36744
36724
  );
36725
+ db.exec("BEGIN");
36745
36726
  const meta = db.prepare("INSERT INTO meta (key, value) VALUES (?, ?)");
36746
36727
  meta.run("source_checksum", graph.source_checksum);
36747
36728
  meta.run("json_size", String(stat.size));
@@ -36780,14 +36761,17 @@ function emitSqliteTwin(graph, serialized, jsonPath) {
36780
36761
  e.provider
36781
36762
  );
36782
36763
  }
36764
+ db.exec("COMMIT");
36783
36765
  stampUserVersion(db, GRAPH_STORE_VERSION);
36784
36766
  } finally {
36785
36767
  db.close();
36786
36768
  }
36787
36769
  fs108.renameSync(tmp, twin);
36788
36770
  return true;
36789
- } catch {
36771
+ } catch (e) {
36790
36772
  fs108.rmSync(tmp, { force: true });
36773
+ process.stderr.write(`code-graph: index not written: ${e.message}
36774
+ `);
36791
36775
  return false;
36792
36776
  }
36793
36777
  }
@@ -41600,7 +41584,8 @@ var RECORDED_EVENTS = /* @__PURE__ */ new Set([
41600
41584
  "pre_compact",
41601
41585
  "agent_error",
41602
41586
  "subagent_start",
41603
- "subagent_stop"
41587
+ "subagent_stop",
41588
+ "instructions_loaded"
41604
41589
  ]);
41605
41590
  var NOT_RECORDED = /* @__PURE__ */ new Map();
41606
41591
  var CONSUMPTION_STATES = ["consumed", "partially-consumed", "rejected-with-reason"];
@@ -42185,6 +42170,10 @@ var LAZY_CONCERNS = Object.freeze({
42185
42170
  "src/scripts/chat_history.ts": Object.freeze({
42186
42171
  chunk: "chat_history.chunk.cjs",
42187
42172
  source: path138.join("..", "chat_history")
42173
+ }),
42174
+ "src/scripts/hooks/instructions_observer_hook.ts": Object.freeze({
42175
+ chunk: "instructions_observer.chunk.cjs",
42176
+ source: "instructions_observer_hook"
42188
42177
  })
42189
42178
  });
42190
42179
  function isBundled3() {
@@ -43099,7 +43088,8 @@ var COLLECTOR_EVENTS = [
43099
43088
  "pre_compact",
43100
43089
  "agent_error",
43101
43090
  "subagent_start",
43102
- "subagent_stop"
43091
+ "subagent_stop",
43092
+ "instructions_loaded"
43103
43093
  ];
43104
43094
  var COLLECTOR_OUTCOMES = ["captured", "startup_failure", "write_failure"];
43105
43095
  var COLLECTOR_PLATFORMS = [
@@ -43362,7 +43352,8 @@ var EVENT_VOCABULARY = /* @__PURE__ */ new Set([
43362
43352
  "pre_compact",
43363
43353
  "agent_error",
43364
43354
  "subagent_start",
43365
- "subagent_stop"
43355
+ "subagent_stop",
43356
+ "instructions_loaded"
43366
43357
  ]);
43367
43358
  var _SEVERITY_BY_EXIT = {
43368
43359
  [EXIT_ALLOW]: "allow",
@@ -1 +1 @@
1
- 886ab561301c6376b605aeed89a965b978dae593df52a5c774ba27349860d298 dispatch.js
1
+ 1089777b2ae58baebcf459eeaccfe7a043a8aa24de365e85cea9827d5a64be27 dispatch.js