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.
- package/dist/bin.js +14 -8
- package/dist/bin.js.map +7 -1
- package/dist/chunks/chunk-23DG7PZZ.js +58 -0
- package/dist/chunks/chunk-23DG7PZZ.js.map +7 -0
- package/dist/chunks/chunk-2S6B3DDQ.js +1769 -0
- package/dist/chunks/chunk-2S6B3DDQ.js.map +7 -0
- package/dist/chunks/chunk-6J5CZVCJ.js +120 -0
- package/dist/chunks/chunk-6J5CZVCJ.js.map +7 -0
- package/dist/chunks/chunk-7L6DD2VD.js +768 -0
- package/dist/chunks/chunk-7L6DD2VD.js.map +7 -0
- package/dist/chunks/chunk-DWD37AI2.js +39 -0
- package/dist/chunks/chunk-DWD37AI2.js.map +7 -0
- package/dist/chunks/chunk-KPDBXQ62.js +62 -0
- package/dist/chunks/chunk-KPDBXQ62.js.map +7 -0
- package/dist/chunks/chunk-KVBKQXTU.js +351 -0
- package/dist/chunks/chunk-KVBKQXTU.js.map +7 -0
- package/dist/chunks/chunk-L2DDIZPI.js +53 -0
- package/dist/chunks/chunk-L2DDIZPI.js.map +7 -0
- package/dist/chunks/chunk-OIAMKDTQ.js +27 -0
- package/dist/chunks/chunk-OIAMKDTQ.js.map +7 -0
- package/dist/chunks/chunk-PUWSEWX3.js +61 -0
- package/dist/chunks/chunk-PUWSEWX3.js.map +7 -0
- package/dist/chunks/chunk-QCQC73WX.js +122 -0
- package/dist/chunks/chunk-QCQC73WX.js.map +7 -0
- package/dist/chunks/chunk-TYLH4NIC.js +39 -0
- package/dist/chunks/chunk-TYLH4NIC.js.map +7 -0
- package/dist/chunks/chunk-VKVJGBNJ.js +72 -0
- package/dist/chunks/chunk-VKVJGBNJ.js.map +7 -0
- package/dist/chunks/chunk-Y2MIXROU.js +20072 -0
- package/dist/chunks/chunk-Y2MIXROU.js.map +7 -0
- package/dist/chunks/cli-V6PJTDLM.js +3464 -0
- package/dist/chunks/cli-V6PJTDLM.js.map +7 -0
- package/dist/chunks/doctor-LLDVEPWL.js +184 -0
- package/dist/chunks/doctor-LLDVEPWL.js.map +7 -0
- package/dist/chunks/entry-YAOEX3EB.js +187 -0
- package/dist/chunks/entry-YAOEX3EB.js.map +7 -0
- package/dist/chunks/init-4ZJFCKIJ.js +46 -0
- package/dist/chunks/init-4ZJFCKIJ.js.map +7 -0
- package/dist/chunks/mcp-serve-KWKMUGWZ.js +22575 -0
- package/dist/chunks/mcp-serve-KWKMUGWZ.js.map +7 -0
- package/dist/chunks/modules-CJB5IKUJ.js +121 -0
- package/dist/chunks/modules-CJB5IKUJ.js.map +7 -0
- package/dist/chunks/runtime-3E4NIFAL.js +208 -0
- package/dist/chunks/runtime-3E4NIFAL.js.map +7 -0
- package/dist/chunks/runtime-7CRR63B5.js +395 -0
- package/dist/chunks/runtime-7CRR63B5.js.map +7 -0
- package/dist/chunks/runtime-CKMVHAU4.js +64 -0
- package/dist/chunks/runtime-CKMVHAU4.js.map +7 -0
- package/dist/chunks/runtime-CVZMWIJO.js +318 -0
- package/dist/chunks/runtime-CVZMWIJO.js.map +7 -0
- package/dist/chunks/runtime-DBNXBOAL.js +295 -0
- package/dist/chunks/runtime-DBNXBOAL.js.map +7 -0
- package/dist/chunks/runtime-EKHO2JXB.js +197 -0
- package/dist/chunks/runtime-EKHO2JXB.js.map +7 -0
- package/dist/chunks/runtime-EY6SVZYP.js +539 -0
- package/dist/chunks/runtime-EY6SVZYP.js.map +7 -0
- package/dist/chunks/runtime-UB2O2HUN.js +212 -0
- package/dist/chunks/runtime-UB2O2HUN.js.map +7 -0
- package/dist/chunks/runtime-WAFQWW4M.js +755 -0
- package/dist/chunks/runtime-WAFQWW4M.js.map +7 -0
- package/dist/chunks/runtime-ZGGF6RVA.js +271 -0
- package/dist/chunks/runtime-ZGGF6RVA.js.map +7 -0
- package/dist/chunks/status-SPIESL4F.js +38 -0
- package/dist/chunks/status-SPIESL4F.js.map +7 -0
- package/dist/chunks/uninstall-J2OWCX4A.js +54 -0
- package/dist/chunks/uninstall-J2OWCX4A.js.map +7 -0
- package/dist/chunks/update-OX5MZYQY.js +34 -0
- package/dist/chunks/update-OX5MZYQY.js.map +7 -0
- package/dist/content/agents/yandecode-reviewer.md +22 -0
- package/dist/content/agents/yandecode-security-reviewer.md +23 -0
- package/dist/content/skills/NOTICE.md +29 -0
- package/dist/content/skills/yandecode-code-review/SKILL.md +37 -0
- package/dist/content/skills/yandecode-debugging/SKILL.md +33 -0
- package/dist/content/skills/yandecode-instructions/SKILL.md +26 -0
- package/dist/content/skills/yandecode-memory/SKILL.md +36 -0
- package/dist/content/skills/yandecode-security-review/SKILL.md +24 -0
- package/dist/content/skills/yandecode-tdd/SKILL.md +38 -0
- package/dist/content/skills/yandecode-verification/SKILL.md +29 -0
- package/dist/content/skills/yandecode-workflow/SKILL.md +50 -0
- package/package.json +25 -19
- package/dist/bin.d.ts +0 -3
- package/dist/bin.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -6
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -21
- package/dist/cli.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -19
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/hook.d.ts +0 -2
- package/dist/commands/hook.d.ts.map +0 -1
- package/dist/commands/hook.js +0 -23
- package/dist/commands/hook.js.map +0 -1
- package/dist/commands/index-cmd.d.ts +0 -2
- package/dist/commands/index-cmd.d.ts.map +0 -1
- package/dist/commands/index-cmd.js +0 -47
- package/dist/commands/index-cmd.js.map +0 -1
- package/dist/commands/index.d.ts +0 -13
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -15
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -22
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -2
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -71
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/rag.d.ts +0 -2
- package/dist/commands/rag.d.ts.map +0 -1
- package/dist/commands/rag.js +0 -27
- package/dist/commands/rag.js.map +0 -1
- package/dist/commands/start.d.ts +0 -6
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/start.js +0 -76
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/status.d.ts +0 -2
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -29
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/statusline.d.ts +0 -2
- package/dist/commands/statusline.d.ts.map +0 -1
- package/dist/commands/statusline.js +0 -90
- package/dist/commands/statusline.js.map +0 -1
- package/dist/commands/swarm.d.ts +0 -4
- package/dist/commands/swarm.d.ts.map +0 -1
- package/dist/commands/swarm.js +0 -48
- package/dist/commands/swarm.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -2
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js +0 -16
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/context.d.ts +0 -13
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -31
- package/dist/context.js.map +0 -1
- package/dist/doctor/checks.d.ts +0 -18
- package/dist/doctor/checks.d.ts.map +0 -1
- package/dist/doctor/checks.js +0 -269
- package/dist/doctor/checks.js.map +0 -1
- package/dist/hooks/handlers.d.ts +0 -21
- package/dist/hooks/handlers.d.ts.map +0 -1
- package/dist/hooks/handlers.js +0 -191
- package/dist/hooks/handlers.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -9
- package/dist/index.js.map +0 -1
- package/dist/integration/claude-md.d.ts +0 -6
- package/dist/integration/claude-md.d.ts.map +0 -1
- package/dist/integration/claude-md.js +0 -30
- package/dist/integration/claude-md.js.map +0 -1
- package/dist/integration/gitignore.d.ts +0 -3
- package/dist/integration/gitignore.d.ts.map +0 -1
- package/dist/integration/gitignore.js +0 -13
- package/dist/integration/gitignore.js.map +0 -1
- package/dist/integration/init.d.ts +0 -17
- package/dist/integration/init.d.ts.map +0 -1
- package/dist/integration/init.js +0 -86
- package/dist/integration/init.js.map +0 -1
- package/dist/integration/json-utils.d.ts +0 -13
- package/dist/integration/json-utils.d.ts.map +0 -1
- package/dist/integration/json-utils.js +0 -33
- package/dist/integration/json-utils.js.map +0 -1
- package/dist/integration/manifest.d.ts +0 -17
- package/dist/integration/manifest.d.ts.map +0 -1
- package/dist/integration/manifest.js +0 -26
- package/dist/integration/manifest.js.map +0 -1
- package/dist/integration/materialize.d.ts +0 -9
- package/dist/integration/materialize.d.ts.map +0 -1
- package/dist/integration/materialize.js +0 -21
- package/dist/integration/materialize.js.map +0 -1
- package/dist/integration/mcp-config.d.ts +0 -4
- package/dist/integration/mcp-config.d.ts.map +0 -1
- package/dist/integration/mcp-config.js +0 -11
- package/dist/integration/mcp-config.js.map +0 -1
- package/dist/integration/settings.d.ts +0 -7
- package/dist/integration/settings.d.ts.map +0 -1
- package/dist/integration/settings.js +0 -70
- package/dist/integration/settings.js.map +0 -1
- package/dist/integration/uninstall.d.ts +0 -10
- package/dist/integration/uninstall.d.ts.map +0 -1
- package/dist/integration/uninstall.js +0 -71
- package/dist/integration/uninstall.js.map +0 -1
- package/dist/launcher.d.ts +0 -8
- package/dist/launcher.d.ts.map +0 -1
- package/dist/launcher.js +0 -18
- package/dist/launcher.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -27
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -311
- package/dist/mcp/server.js.map +0 -1
- package/dist/plugin-content.d.ts +0 -21
- package/dist/plugin-content.d.ts.map +0 -1
- package/dist/plugin-content.js +0 -67
- package/dist/plugin-content.js.map +0 -1
- package/dist/rag/format.d.ts +0 -3
- package/dist/rag/format.d.ts.map +0 -1
- package/dist/rag/format.js +0 -12
- package/dist/rag/format.js.map +0 -1
- package/dist/retrieval-runtime.d.ts +0 -21
- package/dist/retrieval-runtime.d.ts.map +0 -1
- package/dist/retrieval-runtime.js +0 -47
- package/dist/retrieval-runtime.js.map +0 -1
- package/dist/status-line/git.d.ts +0 -3
- package/dist/status-line/git.d.ts.map +0 -1
- package/dist/status-line/git.js +0 -34
- package/dist/status-line/git.js.map +0 -1
- package/dist/status-line/render.d.ts +0 -29
- package/dist/status-line/render.d.ts.map +0 -1
- package/dist/status-line/render.js +0 -72
- package/dist/status-line/render.js.map +0 -1
- package/dist/swarm-runtime.d.ts +0 -11
- package/dist/swarm-runtime.d.ts.map +0 -1
- package/dist/swarm-runtime.js +0 -76
- package/dist/swarm-runtime.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -5
- 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
|
+
}
|