agentplane 0.3.2 → 0.3.3
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/assets/AGENTS.md +1 -1
- package/assets/agents/CODER.json +4 -3
- package/assets/agents/DOCS.json +1 -1
- package/assets/agents/INTEGRATOR.json +1 -1
- package/assets/agents/ORCHESTRATOR.json +1 -0
- package/assets/agents/PLANNER.json +1 -0
- package/assets/agents/TESTER.json +3 -1
- package/assets/policy/dod.code.md +2 -2
- package/assets/policy/dod.core.md +16 -2
- package/assets/policy/dod.docs.md +2 -2
- package/assets/policy/incidents.md +44 -1
- package/assets/policy/workflow.direct.md +8 -4
- package/bin/agentplane.js +59 -9
- package/bin/dist-guard.js +78 -10
- package/bin/runtime-context.d.ts +3 -0
- package/bin/runtime-context.js +13 -0
- package/bin/runtime-watch.d.ts +26 -0
- package/bin/runtime-watch.js +116 -0
- package/bin/stale-dist-policy.d.ts +6 -0
- package/bin/stale-dist-policy.js +44 -0
- package/dist/.build-manifest.json +2480 -5
- package/dist/backends/task-backend/local-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/local-backend.js +9 -12
- package/dist/backends/task-backend/redmine-backend.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine-backend.js +23 -18
- package/dist/backends/task-backend/shared/constants.d.ts +1 -0
- package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
- package/dist/backends/task-backend/shared/constants.js +1 -0
- package/dist/backends/task-backend/shared/doc.d.ts +1 -0
- package/dist/backends/task-backend/shared/doc.d.ts.map +1 -1
- package/dist/backends/task-backend/shared/doc.js +4 -1
- package/dist/backends/task-backend/shared/export.js +3 -3
- package/dist/cli/bootstrap-guide.d.ts +1 -3
- package/dist/cli/bootstrap-guide.d.ts.map +1 -1
- package/dist/cli/bootstrap-guide.js +13 -33
- package/dist/cli/command-guide.d.ts.map +1 -1
- package/dist/cli/command-guide.js +27 -34
- package/dist/cli/run-cli/catalog.d.ts +7 -0
- package/dist/cli/run-cli/catalog.d.ts.map +1 -0
- package/dist/cli/run-cli/catalog.js +22 -0
- package/dist/cli/run-cli/command-catalog.d.ts +1 -1
- package/dist/cli/run-cli/command-catalog.d.ts.map +1 -1
- package/dist/cli/run-cli/command-catalog.js +11 -0
- package/dist/cli/run-cli/commands/init/write-config.d.ts.map +1 -1
- package/dist/cli/run-cli/commands/init/write-config.js +2 -0
- package/dist/cli/run-cli/commands/init.js +5 -14
- package/dist/cli/run-cli/error-guidance.d.ts +9 -0
- package/dist/cli/run-cli/error-guidance.d.ts.map +1 -0
- package/dist/cli/run-cli/error-guidance.js +180 -0
- package/dist/cli/run-cli/globals.d.ts +22 -0
- package/dist/cli/run-cli/globals.d.ts.map +1 -0
- package/dist/cli/run-cli/globals.js +197 -0
- package/dist/cli/run-cli/update-warning.d.ts +6 -0
- package/dist/cli/run-cli/update-warning.d.ts.map +1 -0
- package/dist/cli/run-cli/update-warning.js +64 -0
- package/dist/cli/run-cli.d.ts.map +1 -1
- package/dist/cli/run-cli.js +5 -476
- package/dist/cli/spec/docs-render.d.ts.map +1 -1
- package/dist/cli/spec/docs-render.js +14 -1
- package/dist/commands/doctor/archive.d.ts +4 -0
- package/dist/commands/doctor/archive.d.ts.map +1 -0
- package/dist/commands/doctor/archive.js +211 -0
- package/dist/commands/doctor/fixes.d.ts +9 -0
- package/dist/commands/doctor/fixes.d.ts.map +1 -0
- package/dist/commands/doctor/fixes.js +40 -0
- package/dist/commands/doctor/layering.d.ts +2 -0
- package/dist/commands/doctor/layering.d.ts.map +1 -0
- package/dist/commands/doctor/layering.js +87 -0
- package/dist/commands/doctor/runtime.d.ts +4 -0
- package/dist/commands/doctor/runtime.d.ts.map +1 -0
- package/dist/commands/doctor/runtime.js +56 -0
- package/dist/commands/doctor/workflow.d.ts +6 -0
- package/dist/commands/doctor/workflow.d.ts.map +1 -0
- package/dist/commands/doctor/workflow.js +62 -0
- package/dist/commands/doctor/workspace.d.ts +2 -0
- package/dist/commands/doctor/workspace.d.ts.map +1 -0
- package/dist/commands/doctor/workspace.js +165 -0
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +16 -342
- package/dist/commands/doctor.spec.d.ts +1 -0
- package/dist/commands/doctor.spec.d.ts.map +1 -1
- package/dist/commands/doctor.spec.js +15 -1
- package/dist/commands/guard/impl/commands.d.ts.map +1 -1
- package/dist/commands/guard/impl/commands.js +19 -0
- package/dist/commands/release/apply.command.d.ts +2 -8
- package/dist/commands/release/apply.command.d.ts.map +1 -1
- package/dist/commands/release/apply.command.js +158 -387
- package/dist/commands/release/apply.mutation.d.ts +7 -0
- package/dist/commands/release/apply.mutation.d.ts.map +1 -0
- package/dist/commands/release/apply.mutation.js +107 -0
- package/dist/commands/release/apply.preflight.d.ts +25 -0
- package/dist/commands/release/apply.preflight.d.ts.map +1 -0
- package/dist/commands/release/apply.preflight.js +338 -0
- package/dist/commands/release/apply.reporting.d.ts +4 -0
- package/dist/commands/release/apply.reporting.d.ts.map +1 -0
- package/dist/commands/release/apply.reporting.js +24 -0
- package/dist/commands/release/apply.types.d.ts +46 -0
- package/dist/commands/release/apply.types.d.ts.map +1 -0
- package/dist/commands/release/apply.types.js +1 -0
- package/dist/commands/runtime.command.d.ts +28 -0
- package/dist/commands/runtime.command.d.ts.map +1 -0
- package/dist/commands/runtime.command.js +169 -0
- package/dist/commands/shared/task-store.d.ts.map +1 -1
- package/dist/commands/shared/task-store.js +7 -3
- package/dist/commands/task/add.d.ts.map +1 -1
- package/dist/commands/task/add.js +3 -33
- package/dist/commands/task/block.d.ts.map +1 -1
- package/dist/commands/task/block.js +2 -2
- package/dist/commands/task/close-duplicate.d.ts.map +1 -1
- package/dist/commands/task/close-duplicate.js +2 -2
- package/dist/commands/task/close-noop.d.ts.map +1 -1
- package/dist/commands/task/close-noop.js +2 -2
- package/dist/commands/task/comment.js +2 -2
- package/dist/commands/task/derive.d.ts.map +1 -1
- package/dist/commands/task/derive.js +3 -3
- package/dist/commands/task/doc-template.d.ts +10 -0
- package/dist/commands/task/doc-template.d.ts.map +1 -0
- package/dist/commands/task/doc-template.js +104 -0
- package/dist/commands/task/doc.d.ts.map +1 -1
- package/dist/commands/task/doc.js +36 -1
- package/dist/commands/task/finish.d.ts.map +1 -1
- package/dist/commands/task/finish.js +7 -4
- package/dist/commands/task/migrate-doc.command.d.ts.map +1 -1
- package/dist/commands/task/migrate-doc.command.js +5 -1
- package/dist/commands/task/migrate-doc.d.ts.map +1 -1
- package/dist/commands/task/migrate-doc.js +136 -2
- package/dist/commands/task/new.d.ts.map +1 -1
- package/dist/commands/task/new.js +4 -110
- package/dist/commands/task/new.spec.js +3 -3
- package/dist/commands/task/plan.d.ts.map +1 -1
- package/dist/commands/task/plan.js +5 -4
- package/dist/commands/task/scaffold.d.ts.map +1 -1
- package/dist/commands/task/scaffold.js +7 -52
- package/dist/commands/task/set-status.d.ts.map +1 -1
- package/dist/commands/task/set-status.js +2 -2
- package/dist/commands/task/shared/dependencies.d.ts +15 -0
- package/dist/commands/task/shared/dependencies.d.ts.map +1 -0
- package/dist/commands/task/shared/dependencies.js +143 -0
- package/dist/commands/task/shared/docs.d.ts +21 -0
- package/dist/commands/task/shared/docs.d.ts.map +1 -0
- package/dist/commands/task/shared/docs.js +121 -0
- package/dist/commands/task/shared/listing.d.ts +20 -0
- package/dist/commands/task/shared/listing.d.ts.map +1 -0
- package/dist/commands/task/shared/listing.js +127 -0
- package/dist/commands/task/shared/tags.d.ts +24 -0
- package/dist/commands/task/shared/tags.d.ts.map +1 -0
- package/dist/commands/task/shared/tags.js +177 -0
- package/dist/commands/task/shared/transitions.d.ts +42 -0
- package/dist/commands/task/shared/transitions.d.ts.map +1 -0
- package/dist/commands/task/shared/transitions.js +175 -0
- package/dist/commands/task/shared.d.ts +5 -106
- package/dist/commands/task/shared.d.ts.map +1 -1
- package/dist/commands/task/shared.js +5 -681
- package/dist/commands/task/start.d.ts.map +1 -1
- package/dist/commands/task/start.js +7 -5
- package/dist/commands/task/verify-record.d.ts.map +1 -1
- package/dist/commands/task/verify-record.js +9 -25
- package/dist/commands/task/verify-show.command.d.ts.map +1 -1
- package/dist/commands/task/verify-show.command.js +5 -1
- package/dist/commands/upgrade/apply.d.ts +44 -0
- package/dist/commands/upgrade/apply.d.ts.map +1 -0
- package/dist/commands/upgrade/apply.js +180 -0
- package/dist/commands/upgrade/report.d.ts +21 -0
- package/dist/commands/upgrade/report.d.ts.map +1 -0
- package/dist/commands/upgrade/report.js +81 -0
- package/dist/commands/upgrade/source.d.ts +35 -0
- package/dist/commands/upgrade/source.d.ts.map +1 -0
- package/dist/commands/upgrade/source.js +109 -0
- package/dist/commands/upgrade/types.d.ts +31 -0
- package/dist/commands/upgrade/types.d.ts.map +1 -0
- package/dist/commands/upgrade/types.js +1 -0
- package/dist/commands/upgrade.d.ts +1 -35
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +46 -331
- package/dist/shared/diagnostics.d.ts +23 -0
- package/dist/shared/diagnostics.d.ts.map +1 -0
- package/dist/shared/diagnostics.js +57 -0
- package/dist/shared/errors.d.ts +2 -0
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +2 -0
- package/dist/shared/repo-cli-version.d.ts +13 -0
- package/dist/shared/repo-cli-version.d.ts.map +1 -0
- package/dist/shared/repo-cli-version.js +63 -0
- package/dist/shared/runtime-source.d.ts +33 -0
- package/dist/shared/runtime-source.d.ts.map +1 -0
- package/dist/shared/runtime-source.js +156 -0
- package/dist/shared/version-compare.d.ts +7 -0
- package/dist/shared/version-compare.d.ts.map +1 -0
- package/dist/shared/version-compare.js +30 -0
- package/package.json +2 -2
|
@@ -220,8 +220,8 @@ export const initSpec = {
|
|
|
220
220
|
why: "Non-interactive setup with flexible defaults.",
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
|
-
cmd: "agentplane init --workflow direct --backend local --hooks true --require-
|
|
224
|
-
why: "Non-interactive setup with explicit
|
|
223
|
+
cmd: "agentplane init --workflow direct --backend local --hooks true --require-network-approval true --yes",
|
|
224
|
+
why: "Non-interactive setup with profile defaults plus an explicit network-approval override.",
|
|
225
225
|
},
|
|
226
226
|
{
|
|
227
227
|
cmd: "agentplane init --force --yes",
|
|
@@ -318,14 +318,11 @@ async function cmdInit(opts) {
|
|
|
318
318
|
const isInteractive = process.stdin.isTTY && !flags.yes;
|
|
319
319
|
if (!process.stdin.isTTY &&
|
|
320
320
|
!flags.yes &&
|
|
321
|
-
(!flags.workflow ||
|
|
322
|
-
flags.requirePlanApproval === undefined ||
|
|
323
|
-
flags.requireNetworkApproval === undefined ||
|
|
324
|
-
flags.requireVerifyApproval === undefined)) {
|
|
321
|
+
(!flags.workflow || flags.requireNetworkApproval === undefined)) {
|
|
325
322
|
throw usageError({
|
|
326
323
|
spec: initSpec,
|
|
327
324
|
command: "init",
|
|
328
|
-
message: "Non-interactive init requires --yes or explicit values for: --workflow, --require-
|
|
325
|
+
message: "Non-interactive init requires --yes or explicit values for: --workflow, --require-network-approval.",
|
|
329
326
|
});
|
|
330
327
|
}
|
|
331
328
|
if (isInteractive) {
|
|
@@ -406,16 +403,10 @@ async function cmdInit(opts) {
|
|
|
406
403
|
if (flags.strictUnsafeConfirm === undefined) {
|
|
407
404
|
strictUnsafeConfirm = await askYesNo("Require strict explicit confirmation for extra unsafe actions?", strictUnsafeConfirm);
|
|
408
405
|
}
|
|
409
|
-
process.stdout.write(renderInitSection("
|
|
410
|
-
if (flags.requirePlanApproval === undefined) {
|
|
411
|
-
requirePlanApproval = await askYesNo("Require plan approval before work starts?", requirePlanApproval);
|
|
412
|
-
}
|
|
406
|
+
process.stdout.write(renderInitSection("Network Approval", "Control whether network actions require explicit approval by default. Plan and verification approvals follow the selected setup profile unless you override them with explicit flags."));
|
|
413
407
|
if (flags.requireNetworkApproval === undefined) {
|
|
414
408
|
requireNetworkApproval = await askYesNo("Require explicit approval for network actions?", requireNetworkApproval);
|
|
415
409
|
}
|
|
416
|
-
if (flags.requireVerifyApproval === undefined) {
|
|
417
|
-
requireVerifyApproval = await askYesNo("Require explicit approval before recording verification?", requireVerifyApproval);
|
|
418
|
-
}
|
|
419
410
|
process.stdout.write(renderInitSection("Recipes", "Optional: install recipe packs now (comma-separated IDs) or choose none."));
|
|
420
411
|
if (!flags.recipes) {
|
|
421
412
|
process.stdout.write(`${renderBundledRecipesHint()}\n`);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CliError } from "../../shared/errors.js";
|
|
2
|
+
export type NextAction = {
|
|
3
|
+
command: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
reasonCode?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function writeError(err: CliError, jsonErrors: boolean): void;
|
|
8
|
+
export declare function resolveAgentplaneHome(): string;
|
|
9
|
+
//# sourceMappingURL=error-guidance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-guidance.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/error-guidance.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AASF,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CA4CnE;AAID,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readDiagnosticContext } from "../../shared/diagnostics.js";
|
|
4
|
+
import { formatJsonError } from "../../shared/errors.js";
|
|
5
|
+
import { getReasonCodeMeta } from "../reason-codes.js";
|
|
6
|
+
export function writeError(err, jsonErrors) {
|
|
7
|
+
const guidance = resolveErrorGuidance(err);
|
|
8
|
+
const contextReasonCode = typeof err.context?.reason_code === "string" ? String(err.context.reason_code) : undefined;
|
|
9
|
+
const reasonCode = contextReasonCode ?? guidance.nextAction?.reasonCode;
|
|
10
|
+
const reasonDecode = getReasonCodeMeta(reasonCode);
|
|
11
|
+
if (jsonErrors) {
|
|
12
|
+
process.stdout.write(`${formatJsonError(err, {
|
|
13
|
+
state: guidance.state,
|
|
14
|
+
likelyCause: guidance.likelyCause,
|
|
15
|
+
hint: guidance.hint,
|
|
16
|
+
nextAction: guidance.nextAction,
|
|
17
|
+
reasonDecode,
|
|
18
|
+
})}\n`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const header = `error [${err.code}]`;
|
|
22
|
+
if (err.message.includes("\n")) {
|
|
23
|
+
process.stderr.write(`${header}\n${err.message}\n`);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
process.stderr.write(`${header}: ${err.message}\n`);
|
|
27
|
+
}
|
|
28
|
+
if (guidance.state) {
|
|
29
|
+
process.stderr.write(`state: ${guidance.state}\n`);
|
|
30
|
+
}
|
|
31
|
+
if (guidance.likelyCause) {
|
|
32
|
+
process.stderr.write(`likely_cause: ${guidance.likelyCause}\n`);
|
|
33
|
+
}
|
|
34
|
+
if (guidance.hint) {
|
|
35
|
+
process.stderr.write(`hint: ${guidance.hint}\n`);
|
|
36
|
+
}
|
|
37
|
+
if (guidance.nextAction) {
|
|
38
|
+
process.stderr.write(`next_action: ${guidance.nextAction.command} (${guidance.nextAction.reason})\n`);
|
|
39
|
+
}
|
|
40
|
+
if (reasonDecode) {
|
|
41
|
+
process.stderr.write(`reason_code: ${reasonDecode.code} [${reasonDecode.category}] ${reasonDecode.summary}\n`);
|
|
42
|
+
process.stderr.write(`reason_action: ${reasonDecode.action}\n`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const AGENTPLANE_HOME_ENV = "AGENTPLANE_HOME";
|
|
47
|
+
export function resolveAgentplaneHome() {
|
|
48
|
+
const overridden = process.env[AGENTPLANE_HOME_ENV]?.trim();
|
|
49
|
+
if (overridden)
|
|
50
|
+
return overridden;
|
|
51
|
+
return path.join(os.homedir(), ".agentplane");
|
|
52
|
+
}
|
|
53
|
+
function resolveErrorGuidance(err) {
|
|
54
|
+
const explicit = readDiagnosticContext(err.context);
|
|
55
|
+
const command = typeof err.context?.command === "string" ? err.context.command : undefined;
|
|
56
|
+
const reasonCode = typeof err.context?.reason_code === "string" ? String(err.context.reason_code) : undefined;
|
|
57
|
+
const usage = command ? `agentplane help ${command} --compact` : "agentplane help";
|
|
58
|
+
const withExplicit = (fallback) => ({
|
|
59
|
+
state: explicit.state ?? fallback.state,
|
|
60
|
+
likelyCause: explicit.likelyCause ?? fallback.likelyCause,
|
|
61
|
+
hint: explicit.hint ?? fallback.hint,
|
|
62
|
+
nextAction: explicit.nextAction ?? fallback.nextAction,
|
|
63
|
+
});
|
|
64
|
+
switch (err.code) {
|
|
65
|
+
case "E_USAGE": {
|
|
66
|
+
if (reasonCode === "sync_backend_mismatch") {
|
|
67
|
+
return withExplicit({
|
|
68
|
+
hint: "Configured backend id mismatch. Check active backend and retry with a matching id.",
|
|
69
|
+
nextAction: {
|
|
70
|
+
command: "agentplane config show",
|
|
71
|
+
reason: "inspect active backend id before running sync",
|
|
72
|
+
reasonCode: "sync_backend_mismatch",
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return withExplicit({
|
|
77
|
+
hint: `See \`${usage}\` for usage.`,
|
|
78
|
+
nextAction: {
|
|
79
|
+
command: usage,
|
|
80
|
+
reason: "inspect required arguments and flags",
|
|
81
|
+
reasonCode: "usage_help",
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
case "E_GIT": {
|
|
86
|
+
if (reasonCode === "reconcile_git_state_unreadable") {
|
|
87
|
+
return withExplicit({
|
|
88
|
+
hint: "Reconcile check could not read git state.",
|
|
89
|
+
nextAction: {
|
|
90
|
+
command: "git status --short --untracked-files=no",
|
|
91
|
+
reason: "confirm repository state is readable before mutating commands",
|
|
92
|
+
reasonCode: "reconcile_git_state_unreadable",
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (command?.startsWith("branch")) {
|
|
97
|
+
return withExplicit({
|
|
98
|
+
hint: "Check git repo/branch; run `git branch` or pass --root <path>.",
|
|
99
|
+
nextAction: {
|
|
100
|
+
command: "git branch",
|
|
101
|
+
reason: "inspect repository branch state",
|
|
102
|
+
reasonCode: "git_branch_state",
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (command === "guard commit" || command === "commit") {
|
|
107
|
+
return withExplicit({
|
|
108
|
+
hint: "Check git status/index; stage changes and retry.",
|
|
109
|
+
nextAction: {
|
|
110
|
+
command: "git status --short",
|
|
111
|
+
reason: "inspect staged/unstaged changes before commit",
|
|
112
|
+
reasonCode: "git_index_state",
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return withExplicit({
|
|
117
|
+
hint: "Check git repo context; pass --root <path> if needed.",
|
|
118
|
+
nextAction: {
|
|
119
|
+
command: "git status --short --untracked-files=no",
|
|
120
|
+
reason: "confirm repository context and tracked changes",
|
|
121
|
+
reasonCode: "git_context",
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
case "E_NETWORK": {
|
|
126
|
+
return withExplicit({
|
|
127
|
+
hint: "Check network access and credentials.",
|
|
128
|
+
nextAction: {
|
|
129
|
+
command: "agentplane preflight --json",
|
|
130
|
+
reason: "recheck approvals and network requirements",
|
|
131
|
+
reasonCode: "network_gate",
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
case "E_BACKEND": {
|
|
136
|
+
if (command?.includes("sync")) {
|
|
137
|
+
return withExplicit({
|
|
138
|
+
hint: "Check backend config under .agentplane/backends and retry.",
|
|
139
|
+
nextAction: {
|
|
140
|
+
command: "agentplane config show",
|
|
141
|
+
reason: "verify backend config path and active settings",
|
|
142
|
+
reasonCode: "backend_sync_config",
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return withExplicit({
|
|
147
|
+
hint: "Check backend config under .agentplane/backends.",
|
|
148
|
+
nextAction: {
|
|
149
|
+
command: "agentplane config show",
|
|
150
|
+
reason: "inspect backend configuration",
|
|
151
|
+
reasonCode: "backend_config",
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
case "E_VALIDATION": {
|
|
156
|
+
if (reasonCode === "reconcile_task_scan_failed" ||
|
|
157
|
+
reasonCode === "reconcile_task_scan_incomplete") {
|
|
158
|
+
return withExplicit({
|
|
159
|
+
hint: "Reconcile check failed due to task scan drift or parse/read errors.",
|
|
160
|
+
nextAction: {
|
|
161
|
+
command: "agentplane task list --strict-read",
|
|
162
|
+
reason: "surface task scan/read failures before retrying mutating commands",
|
|
163
|
+
reasonCode,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return withExplicit({
|
|
168
|
+
hint: "Fix invalid config/input shape and rerun.",
|
|
169
|
+
nextAction: {
|
|
170
|
+
command: "agentplane preflight --json",
|
|
171
|
+
reason: "pinpoint validation failure in one report",
|
|
172
|
+
reasonCode: "validation_preflight",
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
default: {
|
|
177
|
+
return withExplicit({});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type ParsedArgs = {
|
|
2
|
+
help: boolean;
|
|
3
|
+
version: boolean;
|
|
4
|
+
noUpdateCheck: boolean;
|
|
5
|
+
root?: string;
|
|
6
|
+
jsonErrors: boolean;
|
|
7
|
+
allowNetwork: boolean;
|
|
8
|
+
outputMode?: "text" | "json";
|
|
9
|
+
};
|
|
10
|
+
export type CliOutputMode = "text" | "json";
|
|
11
|
+
export declare function prescanJsonErrors(argv: readonly string[]): boolean;
|
|
12
|
+
export declare function parseGlobalArgs(argv: string[]): {
|
|
13
|
+
globals: ParsedArgs;
|
|
14
|
+
rest: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function resolveOutputMode(modeFromFlag: "text" | "json" | undefined): CliOutputMode;
|
|
17
|
+
export declare function runWithOutputMode(opts: {
|
|
18
|
+
mode: CliOutputMode;
|
|
19
|
+
command: string;
|
|
20
|
+
run: () => Promise<number>;
|
|
21
|
+
}): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=globals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/globals.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B,CAAC;AAgCF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAG5C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAsBlE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA0FvF;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAU1F;AAQD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDlB"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { CliError } from "../../shared/errors.js";
|
|
2
|
+
const GLOBAL_FLAGS = [
|
|
3
|
+
{ key: "help", forms: ["--help", "-h"], takesValue: false, scoped: false },
|
|
4
|
+
{ key: "version", forms: ["--version", "-v"], takesValue: false, scoped: false },
|
|
5
|
+
{ key: "noUpdateCheck", forms: ["--no-update-check"], takesValue: false, scoped: false },
|
|
6
|
+
{ key: "allowNetwork", forms: ["--allow-network"], takesValue: false, scoped: true },
|
|
7
|
+
{ key: "jsonErrors", forms: ["--json-errors"], takesValue: false, scoped: true },
|
|
8
|
+
{ key: "outputMode", forms: ["--output"], takesValue: true, scoped: false },
|
|
9
|
+
{ key: "root", forms: ["--root"], takesValue: true, scoped: false },
|
|
10
|
+
];
|
|
11
|
+
const GLOBAL_FLAG_FORMS = new Map(GLOBAL_FLAGS.flatMap((def) => def.forms.map((form) => [form, def])));
|
|
12
|
+
const OUTPUT_MODE_ENV = "AGENTPLANE_OUTPUT";
|
|
13
|
+
export function prescanJsonErrors(argv) {
|
|
14
|
+
// If parseGlobalArgs throws (e.g. missing --root value), we still want to honor
|
|
15
|
+
// `--json-errors` in the "scoped global" zone (before the command id).
|
|
16
|
+
let hasRest = false;
|
|
17
|
+
for (let i = 0; i < argv.length; i++) {
|
|
18
|
+
const arg = argv[i];
|
|
19
|
+
if (!arg)
|
|
20
|
+
continue;
|
|
21
|
+
const def = GLOBAL_FLAG_FORMS.get(arg);
|
|
22
|
+
if (!def) {
|
|
23
|
+
// First non-global token is treated as the start of the command id.
|
|
24
|
+
hasRest = true;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (def.key === "jsonErrors" && !hasRest)
|
|
28
|
+
return true;
|
|
29
|
+
if (def.takesValue) {
|
|
30
|
+
// Skip the value if present; do not throw on missing value here.
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
export function parseGlobalArgs(argv) {
|
|
37
|
+
let help = false;
|
|
38
|
+
let version = false;
|
|
39
|
+
let noUpdateCheck = false;
|
|
40
|
+
let jsonErrors = false;
|
|
41
|
+
let root;
|
|
42
|
+
let allowNetwork = false;
|
|
43
|
+
let outputMode;
|
|
44
|
+
const rest = [];
|
|
45
|
+
for (let i = 0; i < argv.length; i++) {
|
|
46
|
+
const arg = argv[i];
|
|
47
|
+
if (!arg)
|
|
48
|
+
continue;
|
|
49
|
+
const def = GLOBAL_FLAG_FORMS.get(arg);
|
|
50
|
+
if (!def) {
|
|
51
|
+
rest.push(arg);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (def.scoped && rest.length > 0) {
|
|
55
|
+
rest.push(arg);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
switch (def.key) {
|
|
59
|
+
case "help": {
|
|
60
|
+
help = true;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "version": {
|
|
64
|
+
version = true;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case "noUpdateCheck": {
|
|
68
|
+
noUpdateCheck = true;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "allowNetwork": {
|
|
72
|
+
allowNetwork = true;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case "jsonErrors": {
|
|
76
|
+
jsonErrors = true;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case "root": {
|
|
80
|
+
const next = argv[i + 1];
|
|
81
|
+
if (!next) {
|
|
82
|
+
throw new CliError({
|
|
83
|
+
exitCode: 2,
|
|
84
|
+
code: "E_USAGE",
|
|
85
|
+
message: "Missing value after --root (expected repository path)",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
root = next;
|
|
89
|
+
i++;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case "outputMode": {
|
|
93
|
+
const next = argv[i + 1];
|
|
94
|
+
if (!next) {
|
|
95
|
+
throw new CliError({
|
|
96
|
+
exitCode: 2,
|
|
97
|
+
code: "E_USAGE",
|
|
98
|
+
message: "Missing value after --output (expected text|json)",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const normalized = next.trim().toLowerCase();
|
|
102
|
+
if (normalized !== "text" && normalized !== "json") {
|
|
103
|
+
throw new CliError({
|
|
104
|
+
exitCode: 2,
|
|
105
|
+
code: "E_USAGE",
|
|
106
|
+
message: `Invalid value for --output: ${next} (expected text|json)`,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
outputMode = normalized;
|
|
110
|
+
i++;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
default: {
|
|
114
|
+
rest.push(arg);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
globals: { help, version, noUpdateCheck, root, jsonErrors, allowNetwork, outputMode },
|
|
121
|
+
rest,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function resolveOutputMode(modeFromFlag) {
|
|
125
|
+
if (modeFromFlag)
|
|
126
|
+
return modeFromFlag;
|
|
127
|
+
const fromEnv = process.env[OUTPUT_MODE_ENV]?.trim().toLowerCase();
|
|
128
|
+
if (!fromEnv || fromEnv === "text")
|
|
129
|
+
return "text";
|
|
130
|
+
if (fromEnv === "json")
|
|
131
|
+
return "json";
|
|
132
|
+
throw new CliError({
|
|
133
|
+
exitCode: 2,
|
|
134
|
+
code: "E_USAGE",
|
|
135
|
+
message: `Invalid ${OUTPUT_MODE_ENV}: ${fromEnv} (expected text|json)`,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function chunkToString(chunk, encoding) {
|
|
139
|
+
if (typeof chunk === "string")
|
|
140
|
+
return chunk;
|
|
141
|
+
if (chunk instanceof Uint8Array)
|
|
142
|
+
return Buffer.from(chunk).toString(encoding);
|
|
143
|
+
return String(chunk);
|
|
144
|
+
}
|
|
145
|
+
export async function runWithOutputMode(opts) {
|
|
146
|
+
if (opts.mode === "text")
|
|
147
|
+
return await opts.run();
|
|
148
|
+
const stdoutWrite = process.stdout.write.bind(process.stdout);
|
|
149
|
+
const stderrWrite = process.stderr.write.bind(process.stderr);
|
|
150
|
+
let stdout = "";
|
|
151
|
+
let stderr = "";
|
|
152
|
+
process.stdout.write = ((chunk, ...rest) => {
|
|
153
|
+
const encoding = typeof rest[0] === "string" ? rest[0] : undefined;
|
|
154
|
+
stdout += chunkToString(chunk, encoding);
|
|
155
|
+
const callback = rest.find((item) => typeof item === "function");
|
|
156
|
+
callback?.(null);
|
|
157
|
+
return true;
|
|
158
|
+
});
|
|
159
|
+
process.stderr.write = ((chunk, ...rest) => {
|
|
160
|
+
const encoding = typeof rest[0] === "string" ? rest[0] : undefined;
|
|
161
|
+
stderr += chunkToString(chunk, encoding);
|
|
162
|
+
const callback = rest.find((item) => typeof item === "function");
|
|
163
|
+
callback?.(null);
|
|
164
|
+
return true;
|
|
165
|
+
});
|
|
166
|
+
try {
|
|
167
|
+
const exitCode = await opts.run();
|
|
168
|
+
let parsed;
|
|
169
|
+
const trimmedStdout = stdout.trim();
|
|
170
|
+
if (trimmedStdout.length > 0) {
|
|
171
|
+
try {
|
|
172
|
+
parsed = JSON.parse(trimmedStdout);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
parsed = undefined;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const payload = {
|
|
179
|
+
schema_version: 1,
|
|
180
|
+
mode: "agent_json_v1",
|
|
181
|
+
command: opts.command,
|
|
182
|
+
ok: exitCode === 0,
|
|
183
|
+
exit_code: exitCode,
|
|
184
|
+
stdout: trimmedStdout,
|
|
185
|
+
stderr: stderr.trim(),
|
|
186
|
+
};
|
|
187
|
+
if (parsed !== undefined) {
|
|
188
|
+
payload.data = parsed;
|
|
189
|
+
}
|
|
190
|
+
stdoutWrite(`${JSON.stringify(payload, null, 2)}\n`);
|
|
191
|
+
return exitCode;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
process.stdout.write = stdoutWrite;
|
|
195
|
+
process.stderr.write = stderrWrite;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-warning.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/update-warning.ts"],"names":[],"mappings":"AAwBA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { warnMessage } from "../output.js";
|
|
2
|
+
import { fetchLatestNpmVersion, readUpdateCheckCache, resolveUpdateCheckCachePath, shouldCheckNow, UPDATE_CHECK_SCHEMA_VERSION, UPDATE_CHECK_TIMEOUT_MS, UPDATE_CHECK_TTL_MS, writeUpdateCheckCache, } from "../update-check.js";
|
|
3
|
+
import { resolveAgentplaneHome } from "./error-guidance.js";
|
|
4
|
+
import { compareVersions } from "../../shared/version-compare.js";
|
|
5
|
+
const UPDATE_CHECK_PACKAGE = "agentplane";
|
|
6
|
+
const UPDATE_CHECK_URL = `https://registry.npmjs.org/${UPDATE_CHECK_PACKAGE}/latest`;
|
|
7
|
+
function isTruthyEnv(value) {
|
|
8
|
+
if (!value)
|
|
9
|
+
return false;
|
|
10
|
+
const normalized = value.trim().toLowerCase();
|
|
11
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
|
|
12
|
+
}
|
|
13
|
+
export async function maybeWarnOnUpdate(opts) {
|
|
14
|
+
if (opts.skip || opts.jsonErrors)
|
|
15
|
+
return;
|
|
16
|
+
if (isTruthyEnv(process.env.AGENTPLANE_NO_UPDATE_CHECK))
|
|
17
|
+
return;
|
|
18
|
+
const now = new Date();
|
|
19
|
+
const cachePath = resolveUpdateCheckCachePath(resolveAgentplaneHome());
|
|
20
|
+
const cache = await readUpdateCheckCache(cachePath);
|
|
21
|
+
if (cache && !shouldCheckNow(cache.checked_at, now, UPDATE_CHECK_TTL_MS)) {
|
|
22
|
+
if (cache.status === "ok" &&
|
|
23
|
+
cache.latest_version &&
|
|
24
|
+
compareVersions(cache.latest_version, opts.currentVersion) > 0) {
|
|
25
|
+
const message = `Update available: ${UPDATE_CHECK_PACKAGE} ${opts.currentVersion} → ${cache.latest_version}. Run: npm i -g ${UPDATE_CHECK_PACKAGE}@latest`;
|
|
26
|
+
process.stderr.write(`${warnMessage(message)}\n`);
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const result = await fetchLatestNpmVersion({
|
|
31
|
+
url: UPDATE_CHECK_URL,
|
|
32
|
+
timeoutMs: UPDATE_CHECK_TIMEOUT_MS,
|
|
33
|
+
etag: cache?.etag ?? null,
|
|
34
|
+
});
|
|
35
|
+
const nextCache = {
|
|
36
|
+
schema_version: UPDATE_CHECK_SCHEMA_VERSION,
|
|
37
|
+
checked_at: now.toISOString(),
|
|
38
|
+
latest_version: cache?.latest_version ?? null,
|
|
39
|
+
etag: cache?.etag ?? null,
|
|
40
|
+
status: "error",
|
|
41
|
+
};
|
|
42
|
+
if (result.status === "ok") {
|
|
43
|
+
nextCache.status = "ok";
|
|
44
|
+
nextCache.latest_version = result.latestVersion;
|
|
45
|
+
nextCache.etag = result.etag;
|
|
46
|
+
}
|
|
47
|
+
else if (result.status === "not_modified") {
|
|
48
|
+
nextCache.status = "not_modified";
|
|
49
|
+
nextCache.etag = result.etag ?? nextCache.etag;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await writeUpdateCheckCache(cachePath, nextCache);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Best-effort cache: ignore write failures.
|
|
56
|
+
}
|
|
57
|
+
const latest = result.status === "ok" ? result.latestVersion : nextCache.latest_version;
|
|
58
|
+
if (!latest || result.status === "error")
|
|
59
|
+
return;
|
|
60
|
+
if (compareVersions(latest, opts.currentVersion) <= 0)
|
|
61
|
+
return;
|
|
62
|
+
const message = `Update available: ${UPDATE_CHECK_PACKAGE} ${opts.currentVersion} → ${latest}. Run: npm i -g ${UPDATE_CHECK_PACKAGE}@latest`;
|
|
63
|
+
process.stderr.write(`${warnMessage(message)}\n`);
|
|
64
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.ts"],"names":[],"mappings":"AAqDA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6N5D"}
|