yandecode 0.1.1 → 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 (226) 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/claude-bin.d.ts +0 -2
  84. package/dist/claude-bin.d.ts.map +0 -1
  85. package/dist/claude-bin.js +0 -4
  86. package/dist/claude-bin.js.map +0 -1
  87. package/dist/cli.d.ts +0 -6
  88. package/dist/cli.d.ts.map +0 -1
  89. package/dist/cli.js +0 -21
  90. package/dist/cli.js.map +0 -1
  91. package/dist/commands/doctor.d.ts +0 -2
  92. package/dist/commands/doctor.d.ts.map +0 -1
  93. package/dist/commands/doctor.js +0 -19
  94. package/dist/commands/doctor.js.map +0 -1
  95. package/dist/commands/hook.d.ts +0 -2
  96. package/dist/commands/hook.d.ts.map +0 -1
  97. package/dist/commands/hook.js +0 -23
  98. package/dist/commands/hook.js.map +0 -1
  99. package/dist/commands/index-cmd.d.ts +0 -2
  100. package/dist/commands/index-cmd.d.ts.map +0 -1
  101. package/dist/commands/index-cmd.js +0 -47
  102. package/dist/commands/index-cmd.js.map +0 -1
  103. package/dist/commands/index.d.ts +0 -13
  104. package/dist/commands/index.d.ts.map +0 -1
  105. package/dist/commands/index.js +0 -15
  106. package/dist/commands/index.js.map +0 -1
  107. package/dist/commands/init.d.ts +0 -2
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/init.js +0 -22
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/mcp.d.ts +0 -2
  112. package/dist/commands/mcp.d.ts.map +0 -1
  113. package/dist/commands/mcp.js +0 -71
  114. package/dist/commands/mcp.js.map +0 -1
  115. package/dist/commands/rag.d.ts +0 -2
  116. package/dist/commands/rag.d.ts.map +0 -1
  117. package/dist/commands/rag.js +0 -27
  118. package/dist/commands/rag.js.map +0 -1
  119. package/dist/commands/start.d.ts +0 -5
  120. package/dist/commands/start.d.ts.map +0 -1
  121. package/dist/commands/start.js +0 -74
  122. package/dist/commands/start.js.map +0 -1
  123. package/dist/commands/status.d.ts +0 -2
  124. package/dist/commands/status.d.ts.map +0 -1
  125. package/dist/commands/status.js +0 -29
  126. package/dist/commands/status.js.map +0 -1
  127. package/dist/commands/statusline.d.ts +0 -2
  128. package/dist/commands/statusline.d.ts.map +0 -1
  129. package/dist/commands/statusline.js +0 -90
  130. package/dist/commands/statusline.js.map +0 -1
  131. package/dist/commands/swarm.d.ts +0 -4
  132. package/dist/commands/swarm.d.ts.map +0 -1
  133. package/dist/commands/swarm.js +0 -48
  134. package/dist/commands/swarm.js.map +0 -1
  135. package/dist/commands/uninstall.d.ts +0 -2
  136. package/dist/commands/uninstall.d.ts.map +0 -1
  137. package/dist/commands/uninstall.js +0 -16
  138. package/dist/commands/uninstall.js.map +0 -1
  139. package/dist/context.d.ts +0 -13
  140. package/dist/context.d.ts.map +0 -1
  141. package/dist/context.js +0 -31
  142. package/dist/context.js.map +0 -1
  143. package/dist/doctor/checks.d.ts +0 -18
  144. package/dist/doctor/checks.d.ts.map +0 -1
  145. package/dist/doctor/checks.js +0 -270
  146. package/dist/doctor/checks.js.map +0 -1
  147. package/dist/hooks/handlers.d.ts +0 -21
  148. package/dist/hooks/handlers.d.ts.map +0 -1
  149. package/dist/hooks/handlers.js +0 -191
  150. package/dist/hooks/handlers.js.map +0 -1
  151. package/dist/index.d.ts +0 -10
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js +0 -10
  154. package/dist/index.js.map +0 -1
  155. package/dist/integration/claude-md.d.ts +0 -6
  156. package/dist/integration/claude-md.d.ts.map +0 -1
  157. package/dist/integration/claude-md.js +0 -30
  158. package/dist/integration/claude-md.js.map +0 -1
  159. package/dist/integration/gitignore.d.ts +0 -3
  160. package/dist/integration/gitignore.d.ts.map +0 -1
  161. package/dist/integration/gitignore.js +0 -13
  162. package/dist/integration/gitignore.js.map +0 -1
  163. package/dist/integration/init.d.ts +0 -17
  164. package/dist/integration/init.d.ts.map +0 -1
  165. package/dist/integration/init.js +0 -86
  166. package/dist/integration/init.js.map +0 -1
  167. package/dist/integration/json-utils.d.ts +0 -13
  168. package/dist/integration/json-utils.d.ts.map +0 -1
  169. package/dist/integration/json-utils.js +0 -33
  170. package/dist/integration/json-utils.js.map +0 -1
  171. package/dist/integration/manifest.d.ts +0 -17
  172. package/dist/integration/manifest.d.ts.map +0 -1
  173. package/dist/integration/manifest.js +0 -26
  174. package/dist/integration/manifest.js.map +0 -1
  175. package/dist/integration/materialize.d.ts +0 -9
  176. package/dist/integration/materialize.d.ts.map +0 -1
  177. package/dist/integration/materialize.js +0 -21
  178. package/dist/integration/materialize.js.map +0 -1
  179. package/dist/integration/mcp-config.d.ts +0 -4
  180. package/dist/integration/mcp-config.d.ts.map +0 -1
  181. package/dist/integration/mcp-config.js +0 -11
  182. package/dist/integration/mcp-config.js.map +0 -1
  183. package/dist/integration/settings.d.ts +0 -7
  184. package/dist/integration/settings.d.ts.map +0 -1
  185. package/dist/integration/settings.js +0 -70
  186. package/dist/integration/settings.js.map +0 -1
  187. package/dist/integration/uninstall.d.ts +0 -10
  188. package/dist/integration/uninstall.d.ts.map +0 -1
  189. package/dist/integration/uninstall.js +0 -71
  190. package/dist/integration/uninstall.js.map +0 -1
  191. package/dist/launcher.d.ts +0 -8
  192. package/dist/launcher.d.ts.map +0 -1
  193. package/dist/launcher.js +0 -18
  194. package/dist/launcher.js.map +0 -1
  195. package/dist/mcp/server.d.ts +0 -27
  196. package/dist/mcp/server.d.ts.map +0 -1
  197. package/dist/mcp/server.js +0 -311
  198. package/dist/mcp/server.js.map +0 -1
  199. package/dist/plugin-content.d.ts +0 -21
  200. package/dist/plugin-content.d.ts.map +0 -1
  201. package/dist/plugin-content.js +0 -67
  202. package/dist/plugin-content.js.map +0 -1
  203. package/dist/rag/format.d.ts +0 -3
  204. package/dist/rag/format.d.ts.map +0 -1
  205. package/dist/rag/format.js +0 -12
  206. package/dist/rag/format.js.map +0 -1
  207. package/dist/retrieval-runtime.d.ts +0 -21
  208. package/dist/retrieval-runtime.d.ts.map +0 -1
  209. package/dist/retrieval-runtime.js +0 -47
  210. package/dist/retrieval-runtime.js.map +0 -1
  211. package/dist/status-line/git.d.ts +0 -3
  212. package/dist/status-line/git.d.ts.map +0 -1
  213. package/dist/status-line/git.js +0 -34
  214. package/dist/status-line/git.js.map +0 -1
  215. package/dist/status-line/render.d.ts +0 -29
  216. package/dist/status-line/render.d.ts.map +0 -1
  217. package/dist/status-line/render.js +0 -72
  218. package/dist/status-line/render.js.map +0 -1
  219. package/dist/swarm-runtime.d.ts +0 -11
  220. package/dist/swarm-runtime.d.ts.map +0 -1
  221. package/dist/swarm-runtime.js +0 -76
  222. package/dist/swarm-runtime.js.map +0 -1
  223. package/dist/version.d.ts +0 -2
  224. package/dist/version.d.ts.map +0 -1
  225. package/dist/version.js +0 -5
  226. package/dist/version.js.map +0 -1
@@ -0,0 +1,212 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ parseSettings
5
+ } from "./chunk-QCQC73WX.js";
6
+ import {
7
+ archiveInput,
8
+ checkInput2 as checkInput,
9
+ newInput,
10
+ nextInput,
11
+ statusInput,
12
+ workflowSettings
13
+ } from "./chunk-7L6DD2VD.js";
14
+ import {
15
+ YandeCodeError,
16
+ external_exports,
17
+ writeFileAtomic
18
+ } from "./chunk-Y2MIXROU.js";
19
+
20
+ // packages/cli/src/modules/workflow/runtime.ts
21
+ import { existsSync as existsSync2 } from "node:fs";
22
+ import { isAbsolute, join as join2, relative } from "node:path";
23
+
24
+ // packages/cli/src/modules/workflow/changes.ts
25
+ import {
26
+ appendFileSync,
27
+ existsSync,
28
+ mkdirSync,
29
+ readdirSync,
30
+ readFileSync,
31
+ renameSync,
32
+ statSync
33
+ } from "node:fs";
34
+ import { join } from "node:path";
35
+ var TASK = /^- \[( |x|X)\]\s+(?:((?:[A-Za-z]+-?)?\d+(?:\.\d+)*)[:.)]?\s+)?(.*)$/;
36
+ var DETAIL = /^\s{2,}(?:[-*]\s+)?(.*\S)\s*$/;
37
+ function parseTasks(markdown) {
38
+ const tasks = [];
39
+ markdown.split("\n").forEach((line, i) => {
40
+ const task = TASK.exec(line);
41
+ if (task) {
42
+ tasks.push({
43
+ id: task[2] ?? `#${tasks.length + 1}`,
44
+ title: task[3].trim(),
45
+ done: task[1] !== " ",
46
+ line: i + 1,
47
+ details: []
48
+ });
49
+ return;
50
+ }
51
+ const detail = DETAIL.exec(line);
52
+ if (detail && tasks.length > 0) tasks[tasks.length - 1].details.push(detail[1]);
53
+ });
54
+ return tasks;
55
+ }
56
+ function slug(title) {
57
+ return title.normalize("NFKD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 60) || "change";
58
+ }
59
+ var ChangeRepository = class {
60
+ constructor(dir, clock = () => /* @__PURE__ */ new Date()) {
61
+ this.dir = dir;
62
+ this.clock = clock;
63
+ }
64
+ dir;
65
+ clock;
66
+ path(id, ...rest) {
67
+ return join(this.dir, id, ...rest);
68
+ }
69
+ require(id) {
70
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(id) || !existsSync(this.path(id))) {
71
+ throw new YandeCodeError("CHANGE_UNKNOWN", `no change "${id}" in ${this.dir}`);
72
+ }
73
+ }
74
+ create(input) {
75
+ let id = slug(input.title);
76
+ for (let n = 2; existsSync(this.path(id)); n++) id = `${slug(input.title)}-${n}`;
77
+ mkdirSync(this.path(id), { recursive: true });
78
+ writeFileAtomic(
79
+ this.path(id, "proposal.md"),
80
+ [
81
+ `# ${input.title}`,
82
+ "",
83
+ "## Why",
84
+ "",
85
+ input.why,
86
+ "",
87
+ "## What Changes",
88
+ "",
89
+ input.what ?? "- (to be defined)",
90
+ ""
91
+ ].join("\n")
92
+ );
93
+ return { id, dir: this.path(id) };
94
+ }
95
+ list() {
96
+ if (!existsSync(this.dir)) return [];
97
+ return readdirSync(this.dir).filter((name) => name !== "archive" && statSync(join(this.dir, name)).isDirectory()).sort().map((id) => this.status(id));
98
+ }
99
+ tasks(id) {
100
+ this.require(id);
101
+ const file = this.path(id, "tasks.md");
102
+ return existsSync(file) ? parseTasks(readFileSync(file, "utf8")) : [];
103
+ }
104
+ status(id) {
105
+ const tasks = this.tasks(id);
106
+ const done = tasks.filter((t) => t.done).length;
107
+ const specs = this.path(id, "specs");
108
+ const hasSpecs = existsSync(specs) && readdirSync(specs, { recursive: true }).some((f) => String(f).endsWith(".md"));
109
+ let stage = "discovery";
110
+ if (existsSync(this.path(id, "proposal.md"))) stage = "proposed";
111
+ if (existsSync(this.path(id, "design.md"))) stage = "designed";
112
+ if (hasSpecs) stage = "specified";
113
+ if (tasks.length > 0)
114
+ stage = done === 0 ? "planned" : done === tasks.length ? "implemented" : "in-progress";
115
+ return { id, stage, done, total: tasks.length, next: tasks.find((t) => !t.done) ?? null };
116
+ }
117
+ /** Marks a task done in tasks.md and appends the evidence to execution-log.md. */
118
+ check(id, taskId, note) {
119
+ const task = this.tasks(id).find((t) => t.id === taskId);
120
+ if (!task) throw new YandeCodeError("TASK_UNKNOWN", `no task "${taskId}" in ${id}/tasks.md`);
121
+ const file = this.path(id, "tasks.md");
122
+ const lines = readFileSync(file, "utf8").split("\n");
123
+ lines[task.line - 1] = lines[task.line - 1].replace(/^- \[ \]/, "- [x]");
124
+ writeFileAtomic(file, lines.join("\n"));
125
+ appendFileSync(
126
+ this.path(id, "execution-log.md"),
127
+ `- ${this.clock().toISOString()} \u2014 ${task.id} done: ${task.title}${note ? ` \u2014 ${note}` : ""}
128
+ `
129
+ );
130
+ return { ...task, done: true };
131
+ }
132
+ archive(id) {
133
+ this.require(id);
134
+ const target = join(this.dir, "archive", `${this.clock().toISOString().slice(0, 10)}-${id}`);
135
+ mkdirSync(join(this.dir, "archive"), { recursive: true });
136
+ renameSync(this.path(id), target);
137
+ return target;
138
+ }
139
+ };
140
+
141
+ // packages/cli/src/modules/workflow/runtime.ts
142
+ function repoFor(ctx) {
143
+ const { changesDir } = parseSettings("workflow", workflowSettings, ctx.settings);
144
+ const dir = changesDir !== void 0 ? isAbsolute(changesDir) ? changesDir : join2(ctx.root, changesDir) : existsSync2(join2(ctx.root, "openspec", "changes")) ? join2(ctx.root, "openspec", "changes") : join2(ctx.root, "docs", "changes");
145
+ return new ChangeRepository(dir);
146
+ }
147
+ var statusLine = (s) => `${s.id} \u2014 ${s.stage}, ${s.done}/${s.total} tasks${s.next ? `; next ${s.next.id} ${s.next.title}` : ""}`;
148
+ var taskBlock = (t) => [`${t.id} ${t.title}`, ...t.details.map((d) => ` ${d}`)].join("\n");
149
+ var ok = (text) => Promise.resolve({ text });
150
+ var runtime = {
151
+ tools: {
152
+ work_new: (raw, ctx) => {
153
+ const args = external_exports.object(newInput).parse(raw);
154
+ const { id, dir } = repoFor(ctx).create(args);
155
+ return ok(
156
+ `Created change ${id} at ${relative(ctx.root, dir)}/proposal.md. Next: design.md (if needed), specs/, then tasks.md as "- [ ] T1 \u2026" lines with indented acceptance criteria.`
157
+ );
158
+ },
159
+ work_status: (raw, ctx) => {
160
+ const args = external_exports.object(statusInput).parse(raw);
161
+ const repo = repoFor(ctx);
162
+ if (args.id) return ok(statusLine(repo.status(args.id)));
163
+ const all = repo.list();
164
+ return ok(
165
+ all.length > 0 ? all.map(statusLine).join("\n") : `No active changes in ${relative(ctx.root, repo.dir)}.`
166
+ );
167
+ },
168
+ work_next: (raw, ctx) => {
169
+ const args = external_exports.object(nextInput).parse(raw);
170
+ const status = repoFor(ctx).status(args.id);
171
+ if (!status.next) {
172
+ return ok(
173
+ status.total === 0 ? `${args.id} has no tasks yet: write tasks.md.` : `${args.id}: all ${status.total} tasks done \u2014 verify and work_archive.`
174
+ );
175
+ }
176
+ return ok(`${args.id} (${status.done}/${status.total} done)
177
+ ${taskBlock(status.next)}`);
178
+ },
179
+ work_check: (raw, ctx) => {
180
+ const args = external_exports.object(checkInput).parse(raw);
181
+ const repo = repoFor(ctx);
182
+ const task = repo.check(args.id, args.task_id, args.evidence);
183
+ return ok(`Checked ${task.id} ${task.title}. ${statusLine(repo.status(args.id))}`);
184
+ },
185
+ work_archive: (raw, ctx) => {
186
+ const args = external_exports.object(archiveInput).parse(raw);
187
+ const target = repoFor(ctx).archive(args.id);
188
+ return ok(`Archived ${args.id} \u2192 ${relative(ctx.root, target)}`);
189
+ }
190
+ },
191
+ hooks: {
192
+ SessionStart: (_input, ctx) => {
193
+ const inProgress = repoFor(ctx).list().filter((s2) => s2.stage === "in-progress");
194
+ if (inProgress.length === 0) return Promise.resolve({ kind: "none" });
195
+ if (inProgress.length > 1) {
196
+ return Promise.resolve({
197
+ kind: "context",
198
+ text: `${inProgress.length} changes are in progress (${inProgress.map((s2) => s2.id).join(", ")}); work_status shows where each stands.`
199
+ });
200
+ }
201
+ const s = inProgress[0];
202
+ return Promise.resolve({
203
+ kind: "context",
204
+ text: `Change ${s.id} is in progress: ${s.done}/${s.total} tasks done${s.next ? `, next ${s.next.id} ${s.next.title}` : ""}. work_next("${s.id}") gives its acceptance criteria.`
205
+ });
206
+ }
207
+ }
208
+ };
209
+ export {
210
+ runtime
211
+ };
212
+ //# sourceMappingURL=runtime-UB2O2HUN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/modules/workflow/runtime.ts", "../../src/modules/workflow/changes.ts"],
4
+ "sourcesContent": ["import { existsSync } from 'node:fs';\nimport { isAbsolute, join, relative } from 'node:path';\nimport { z } from 'zod';\nimport type { ModuleContext, ModuleRuntime, ToolResult } from '@cli/modules/contract';\nimport { parseSettings } from '@cli/modules/host';\nimport { ChangeRepository, type ChangeStatus, type Task } from './changes';\nimport {\n archiveInput,\n checkInput,\n newInput,\n nextInput,\n statusInput,\n workflowSettings,\n} from './definition';\n\nfunction repoFor(ctx: ModuleContext): ChangeRepository {\n const { changesDir } = parseSettings('workflow', workflowSettings, ctx.settings);\n const dir =\n changesDir !== undefined\n ? isAbsolute(changesDir)\n ? changesDir\n : join(ctx.root, changesDir)\n : existsSync(join(ctx.root, 'openspec', 'changes'))\n ? join(ctx.root, 'openspec', 'changes')\n : join(ctx.root, 'docs', 'changes');\n return new ChangeRepository(dir);\n}\n\nconst statusLine = (s: ChangeStatus): string =>\n `${s.id} \u2014 ${s.stage}, ${s.done}/${s.total} tasks${s.next ? `; next ${s.next.id} ${s.next.title}` : ''}`;\n\nconst taskBlock = (t: Task): string =>\n [`${t.id} ${t.title}`, ...t.details.map((d) => ` ${d}`)].join('\\n');\n\nconst ok = (text: string): Promise<ToolResult> => Promise.resolve({ text });\n\nexport const runtime: ModuleRuntime = {\n tools: {\n work_new: (raw, ctx) => {\n const args = z.object(newInput).parse(raw);\n const { id, dir } = repoFor(ctx).create(args);\n return ok(\n `Created change ${id} at ${relative(ctx.root, dir)}/proposal.md. Next: design.md (if needed), specs/, then tasks.md as \"- [ ] T1 \u2026\" lines with indented acceptance criteria.`,\n );\n },\n work_status: (raw, ctx) => {\n const args = z.object(statusInput).parse(raw);\n const repo = repoFor(ctx);\n if (args.id) return ok(statusLine(repo.status(args.id)));\n const all = repo.list();\n return ok(\n all.length > 0\n ? all.map(statusLine).join('\\n')\n : `No active changes in ${relative(ctx.root, repo.dir)}.`,\n );\n },\n work_next: (raw, ctx) => {\n const args = z.object(nextInput).parse(raw);\n const status = repoFor(ctx).status(args.id);\n if (!status.next) {\n return ok(\n status.total === 0\n ? `${args.id} has no tasks yet: write tasks.md.`\n : `${args.id}: all ${status.total} tasks done \u2014 verify and work_archive.`,\n );\n }\n return ok(`${args.id} (${status.done}/${status.total} done)\\n${taskBlock(status.next)}`);\n },\n work_check: (raw, ctx) => {\n const args = z.object(checkInput).parse(raw);\n const repo = repoFor(ctx);\n const task = repo.check(args.id, args.task_id, args.evidence);\n return ok(`Checked ${task.id} ${task.title}. ${statusLine(repo.status(args.id))}`);\n },\n work_archive: (raw, ctx) => {\n const args = z.object(archiveInput).parse(raw);\n const target = repoFor(ctx).archive(args.id);\n return ok(`Archived ${args.id} \u2192 ${relative(ctx.root, target)}`);\n },\n },\n hooks: {\n SessionStart: (_input, ctx) => {\n // Only a change with work under way is news; listing every planned change was noise\n // that named unrelated tasks at the start of each session (pacolang A/B).\n const inProgress = repoFor(ctx)\n .list()\n .filter((s) => s.stage === 'in-progress');\n if (inProgress.length === 0) return Promise.resolve({ kind: 'none' });\n if (inProgress.length > 1) {\n return Promise.resolve({\n kind: 'context',\n text: `${inProgress.length} changes are in progress (${inProgress.map((s) => s.id).join(', ')}); work_status shows where each stands.`,\n });\n }\n const s = inProgress[0]!;\n return Promise.resolve({\n kind: 'context',\n text: `Change ${s.id} is in progress: ${s.done}/${s.total} tasks done${s.next ? `, next ${s.next.id} ${s.next.title}` : ''}. work_next(\"${s.id}\") gives its acceptance criteria.`,\n });\n },\n },\n};\n", "import {\n appendFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { YandeCodeError, writeFileAtomic } from '@yandecode/core';\n\nexport interface Task {\n /** Explicit id (T1, 2.3, T-12) or positional (#n) when the line has none. */\n id: string;\n title: string;\n done: boolean;\n /** 1-based line in tasks.md. */\n line: number;\n /** Indented lines under the task (acceptance criteria, files, notes). */\n details: string[];\n}\n\nexport type Stage =\n 'discovery' | 'proposed' | 'designed' | 'specified' | 'planned' | 'in-progress' | 'implemented';\n\nexport interface ChangeStatus {\n id: string;\n stage: Stage;\n done: number;\n total: number;\n next: Task | null;\n}\n\nconst TASK = /^- \\[( |x|X)\\]\\s+(?:((?:[A-Za-z]+-?)?\\d+(?:\\.\\d+)*)[:.)]?\\s+)?(.*)$/;\nconst DETAIL = /^\\s{2,}(?:[-*]\\s+)?(.*\\S)\\s*$/;\n\nexport function parseTasks(markdown: string): Task[] {\n const tasks: Task[] = [];\n markdown.split('\\n').forEach((line, i) => {\n const task = TASK.exec(line);\n if (task) {\n tasks.push({\n id: task[2] ?? `#${tasks.length + 1}`,\n title: task[3]!.trim(),\n done: task[1] !== ' ',\n line: i + 1,\n details: [],\n });\n return;\n }\n const detail = DETAIL.exec(line);\n if (detail && tasks.length > 0) tasks[tasks.length - 1]!.details.push(detail[1]!);\n });\n return tasks;\n}\n\nfunction slug(title: string): string {\n return (\n title\n .normalize('NFKD')\n .replace(/[\u0300-\u036F]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 60) || 'change'\n );\n}\n\n/**\n * Work in progress as OpenSpec-shaped folders: `<dir>/<id>/{proposal,design,tasks}.md`, `specs/`,\n * and an append-only `execution-log.md`. The stage is derived from what exists on disk, so any\n * session (or a Ralph loop iteration) resumes without conversation memory (ADR-024).\n */\nexport class ChangeRepository {\n constructor(\n readonly dir: string,\n private readonly clock: () => Date = () => new Date(),\n ) {}\n\n private path(id: string, ...rest: string[]): string {\n return join(this.dir, id, ...rest);\n }\n\n private require(id: string): void {\n if (!/^[a-z0-9][a-z0-9-]*$/.test(id) || !existsSync(this.path(id))) {\n throw new YandeCodeError('CHANGE_UNKNOWN', `no change \"${id}\" in ${this.dir}`);\n }\n }\n\n create(input: { title: string; why: string; what?: string | undefined }): {\n id: string;\n dir: string;\n } {\n let id = slug(input.title);\n for (let n = 2; existsSync(this.path(id)); n++) id = `${slug(input.title)}-${n}`;\n mkdirSync(this.path(id), { recursive: true });\n writeFileAtomic(\n this.path(id, 'proposal.md'),\n [\n `# ${input.title}`,\n '',\n '## Why',\n '',\n input.why,\n '',\n '## What Changes',\n '',\n input.what ?? '- (to be defined)',\n '',\n ].join('\\n'),\n );\n return { id, dir: this.path(id) };\n }\n\n list(): ChangeStatus[] {\n if (!existsSync(this.dir)) return [];\n return readdirSync(this.dir)\n .filter((name) => name !== 'archive' && statSync(join(this.dir, name)).isDirectory())\n .sort()\n .map((id) => this.status(id));\n }\n\n tasks(id: string): Task[] {\n this.require(id);\n const file = this.path(id, 'tasks.md');\n return existsSync(file) ? parseTasks(readFileSync(file, 'utf8')) : [];\n }\n\n status(id: string): ChangeStatus {\n const tasks = this.tasks(id);\n const done = tasks.filter((t) => t.done).length;\n const specs = this.path(id, 'specs');\n const hasSpecs =\n existsSync(specs) &&\n readdirSync(specs, { recursive: true }).some((f) => String(f).endsWith('.md'));\n let stage: Stage = 'discovery';\n if (existsSync(this.path(id, 'proposal.md'))) stage = 'proposed';\n if (existsSync(this.path(id, 'design.md'))) stage = 'designed';\n if (hasSpecs) stage = 'specified';\n if (tasks.length > 0)\n stage = done === 0 ? 'planned' : done === tasks.length ? 'implemented' : 'in-progress';\n return { id, stage, done, total: tasks.length, next: tasks.find((t) => !t.done) ?? null };\n }\n\n /** Marks a task done in tasks.md and appends the evidence to execution-log.md. */\n check(id: string, taskId: string, note?: string): Task {\n const task = this.tasks(id).find((t) => t.id === taskId);\n if (!task) throw new YandeCodeError('TASK_UNKNOWN', `no task \"${taskId}\" in ${id}/tasks.md`);\n const file = this.path(id, 'tasks.md');\n const lines = readFileSync(file, 'utf8').split('\\n');\n lines[task.line - 1] = lines[task.line - 1]!.replace(/^- \\[ \\]/, '- [x]');\n writeFileAtomic(file, lines.join('\\n'));\n appendFileSync(\n this.path(id, 'execution-log.md'),\n `- ${this.clock().toISOString()} \u2014 ${task.id} done: ${task.title}${note ? ` \u2014 ${note}` : ''}\\n`,\n );\n return { ...task, done: true };\n }\n\n archive(id: string): string {\n this.require(id);\n const target = join(this.dir, 'archive', `${this.clock().toISOString().slice(0, 10)}-${id}`);\n mkdirSync(join(this.dir, 'archive'), { recursive: true });\n renameSync(this.path(id), target);\n return target;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "join", "join", "existsSync", "s"]
7
+ }