agentplane 0.2.6 → 0.2.12
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/README.md +11 -0
- package/assets/AGENTS.md +35 -0
- package/assets/agents/CODER.json +0 -1
- package/assets/agents/INTEGRATOR.json +0 -1
- package/assets/agents/ORCHESTRATOR.json +1 -2
- package/assets/agents/PLANNER.json +1 -3
- package/assets/agents/TESTER.json +0 -1
- package/assets/agents/UPGRADER.json +17 -15
- package/dist/cli/archive.d.ts.map +1 -1
- package/dist/cli/archive.js +61 -36
- package/dist/cli/command-guide.d.ts.map +1 -1
- package/dist/cli/command-guide.js +4 -2
- package/dist/cli/run-cli/command-catalog.d.ts +4 -1
- package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog.js +40 -22
- package/dist/cli/run-cli/commands/config.d.ts +5 -4
- package/dist/cli/run-cli/commands/config.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/config.js +39 -29
- package/dist/cli/run-cli/commands/core.d.ts +2 -1
- package/dist/cli/run-cli/commands/core.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/core.js +174 -67
- package/dist/cli/run-cli/commands/ide.d.ts +3 -1
- package/dist/cli/run-cli/commands/ide.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/ide.js +7 -6
- package/dist/cli/run-cli/commands/init/ide-sync.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/ide-sync.js +10 -1
- package/dist/cli/run-cli/commands/init/write-agents.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/write-agents.js +4 -24
- package/dist/cli/run-cli/commands/init/write-gitignore.d.ts +4 -0
- package/dist/cli/run-cli/commands/init/write-gitignore.d.ts.map +1 -0
- package/dist/cli/run-cli/commands/init/write-gitignore.js +35 -0
- package/dist/cli/run-cli/commands/init.d.ts +1 -0
- package/dist/cli/run-cli/commands/init.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init.js +31 -8
- package/dist/cli/run-cli/registry.run.d.ts +6 -2
- package/dist/cli/run-cli/registry.run.d.ts.map +1 -1
- package/dist/cli/run-cli/registry.run.js +7 -2
- package/dist/cli/run-cli.d.ts.map +1 -1
- package/dist/cli/run-cli.js +94 -75
- package/dist/cli/run-cli.test-helpers.d.ts.map +1 -1
- package/dist/cli/run-cli.test-helpers.js +99 -3
- package/dist/cli/spec/parse-utils.d.ts +11 -0
- package/dist/cli/spec/parse-utils.d.ts.map +1 -0
- package/dist/cli/spec/parse-utils.js +28 -0
- package/dist/commands/block.command.d.ts +3 -18
- package/dist/commands/block.command.d.ts.map +1 -1
- package/dist/commands/block.command.js +2 -143
- package/dist/commands/block.run.d.ts +5 -0
- package/dist/commands/block.run.d.ts.map +1 -0
- package/dist/commands/block.run.js +22 -0
- package/dist/commands/block.spec.d.ts +17 -0
- package/dist/commands/block.spec.d.ts.map +1 -0
- package/dist/commands/block.spec.js +115 -0
- package/dist/commands/finish.command.d.ts +3 -27
- package/dist/commands/finish.command.d.ts.map +1 -1
- package/dist/commands/finish.command.js +2 -237
- package/dist/commands/finish.run.d.ts +5 -0
- package/dist/commands/finish.run.d.ts.map +1 -0
- package/dist/commands/finish.run.js +40 -0
- package/dist/commands/finish.spec.d.ts +26 -0
- package/dist/commands/finish.spec.d.ts.map +1 -0
- package/dist/commands/finish.spec.js +193 -0
- package/dist/commands/release/apply.command.d.ts +11 -0
- package/dist/commands/release/apply.command.d.ts.map +1 -0
- package/dist/commands/release/apply.command.js +343 -0
- package/dist/commands/release/plan.command.d.ts +12 -0
- package/dist/commands/release/plan.command.d.ts.map +1 -0
- package/dist/commands/release/plan.command.js +206 -0
- package/dist/commands/release/release.command.d.ts +5 -0
- package/dist/commands/release/release.command.d.ts.map +1 -0
- package/dist/commands/release/release.command.js +18 -0
- package/dist/commands/shared/task-backend.d.ts +1 -0
- package/dist/commands/shared/task-backend.d.ts.map +1 -1
- package/dist/commands/start.command.d.ts +3 -18
- package/dist/commands/start.command.d.ts.map +1 -1
- package/dist/commands/start.command.js +2 -143
- package/dist/commands/start.run.d.ts +5 -0
- package/dist/commands/start.run.d.ts.map +1 -0
- package/dist/commands/start.run.js +22 -0
- package/dist/commands/start.spec.d.ts +17 -0
- package/dist/commands/start.spec.d.ts.map +1 -0
- package/dist/commands/start.spec.js +115 -0
- package/dist/commands/task/add.command.d.ts.map +1 -1
- package/dist/commands/task/add.command.js +1 -7
- package/dist/commands/task/derive.command.d.ts.map +1 -1
- package/dist/commands/task/derive.command.js +1 -7
- package/dist/commands/task/list.command.d.ts +3 -8
- package/dist/commands/task/list.command.d.ts.map +1 -1
- package/dist/commands/task/list.command.js +2 -67
- package/dist/commands/task/list.run.d.ts +5 -0
- package/dist/commands/task/list.run.d.ts.map +1 -0
- package/dist/commands/task/list.run.js +10 -0
- package/dist/commands/task/list.spec.d.ts +7 -0
- package/dist/commands/task/list.spec.d.ts.map +1 -0
- package/dist/commands/task/list.spec.js +51 -0
- package/dist/commands/task/next.command.d.ts +3 -8
- package/dist/commands/task/next.command.d.ts.map +1 -1
- package/dist/commands/task/next.command.js +2 -89
- package/dist/commands/task/next.run.d.ts +5 -0
- package/dist/commands/task/next.run.d.ts.map +1 -0
- package/dist/commands/task/next.run.js +11 -0
- package/dist/commands/task/next.spec.d.ts +7 -0
- package/dist/commands/task/next.spec.d.ts.map +1 -0
- package/dist/commands/task/next.spec.js +69 -0
- package/dist/commands/task/search.command.d.ts +3 -10
- package/dist/commands/task/search.command.d.ts.map +1 -1
- package/dist/commands/task/search.command.js +2 -101
- package/dist/commands/task/search.run.d.ts +5 -0
- package/dist/commands/task/search.run.d.ts.map +1 -0
- package/dist/commands/task/search.run.js +13 -0
- package/dist/commands/task/search.spec.d.ts +9 -0
- package/dist/commands/task/search.spec.d.ts.map +1 -0
- package/dist/commands/task/search.spec.js +79 -0
- package/dist/commands/task/set-status.command.d.ts.map +1 -1
- package/dist/commands/task/set-status.command.js +1 -7
- package/dist/commands/task/shared.d.ts.map +1 -1
- package/dist/commands/task/shared.js +15 -8
- package/dist/commands/task/show.command.d.ts +3 -7
- package/dist/commands/task/show.command.d.ts.map +1 -1
- package/dist/commands/task/show.command.js +2 -19
- package/dist/commands/task/show.run.d.ts +5 -0
- package/dist/commands/task/show.run.d.ts.map +1 -0
- package/dist/commands/task/show.run.js +11 -0
- package/dist/commands/task/show.spec.d.ts +6 -0
- package/dist/commands/task/show.spec.d.ts.map +1 -0
- package/dist/commands/task/show.spec.js +8 -0
- package/dist/commands/task/update.command.d.ts.map +1 -1
- package/dist/commands/task/update.command.js +1 -7
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +149 -31
- package/dist/commands/verify.command.d.ts +3 -15
- package/dist/commands/verify.command.d.ts.map +1 -1
- package/dist/commands/verify.command.js +2 -113
- package/dist/commands/verify.run.d.ts +5 -0
- package/dist/commands/verify.run.d.ts.map +1 -0
- package/dist/commands/verify.run.js +17 -0
- package/dist/commands/verify.spec.d.ts +14 -0
- package/dist/commands/verify.spec.d.ts.map +1 -0
- package/dist/commands/verify.spec.js +96 -0
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveProject } from "@agentplaneorg/core";
|
|
4
|
+
import { usageError } from "../../cli/spec/errors.js";
|
|
5
|
+
import { exitCodeForError } from "../../cli/exit-codes.js";
|
|
6
|
+
import { CliError } from "../../shared/errors.js";
|
|
7
|
+
import { execFileAsync, gitEnv } from "../shared/git.js";
|
|
8
|
+
function parseSemver(version) {
|
|
9
|
+
const m = /^(\d+)\.(\d+)\.(\d+)$/u.exec(version.trim());
|
|
10
|
+
if (!m)
|
|
11
|
+
return null;
|
|
12
|
+
const major = Number(m[1]);
|
|
13
|
+
const minor = Number(m[2]);
|
|
14
|
+
const patch = Number(m[3]);
|
|
15
|
+
if (![major, minor, patch].every((n) => Number.isInteger(n) && n >= 0))
|
|
16
|
+
return null;
|
|
17
|
+
return { major, minor, patch };
|
|
18
|
+
}
|
|
19
|
+
function bumpVersion(version, bump) {
|
|
20
|
+
const parsed = parseSemver(version);
|
|
21
|
+
if (!parsed) {
|
|
22
|
+
throw new CliError({
|
|
23
|
+
exitCode: exitCodeForError("E_VALIDATION"),
|
|
24
|
+
code: "E_VALIDATION",
|
|
25
|
+
message: `Invalid version (expected X.Y.Z): ${version}`,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (bump === "patch")
|
|
29
|
+
return `${parsed.major}.${parsed.minor}.${parsed.patch + 1}`;
|
|
30
|
+
if (bump === "minor")
|
|
31
|
+
return `${parsed.major}.${parsed.minor + 1}.0`;
|
|
32
|
+
return `${parsed.major + 1}.0.0`;
|
|
33
|
+
}
|
|
34
|
+
async function readPackageVersion(pkgJsonPath) {
|
|
35
|
+
const raw = JSON.parse(await readFile(pkgJsonPath, "utf8"));
|
|
36
|
+
const version = typeof raw.version === "string" ? raw.version.trim() : "";
|
|
37
|
+
if (!version) {
|
|
38
|
+
throw new CliError({
|
|
39
|
+
exitCode: exitCodeForError("E_VALIDATION"),
|
|
40
|
+
code: "E_VALIDATION",
|
|
41
|
+
message: `Missing package.json version: ${pkgJsonPath}`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return version;
|
|
45
|
+
}
|
|
46
|
+
async function getLatestSemverTag(gitRoot) {
|
|
47
|
+
try {
|
|
48
|
+
const { stdout } = await execFileAsync("git", ["describe", "--tags", "--abbrev=0", "--match", "v[0-9]*.[0-9]*.[0-9]*"], { cwd: gitRoot, env: gitEnv() });
|
|
49
|
+
const tag = String(stdout ?? "").trim();
|
|
50
|
+
return tag || null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function listChanges(gitRoot, sinceRef) {
|
|
57
|
+
const range = sinceRef ? `${sinceRef}..HEAD` : "HEAD";
|
|
58
|
+
const { stdout } = await execFileAsync("git", ["log", "--no-merges", "--pretty=format:%H%x00%aI%x00%s", range], { cwd: gitRoot, env: gitEnv(), maxBuffer: 10 * 1024 * 1024 });
|
|
59
|
+
const text = String(stdout ?? "");
|
|
60
|
+
const lines = text.split("\n").filter((l) => l.length > 0);
|
|
61
|
+
const out = [];
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
const parts = line.split("\0");
|
|
64
|
+
const hash = (parts[0] ?? "").trim();
|
|
65
|
+
const authorDateIso = (parts[1] ?? "").trim();
|
|
66
|
+
const subject = (parts[2] ?? "").trim();
|
|
67
|
+
if (!hash || !authorDateIso || !subject)
|
|
68
|
+
continue;
|
|
69
|
+
out.push({ hash, authorDateIso, subject });
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function changesMarkdown(changes) {
|
|
74
|
+
if (changes.length === 0)
|
|
75
|
+
return "_No commits found in the selected range._\n";
|
|
76
|
+
return (changes
|
|
77
|
+
.map((c) => `- ${c.subject} (${c.hash.slice(0, 7)})`)
|
|
78
|
+
.join("\n")
|
|
79
|
+
.trim() + "\n");
|
|
80
|
+
}
|
|
81
|
+
function releaseInstructions(opts) {
|
|
82
|
+
return (`# Release plan\n\n` +
|
|
83
|
+
`## Target\n\n` +
|
|
84
|
+
`- Tag: \`${opts.nextTag}\`\n` +
|
|
85
|
+
(opts.prevTag
|
|
86
|
+
? `- Since: \`${opts.prevTag}\`\n`
|
|
87
|
+
: "- Since: (no previous semver tag found)\n") +
|
|
88
|
+
`- Bump: \`${opts.bump}\`\n\n` +
|
|
89
|
+
`## Agent task: write release notes\n\n` +
|
|
90
|
+
`Write English release notes as \`docs/releases/${opts.nextTag}.md\`.\n\n` +
|
|
91
|
+
`Rules:\n` +
|
|
92
|
+
`- Use human-readable bullets focused on outcomes and user-facing improvements.\n` +
|
|
93
|
+
`- Minimum: 3 bullet points.\n` +
|
|
94
|
+
`- Do not include Cyrillic.\n` +
|
|
95
|
+
`- Use \`docs/releases/TEMPLATE.md\` as the structure.\n\n` +
|
|
96
|
+
`Inputs:\n` +
|
|
97
|
+
`- \`changes.md\` and \`changes.json\` in this directory.\n`);
|
|
98
|
+
}
|
|
99
|
+
export const releasePlanSpec = {
|
|
100
|
+
id: ["release", "plan"],
|
|
101
|
+
group: "Release",
|
|
102
|
+
summary: "Generate an agent-assisted release plan (changes list + next patch version).",
|
|
103
|
+
description: "Generates a structured changes list since the last semver tag and writes a plan directory under .agentplane/.release/. This plan is intended for a DOCS agent to author release notes. By default, only patch bumps are allowed without explicit approval.",
|
|
104
|
+
options: [
|
|
105
|
+
{
|
|
106
|
+
kind: "boolean",
|
|
107
|
+
name: "patch",
|
|
108
|
+
default: false,
|
|
109
|
+
description: "Bump patch version (default).",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
kind: "boolean",
|
|
113
|
+
name: "minor",
|
|
114
|
+
default: false,
|
|
115
|
+
description: "Bump minor version (requires --yes).",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
kind: "boolean",
|
|
119
|
+
name: "major",
|
|
120
|
+
default: false,
|
|
121
|
+
description: "Bump major version (requires --yes).",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
kind: "string",
|
|
125
|
+
name: "since",
|
|
126
|
+
valueHint: "<tag>",
|
|
127
|
+
description: "Override the starting tag/ref (defaults to the latest vX.Y.Z tag).",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
kind: "boolean",
|
|
131
|
+
name: "yes",
|
|
132
|
+
default: false,
|
|
133
|
+
description: "Approve minor/major version bumps (required for --minor/--major).",
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
validateRaw: (raw) => {
|
|
137
|
+
const count = [
|
|
138
|
+
raw.opts.patch === true,
|
|
139
|
+
raw.opts.minor === true,
|
|
140
|
+
raw.opts.major === true,
|
|
141
|
+
].filter(Boolean).length;
|
|
142
|
+
if (count > 1) {
|
|
143
|
+
throw usageError({
|
|
144
|
+
spec: releasePlanSpec,
|
|
145
|
+
command: "release plan",
|
|
146
|
+
message: "Options --patch/--minor/--major are mutually exclusive.",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
parse: (raw) => {
|
|
151
|
+
const bump = raw.opts.major === true ? "major" : raw.opts.minor === true ? "minor" : "patch";
|
|
152
|
+
return { bump, since: raw.opts.since, yes: raw.opts.yes === true };
|
|
153
|
+
},
|
|
154
|
+
validate: (p) => {
|
|
155
|
+
if ((p.bump === "minor" || p.bump === "major") && p.yes !== true) {
|
|
156
|
+
throw usageError({
|
|
157
|
+
spec: releasePlanSpec,
|
|
158
|
+
command: "release plan",
|
|
159
|
+
message: `Bump '${p.bump}' requires explicit approval. Re-run with --yes.`,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
examples: [
|
|
164
|
+
{
|
|
165
|
+
cmd: "agentplane release plan",
|
|
166
|
+
why: "Generate a plan for the next patch release and hand it to a DOCS agent to write release notes.",
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
cmd: "agentplane release plan --minor --yes",
|
|
170
|
+
why: "Generate a plan for the next minor release (explicit approval required).",
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
export const runReleasePlan = async (ctx, flags) => {
|
|
175
|
+
const resolved = await resolveProject({ cwd: ctx.cwd, rootOverride: ctx.rootOverride ?? null });
|
|
176
|
+
const gitRoot = resolved.gitRoot;
|
|
177
|
+
const corePkgPath = path.join(gitRoot, "packages", "core", "package.json");
|
|
178
|
+
const agentplanePkgPath = path.join(gitRoot, "packages", "agentplane", "package.json");
|
|
179
|
+
const [coreVersion, agentplaneVersion] = await Promise.all([
|
|
180
|
+
readPackageVersion(corePkgPath),
|
|
181
|
+
readPackageVersion(agentplanePkgPath),
|
|
182
|
+
]);
|
|
183
|
+
if (coreVersion !== agentplaneVersion) {
|
|
184
|
+
throw new CliError({
|
|
185
|
+
exitCode: exitCodeForError("E_VALIDATION"),
|
|
186
|
+
code: "E_VALIDATION",
|
|
187
|
+
message: `Package versions must match before release planning. ` +
|
|
188
|
+
`packages/core=${coreVersion} packages/agentplane=${agentplaneVersion}`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
const prevTag = flags.since ?? (await getLatestSemverTag(gitRoot));
|
|
192
|
+
const nextVersion = bumpVersion(coreVersion, flags.bump);
|
|
193
|
+
const nextTag = `v${nextVersion}`;
|
|
194
|
+
const changes = await listChanges(gitRoot, prevTag);
|
|
195
|
+
const runId = new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-");
|
|
196
|
+
const baseDir = path.join(gitRoot, ".agentplane", ".release", "plan", runId);
|
|
197
|
+
await mkdir(baseDir, { recursive: true });
|
|
198
|
+
await writeFile(path.join(baseDir, "version.json"), JSON.stringify({ prevTag, prevVersion: coreVersion, nextTag, nextVersion, bump: flags.bump }, null, 2) + "\n", "utf8");
|
|
199
|
+
await writeFile(path.join(baseDir, "changes.json"), JSON.stringify(changes, null, 2) + "\n", "utf8");
|
|
200
|
+
await writeFile(path.join(baseDir, "changes.md"), changesMarkdown(changes), "utf8");
|
|
201
|
+
await writeFile(path.join(baseDir, "instructions.md"), releaseInstructions({ nextTag, prevTag, bump: flags.bump }), "utf8");
|
|
202
|
+
process.stdout.write(`Release plan written: ${path.relative(gitRoot, baseDir)}\n`);
|
|
203
|
+
process.stdout.write(`Next tag: ${nextTag}\n`);
|
|
204
|
+
process.stdout.write(`Hint: Create a DOCS task to write docs/releases/${nextTag}.md based on this plan.\n`);
|
|
205
|
+
return 0;
|
|
206
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CommandHandler, CommandSpec } from "../../cli/spec/spec.js";
|
|
2
|
+
export type ReleaseGroupParsed = Record<string, never>;
|
|
3
|
+
export declare const releaseSpec: CommandSpec<ReleaseGroupParsed>;
|
|
4
|
+
export declare const runRelease: CommandHandler<ReleaseGroupParsed>;
|
|
5
|
+
//# sourceMappingURL=release.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.command.d.ts","sourceRoot":"","sources":["../../../src/commands/release/release.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvD,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,kBAAkB,CAYvD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,kBAAkB,CAGzD,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { usageError } from "../../cli/spec/errors.js";
|
|
2
|
+
export const releaseSpec = {
|
|
3
|
+
id: ["release"],
|
|
4
|
+
group: "Release",
|
|
5
|
+
summary: "Prepare a release (agent-assisted notes + version bump workflow).",
|
|
6
|
+
synopsis: ["agentplane release <command> [args] [options]"],
|
|
7
|
+
validateRaw: (raw) => {
|
|
8
|
+
if (raw.extra.length > 0) {
|
|
9
|
+
throw usageError({ spec: releaseSpec, message: `Unknown subcommand: ${raw.extra[0]}` });
|
|
10
|
+
}
|
|
11
|
+
throw usageError({ spec: releaseSpec, message: "Missing subcommand." });
|
|
12
|
+
},
|
|
13
|
+
parse: () => ({}),
|
|
14
|
+
};
|
|
15
|
+
export const runRelease = () => {
|
|
16
|
+
// Unreachable (validateRaw always throws).
|
|
17
|
+
return Promise.resolve(2);
|
|
18
|
+
};
|
|
@@ -4,6 +4,7 @@ export type CommandMemo = {
|
|
|
4
4
|
taskList?: Promise<TaskData[]>;
|
|
5
5
|
changedPaths?: Promise<string[]>;
|
|
6
6
|
headCommit?: Promise<string>;
|
|
7
|
+
agentIds?: Promise<string[]>;
|
|
7
8
|
};
|
|
8
9
|
export type CommandContext = {
|
|
9
10
|
resolvedProject: Awaited<ReturnType<typeof loadTaskBackend>>["resolved"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,UAAU,CAAC;IAEhB,IAAI,EAAE,WAAW,CAAC;IAGlB,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACxC,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+B7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAepB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC,CAaD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG5E"}
|
|
1
|
+
{"version":3,"file":"task-backend.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/task-backend.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9D,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,UAAU,CAAC;IAEhB,IAAI,EAAE,WAAW,CAAC;IAGlB,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACxC,CAAC;AASF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+B7E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB1B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAepB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC,CAaD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG5E"}
|
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
taskId: string;
|
|
5
|
-
author: string;
|
|
6
|
-
body: string;
|
|
7
|
-
commitFromComment: boolean;
|
|
8
|
-
commitEmoji?: string;
|
|
9
|
-
commitAllow: string[];
|
|
10
|
-
commitAutoAllow: boolean;
|
|
11
|
-
commitAllowTasks: boolean;
|
|
12
|
-
commitRequireClean: boolean;
|
|
13
|
-
confirmStatusCommit: boolean;
|
|
14
|
-
force: boolean;
|
|
15
|
-
quiet: boolean;
|
|
16
|
-
};
|
|
17
|
-
export declare const startSpec: CommandSpec<StartParsed>;
|
|
18
|
-
export declare function makeRunStartHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: StartParsed) => Promise<number>;
|
|
1
|
+
export { startSpec } from "./start.spec.js";
|
|
2
|
+
export type { StartParsed } from "./start.spec.js";
|
|
3
|
+
export { makeRunStartHandler } from "./start.run.js";
|
|
19
4
|
//# sourceMappingURL=start.command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.command.d.ts","sourceRoot":"","sources":["../../src/commands/start.command.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"start.command.d.ts","sourceRoot":"","sources":["../../src/commands/start.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,143 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
function toStringList(v) {
|
|
4
|
-
if (typeof v === "string")
|
|
5
|
-
return [v];
|
|
6
|
-
if (Array.isArray(v))
|
|
7
|
-
return v.filter((x) => typeof x === "string");
|
|
8
|
-
return [];
|
|
9
|
-
}
|
|
10
|
-
export const startSpec = {
|
|
11
|
-
id: ["start"],
|
|
12
|
-
group: "Lifecycle",
|
|
13
|
-
summary: "Transition a task to DOING and record a structured Start comment.",
|
|
14
|
-
args: [
|
|
15
|
-
{
|
|
16
|
-
name: "task-id",
|
|
17
|
-
required: true,
|
|
18
|
-
valueHint: "<task-id>",
|
|
19
|
-
description: "Existing task id.",
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
options: [
|
|
23
|
-
{
|
|
24
|
-
kind: "string",
|
|
25
|
-
name: "author",
|
|
26
|
-
valueHint: "<id>",
|
|
27
|
-
required: true,
|
|
28
|
-
description: "Comment author id (e.g. CODER).",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
kind: "string",
|
|
32
|
-
name: "body",
|
|
33
|
-
valueHint: "<text>",
|
|
34
|
-
required: true,
|
|
35
|
-
description: "Structured comment body (must match the configured Start: prefix).",
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
kind: "boolean",
|
|
39
|
-
name: "commit-from-comment",
|
|
40
|
-
default: false,
|
|
41
|
-
description: "Create a status commit using the comment body.",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
kind: "string",
|
|
45
|
-
name: "commit-emoji",
|
|
46
|
-
valueHint: "<emoji>",
|
|
47
|
-
description: "Override the status commit emoji (used with --commit-from-comment).",
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
kind: "string",
|
|
51
|
-
name: "commit-allow",
|
|
52
|
-
valueHint: "<path-prefix>",
|
|
53
|
-
repeatable: true,
|
|
54
|
-
description: "Repeatable. Allowlist path prefixes to stage for the status commit (used with --commit-from-comment).",
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
kind: "boolean",
|
|
58
|
-
name: "commit-auto-allow",
|
|
59
|
-
default: false,
|
|
60
|
-
description: "Auto-allow inferred allowlist paths if none are provided (used with --commit-from-comment).",
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
kind: "boolean",
|
|
64
|
-
name: "commit-allow-tasks",
|
|
65
|
-
default: true,
|
|
66
|
-
hidden: true,
|
|
67
|
-
description: "Deprecated. Tasks are always allowed for status commits.",
|
|
68
|
-
deprecated: "no-op",
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
kind: "boolean",
|
|
72
|
-
name: "commit-require-clean",
|
|
73
|
-
default: false,
|
|
74
|
-
description: "Require a clean working tree for the status commit (used with --commit-from-comment).",
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
kind: "boolean",
|
|
78
|
-
name: "confirm-status-commit",
|
|
79
|
-
default: false,
|
|
80
|
-
description: "Confirm status commit creation when status_commit_policy=confirm (used with --commit-from-comment).",
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
kind: "boolean",
|
|
84
|
-
name: "force",
|
|
85
|
-
default: false,
|
|
86
|
-
description: "Override readiness checks and status transition restrictions.",
|
|
87
|
-
},
|
|
88
|
-
{ kind: "boolean", name: "quiet", default: false, description: "Suppress output." },
|
|
89
|
-
],
|
|
90
|
-
examples: [
|
|
91
|
-
{
|
|
92
|
-
cmd: 'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI"',
|
|
93
|
-
why: "Start work on a task.",
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
cmd: 'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI" --commit-from-comment --commit-allow packages/agentplane/src',
|
|
97
|
-
why: "Start work and create a status commit from the comment.",
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
validateRaw: (raw) => {
|
|
101
|
-
const author = typeof raw.opts.author === "string" ? raw.opts.author.trim() : "";
|
|
102
|
-
const body = typeof raw.opts.body === "string" ? raw.opts.body.trim() : "";
|
|
103
|
-
if (!author)
|
|
104
|
-
throw usageError({ spec: startSpec, message: "Invalid value for --author: empty." });
|
|
105
|
-
if (!body)
|
|
106
|
-
throw usageError({ spec: startSpec, message: "Invalid value for --body: empty." });
|
|
107
|
-
},
|
|
108
|
-
parse: (raw) => ({
|
|
109
|
-
taskId: typeof raw.args["task-id"] === "string" ? raw.args["task-id"] : "",
|
|
110
|
-
author: raw.opts.author,
|
|
111
|
-
body: raw.opts.body,
|
|
112
|
-
commitFromComment: raw.opts["commit-from-comment"] === true,
|
|
113
|
-
commitEmoji: raw.opts["commit-emoji"],
|
|
114
|
-
commitAllow: toStringList(raw.opts["commit-allow"]),
|
|
115
|
-
commitAutoAllow: raw.opts["commit-auto-allow"] === true,
|
|
116
|
-
commitAllowTasks: raw.opts["commit-allow-tasks"] !== false,
|
|
117
|
-
commitRequireClean: raw.opts["commit-require-clean"] === true,
|
|
118
|
-
confirmStatusCommit: raw.opts["confirm-status-commit"] === true,
|
|
119
|
-
force: raw.opts.force === true,
|
|
120
|
-
quiet: raw.opts.quiet === true,
|
|
121
|
-
}),
|
|
122
|
-
};
|
|
123
|
-
export function makeRunStartHandler(getCtx) {
|
|
124
|
-
return async (ctx, p) => {
|
|
125
|
-
return await cmdStart({
|
|
126
|
-
ctx: await getCtx("start"),
|
|
127
|
-
cwd: ctx.cwd,
|
|
128
|
-
rootOverride: ctx.rootOverride,
|
|
129
|
-
taskId: p.taskId,
|
|
130
|
-
author: p.author,
|
|
131
|
-
body: p.body,
|
|
132
|
-
commitFromComment: p.commitFromComment,
|
|
133
|
-
commitEmoji: p.commitEmoji,
|
|
134
|
-
commitAllow: p.commitAllow,
|
|
135
|
-
commitAutoAllow: p.commitAutoAllow,
|
|
136
|
-
commitAllowTasks: p.commitAllowTasks,
|
|
137
|
-
commitRequireClean: p.commitRequireClean,
|
|
138
|
-
confirmStatusCommit: p.confirmStatusCommit,
|
|
139
|
-
force: p.force,
|
|
140
|
-
quiet: p.quiet,
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
}
|
|
1
|
+
export { startSpec } from "./start.spec.js";
|
|
2
|
+
export { makeRunStartHandler } from "./start.run.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CommandCtx } from "../cli/spec/spec.js";
|
|
2
|
+
import type { CommandContext } from "./shared/task-backend.js";
|
|
3
|
+
import type { StartParsed } from "./start.spec.js";
|
|
4
|
+
export declare function makeRunStartHandler(getCtx: (cmd: string) => Promise<CommandContext>): (ctx: CommandCtx, p: StartParsed) => Promise<number>;
|
|
5
|
+
//# sourceMappingURL=start.run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.run.d.ts","sourceRoot":"","sources":["../../src/commands/start.run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACpE,KAAK,UAAU,EAAE,GAAG,WAAW,KAAG,OAAO,CAAC,MAAM,CAAC,CAmBhE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { cmdStart } from "./task/start.js";
|
|
2
|
+
export function makeRunStartHandler(getCtx) {
|
|
3
|
+
return async (ctx, p) => {
|
|
4
|
+
return await cmdStart({
|
|
5
|
+
ctx: await getCtx("start"),
|
|
6
|
+
cwd: ctx.cwd,
|
|
7
|
+
rootOverride: ctx.rootOverride,
|
|
8
|
+
taskId: p.taskId,
|
|
9
|
+
author: p.author,
|
|
10
|
+
body: p.body,
|
|
11
|
+
commitFromComment: p.commitFromComment,
|
|
12
|
+
commitEmoji: p.commitEmoji,
|
|
13
|
+
commitAllow: p.commitAllow,
|
|
14
|
+
commitAutoAllow: p.commitAutoAllow,
|
|
15
|
+
commitAllowTasks: p.commitAllowTasks,
|
|
16
|
+
commitRequireClean: p.commitRequireClean,
|
|
17
|
+
confirmStatusCommit: p.confirmStatusCommit,
|
|
18
|
+
force: p.force,
|
|
19
|
+
quiet: p.quiet,
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CommandSpec } from "../cli/spec/spec.js";
|
|
2
|
+
export type StartParsed = {
|
|
3
|
+
taskId: string;
|
|
4
|
+
author: string;
|
|
5
|
+
body: string;
|
|
6
|
+
commitFromComment: boolean;
|
|
7
|
+
commitEmoji?: string;
|
|
8
|
+
commitAllow: string[];
|
|
9
|
+
commitAutoAllow: boolean;
|
|
10
|
+
commitAllowTasks: boolean;
|
|
11
|
+
commitRequireClean: boolean;
|
|
12
|
+
confirmStatusCommit: boolean;
|
|
13
|
+
force: boolean;
|
|
14
|
+
quiet: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare const startSpec: CommandSpec<StartParsed>;
|
|
17
|
+
//# sourceMappingURL=start.spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.spec.d.ts","sourceRoot":"","sources":["../../src/commands/start.spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,WAAW,CAAC,WAAW,CAmH9C,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { usageError } from "../cli/spec/errors.js";
|
|
2
|
+
import { toStringList } from "../cli/spec/parse-utils.js";
|
|
3
|
+
export const startSpec = {
|
|
4
|
+
id: ["start"],
|
|
5
|
+
group: "Lifecycle",
|
|
6
|
+
summary: "Transition a task to DOING and record a structured Start comment.",
|
|
7
|
+
args: [
|
|
8
|
+
{
|
|
9
|
+
name: "task-id",
|
|
10
|
+
required: true,
|
|
11
|
+
valueHint: "<task-id>",
|
|
12
|
+
description: "Existing task id.",
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
options: [
|
|
16
|
+
{
|
|
17
|
+
kind: "string",
|
|
18
|
+
name: "author",
|
|
19
|
+
valueHint: "<id>",
|
|
20
|
+
required: true,
|
|
21
|
+
description: "Comment author id (e.g. CODER).",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
kind: "string",
|
|
25
|
+
name: "body",
|
|
26
|
+
valueHint: "<text>",
|
|
27
|
+
required: true,
|
|
28
|
+
description: "Structured comment body (must match the configured Start: prefix).",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
kind: "boolean",
|
|
32
|
+
name: "commit-from-comment",
|
|
33
|
+
default: false,
|
|
34
|
+
description: "Create a status commit using the comment body.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
kind: "string",
|
|
38
|
+
name: "commit-emoji",
|
|
39
|
+
valueHint: "<emoji>",
|
|
40
|
+
description: "Override the status commit emoji (used with --commit-from-comment).",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
kind: "string",
|
|
44
|
+
name: "commit-allow",
|
|
45
|
+
valueHint: "<path-prefix>",
|
|
46
|
+
repeatable: true,
|
|
47
|
+
description: "Repeatable. Allowlist path prefixes to stage for the status commit (used with --commit-from-comment).",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
kind: "boolean",
|
|
51
|
+
name: "commit-auto-allow",
|
|
52
|
+
default: false,
|
|
53
|
+
description: "Auto-allow inferred allowlist paths if none are provided (used with --commit-from-comment).",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
kind: "boolean",
|
|
57
|
+
name: "commit-allow-tasks",
|
|
58
|
+
default: true,
|
|
59
|
+
hidden: true,
|
|
60
|
+
description: "Deprecated. Tasks are always allowed for status commits.",
|
|
61
|
+
deprecated: "no-op",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
kind: "boolean",
|
|
65
|
+
name: "commit-require-clean",
|
|
66
|
+
default: false,
|
|
67
|
+
description: "Require a clean working tree for the status commit (used with --commit-from-comment).",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
kind: "boolean",
|
|
71
|
+
name: "confirm-status-commit",
|
|
72
|
+
default: false,
|
|
73
|
+
description: "Confirm status commit creation when status_commit_policy=confirm (used with --commit-from-comment).",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
kind: "boolean",
|
|
77
|
+
name: "force",
|
|
78
|
+
default: false,
|
|
79
|
+
description: "Override readiness checks and status transition restrictions.",
|
|
80
|
+
},
|
|
81
|
+
{ kind: "boolean", name: "quiet", default: false, description: "Suppress output." },
|
|
82
|
+
],
|
|
83
|
+
examples: [
|
|
84
|
+
{
|
|
85
|
+
cmd: 'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI"',
|
|
86
|
+
why: "Start work on a task.",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
cmd: 'agentplane start 202602030608-F1Q8AB --author CODER --body "Start: implement spec-driven CLI" --commit-from-comment --commit-allow packages/agentplane/src',
|
|
90
|
+
why: "Start work and create a status commit from the comment.",
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
validateRaw: (raw) => {
|
|
94
|
+
const author = typeof raw.opts.author === "string" ? raw.opts.author.trim() : "";
|
|
95
|
+
const body = typeof raw.opts.body === "string" ? raw.opts.body.trim() : "";
|
|
96
|
+
if (!author)
|
|
97
|
+
throw usageError({ spec: startSpec, message: "Invalid value for --author: empty." });
|
|
98
|
+
if (!body)
|
|
99
|
+
throw usageError({ spec: startSpec, message: "Invalid value for --body: empty." });
|
|
100
|
+
},
|
|
101
|
+
parse: (raw) => ({
|
|
102
|
+
taskId: typeof raw.args["task-id"] === "string" ? raw.args["task-id"] : "",
|
|
103
|
+
author: raw.opts.author,
|
|
104
|
+
body: raw.opts.body,
|
|
105
|
+
commitFromComment: raw.opts["commit-from-comment"] === true,
|
|
106
|
+
commitEmoji: raw.opts["commit-emoji"],
|
|
107
|
+
commitAllow: toStringList(raw.opts["commit-allow"]),
|
|
108
|
+
commitAutoAllow: raw.opts["commit-auto-allow"] === true,
|
|
109
|
+
commitAllowTasks: raw.opts["commit-allow-tasks"] !== false,
|
|
110
|
+
commitRequireClean: raw.opts["commit-require-clean"] === true,
|
|
111
|
+
confirmStatusCommit: raw.opts["confirm-status-commit"] === true,
|
|
112
|
+
force: raw.opts.force === true,
|
|
113
|
+
quiet: raw.opts.quiet === true,
|
|
114
|
+
}),
|
|
115
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/add.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/add.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAKhE,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,aAAa,CAmIlD,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACtE,KAAK,UAAU,EAAE,GAAG,aAAa,KAAG,OAAO,CAAC,MAAM,CAAC,CAkBlE"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import { usageError } from "../../cli/spec/errors.js";
|
|
2
|
+
import { toStringList } from "../../cli/spec/parse-utils.js";
|
|
2
3
|
import { cmdTaskAdd } from "./add.js";
|
|
3
4
|
import { normalizeDependsOnInput } from "./shared.js";
|
|
4
|
-
function toStringList(v) {
|
|
5
|
-
if (typeof v === "string")
|
|
6
|
-
return [v];
|
|
7
|
-
if (Array.isArray(v))
|
|
8
|
-
return v.filter((x) => typeof x === "string");
|
|
9
|
-
return [];
|
|
10
|
-
}
|
|
11
5
|
export const taskAddSpec = {
|
|
12
6
|
id: ["task", "add"],
|
|
13
7
|
group: "Task",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/derive.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"derive.command.d.ts","sourceRoot":"","sources":["../../../src/commands/task/derive.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC5C,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAqExD,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,IACzE,KAAK,UAAU,EAAE,GAAG,gBAAgB,KAAG,OAAO,CAAC,MAAM,CAAC,CAarE"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { usageError } from "../../cli/spec/errors.js";
|
|
2
|
+
import { toStringList } from "../../cli/spec/parse-utils.js";
|
|
2
3
|
import { cmdTaskDerive } from "./derive.js";
|
|
3
|
-
function toStringList(v) {
|
|
4
|
-
if (typeof v === "string")
|
|
5
|
-
return [v];
|
|
6
|
-
if (Array.isArray(v))
|
|
7
|
-
return v.filter((x) => typeof x === "string");
|
|
8
|
-
return [];
|
|
9
|
-
}
|
|
10
4
|
export const taskDeriveSpec = {
|
|
11
5
|
id: ["task", "derive"],
|
|
12
6
|
group: "Task",
|