craftar 0.35.0 → 0.37.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.
Files changed (44) hide show
  1. package/README.md +25 -4
  2. package/dist/cli.js +31 -19
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/capabilities.js +2 -2
  5. package/dist/core/capabilities.js.map +1 -1
  6. package/dist/core/doctor.js +74 -1
  7. package/dist/core/doctor.js.map +1 -1
  8. package/dist/core/drift.js +10 -4
  9. package/dist/core/drift.js.map +1 -1
  10. package/dist/core/extract.js +2 -2
  11. package/dist/core/extract.js.map +1 -1
  12. package/dist/core/report.js +12 -0
  13. package/dist/core/report.js.map +1 -1
  14. package/dist/core/resolve.js +29 -0
  15. package/dist/core/resolve.js.map +1 -1
  16. package/dist/core/sync.js +154 -3
  17. package/dist/core/sync.js.map +1 -1
  18. package/dist/core/template-import.js +16 -3
  19. package/dist/core/template-import.js.map +1 -1
  20. package/dist/core/write-actions.js +21 -12
  21. package/dist/core/write-actions.js.map +1 -1
  22. package/dist/emitters/agents-md.js +26 -3
  23. package/dist/emitters/agents-md.js.map +1 -1
  24. package/dist/emitters/claude-code.js +175 -20
  25. package/dist/emitters/claude-code.js.map +1 -1
  26. package/dist/emitters/kiro.js +111 -26
  27. package/dist/emitters/kiro.js.map +1 -1
  28. package/dist/emitters/shared.js +135 -57
  29. package/dist/emitters/shared.js.map +1 -1
  30. package/dist/importers/claude-code.js +75 -7
  31. package/dist/importers/claude-code.js.map +1 -1
  32. package/dist/importers/decide.js +22 -4
  33. package/dist/importers/decide.js.map +1 -1
  34. package/dist/importers/drift-promote.js +9 -3
  35. package/dist/importers/drift-promote.js.map +1 -1
  36. package/dist/schema/index.js +11 -1
  37. package/dist/schema/index.js.map +1 -1
  38. package/dist/ui/page.js +115 -10
  39. package/dist/ui/page.js.map +1 -1
  40. package/dist/ui/routes.js +129 -8
  41. package/dist/ui/routes.js.map +1 -1
  42. package/dist/ui/server.js +121 -34
  43. package/dist/ui/server.js.map +1 -1
  44. package/package.json +1 -1
@@ -1,6 +1,8 @@
1
- import { buildRuleLookup, outName, resolveRuleRefs, ruleFile, ruleWriter, textFile } from "./shared.js";
1
+ import { buildRuleLookup, effectiveTargets, outName, resolveRuleRefs, ruleFile, ruleWriter, textFile } from "./shared.js";
2
2
  /** The param that sets the AGENTS.md size budget, read by `plan()` (and reserved from extraction, like `kiro.banner`). */
3
3
  export const AGENTS_MD_BUDGET_KEY = "agents-md.maxBytes";
4
+ /** The param that turns AGENTS.md into the one home of the always-on rules (spec 41 §4.1). */
5
+ export const AGENTS_MD_PRIMARY_KEY = "agents-md.primary";
4
6
  /**
5
7
  * AGENTS.md target (open standard read by Codex, Cursor, Warp, Copilot, Kiro, Kimi…).
6
8
  * Concatenates the `always` rules into one file. Scoped rules (`fileMatch`, `manual`, `auto`)
@@ -30,7 +32,12 @@ export const agentsMd = {
30
32
  if (!rules.length)
31
33
  return [];
32
34
  // Build the lookup once per AGENTS.md, not once per body (spec 15 §4.2)
33
- const lookup = buildRuleLookup(ctx.resolution.ingredients);
35
+ const lookup = buildRuleLookup(ctx.resolution.ingredients, ctx.resolution);
36
+ // For mode-off comparison (spec 41 §4.4)
37
+ const primary = ctx.resolution.primary;
38
+ const lookupOff = primary ? buildRuleLookup(ctx.resolution.ingredients, { primary: false }) : null;
39
+ // Track whether any text differs due to mode
40
+ let anyDiffersDueToMode = false;
34
41
  const parts = [
35
42
  "<!-- GENERATED by craftar from the Forge. Edit the rule ingredients, not this file. -->",
36
43
  "",
@@ -52,13 +59,19 @@ export const agentsMd = {
52
59
  const { text: resolved, report } = resolveRuleRefs(rawBody, ing.ref, lookup, ctx.resolution.targets);
53
60
  alwaysReports.push(report);
54
61
  const body = resolved.replace(/\n+$/, "");
62
+ // Check for reworded (spec 41 §4.4)
63
+ if (primary && lookupOff) {
64
+ const modeOffResolved = resolveRuleRefs(rawBody, ing.ref, lookupOff, ctx.resolution.targets).text;
65
+ if (modeOffResolved !== resolved)
66
+ anyDiffersDueToMode = true;
67
+ }
55
68
  // Report the byte size of this always-on rule's body as it appears in AGENTS.md
56
69
  ctx.reportAgentsMdRule(outName(ing.meta), Buffer.byteLength(body, "utf8"), false);
57
70
  parts.push(`<!-- rule: ${outName(ing.meta)} -->`, body, "");
58
71
  }
59
72
  else {
60
73
  // Spec 14 §4.1: decide which target writes this rule file
61
- const writer = ruleWriter(ctx.resolution.targets, ing.meta.targets);
74
+ const writer = ruleWriter(ctx.resolution.targets, effectiveTargets(ing.meta, ctx.resolution));
62
75
  const scopeText = ing.meta.inclusion === "fileMatch"
63
76
  ? `applies to \`${[ing.meta.fileMatchPattern].flat().join("`, `")}\``
64
77
  : ing.meta.inclusion;
@@ -74,6 +87,12 @@ export const agentsMd = {
74
87
  const { text: resolved, report } = resolveRuleRefs(rawBody, ing.ref, lookup, ctx.resolution.targets);
75
88
  embeddedReports.push(report);
76
89
  const body = resolved.replace(/\n+$/, "");
90
+ // Check for reworded (spec 41 §4.4)
91
+ if (primary && lookupOff) {
92
+ const modeOffResolved = resolveRuleRefs(rawBody, ing.ref, lookupOff, ctx.resolution.targets).text;
93
+ if (modeOffResolved !== resolved)
94
+ anyDiffersDueToMode = true;
95
+ }
77
96
  // Report the byte size of this embedded scoped rule
78
97
  ctx.reportAgentsMdRule(outName(ing.meta), Buffer.byteLength(body, "utf8"), true);
79
98
  embedded.push(`<!-- rule: ${outName(ing.meta)} -->`, `> Scoped rule — ${scopeText}`, "", body, "");
@@ -89,6 +108,10 @@ export const agentsMd = {
89
108
  // Emit the warning per spec 15 §4.5: at most one ctx.warn for AGENTS.md
90
109
  // Reports in AGENTS.md order: always-on first, then embedded
91
110
  emitRefWarning(ctx.warn, [...alwaysReports, ...embeddedReports]);
111
+ // Report reworded if any body differs due to mode (spec 41 §4.4)
112
+ if (anyDiffersDueToMode) {
113
+ ctx.reportReworded("AGENTS.md");
114
+ }
92
115
  return [await textFile(ctx, "AGENTS.md", parts.join("\n"), "agents-md", "rule/*")];
93
116
  },
94
117
  };
@@ -1 +1 @@
1
- {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/emitters/agents-md.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../src/emitters/agents-md.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
+ import path from "node:path";
1
2
  import { serializeFrontmatter } from "../core/frontmatter.js";
2
3
  import { listFiles } from "../core/forge.js";
3
- import { authEnvNames, EXAMPLE_SETTINGS, mcpServers, outName, ruleFile, textFile } from "./shared.js";
4
+ import { decodeForScan } from "../core/secrets.js";
5
+ import { authEnvNames, buildRuleLookup, EXAMPLE_SETTINGS, formatDeadRefs, formatScannedRefs, mcpServers, outName, resolveRuleRefs, ruleFile, textFile, unresolvedRuleRefs, UNKNOWN_NAME_KIND, } from "./shared.js";
4
6
  /**
5
7
  * Claude Code target: `.claude/{rules,agents,commands,skills,scripts,hooks}` + `.mcp.json`.
6
8
  * Files are emitted verbatim from the Forge so that `import` → `sync` on the source workspace is a no-op.
9
+ *
10
+ * Under agents-md.primary (spec 41 §4.4), references to rules in bodies are resolved through
11
+ * resolveRuleRefs, and copied files are scanned and warned about but not rewritten.
7
12
  */
8
13
  export const claudeCode = {
9
14
  target: "claude-code",
@@ -11,50 +16,128 @@ export const claudeCode = {
11
16
  const out = [];
12
17
  const t = "claude-code";
13
18
  const mcp = [];
19
+ const primary = ctx.resolution.primary;
20
+ // Under the mode, build the lookup once
21
+ const lookup = primary ? buildRuleLookup(ctx.resolution.ingredients, ctx.resolution) : null;
22
+ const targets = ctx.resolution.targets;
23
+ // Collect reports for the warning (spec 41 §4.4)
24
+ const reports = [];
25
+ const scannedHits = [];
26
+ // Resolve function under primary mode, returns original text when mode is off
27
+ const resolve = (text, citing) => {
28
+ if (!primary || !lookup)
29
+ return text;
30
+ const { text: resolved, report } = resolveRuleRefs(text, citing, lookup, targets, "agents-md");
31
+ reports.push(report);
32
+ return resolved;
33
+ };
34
+ // Track whether a file was reworded
35
+ // Each [original, resolved] pair is one text of the file, compared on its own (spec 41 §4.4)
36
+ const checkReworded = (path, ...pairs) => {
37
+ if (primary && pairs.some(([original, resolved]) => original !== resolved))
38
+ ctx.reportReworded(path);
39
+ };
40
+ // Scan a file for unresolved references (spec 41 §4.4): files copied as bytes or other TEXT_EXT
41
+ const scanFile = (path, content) => {
42
+ if (!primary || !lookup)
43
+ return;
44
+ const text = decodeForScan(content);
45
+ if (text === null)
46
+ return; // Binary file
47
+ const hits = unresolvedRuleRefs(text, lookup, targets, "agents-md");
48
+ for (const h of hits) {
49
+ scannedHits.push({ path, line: h.line, name: h.name });
50
+ }
51
+ };
52
+ // An agent's or a command's metadata, then its body (spec 41 §4.4, kiro's order): its frontmatterRaw when it has
53
+ // one, else its description. With the mode off `resolve` returns each text as given.
54
+ const resolveDoc = (path, citing, m, rawBody) => {
55
+ const raw = m.frontmatterRaw != null ? resolve(m.frontmatterRaw, citing) : null;
56
+ const description = m.frontmatterRaw == null && m.description !== undefined ? resolve(m.description, citing) : m.description;
57
+ const body = resolve(rawBody, citing);
58
+ checkReworded(path, [m.frontmatterRaw ?? m.description, raw ?? description], [rawBody, body]);
59
+ return { raw, description, body };
60
+ };
14
61
  // What this target writes comes from its walk; the matrix decides the rest and warns (spec 18).
15
62
  for (const ing of ctx.aimed) {
16
63
  const m = ing.meta;
17
64
  switch (m.type) {
18
65
  case "rule": {
19
- const body = await ctx.text(ing, m.file);
66
+ const rawBody = await ctx.text(ing, m.file);
67
+ const body = resolve(rawBody, ing.ref);
68
+ const path = ruleFile("claude-code", m);
20
69
  // If frontmatterRaw is set, serialize with it; otherwise emit body only (no generated paths:)
70
+ // frontmatterRaw is NOT resolved (spec 41 §4.4)
21
71
  const doc = m.frontmatterRaw != null ? serializeFrontmatter({}, body, { raw: m.frontmatterRaw }) : body;
22
- out.push(await textFile(ctx, ruleFile("claude-code", m), doc, t, ing.ref));
72
+ checkReworded(path, [rawBody, body]);
73
+ out.push(await textFile(ctx, path, doc, t, ing.ref));
23
74
  break;
24
75
  }
25
76
  case "agent": {
26
- const body = await ctx.text(ing, m.file);
27
- const fm = m.frontmatterRaw ?? null;
28
- const doc = serializeFrontmatter({ name: outName(m), description: m.description, tools: m.tools, model: m.model }, body, { raw: fm });
29
- out.push(await textFile(ctx, `.claude/agents/${outName(m)}.md`, doc, t, ing.ref));
77
+ const path = `.claude/agents/${outName(m)}.md`;
78
+ const { raw, description, body } = resolveDoc(path, ing.ref, m, await ctx.text(ing, m.file));
79
+ const doc = serializeFrontmatter({ name: outName(m), description, tools: m.tools, model: m.model }, body, { raw });
80
+ out.push(await textFile(ctx, path, doc, t, ing.ref));
30
81
  break;
31
82
  }
32
83
  case "command": {
33
- const body = await ctx.text(ing, m.file);
34
- const doc = serializeFrontmatter({ description: m.description, "argument-hint": m.argumentHint, "allowed-tools": m.allowedTools }, body, { raw: m.frontmatterRaw ?? null });
35
- out.push(await textFile(ctx, `.claude/commands/${outName(m)}.md`, doc, t, ing.ref));
84
+ const path = `.claude/commands/${outName(m)}.md`;
85
+ const { raw, description, body } = resolveDoc(path, ing.ref, m, await ctx.text(ing, m.file));
86
+ const doc = serializeFrontmatter({ description, "argument-hint": m.argumentHint, "allowed-tools": m.allowedTools }, body, { raw });
87
+ out.push(await textFile(ctx, path, doc, t, ing.ref));
36
88
  break;
37
89
  }
38
90
  case "skill": {
39
91
  if (m.layout === "file") {
40
- out.push(await textFile(ctx, `.claude/skills/${outName(m)}.md`, await ctx.text(ing, "SKILL.md"), t, ing.ref));
92
+ const path = `.claude/skills/${outName(m)}.md`;
93
+ const rawText = await ctx.text(ing, "SKILL.md");
94
+ const text = resolve(rawText, ing.ref);
95
+ checkReworded(path, [rawText, text]);
96
+ out.push(await textFile(ctx, path, text, t, ing.ref));
41
97
  }
42
98
  else {
99
+ // Directory skill: resolve .md files, scan others
43
100
  for (const f of await listFiles(ing.dir)) {
44
101
  if (f === "ingredient.yaml")
45
102
  continue;
46
- out.push(await anyFile(ctx, ing, f, `.claude/skills/${outName(m)}/${f}`, t));
103
+ const path = `.claude/skills/${outName(m)}/${f}`;
104
+ if (claudeResolves(m, f)) {
105
+ const rawText = await ctx.text(ing, f);
106
+ const text = resolve(rawText, ing.ref);
107
+ checkReworded(path, [rawText, text]);
108
+ out.push(await textFile(ctx, path, text, t, ing.ref));
109
+ }
110
+ else if (TEXT_EXT.test(f)) {
111
+ // Other text files: not resolved, but scanned
112
+ const rawText = await ctx.text(ing, f);
113
+ if (primary && lookup) {
114
+ scanFile(path, Buffer.from(rawText, "utf8"));
115
+ }
116
+ out.push(await textFile(ctx, path, rawText, t, ing.ref));
117
+ }
118
+ else {
119
+ // Binary files: copied as bytes, scanned
120
+ const content = await ctx.bytes(ing, f);
121
+ scanFile(path, content);
122
+ out.push({ path, content, target: t, ingredient: ing.ref });
123
+ }
47
124
  }
48
125
  }
49
126
  break;
50
127
  }
51
128
  case "script":
52
- for (const f of m.files)
53
- out.push(await anyFile(ctx, ing, f, `.claude/scripts/${f}`, t));
129
+ for (const f of m.files) {
130
+ const path = `.claude/scripts/${f}`;
131
+ const file = await anyFileWithScan(ctx, ing, f, path, t, lookup, targets, primary, scanFile);
132
+ out.push(file);
133
+ }
54
134
  break;
55
135
  case "hook":
56
- for (const f of m.files)
57
- out.push(await anyFile(ctx, ing, f, `.claude/hooks/${f}`, t));
136
+ for (const f of m.files) {
137
+ const path = `.claude/hooks/${f}`;
138
+ const file = await anyFileWithScan(ctx, ing, f, path, t, lookup, targets, primary, scanFile);
139
+ out.push(file);
140
+ }
58
141
  break;
59
142
  case "mcp":
60
143
  mcp.push(ing); // collected into .mcp.json below
@@ -65,6 +148,10 @@ export const claudeCode = {
65
148
  }
66
149
  }
67
150
  }
151
+ // Emit the claude-code warning (spec 41 §4.4)
152
+ if (primary) {
153
+ emitClaudeCodeWarning(ctx, reports, scannedHits);
154
+ }
68
155
  const servers = mcpServers(ctx, t, ".mcp.json", mcp);
69
156
  if (Object.keys(servers).length) {
70
157
  const json = JSON.stringify({ mcpServers: servers }, null, 2) + "\n";
@@ -83,11 +170,79 @@ export const claudeCode = {
83
170
  return out;
84
171
  },
85
172
  };
173
+ /**
174
+ * Whether the claude-code emitter resolves rule references in this file of an ingredient under agents-md.primary
175
+ * (spec 41 §4.4): a rule's, an agent's or a command's body file, a file-layout skill's SKILL.md and every `.md` file of a
176
+ * directory skill. Every other file is copied as written and scanned. An agent's and a command's metadata are resolved
177
+ * too (`frontmatterRaw` when present, else `description`). The one answer, read by the emitter and by import (§4.10).
178
+ */
179
+ export function claudeResolves(meta, file) {
180
+ // Compared as the emitters read them (`emittedFile`): `./rule.md` and `/rule.md` name the file listed as `rule.md`.
181
+ const eq = (a, b) => path.posix.join(".", a) === path.posix.join(".", b);
182
+ switch (meta.type) {
183
+ case "rule":
184
+ case "agent":
185
+ case "command":
186
+ return eq(file, meta.file);
187
+ case "skill":
188
+ return meta.layout === "file" ? eq(file, "SKILL.md") : /\.md$/i.test(file);
189
+ default:
190
+ return false;
191
+ }
192
+ }
86
193
  /** Files claude-code emits as text, through `ctx.text` (substituted); anything else is copied as raw bytes. */
87
194
  export const TEXT_EXT = /\.(md|txt|json|ya?ml|ps1|py|sh|js|ts|cjs|mjs|toml|xml|csv)$/i;
88
- async function anyFile(ctx, ing, file, relPath, target) {
89
- if (TEXT_EXT.test(file))
90
- return textFile(ctx, relPath, await ctx.text(ing, file), target, ing.ref);
91
- return { path: relPath, content: await ctx.bytes(ing, file), target, ingredient: ing.ref };
195
+ /** Emit a file for scripts/hooks: scan but do not rewrite (spec 41 §4.4). */
196
+ async function anyFileWithScan(ctx, ing, file, relPath, target, lookup, targets, primary, scanFile) {
197
+ if (TEXT_EXT.test(file)) {
198
+ const text = await ctx.text(ing, file);
199
+ if (primary && lookup) {
200
+ scanFile(relPath, Buffer.from(text, "utf8"));
201
+ }
202
+ return textFile(ctx, relPath, text, target, ing.ref);
203
+ }
204
+ const content = await ctx.bytes(ing, file);
205
+ scanFile(relPath, content);
206
+ return { path: relPath, content, target, ingredient: ing.ref };
207
+ }
208
+ /** Emit the claude-code warning for dead references and scanned files (spec 41 §4.4). */
209
+ function emitClaudeCodeWarning(ctx, reports, scannedHits) {
210
+ // Collect D entries: dead references (kind not empty, not UNKNOWN_NAME_KIND)
211
+ // Unknown names produce nothing in claude-code (claude-code is a target, so they are unchanged — state A-like)
212
+ const dead = [];
213
+ const seenDead = new Set();
214
+ for (const report of reports) {
215
+ for (const e of report.reworded) {
216
+ if (e.kind === UNKNOWN_NAME_KIND)
217
+ continue; // Unknown names are unchanged with claude-code
218
+ const key = `${e.ref}|${e.citing}`;
219
+ if (!seenDead.has(key)) {
220
+ seenDead.add(key);
221
+ dead.push(e);
222
+ }
223
+ }
224
+ }
225
+ // Dedupe scanned hits by path+line+name
226
+ const seenScanned = new Set();
227
+ const dedupedHits = [];
228
+ // Sort by path then line
229
+ const sortedHits = [...scannedHits].sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line);
230
+ for (const h of sortedHits) {
231
+ const key = `${h.path}:${h.line}:${h.name}`;
232
+ if (!seenScanned.has(key)) {
233
+ seenScanned.add(key);
234
+ dedupedHits.push(h);
235
+ }
236
+ }
237
+ if (dead.length === 0 && dedupedHits.length === 0)
238
+ return;
239
+ const parts = [];
240
+ if (dead.length > 0) {
241
+ parts.push(formatDeadRefs(dead));
242
+ }
243
+ if (dedupedHits.length > 0) {
244
+ parts.push(formatScannedRefs(dedupedHits));
245
+ }
246
+ ctx.warn(`claude-code: ${parts.join("; ")}`);
92
247
  }
93
248
  //# sourceMappingURL=claude-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/emitters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKtG;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,MAAM,EAAE,aAAa;IACrB,KAAK,CAAC,IAAI,CAAC,GAAG;QACZ,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC;QACxB,MAAM,GAAG,GAAyB,EAAE,CAAC;QAErC,gGAAgG;QAChG,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACnB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzC,8FAA8F;oBAC9F,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACxG,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC3E,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzC,MAAM,EAAE,GAAG,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC;oBACpC,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtI,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,kBAAkB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClF,MAAM;gBACR,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBACzC,MAAM,GAAG,GAAG,oBAAoB,CAC9B,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,YAAY,EAAE,EAChG,IAAI,EACJ,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,EAAE,CAClC,CAAC;oBACF,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,oBAAoB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpF,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;wBACxB,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,kBAAkB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAChH,CAAC;yBAAM,CAAC;wBACN,KAAK,MAAM,CAAC,IAAI,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;4BACzC,IAAI,CAAC,KAAK,iBAAiB;gCAAE,SAAS;4BACtC,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,kBAAkB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;wBAC/E,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ;oBACX,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;wBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzF,MAAM;gBACR,KAAK,MAAM;oBACT,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;wBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvF,MAAM;gBACR,KAAK,KAAK;oBACR,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;oBAChD,MAAM;gBACR,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,KAAK,GAAU,CAAC,CAAC,CAAC,sCAAsC;oBAC9D,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,oBAAqB,KAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,uEAAuE;QACvE,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,8EAA8E;YAC9E,MAAM,GAAG,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAEF,+GAA+G;AAC/G,MAAM,CAAC,MAAM,QAAQ,GAAG,8DAA8D,CAAC;AAEvF,KAAK,UAAU,OAAO,CAAC,GAAa,EAAE,GAAoC,EAAE,IAAY,EAAE,OAAe,EAAE,MAA6B;IACtI,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACnG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AAC7F,CAAC"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/emitters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,GAGlB,MAAM,aAAa,CAAC;AAKrB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,MAAM,EAAE,aAAa;IACrB,KAAK,CAAC,IAAI,CAAC,GAAG;QACZ,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,aAAa,CAAC;QACxB,MAAM,GAAG,GAAyB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAEvC,wCAAwC;QACxC,MAAM,MAAM,GAAsB,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/G,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QAEvC,iDAAiD;QACjD,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,WAAW,GAAwD,EAAE,CAAC;QAE5E,8EAA8E;QAC9E,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAc,EAAU,EAAE;YACvD,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YAC/F,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF,oCAAoC;QACpC,6FAA6F;QAC7F,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,GAAG,KAAoE,EAAQ,EAAE;YACpH,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC;gBAAE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvG,CAAC,CAAC;QAEF,gGAAgG;QAChG,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,OAAe,EAAQ,EAAE;YACvD,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;gBAAE,OAAO;YAChC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,CAAC,cAAc;YACzC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACpE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC;QAEF,iHAAiH;QACjH,qFAAqF;QACrF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,CAAoD,EAAE,OAAe,EAAE,EAAE;YACzH,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChF,MAAM,WAAW,GAAG,CAAC,CAAC,cAAc,IAAI,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAC7H,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9F,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACpC,CAAC,CAAC;QAEF,gGAAgG;QAChG,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACnB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;oBACxC,8FAA8F;oBAC9F,gDAAgD;oBAChD,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBACxG,aAAa,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBACrC,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrD,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,IAAI,GAAG,kBAAkB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBAC/C,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7F,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBACnH,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrD,MAAM;gBACR,CAAC;gBACD,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,MAAM,IAAI,GAAG,oBAAoB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBACjD,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7F,MAAM,GAAG,GAAG,oBAAoB,CAC9B,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC,YAAY,EAAE,EACjF,IAAI,EACJ,EAAE,GAAG,EAAE,CACR,CAAC;oBACF,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrD,MAAM;gBACR,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,kBAAkB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;wBAC/C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;wBACvC,aAAa,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;wBACrC,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACxD,CAAC;yBAAM,CAAC;wBACN,kDAAkD;wBAClD,KAAK,MAAM,CAAC,IAAI,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;4BACzC,IAAI,CAAC,KAAK,iBAAiB;gCAAE,SAAS;4BACtC,MAAM,IAAI,GAAG,kBAAkB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;4BACjD,IAAI,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gCACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gCACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gCACvC,aAAa,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gCACrC,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;4BACxD,CAAC;iCAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gCAC5B,8CAA8C;gCAC9C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gCACvC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;oCACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gCAC/C,CAAC;gCACD,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;4BAC3D,CAAC;iCAAM,CAAC;gCACN,yCAAyC;gCACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gCACxC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gCACxB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;4BAC9D,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ;oBACX,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,CAAC;wBACpC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;wBAC7F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,CAAC;oBACD,MAAM;gBACR,KAAK,MAAM;oBACT,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;wBAC7F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjB,CAAC;oBACD,MAAM;gBACR,KAAK,KAAK;oBACR,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,iCAAiC;oBAChD,MAAM;gBACR,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,KAAK,GAAU,CAAC,CAAC,CAAC,sCAAsC;oBAC9D,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,oBAAqB,KAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,uEAAuE;QACvE,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,8EAA8E;YAC9E,MAAM,GAAG,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YACvD,GAAG,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAY;IAC3D,oHAAoH;IACpH,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACzF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,+GAA+G;AAC/G,MAAM,CAAC,MAAM,QAAQ,GAAG,8DAA8D,CAAC;AAEvF,6EAA6E;AAC7E,KAAK,UAAU,eAAe,CAC5B,GAAa,EACb,GAAuB,EACvB,IAAY,EACZ,OAAe,EACf,MAA6B,EAC7B,MAAyB,EACzB,OAA0B,EAC1B,OAAgB,EAChB,QAAiD;IAEjD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AACjE,CAAC;AAED,yFAAyF;AACzF,SAAS,qBAAqB,CAC5B,GAAa,EACb,OAAoB,EACpB,WAAgE;IAEhE,6EAA6E;IAC7E,+GAA+G;IAC/G,MAAM,IAAI,GAAyD,EAAE,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS,CAAC,+CAA+C;YAC3F,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,WAAW,GAAwD,EAAE,CAAC;IAC5E,yBAAyB;IACzB,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACpG,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,7 +1,9 @@
1
- import { toCrlf } from "../core/text.js";
1
+ import { posix } from "node:path";
2
+ import { climbsOut, toCrlf } from "../core/text.js";
2
3
  import { serializeFrontmatter } from "../core/frontmatter.js";
3
4
  import { listFiles } from "../core/forge.js";
4
- import { buildRuleLookup, mcpServers, outName, resolveRuleRefs, ruleFile, RULE_NAME_CHARS, UNKNOWN_NAME_KIND } from "./shared.js";
5
+ import { decodeForScan } from "../core/secrets.js";
6
+ import { appliesTo, buildRuleLookup, effectiveTargets, formatDeadRefs, formatScannedRefs, mcpServers, outName, resolveRuleRefs, ruleFile, RULE_NAME_CHARS, UNKNOWN_NAME_KIND, unresolvedRuleRefs, } from "./shared.js";
5
7
  /** Files kiro copies as text, through `ctx.text` (substituted); anything else is copied as raw bytes. */
6
8
  export const KIRO_TEXT_EXT = /\.(md|txt|json|ya?ml)$/i;
7
9
  /**
@@ -20,17 +22,47 @@ export const kiro = {
20
22
  const out = [];
21
23
  const t = "kiro";
22
24
  const banner = String(ctx.resolution.params["kiro.banner"] ?? "<!-- GENERATED from {{source}} by craftar -- do not edit. -->");
23
- const ruleNames = new Set(ctx.resolution.ingredients.filter((i) => i.meta.type === "rule").map((i) => outName(i.meta)));
24
- const scopedRules = ctx.resolution.ingredients.filter((i) => i.meta.type === "rule" && i.meta.inclusion === "fileMatch").map((i) => outName(i.meta));
25
+ const primary = ctx.resolution.primary;
26
+ // Under the mode, filter ruleNames and scopedRules to rules kiro WRITES (spec 41 §4.5)
27
+ // Mode off: unchanged (every rule)
28
+ const rulesKiroWrites = primary
29
+ ? ctx.resolution.ingredients.filter((i) => i.meta.type === "rule" && appliesTo(effectiveTargets(i.meta, ctx.resolution), "kiro"))
30
+ : ctx.resolution.ingredients.filter((i) => i.meta.type === "rule");
31
+ const ruleNames = new Set(rulesKiroWrites.map((i) => outName(i.meta)));
32
+ const scopedRules = rulesKiroWrites.filter((i) => i.meta.type === "rule" && i.meta.inclusion === "fileMatch").map((i) => outName(i.meta));
25
33
  const targets = ctx.resolution.targets;
26
- const lookup = buildRuleLookup(ctx.resolution.ingredients);
34
+ const lookup = buildRuleLookup(ctx.resolution.ingredients, ctx.resolution);
35
+ // For mode-off comparison (spec 41 §4.4), build lookup without primary
36
+ const lookupOff = primary ? buildRuleLookup(ctx.resolution.ingredients, { primary: false }) : null;
27
37
  // Collect reports for the warning (spec 17 §4.5)
28
38
  const reports = [];
39
+ // Scanned file hits (spec 41 §4.4)
40
+ const scannedHits = [];
29
41
  const resolve = (text, citing) => {
30
42
  const { text: resolved, report } = resolveRuleRefs(text, citing, lookup, targets, "kiro");
31
43
  reports.push(report);
32
44
  return resolved;
33
45
  };
46
+ // Track reworded: each text of the file, resolved with the mode and without it (spec 41 §4.4)
47
+ const checkReworded = (path, texts, citing) => {
48
+ if (!primary || !lookupOff)
49
+ return;
50
+ const differs = (text) => resolveRuleRefs(text, citing, lookupOff, targets, "kiro").text !== resolveRuleRefs(text, citing, lookup, targets, "kiro").text;
51
+ if (texts.some(differs))
52
+ ctx.reportReworded(path);
53
+ };
54
+ // Scan a file for unresolved references (spec 41 §4.4)
55
+ const scanFile = (path, content) => {
56
+ if (!primary)
57
+ return;
58
+ const text = decodeForScan(content);
59
+ if (text === null)
60
+ return; // Binary
61
+ const hits = unresolvedRuleRefs(text, lookup, targets, "kiro");
62
+ for (const h of hits) {
63
+ scannedHits.push({ path, line: h.line, name: h.name });
64
+ }
65
+ };
34
66
  const mcp = [];
35
67
  // What this target writes comes from its walk; the matrix decides the rest and warns (spec 18).
36
68
  // `ctx.resolution.ingredients` above is for lookups only.
@@ -38,12 +70,15 @@ export const kiro = {
38
70
  const m = ing.meta;
39
71
  switch (m.type) {
40
72
  case "rule": {
41
- const body = resolve(await ctx.text(ing, m.file), ing.ref);
73
+ const rawBody = await ctx.text(ing, m.file);
74
+ const body = resolve(rawBody, ing.ref);
75
+ const path = ruleFile("kiro", m);
76
+ checkReworded(path, [rawBody], ing.ref);
42
77
  const fm = m.inclusion === "fileMatch"
43
78
  ? `---\ninclusion: fileMatch\nfileMatchPattern: ${JSON.stringify(Array.isArray(m.fileMatchPattern) ? m.fileMatchPattern.join(",") : m.fileMatchPattern ?? "**")}\n---\n\n`
44
79
  : `---\ninclusion: ${m.inclusion}\n---\n\n`;
45
80
  const head = banner.replace("{{source}}", `.claude/rules/${outName(m)}.md`) + "\n\n";
46
- out.push(crlf(ruleFile("kiro", m), fm + head + body, ing.ref));
81
+ out.push(crlf(path, fm + head + body, ing.ref));
47
82
  break;
48
83
  }
49
84
  case "steering":
@@ -51,38 +86,80 @@ export const kiro = {
51
86
  out.push(crlf(`.kiro/steering/${outName(m)}.md`, await ctx.text(ing, m.file), ing.ref));
52
87
  break;
53
88
  case "agent": {
89
+ const path = `.kiro/agents/${outName(m)}.json`;
54
90
  // Resolve description first, then body (spec 17 §4.5 order: description before prompt)
55
- const description = resolve(m.description ?? "", ing.ref);
91
+ const rawDesc = m.description ?? "";
92
+ const description = resolve(rawDesc, ing.ref);
56
93
  // Read the body once and derive both versions from it
57
94
  const rawBody = await ctx.text(ing, m.file);
58
95
  const body = resolve(rawBody, ing.ref);
96
+ checkReworded(path, [rawDesc, rawBody], ing.ref);
59
97
  const tools = mapTools(m.tools, ctx);
60
98
  // agentResources reads the blanket-rewritten text, not the resolved text (spec 17 §4.6)
61
- const resources = m.resources ?? agentResources(outName(m), rewrite(m.description ?? "") + "\n" + rewrite(rawBody), ruleNames, scopedRules);
99
+ const resources = m.resources ?? agentResources(outName(m), rewrite(rawDesc) + "\n" + rewrite(rawBody), ruleNames, scopedRules);
100
+ // Under the mode, record hand-written resources for the check (spec 41 §4.5)
101
+ if (primary && m.resources) {
102
+ for (const entry of m.resources) {
103
+ if (!entry.startsWith("file://"))
104
+ continue;
105
+ const raw = entry.slice("file://".length);
106
+ // Skip globs
107
+ if (/[*?[{]/.test(raw))
108
+ continue;
109
+ // Compared as a path (`.kiro/steering/./x.md` is `.kiro/steering/x.md`); one that climbs out of the workspace
110
+ // names nothing the plan can write and is never looked up on disk.
111
+ if (climbsOut(raw))
112
+ continue;
113
+ const rel = posix.normalize(raw);
114
+ // Only check .kiro/steering/, .claude/rules/, or AGENTS.md
115
+ if (rel.startsWith(".kiro/steering/") || rel.startsWith(".claude/rules/") || rel === "AGENTS.md") {
116
+ ctx.reportKiroResource(outName(m), rel);
117
+ }
118
+ }
119
+ }
62
120
  const json = JSON.stringify({ name: outName(m), description, prompt: body.replace(/^\n+/, "").replace(/\n+$/, ""), tools, allowedTools: tools, resources }, null, 2) + "\n";
63
- out.push(crlf(`.kiro/agents/${outName(m)}.json`, json, ing.ref));
121
+ out.push(crlf(path, json, ing.ref));
64
122
  break;
65
123
  }
66
124
  case "command": {
125
+ const path = `.kiro/steering/commands/${outName(m)}.md`;
126
+ const rawBody = await ctx.text(ing, m.file);
67
127
  // Resolve description and raw frontmatter first, then body (spec 17 §4.5 order: frontmatter before body)
68
128
  // When frontmatterRaw is set, the description field is unused (serializeFrontmatter ignores it),
69
129
  // so we skip resolving it to avoid spurious reports.
70
130
  const resolvedDescription = !m.frontmatterRaw && m.description !== undefined ? resolve(m.description, ing.ref) : undefined;
71
131
  const resolvedFm = m.frontmatterRaw ? resolve(m.frontmatterRaw, ing.ref) : null;
72
- const body = resolve(await ctx.text(ing, m.file), ing.ref);
132
+ const body = resolve(rawBody, ing.ref);
133
+ checkReworded(path, [m.frontmatterRaw ? m.frontmatterRaw : (m.description ?? ""), rawBody], ing.ref);
73
134
  const doc = serializeFrontmatter({ description: resolvedDescription, "argument-hint": m.argumentHint, "allowed-tools": m.allowedTools }, body, { raw: resolvedFm });
74
- out.push(crlf(`.kiro/steering/commands/${outName(m)}.md`, `---\ninclusion: manual\n---\n\n` + doc, ing.ref));
135
+ out.push(crlf(path, `---\ninclusion: manual\n---\n\n` + doc, ing.ref));
75
136
  break;
76
137
  }
77
138
  case "skill": {
78
139
  if (m.layout === "file") {
79
- out.push(crlf(`.kiro/skills/${outName(m)}/SKILL.md`, resolve(await ctx.text(ing, "SKILL.md"), ing.ref), ing.ref));
140
+ const path = `.kiro/skills/${outName(m)}/SKILL.md`;
141
+ const rawText = await ctx.text(ing, "SKILL.md");
142
+ const text = resolve(rawText, ing.ref);
143
+ checkReworded(path, [rawText], ing.ref);
144
+ out.push(crlf(path, text, ing.ref));
80
145
  }
81
146
  else {
82
147
  for (const f of await listFiles(ing.dir)) {
83
148
  if (f === "ingredient.yaml")
84
149
  continue;
85
- out.push(await copy(ctx, ing, f, `.kiro/skills/${outName(m)}/${f}`, resolve));
150
+ const path = `.kiro/skills/${outName(m)}/${f}`;
151
+ if (KIRO_TEXT_EXT.test(f)) {
152
+ const rawText = await ctx.text(ing, f);
153
+ const text = resolve(rawText, ing.ref);
154
+ checkReworded(path, [rawText], ing.ref);
155
+ out.push(crlf(path, text, ing.ref));
156
+ }
157
+ else {
158
+ // Binary file: scan but don't rewrite (spec 41 §4.4)
159
+ const content = await ctx.bytes(ing, f);
160
+ scanFile(path, content);
161
+ out.push({ path, content, target: t, ingredient: ing.ref });
162
+ }
86
163
  }
87
164
  }
88
165
  break;
@@ -97,8 +174,8 @@ export const kiro = {
97
174
  }
98
175
  }
99
176
  }
100
- // Emit one warning for all dead and unknown references (spec 17 §4.5)
101
- emitKiroWarning(ctx, reports);
177
+ // Emit one warning for all dead and unknown references (spec 17 §4.5) and scanned files (spec 41 §4.4)
178
+ emitKiroWarning(ctx, reports, scannedHits);
102
179
  const servers = mcpServers(ctx, t, ".kiro/settings/mcp.json", mcp);
103
180
  if (Object.keys(servers).length) {
104
181
  out.push(crlf(".kiro/settings/mcp.json", JSON.stringify({ mcpServers: servers }, null, 2) + "\n", "mcp/*"));
@@ -106,8 +183,8 @@ export const kiro = {
106
183
  return out;
107
184
  },
108
185
  };
109
- /** Emit the kiro warning for dead and unknown references (spec 17 §4.5). */
110
- function emitKiroWarning(ctx, reports) {
186
+ /** Emit the kiro warning for dead, unknown references, and scanned files (spec 17 §4.5, spec 41 §4.4). */
187
+ function emitKiroWarning(ctx, reports, scannedHits = []) {
111
188
  // Collect entries: D (has kind with "reaches no target") and unknown (empty kind)
112
189
  const dead = [];
113
190
  const unknown = [];
@@ -132,12 +209,22 @@ function emitKiroWarning(ctx, reports) {
132
209
  }
133
210
  }
134
211
  }
135
- if (dead.length === 0 && unknown.length === 0)
212
+ // Dedupe scanned hits by path+line+name, sort by path then line
213
+ const seenScanned = new Set();
214
+ const dedupedHits = [];
215
+ const sortedHits = [...scannedHits].sort((a, b) => a.path.localeCompare(b.path) || a.line - b.line);
216
+ for (const h of sortedHits) {
217
+ const key = `${h.path}:${h.line}:${h.name}`;
218
+ if (!seenScanned.has(key)) {
219
+ seenScanned.add(key);
220
+ dedupedHits.push(h);
221
+ }
222
+ }
223
+ if (dead.length === 0 && unknown.length === 0 && dedupedHits.length === 0)
136
224
  return;
137
225
  const parts = [];
138
226
  if (dead.length > 0) {
139
- const entries = dead.map((e) => `${e.ref} (in ${e.citing}; ${e.kind})`).join(", ");
140
- parts.push(`${dead.length} reference(s) to rule files this workspace does not have — reworded: ${entries}`);
227
+ parts.push(formatDeadRefs(dead));
141
228
  }
142
229
  if (unknown.length > 0) {
143
230
  const entries = unknown.map((e) => `${e.ref} (in ${e.citing})`).join(", ");
@@ -148,6 +235,9 @@ function emitKiroWarning(ctx, reports) {
148
235
  parts.push(`${unknown.length} reference(s) to names that are no rule or steering of this workspace — rewritten to .kiro/steering/ as before: ${entries}`);
149
236
  }
150
237
  }
238
+ if (dedupedHits.length > 0) {
239
+ parts.push(formatScannedRefs(dedupedHits));
240
+ }
151
241
  ctx.warn(`kiro: ${parts.join("; ")}`);
152
242
  }
153
243
  export function rewrite(text) {
@@ -156,11 +246,6 @@ export function rewrite(text) {
156
246
  function crlf(path, text, ingredient) {
157
247
  return { path, content: Buffer.from(toCrlf(text), "utf8"), target: "kiro", ingredient };
158
248
  }
159
- async function copy(ctx, ing, file, relPath, resolve) {
160
- if (KIRO_TEXT_EXT.test(file))
161
- return crlf(relPath, resolve(await ctx.text(ing, file), ing.ref), ing.ref);
162
- return { path: relPath, content: await ctx.bytes(ing, file), target: "kiro", ingredient: ing.ref };
163
- }
164
249
  const TOOL_MAP = {
165
250
  read: "read",
166
251
  grep: "grep",