yandecode 0.1.0 → 0.2.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 (222) hide show
  1. package/dist/bin.js +14 -8
  2. package/dist/bin.js.map +7 -1
  3. package/dist/chunks/chunk-23DG7PZZ.js +58 -0
  4. package/dist/chunks/chunk-23DG7PZZ.js.map +7 -0
  5. package/dist/chunks/chunk-2S6B3DDQ.js +1769 -0
  6. package/dist/chunks/chunk-2S6B3DDQ.js.map +7 -0
  7. package/dist/chunks/chunk-6J5CZVCJ.js +120 -0
  8. package/dist/chunks/chunk-6J5CZVCJ.js.map +7 -0
  9. package/dist/chunks/chunk-7L6DD2VD.js +768 -0
  10. package/dist/chunks/chunk-7L6DD2VD.js.map +7 -0
  11. package/dist/chunks/chunk-DWD37AI2.js +39 -0
  12. package/dist/chunks/chunk-DWD37AI2.js.map +7 -0
  13. package/dist/chunks/chunk-KPDBXQ62.js +62 -0
  14. package/dist/chunks/chunk-KPDBXQ62.js.map +7 -0
  15. package/dist/chunks/chunk-KVBKQXTU.js +351 -0
  16. package/dist/chunks/chunk-KVBKQXTU.js.map +7 -0
  17. package/dist/chunks/chunk-L2DDIZPI.js +53 -0
  18. package/dist/chunks/chunk-L2DDIZPI.js.map +7 -0
  19. package/dist/chunks/chunk-OIAMKDTQ.js +27 -0
  20. package/dist/chunks/chunk-OIAMKDTQ.js.map +7 -0
  21. package/dist/chunks/chunk-PUWSEWX3.js +61 -0
  22. package/dist/chunks/chunk-PUWSEWX3.js.map +7 -0
  23. package/dist/chunks/chunk-QCQC73WX.js +122 -0
  24. package/dist/chunks/chunk-QCQC73WX.js.map +7 -0
  25. package/dist/chunks/chunk-TYLH4NIC.js +39 -0
  26. package/dist/chunks/chunk-TYLH4NIC.js.map +7 -0
  27. package/dist/chunks/chunk-VKVJGBNJ.js +72 -0
  28. package/dist/chunks/chunk-VKVJGBNJ.js.map +7 -0
  29. package/dist/chunks/chunk-Y2MIXROU.js +20072 -0
  30. package/dist/chunks/chunk-Y2MIXROU.js.map +7 -0
  31. package/dist/chunks/cli-V6PJTDLM.js +3464 -0
  32. package/dist/chunks/cli-V6PJTDLM.js.map +7 -0
  33. package/dist/chunks/doctor-LLDVEPWL.js +184 -0
  34. package/dist/chunks/doctor-LLDVEPWL.js.map +7 -0
  35. package/dist/chunks/entry-YAOEX3EB.js +187 -0
  36. package/dist/chunks/entry-YAOEX3EB.js.map +7 -0
  37. package/dist/chunks/init-4ZJFCKIJ.js +46 -0
  38. package/dist/chunks/init-4ZJFCKIJ.js.map +7 -0
  39. package/dist/chunks/mcp-serve-KWKMUGWZ.js +22575 -0
  40. package/dist/chunks/mcp-serve-KWKMUGWZ.js.map +7 -0
  41. package/dist/chunks/modules-CJB5IKUJ.js +121 -0
  42. package/dist/chunks/modules-CJB5IKUJ.js.map +7 -0
  43. package/dist/chunks/runtime-3E4NIFAL.js +208 -0
  44. package/dist/chunks/runtime-3E4NIFAL.js.map +7 -0
  45. package/dist/chunks/runtime-7CRR63B5.js +395 -0
  46. package/dist/chunks/runtime-7CRR63B5.js.map +7 -0
  47. package/dist/chunks/runtime-CKMVHAU4.js +64 -0
  48. package/dist/chunks/runtime-CKMVHAU4.js.map +7 -0
  49. package/dist/chunks/runtime-CVZMWIJO.js +318 -0
  50. package/dist/chunks/runtime-CVZMWIJO.js.map +7 -0
  51. package/dist/chunks/runtime-DBNXBOAL.js +295 -0
  52. package/dist/chunks/runtime-DBNXBOAL.js.map +7 -0
  53. package/dist/chunks/runtime-EKHO2JXB.js +197 -0
  54. package/dist/chunks/runtime-EKHO2JXB.js.map +7 -0
  55. package/dist/chunks/runtime-EY6SVZYP.js +539 -0
  56. package/dist/chunks/runtime-EY6SVZYP.js.map +7 -0
  57. package/dist/chunks/runtime-UB2O2HUN.js +212 -0
  58. package/dist/chunks/runtime-UB2O2HUN.js.map +7 -0
  59. package/dist/chunks/runtime-WAFQWW4M.js +755 -0
  60. package/dist/chunks/runtime-WAFQWW4M.js.map +7 -0
  61. package/dist/chunks/runtime-ZGGF6RVA.js +271 -0
  62. package/dist/chunks/runtime-ZGGF6RVA.js.map +7 -0
  63. package/dist/chunks/status-SPIESL4F.js +38 -0
  64. package/dist/chunks/status-SPIESL4F.js.map +7 -0
  65. package/dist/chunks/uninstall-J2OWCX4A.js +54 -0
  66. package/dist/chunks/uninstall-J2OWCX4A.js.map +7 -0
  67. package/dist/chunks/update-OX5MZYQY.js +34 -0
  68. package/dist/chunks/update-OX5MZYQY.js.map +7 -0
  69. package/dist/content/agents/yandecode-reviewer.md +22 -0
  70. package/dist/content/agents/yandecode-security-reviewer.md +23 -0
  71. package/dist/content/skills/NOTICE.md +29 -0
  72. package/dist/content/skills/yandecode-code-review/SKILL.md +37 -0
  73. package/dist/content/skills/yandecode-debugging/SKILL.md +33 -0
  74. package/dist/content/skills/yandecode-instructions/SKILL.md +26 -0
  75. package/dist/content/skills/yandecode-memory/SKILL.md +36 -0
  76. package/dist/content/skills/yandecode-security-review/SKILL.md +24 -0
  77. package/dist/content/skills/yandecode-tdd/SKILL.md +38 -0
  78. package/dist/content/skills/yandecode-verification/SKILL.md +29 -0
  79. package/dist/content/skills/yandecode-workflow/SKILL.md +50 -0
  80. package/package.json +25 -19
  81. package/dist/bin.d.ts +0 -3
  82. package/dist/bin.d.ts.map +0 -1
  83. package/dist/cli.d.ts +0 -6
  84. package/dist/cli.d.ts.map +0 -1
  85. package/dist/cli.js +0 -21
  86. package/dist/cli.js.map +0 -1
  87. package/dist/commands/doctor.d.ts +0 -2
  88. package/dist/commands/doctor.d.ts.map +0 -1
  89. package/dist/commands/doctor.js +0 -19
  90. package/dist/commands/doctor.js.map +0 -1
  91. package/dist/commands/hook.d.ts +0 -2
  92. package/dist/commands/hook.d.ts.map +0 -1
  93. package/dist/commands/hook.js +0 -23
  94. package/dist/commands/hook.js.map +0 -1
  95. package/dist/commands/index-cmd.d.ts +0 -2
  96. package/dist/commands/index-cmd.d.ts.map +0 -1
  97. package/dist/commands/index-cmd.js +0 -47
  98. package/dist/commands/index-cmd.js.map +0 -1
  99. package/dist/commands/index.d.ts +0 -13
  100. package/dist/commands/index.d.ts.map +0 -1
  101. package/dist/commands/index.js +0 -15
  102. package/dist/commands/index.js.map +0 -1
  103. package/dist/commands/init.d.ts +0 -2
  104. package/dist/commands/init.d.ts.map +0 -1
  105. package/dist/commands/init.js +0 -22
  106. package/dist/commands/init.js.map +0 -1
  107. package/dist/commands/mcp.d.ts +0 -2
  108. package/dist/commands/mcp.d.ts.map +0 -1
  109. package/dist/commands/mcp.js +0 -71
  110. package/dist/commands/mcp.js.map +0 -1
  111. package/dist/commands/rag.d.ts +0 -2
  112. package/dist/commands/rag.d.ts.map +0 -1
  113. package/dist/commands/rag.js +0 -27
  114. package/dist/commands/rag.js.map +0 -1
  115. package/dist/commands/start.d.ts +0 -6
  116. package/dist/commands/start.d.ts.map +0 -1
  117. package/dist/commands/start.js +0 -76
  118. package/dist/commands/start.js.map +0 -1
  119. package/dist/commands/status.d.ts +0 -2
  120. package/dist/commands/status.d.ts.map +0 -1
  121. package/dist/commands/status.js +0 -29
  122. package/dist/commands/status.js.map +0 -1
  123. package/dist/commands/statusline.d.ts +0 -2
  124. package/dist/commands/statusline.d.ts.map +0 -1
  125. package/dist/commands/statusline.js +0 -90
  126. package/dist/commands/statusline.js.map +0 -1
  127. package/dist/commands/swarm.d.ts +0 -4
  128. package/dist/commands/swarm.d.ts.map +0 -1
  129. package/dist/commands/swarm.js +0 -48
  130. package/dist/commands/swarm.js.map +0 -1
  131. package/dist/commands/uninstall.d.ts +0 -2
  132. package/dist/commands/uninstall.d.ts.map +0 -1
  133. package/dist/commands/uninstall.js +0 -16
  134. package/dist/commands/uninstall.js.map +0 -1
  135. package/dist/context.d.ts +0 -13
  136. package/dist/context.d.ts.map +0 -1
  137. package/dist/context.js +0 -31
  138. package/dist/context.js.map +0 -1
  139. package/dist/doctor/checks.d.ts +0 -18
  140. package/dist/doctor/checks.d.ts.map +0 -1
  141. package/dist/doctor/checks.js +0 -269
  142. package/dist/doctor/checks.js.map +0 -1
  143. package/dist/hooks/handlers.d.ts +0 -21
  144. package/dist/hooks/handlers.d.ts.map +0 -1
  145. package/dist/hooks/handlers.js +0 -191
  146. package/dist/hooks/handlers.js.map +0 -1
  147. package/dist/index.d.ts +0 -9
  148. package/dist/index.d.ts.map +0 -1
  149. package/dist/index.js +0 -9
  150. package/dist/index.js.map +0 -1
  151. package/dist/integration/claude-md.d.ts +0 -6
  152. package/dist/integration/claude-md.d.ts.map +0 -1
  153. package/dist/integration/claude-md.js +0 -30
  154. package/dist/integration/claude-md.js.map +0 -1
  155. package/dist/integration/gitignore.d.ts +0 -3
  156. package/dist/integration/gitignore.d.ts.map +0 -1
  157. package/dist/integration/gitignore.js +0 -13
  158. package/dist/integration/gitignore.js.map +0 -1
  159. package/dist/integration/init.d.ts +0 -17
  160. package/dist/integration/init.d.ts.map +0 -1
  161. package/dist/integration/init.js +0 -86
  162. package/dist/integration/init.js.map +0 -1
  163. package/dist/integration/json-utils.d.ts +0 -13
  164. package/dist/integration/json-utils.d.ts.map +0 -1
  165. package/dist/integration/json-utils.js +0 -33
  166. package/dist/integration/json-utils.js.map +0 -1
  167. package/dist/integration/manifest.d.ts +0 -17
  168. package/dist/integration/manifest.d.ts.map +0 -1
  169. package/dist/integration/manifest.js +0 -26
  170. package/dist/integration/manifest.js.map +0 -1
  171. package/dist/integration/materialize.d.ts +0 -9
  172. package/dist/integration/materialize.d.ts.map +0 -1
  173. package/dist/integration/materialize.js +0 -21
  174. package/dist/integration/materialize.js.map +0 -1
  175. package/dist/integration/mcp-config.d.ts +0 -4
  176. package/dist/integration/mcp-config.d.ts.map +0 -1
  177. package/dist/integration/mcp-config.js +0 -11
  178. package/dist/integration/mcp-config.js.map +0 -1
  179. package/dist/integration/settings.d.ts +0 -7
  180. package/dist/integration/settings.d.ts.map +0 -1
  181. package/dist/integration/settings.js +0 -70
  182. package/dist/integration/settings.js.map +0 -1
  183. package/dist/integration/uninstall.d.ts +0 -10
  184. package/dist/integration/uninstall.d.ts.map +0 -1
  185. package/dist/integration/uninstall.js +0 -71
  186. package/dist/integration/uninstall.js.map +0 -1
  187. package/dist/launcher.d.ts +0 -8
  188. package/dist/launcher.d.ts.map +0 -1
  189. package/dist/launcher.js +0 -18
  190. package/dist/launcher.js.map +0 -1
  191. package/dist/mcp/server.d.ts +0 -27
  192. package/dist/mcp/server.d.ts.map +0 -1
  193. package/dist/mcp/server.js +0 -311
  194. package/dist/mcp/server.js.map +0 -1
  195. package/dist/plugin-content.d.ts +0 -21
  196. package/dist/plugin-content.d.ts.map +0 -1
  197. package/dist/plugin-content.js +0 -67
  198. package/dist/plugin-content.js.map +0 -1
  199. package/dist/rag/format.d.ts +0 -3
  200. package/dist/rag/format.d.ts.map +0 -1
  201. package/dist/rag/format.js +0 -12
  202. package/dist/rag/format.js.map +0 -1
  203. package/dist/retrieval-runtime.d.ts +0 -21
  204. package/dist/retrieval-runtime.d.ts.map +0 -1
  205. package/dist/retrieval-runtime.js +0 -47
  206. package/dist/retrieval-runtime.js.map +0 -1
  207. package/dist/status-line/git.d.ts +0 -3
  208. package/dist/status-line/git.d.ts.map +0 -1
  209. package/dist/status-line/git.js +0 -34
  210. package/dist/status-line/git.js.map +0 -1
  211. package/dist/status-line/render.d.ts +0 -29
  212. package/dist/status-line/render.d.ts.map +0 -1
  213. package/dist/status-line/render.js +0 -72
  214. package/dist/status-line/render.js.map +0 -1
  215. package/dist/swarm-runtime.d.ts +0 -11
  216. package/dist/swarm-runtime.d.ts.map +0 -1
  217. package/dist/swarm-runtime.js +0 -76
  218. package/dist/swarm-runtime.js.map +0 -1
  219. package/dist/version.d.ts +0 -2
  220. package/dist/version.d.ts.map +0 -1
  221. package/dist/version.js +0 -5
  222. package/dist/version.js.map +0 -1
@@ -0,0 +1,121 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ parseModuleList
5
+ } from "./chunk-23DG7PZZ.js";
6
+ import {
7
+ printApplyReport,
8
+ saveSelectionAndApply
9
+ } from "./chunk-VKVJGBNJ.js";
10
+ import "./chunk-KVBKQXTU.js";
11
+ import "./chunk-L2DDIZPI.js";
12
+ import "./chunk-DWD37AI2.js";
13
+ import "./chunk-PUWSEWX3.js";
14
+ import {
15
+ dependentsOf,
16
+ findModule,
17
+ requireWorkspace,
18
+ resolveEnabled
19
+ } from "./chunk-QCQC73WX.js";
20
+ import {
21
+ MODULES
22
+ } from "./chunk-7L6DD2VD.js";
23
+ import {
24
+ YandeCodeError
25
+ } from "./chunk-Y2MIXROU.js";
26
+
27
+ // packages/cli/src/commands/modules.ts
28
+ import { rmSync, readdirSync } from "node:fs";
29
+ import { join } from "node:path";
30
+ function runModulesList(cwd, io, deps = {}) {
31
+ const registry = deps.registry ?? MODULES;
32
+ const ws = requireWorkspace(cwd);
33
+ const enabled = new Set(resolveEnabled(registry, ws.config.modules));
34
+ const width = Math.max(...registry.map((m) => m.id.length));
35
+ for (const m of registry) {
36
+ const tools = (m.tools ?? []).length;
37
+ const facts = [
38
+ tools > 0 && `${tools} tool(s)`,
39
+ m.hooks.length > 0 && `hooks: ${[...new Set(m.hooks.map((h) => h.event))].join(", ")}`,
40
+ m.requires.length > 0 && `requires ${m.requires.join(", ")}`
41
+ ].filter(Boolean);
42
+ io.out(
43
+ `${enabled.has(m.id) ? "\u25CF" : "\u25CB"} ${m.id.padEnd(width)} ${m.summary}${facts.length > 0 ? ` [${facts.join("; ")}]` : ""}
44
+ `
45
+ );
46
+ }
47
+ return 0;
48
+ }
49
+ function runModulesInfo(id, io, deps = {}) {
50
+ const m = findModule(id, deps.registry ?? MODULES);
51
+ const lines = [
52
+ `${m.id} \u2014 ${m.title}`,
53
+ m.summary,
54
+ `requires: ${m.requires.join(", ") || "-"}`,
55
+ `external requirements: ${(m.requirements ?? []).join("; ") || "none"}`,
56
+ `hooks: ${m.hooks.map((h) => h.matcher ? `${h.event}(${h.matcher})` : h.event).join(", ") || "-"}`,
57
+ `tools: ${(m.tools ?? []).map((t) => t.name).join(", ") || "-"}`,
58
+ `skills: ${m.skills.join(", ") || "-"}`,
59
+ `agents: ${m.agents.join(", ") || "-"}`
60
+ ];
61
+ io.out(`${lines.join("\n")}
62
+ `);
63
+ return 0;
64
+ }
65
+ function runModulesEnable(cwd, list, io, deps = {}) {
66
+ const ws = requireWorkspace(cwd);
67
+ const ids = list.flatMap(parseModuleList);
68
+ const { config, added, report } = saveSelectionAndApply(
69
+ ws.root,
70
+ [...ws.config.modules, ...ids],
71
+ deps
72
+ );
73
+ printApplyReport(
74
+ io,
75
+ config.modules,
76
+ added.filter((id) => !ws.config.modules.includes(id)),
77
+ report
78
+ );
79
+ return 0;
80
+ }
81
+ function runModulesDisable(cwd, list, flags, io, deps = {}) {
82
+ const registry = deps.registry ?? MODULES;
83
+ const ws = requireWorkspace(cwd);
84
+ const enabled = resolveEnabled(registry, ws.config.modules);
85
+ const toDisable = new Set(list.flatMap(parseModuleList).map((id) => findModule(id, registry).id));
86
+ for (const id of [...toDisable]) {
87
+ const dependents = dependentsOf(registry, enabled, id).filter((d) => !toDisable.has(d));
88
+ if (dependents.length === 0) continue;
89
+ if (!flags.cascade) {
90
+ throw new YandeCodeError(
91
+ "MODULE_REQUIRED",
92
+ `cannot disable "${id}": required by ${dependents.join(", ")} (disable them too, or pass --cascade)`
93
+ );
94
+ }
95
+ dependents.forEach((d) => toDisable.add(d));
96
+ }
97
+ const remaining = enabled.filter((id) => !toDisable.has(id));
98
+ const { config, report } = saveSelectionAndApply(ws.root, remaining, deps);
99
+ if (flags.purge) {
100
+ for (const id of toDisable) {
101
+ for (const file of readdirSync(ws.paths.yandecodeDir).filter(
102
+ (f) => f === `${id}.db` || f.startsWith(`${id}.db-`) || f === id
103
+ )) {
104
+ rmSync(join(ws.paths.yandecodeDir, file), { recursive: true, force: true });
105
+ io.out(` purged .yandecode/${file}
106
+ `);
107
+ }
108
+ }
109
+ }
110
+ io.out(`disabled: ${[...toDisable].join(", ")}
111
+ `);
112
+ printApplyReport(io, config.modules, [], report);
113
+ return 0;
114
+ }
115
+ export {
116
+ runModulesDisable,
117
+ runModulesEnable,
118
+ runModulesInfo,
119
+ runModulesList
120
+ };
121
+ //# sourceMappingURL=modules-CJB5IKUJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/modules.ts"],
4
+ "sourcesContent": ["import { rmSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { YandeCodeError } from '@yandecode/core';\nimport type { Io } from '@cli/io';\nimport { findModule, requireWorkspace } from '@cli/modules/host';\nimport { MODULES } from '@cli/modules/registry';\nimport { dependentsOf, resolveEnabled } from '@cli/modules/resolve';\nimport { parseModuleList } from './select-modules';\nimport { printApplyReport, saveSelectionAndApply, type SetupDeps } from './setup';\n\nexport function runModulesList(cwd: string, io: Io, deps: SetupDeps = {}): number {\n const registry = deps.registry ?? MODULES;\n const ws = requireWorkspace(cwd);\n const enabled = new Set(resolveEnabled(registry, ws.config.modules));\n const width = Math.max(...registry.map((m) => m.id.length));\n for (const m of registry) {\n const tools = (m.tools ?? []).length;\n const facts = [\n tools > 0 && `${tools} tool(s)`,\n m.hooks.length > 0 && `hooks: ${[...new Set(m.hooks.map((h) => h.event))].join(', ')}`,\n m.requires.length > 0 && `requires ${m.requires.join(', ')}`,\n ].filter(Boolean);\n io.out(\n `${enabled.has(m.id) ? '\u25CF' : '\u25CB'} ${m.id.padEnd(width)} ${m.summary}${facts.length > 0 ? ` [${facts.join('; ')}]` : ''}\\n`,\n );\n }\n return 0;\n}\n\nexport function runModulesInfo(id: string, io: Io, deps: SetupDeps = {}): number {\n const m = findModule(id, deps.registry ?? MODULES);\n const lines = [\n `${m.id} \u2014 ${m.title}`,\n m.summary,\n `requires: ${m.requires.join(', ') || '-'}`,\n `external requirements: ${(m.requirements ?? []).join('; ') || 'none'}`,\n `hooks: ${m.hooks.map((h) => (h.matcher ? `${h.event}(${h.matcher})` : h.event)).join(', ') || '-'}`,\n `tools: ${(m.tools ?? []).map((t) => t.name).join(', ') || '-'}`,\n `skills: ${m.skills.join(', ') || '-'}`,\n `agents: ${m.agents.join(', ') || '-'}`,\n ];\n io.out(`${lines.join('\\n')}\\n`);\n return 0;\n}\n\nexport function runModulesEnable(\n cwd: string,\n list: string[],\n io: Io,\n deps: SetupDeps = {},\n): number {\n const ws = requireWorkspace(cwd);\n const ids = list.flatMap(parseModuleList);\n const { config, added, report } = saveSelectionAndApply(\n ws.root,\n [...ws.config.modules, ...ids],\n deps,\n );\n printApplyReport(\n io,\n config.modules,\n added.filter((id) => !ws.config.modules.includes(id)),\n report,\n );\n return 0;\n}\n\nexport interface DisableFlags {\n cascade?: boolean;\n purge?: boolean;\n}\n\nexport function runModulesDisable(\n cwd: string,\n list: string[],\n flags: DisableFlags,\n io: Io,\n deps: SetupDeps = {},\n): number {\n const registry = deps.registry ?? MODULES;\n const ws = requireWorkspace(cwd);\n const enabled = resolveEnabled(registry, ws.config.modules);\n const toDisable = new Set(list.flatMap(parseModuleList).map((id) => findModule(id, registry).id));\n for (const id of [...toDisable]) {\n const dependents = dependentsOf(registry, enabled, id).filter((d) => !toDisable.has(d));\n if (dependents.length === 0) continue;\n if (!flags.cascade) {\n throw new YandeCodeError(\n 'MODULE_REQUIRED',\n `cannot disable \"${id}\": required by ${dependents.join(', ')} (disable them too, or pass --cascade)`,\n );\n }\n dependents.forEach((d) => toDisable.add(d));\n }\n const remaining = enabled.filter((id) => !toDisable.has(id));\n const { config, report } = saveSelectionAndApply(ws.root, remaining, deps);\n if (flags.purge) {\n for (const id of toDisable) {\n for (const file of readdirSync(ws.paths.yandecodeDir).filter(\n (f) => f === `${id}.db` || f.startsWith(`${id}.db-`) || f === id,\n )) {\n rmSync(join(ws.paths.yandecodeDir, file), { recursive: true, force: true });\n io.out(` purged .yandecode/${file}\\n`);\n }\n }\n }\n io.out(`disabled: ${[...toDisable].join(', ')}\\n`);\n printApplyReport(io, config.modules, [], report);\n return 0;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,208 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ requireWorkspace
5
+ } from "./chunk-QCQC73WX.js";
6
+ import {
7
+ detectChecks
8
+ } from "./chunk-7L6DD2VD.js";
9
+ import {
10
+ listCandidatePaths
11
+ } from "./chunk-2S6B3DDQ.js";
12
+ import "./chunk-Y2MIXROU.js";
13
+
14
+ // packages/cli/src/modules/instructions/audit.ts
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { basename, dirname, extname, join } from "node:path";
17
+ var INSTRUCTION_FILES = /* @__PURE__ */ new Set(["CLAUDE.md", "AGENTS.md", "CLAUDE.local.md", "GEMINI.md"]);
18
+ var MAX_CHARS = 8e3;
19
+ var MANAGED_BLOCK = /<!-- yandecode:start -->[\s\S]*?<!-- yandecode:end -->/g;
20
+ var LANGUAGE_NAMES = {
21
+ ".ts": "TypeScript",
22
+ ".tsx": "TypeScript",
23
+ ".js": "JavaScript",
24
+ ".py": "Python",
25
+ ".go": "Go",
26
+ ".rs": "Rust",
27
+ ".java": "Java",
28
+ ".kt": "Kotlin",
29
+ ".rb": "Ruby",
30
+ ".php": "PHP",
31
+ ".cs": "C#"
32
+ };
33
+ function withoutManagedBlock(text) {
34
+ return text.replace(MANAGED_BLOCK, (block) => block.replace(/[^\n]/g, ""));
35
+ }
36
+ var HOST_WITHOUT_SCHEME = /^[\w-]+(\.[\w-]+)+\//;
37
+ function pathCandidates(line) {
38
+ const inCode = [...line.matchAll(/`([^`\s]+)`/g)].map((m) => m[1]).filter((p) => p.includes("/"));
39
+ const links = [...line.matchAll(/\]\(([^)\s]+)\)/g)].map((m) => m[1]);
40
+ return [...inCode, ...links].filter((p) => !/^[a-z]+:|^#|^-|^~|^\/|[*<>{}$|]/i.test(p) && !HOST_WITHOUT_SCHEME.test(p)).map((p) => p.replace(/[#?].*$/, "").replace(/:\d+(-\d+)?$/, "")).filter((p) => p.length > 0);
41
+ }
42
+ function missingPaths(root, file, lines) {
43
+ const dir = dirname(join(root, file));
44
+ const workspacePrefix = `${basename(root)}/`;
45
+ const exists = (p) => existsSync(join(root, p)) || existsSync(join(dir, p)) || p.startsWith(workspacePrefix) && existsSync(join(root, p.slice(workspacePrefix.length)));
46
+ return lines.flatMap(
47
+ (line, i) => pathCandidates(line).filter((p) => !exists(p)).map((p) => ({
48
+ file,
49
+ line: i + 1,
50
+ kind: "missing-path",
51
+ detail: `${p} does not exist`
52
+ }))
53
+ );
54
+ }
55
+ function unknownCommands(root, file, lines) {
56
+ const pkgFile = join(root, "package.json");
57
+ const scripts = existsSync(pkgFile) ? JSON.parse(readFileSync(pkgFile, "utf8")).scripts ?? {} : null;
58
+ const makefile = existsSync(join(root, "Makefile")) ? readFileSync(join(root, "Makefile"), "utf8") : null;
59
+ return lines.flatMap((line, i) => {
60
+ const issues = [];
61
+ for (const m of line.matchAll(/\b(npm|pnpm|yarn|bun) run ([\w:.-]+)/g)) {
62
+ if (scripts && !(m[2] in scripts)) {
63
+ issues.push({
64
+ file,
65
+ line: i + 1,
66
+ kind: "unknown-command",
67
+ detail: `${m[1]} run ${m[2]}: no "${m[2]}" script in package.json`
68
+ });
69
+ }
70
+ }
71
+ for (const m of line.matchAll(/`make ([\w.-]+)`/g)) {
72
+ if (makefile !== null && !new RegExp(`^${m[1].replace(/[.]/g, "\\.")}:`, "m").test(makefile)) {
73
+ issues.push({
74
+ file,
75
+ line: i + 1,
76
+ kind: "unknown-command",
77
+ detail: `make ${m[1]}: no such target in Makefile`
78
+ });
79
+ }
80
+ }
81
+ return issues;
82
+ });
83
+ }
84
+ function duplicates(contents) {
85
+ const firstSeen = /* @__PURE__ */ new Map();
86
+ const issues = [];
87
+ for (const [file, lines] of contents) {
88
+ lines.forEach((line, i) => {
89
+ const key = line.trim().toLowerCase().replace(/\s+/g, " ");
90
+ if (key.length < 20 || key.startsWith("#") || key.startsWith("```")) return;
91
+ const first = firstSeen.get(key);
92
+ if (first) issues.push({ file, line: i + 1, kind: "duplicate", detail: `also in ${first}` });
93
+ else firstSeen.set(key, `${file}:${i + 1}`);
94
+ });
95
+ }
96
+ return issues;
97
+ }
98
+ function conventions(root, paths) {
99
+ const out = [];
100
+ const lock = [
101
+ ["pnpm-lock.yaml", "pnpm"],
102
+ ["yarn.lock", "yarn"],
103
+ ["bun.lock", "bun"],
104
+ ["package-lock.json", "npm"]
105
+ ].find(([file]) => existsSync(join(root, file)));
106
+ if (lock) out.push(`package manager: ${lock[1]}`);
107
+ for (const check of detectChecks(root)) out.push(`${check.step}: ${check.command}`);
108
+ const formatters = [
109
+ [".prettierrc", "prettier"],
110
+ ["prettier.config.js", "prettier"],
111
+ ["biome.json", "biome"],
112
+ [".editorconfig", "editorconfig"],
113
+ ["rustfmt.toml", "rustfmt"]
114
+ ].filter(([file]) => existsSync(join(root, file)));
115
+ for (const name of new Set(formatters.map(([, name2]) => name2))) out.push(`formatter: ${name}`);
116
+ const counts = /* @__PURE__ */ new Map();
117
+ for (const p of paths) {
118
+ const language = LANGUAGE_NAMES[extname(p).toLowerCase()];
119
+ if (language) counts.set(language, (counts.get(language) ?? 0) + 1);
120
+ }
121
+ const languages = [...counts].sort((a, b) => b[1] - a[1]).slice(0, 3).map(([name]) => name);
122
+ if (languages.length > 0) out.push(`languages: ${languages.join(", ")}`);
123
+ return out;
124
+ }
125
+ function auditInstructions(root) {
126
+ const paths = listCandidatePaths(root);
127
+ const files = paths.filter((p) => INSTRUCTION_FILES.has(basename(p))).sort((a, b) => a.split("/").length - b.split("/").length || a.localeCompare(b));
128
+ const contents = new Map(
129
+ files.map((f) => [f, withoutManagedBlock(readFileSync(join(root, f), "utf8")).split("\n")])
130
+ );
131
+ const issues = [];
132
+ if (!files.some((f) => !f.includes("/"))) {
133
+ issues.push({
134
+ file: "(none)",
135
+ line: 0,
136
+ kind: "missing-file",
137
+ detail: "no CLAUDE.md or AGENTS.md at the project root"
138
+ });
139
+ }
140
+ for (const [file, lines] of contents) {
141
+ const chars = lines.join("\n").length;
142
+ if (chars > MAX_CHARS) {
143
+ issues.push({
144
+ file,
145
+ line: 0,
146
+ kind: "too-long",
147
+ detail: `~${Math.round(chars / 4)} tokens loaded every session; move details into skills or docs`
148
+ });
149
+ }
150
+ issues.push(...missingPaths(root, file, lines), ...unknownCommands(root, file, lines));
151
+ }
152
+ issues.push(...duplicates(contents));
153
+ return {
154
+ files: files.map((path) => {
155
+ const chars = contents.get(path).join("\n").length;
156
+ return { path, chars, approxTokens: Math.round(chars / 4) };
157
+ }),
158
+ issues,
159
+ conventions: conventions(root, paths)
160
+ };
161
+ }
162
+
163
+ // packages/cli/src/modules/instructions/runtime.ts
164
+ function formatReport(report) {
165
+ const files = report.files.length > 0 ? report.files.map((f) => ` ${f.path} (~${f.approxTokens} tokens)`) : [" (none)"];
166
+ const issues = report.issues.length > 0 ? report.issues.map(
167
+ (i) => ` ${i.file}${i.line > 0 ? `:${i.line}` : ""} ${i.kind}: ${i.detail}`
168
+ ) : [" none"];
169
+ return [
170
+ "instruction files:",
171
+ ...files,
172
+ `issues (${report.issues.length}):`,
173
+ ...issues,
174
+ "detected conventions (state the non-obvious ones in CLAUDE.md):",
175
+ ...report.conventions.map((c) => ` ${c}`)
176
+ ].join("\n");
177
+ }
178
+ var runtime = {
179
+ tools: {
180
+ instructions_audit: (_args, ctx) => Promise.resolve({ text: formatReport(auditInstructions(ctx.root)) })
181
+ },
182
+ doctor: (ctx) => {
183
+ const report = auditInstructions(ctx.root);
184
+ return Promise.resolve([
185
+ report.issues.length === 0 ? {
186
+ name: "instructions",
187
+ status: "ok",
188
+ detail: `${report.files.length} file(s), no issues`
189
+ } : {
190
+ name: "instructions",
191
+ status: "warn",
192
+ detail: `${report.issues.length} issue(s)`,
193
+ fix: "yandecode instructions audit"
194
+ }
195
+ ]);
196
+ }
197
+ };
198
+ function runAuditCommand(cwd) {
199
+ const report = auditInstructions(requireWorkspace(cwd).root);
200
+ process.stdout.write(`${formatReport(report)}
201
+ `);
202
+ return report.issues.length > 0 ? 1 : 0;
203
+ }
204
+ export {
205
+ runAuditCommand,
206
+ runtime
207
+ };
208
+ //# sourceMappingURL=runtime-3E4NIFAL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/modules/instructions/audit.ts", "../../src/modules/instructions/runtime.ts"],
4
+ "sourcesContent": ["import { existsSync, readFileSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\nimport { listCandidatePaths } from '@yandecode/retrieval';\nimport { detectChecks } from '@cli/shared/project-checks';\n\nconst INSTRUCTION_FILES = new Set(['CLAUDE.md', 'AGENTS.md', 'CLAUDE.local.md', 'GEMINI.md']);\n/** ~2 000 tokens: instructions load on every session, so size is a recurring cost. */\nconst MAX_CHARS = 8_000;\nconst MANAGED_BLOCK = /<!-- yandecode:start -->[\\s\\S]*?<!-- yandecode:end -->/g;\n\nexport type IssueKind =\n 'missing-file' | 'too-long' | 'missing-path' | 'unknown-command' | 'duplicate';\n\nexport interface Issue {\n file: string;\n line: number;\n kind: IssueKind;\n detail: string;\n}\n\nexport interface InstructionsReport {\n files: { path: string; chars: number; approxTokens: number }[];\n issues: Issue[];\n conventions: string[];\n}\n\nconst LANGUAGE_NAMES: Readonly<Record<string, string>> = {\n '.ts': 'TypeScript',\n '.tsx': 'TypeScript',\n '.js': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.rb': 'Ruby',\n '.php': 'PHP',\n '.cs': 'C#',\n};\n\n/** Blanks the managed yandecode block while keeping line numbers. */\nfunction withoutManagedBlock(text: string): string {\n return text.replace(MANAGED_BLOCK, (block) => block.replace(/[^\\n]/g, ''));\n}\n\n/** `github.com/org`, `docs.rs/crate`: a host written without its scheme. */\nconst HOST_WITHOUT_SCHEME = /^[\\w-]+(\\.[\\w-]+)+\\//;\n\n/**\n * Paths an instruction line points to. Code spans count only when they contain a `/` (bare\n * names like `tasks.md` are usually generic mentions); Markdown links always count. Machine\n * paths (`~/\u2026`, `/\u2026`) and hosts without a scheme cannot be checked against the project.\n */\nfunction pathCandidates(line: string): string[] {\n const inCode = [...line.matchAll(/`([^`\\s]+)`/g)]\n .map((m) => m[1]!)\n .filter((p) => p.includes('/'));\n const links = [...line.matchAll(/\\]\\(([^)\\s]+)\\)/g)].map((m) => m[1]!);\n return [...inCode, ...links]\n .filter((p) => !/^[a-z]+:|^#|^-|^~|^\\/|[*<>{}$|]/i.test(p) && !HOST_WITHOUT_SCHEME.test(p))\n .map((p) => p.replace(/[#?].*$/, '').replace(/:\\d+(-\\d+)?$/, ''))\n .filter((p) => p.length > 0);\n}\n\nfunction missingPaths(root: string, file: string, lines: readonly string[]): Issue[] {\n const dir = dirname(join(root, file));\n // Docs often prefix paths with the workspace's own name: `myproject/src/x.ts`.\n const workspacePrefix = `${basename(root)}/`;\n const exists = (p: string): boolean =>\n existsSync(join(root, p)) ||\n existsSync(join(dir, p)) ||\n (p.startsWith(workspacePrefix) && existsSync(join(root, p.slice(workspacePrefix.length))));\n return lines.flatMap((line, i) =>\n pathCandidates(line)\n .filter((p) => !exists(p))\n .map((p) => ({\n file,\n line: i + 1,\n kind: 'missing-path' as const,\n detail: `${p} does not exist`,\n })),\n );\n}\n\nfunction unknownCommands(root: string, file: string, lines: readonly string[]): Issue[] {\n const pkgFile = join(root, 'package.json');\n const scripts = existsSync(pkgFile)\n ? ((JSON.parse(readFileSync(pkgFile, 'utf8')) as { scripts?: Record<string, string> })\n .scripts ?? {})\n : null;\n const makefile = existsSync(join(root, 'Makefile'))\n ? readFileSync(join(root, 'Makefile'), 'utf8')\n : null;\n return lines.flatMap((line, i) => {\n const issues: Issue[] = [];\n for (const m of line.matchAll(/\\b(npm|pnpm|yarn|bun) run ([\\w:.-]+)/g)) {\n if (scripts && !(m[2]! in scripts)) {\n issues.push({\n file,\n line: i + 1,\n kind: 'unknown-command',\n detail: `${m[1]} run ${m[2]}: no \"${m[2]}\" script in package.json`,\n });\n }\n }\n for (const m of line.matchAll(/`make ([\\w.-]+)`/g)) {\n if (\n makefile !== null &&\n !new RegExp(`^${m[1]!.replace(/[.]/g, '\\\\.')}:`, 'm').test(makefile)\n ) {\n issues.push({\n file,\n line: i + 1,\n kind: 'unknown-command',\n detail: `make ${m[1]}: no such target in Makefile`,\n });\n }\n }\n return issues;\n });\n}\n\nfunction duplicates(contents: ReadonlyMap<string, readonly string[]>): Issue[] {\n const firstSeen = new Map<string, string>();\n const issues: Issue[] = [];\n for (const [file, lines] of contents) {\n lines.forEach((line, i) => {\n const key = line.trim().toLowerCase().replace(/\\s+/g, ' ');\n if (key.length < 20 || key.startsWith('#') || key.startsWith('```')) return;\n const first = firstSeen.get(key);\n if (first) issues.push({ file, line: i + 1, kind: 'duplicate', detail: `also in ${first}` });\n else firstSeen.set(key, `${file}:${i + 1}`);\n });\n }\n return issues;\n}\n\nfunction conventions(root: string, paths: readonly string[]): string[] {\n const out: string[] = [];\n const lock = [\n ['pnpm-lock.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['bun.lock', 'bun'],\n ['package-lock.json', 'npm'],\n ].find(([file]) => existsSync(join(root, file!)));\n if (lock) out.push(`package manager: ${lock[1]}`);\n for (const check of detectChecks(root)) out.push(`${check.step}: ${check.command}`);\n const formatters = [\n ['.prettierrc', 'prettier'],\n ['prettier.config.js', 'prettier'],\n ['biome.json', 'biome'],\n ['.editorconfig', 'editorconfig'],\n ['rustfmt.toml', 'rustfmt'],\n ].filter(([file]) => existsSync(join(root, file!)));\n for (const name of new Set(formatters.map(([, name]) => name))) out.push(`formatter: ${name}`);\n const counts = new Map<string, number>();\n for (const p of paths) {\n const language = LANGUAGE_NAMES[extname(p).toLowerCase()];\n if (language) counts.set(language, (counts.get(language) ?? 0) + 1);\n }\n const languages = [...counts]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([name]) => name);\n if (languages.length > 0) out.push(`languages: ${languages.join(', ')}`);\n return out;\n}\n\n/**\n * Deterministic health check of the project's agent instructions (CLAUDE.md / AGENTS.md):\n * size, references to files and commands that do not exist, duplicated rules, plus the\n * conventions a good instruction file should state.\n */\nexport function auditInstructions(root: string): InstructionsReport {\n const paths = listCandidatePaths(root);\n const files = paths\n .filter((p) => INSTRUCTION_FILES.has(basename(p)))\n .sort((a, b) => a.split('/').length - b.split('/').length || a.localeCompare(b));\n const contents = new Map(\n files.map((f) => [f, withoutManagedBlock(readFileSync(join(root, f), 'utf8')).split('\\n')]),\n );\n const issues: Issue[] = [];\n if (!files.some((f) => !f.includes('/'))) {\n issues.push({\n file: '(none)',\n line: 0,\n kind: 'missing-file',\n detail: 'no CLAUDE.md or AGENTS.md at the project root',\n });\n }\n for (const [file, lines] of contents) {\n const chars = lines.join('\\n').length;\n if (chars > MAX_CHARS) {\n issues.push({\n file,\n line: 0,\n kind: 'too-long',\n detail: `~${Math.round(chars / 4)} tokens loaded every session; move details into skills or docs`,\n });\n }\n issues.push(...missingPaths(root, file, lines), ...unknownCommands(root, file, lines));\n }\n issues.push(...duplicates(contents));\n return {\n files: files.map((path) => {\n const chars = contents.get(path)!.join('\\n').length;\n return { path, chars, approxTokens: Math.round(chars / 4) };\n }),\n issues,\n conventions: conventions(root, paths),\n };\n}\n", "import type { ModuleRuntime } from '@cli/modules/contract';\nimport { requireWorkspace } from '@cli/modules/host';\nimport { auditInstructions, type InstructionsReport } from './audit';\n\nfunction formatReport(report: InstructionsReport): string {\n const files =\n report.files.length > 0\n ? report.files.map((f) => ` ${f.path} (~${f.approxTokens} tokens)`)\n : [' (none)'];\n const issues =\n report.issues.length > 0\n ? report.issues.map(\n (i) => ` ${i.file}${i.line > 0 ? `:${i.line}` : ''} ${i.kind}: ${i.detail}`,\n )\n : [' none'];\n return [\n 'instruction files:',\n ...files,\n `issues (${report.issues.length}):`,\n ...issues,\n 'detected conventions (state the non-obvious ones in CLAUDE.md):',\n ...report.conventions.map((c) => ` ${c}`),\n ].join('\\n');\n}\n\nexport const runtime: ModuleRuntime = {\n tools: {\n instructions_audit: (_args, ctx) =>\n Promise.resolve({ text: formatReport(auditInstructions(ctx.root)) }),\n },\n doctor: (ctx) => {\n const report = auditInstructions(ctx.root);\n return Promise.resolve([\n report.issues.length === 0\n ? {\n name: 'instructions',\n status: 'ok',\n detail: `${report.files.length} file(s), no issues`,\n }\n : {\n name: 'instructions',\n status: 'warn',\n detail: `${report.issues.length} issue(s)`,\n fix: 'yandecode instructions audit',\n },\n ]);\n },\n};\n\nexport function runAuditCommand(cwd: string): number {\n const report = auditInstructions(requireWorkspace(cwd).root);\n process.stdout.write(`${formatReport(report)}\\n`);\n return report.issues.length > 0 ? 1 : 0;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["name"]
7
+ }