agentplane 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/agents/agents-template.d.ts.map +1 -0
  2. package/dist/{agents-template.js → agents/agents-template.js} +2 -2
  3. package/dist/{task-backend.d.ts → backends/task-backend.d.ts} +5 -3
  4. package/dist/backends/task-backend.d.ts.map +1 -0
  5. package/dist/{task-backend.js → backends/task-backend.js} +102 -268
  6. package/dist/backends/task-index.d.ts +16 -0
  7. package/dist/backends/task-index.d.ts.map +1 -0
  8. package/dist/backends/task-index.js +84 -0
  9. package/dist/cli/archive.d.ts +16 -0
  10. package/dist/cli/archive.d.ts.map +1 -0
  11. package/dist/cli/archive.js +149 -0
  12. package/dist/cli/checksum.d.ts +3 -0
  13. package/dist/cli/checksum.d.ts.map +1 -0
  14. package/dist/cli/checksum.js +12 -0
  15. package/dist/cli/command-guide.d.ts.map +1 -0
  16. package/dist/cli/error-map.d.ts +4 -0
  17. package/dist/cli/error-map.d.ts.map +1 -0
  18. package/dist/cli/error-map.js +42 -0
  19. package/dist/cli/exit-codes.d.ts +3 -0
  20. package/dist/cli/exit-codes.d.ts.map +1 -0
  21. package/dist/cli/exit-codes.js +12 -0
  22. package/dist/cli/help.d.ts.map +1 -0
  23. package/dist/{help.js → cli/help.js} +1 -1
  24. package/dist/cli/http.d.ts +4 -0
  25. package/dist/cli/http.d.ts.map +1 -0
  26. package/dist/cli/http.js +95 -0
  27. package/dist/cli/output.d.ts +16 -0
  28. package/dist/cli/output.d.ts.map +1 -0
  29. package/dist/cli/output.js +47 -0
  30. package/dist/cli/recipes-bundled.js +2 -2
  31. package/dist/cli/run-cli.d.ts.map +1 -0
  32. package/dist/cli/run-cli.js +2681 -0
  33. package/dist/{run-cli.test-helpers.d.ts → cli/run-cli.test-helpers.d.ts} +6 -0
  34. package/dist/cli/run-cli.test-helpers.d.ts.map +1 -0
  35. package/dist/{run-cli.test-helpers.js → cli/run-cli.test-helpers.js} +67 -0
  36. package/dist/cli/update-check.d.ts +31 -0
  37. package/dist/cli/update-check.d.ts.map +1 -0
  38. package/dist/cli/update-check.js +86 -0
  39. package/dist/cli.js +1 -1
  40. package/dist/commands/backend.d.ts +15 -0
  41. package/dist/commands/backend.d.ts.map +1 -0
  42. package/dist/commands/backend.js +211 -0
  43. package/dist/commands/recipes.d.ts +13 -0
  44. package/dist/commands/recipes.d.ts.map +1 -0
  45. package/dist/commands/recipes.js +1919 -0
  46. package/dist/commands/upgrade.d.ts +6 -0
  47. package/dist/commands/upgrade.d.ts.map +1 -0
  48. package/dist/commands/upgrade.js +291 -0
  49. package/dist/commands/workflow.d.ts +367 -0
  50. package/dist/commands/workflow.d.ts.map +1 -0
  51. package/dist/commands/workflow.js +4619 -0
  52. package/dist/meta/version.d.ts.map +1 -0
  53. package/dist/meta/version.js +20 -0
  54. package/dist/recipes/bundled-recipes.d.ts.map +1 -0
  55. package/dist/shared/comment-format.d.ts.map +1 -0
  56. package/dist/shared/env.d.ts.map +1 -0
  57. package/dist/{errors.d.ts → shared/errors.d.ts} +1 -3
  58. package/dist/shared/errors.d.ts.map +1 -0
  59. package/dist/{errors.js → shared/errors.js} +1 -3
  60. package/package.json +6 -2
  61. package/dist/agents-template.d.ts.map +0 -1
  62. package/dist/bundled-recipes.d.ts.map +0 -1
  63. package/dist/command-guide.d.ts.map +0 -1
  64. package/dist/comment-format.d.ts.map +0 -1
  65. package/dist/env.d.ts.map +0 -1
  66. package/dist/errors.d.ts.map +0 -1
  67. package/dist/help.d.ts.map +0 -1
  68. package/dist/run-cli.d.ts.map +0 -1
  69. package/dist/run-cli.js +0 -9454
  70. package/dist/run-cli.test-helpers.d.ts.map +0 -1
  71. package/dist/task-backend.d.ts.map +0 -1
  72. package/dist/version.d.ts.map +0 -1
  73. package/dist/version.js +0 -3
  74. /package/dist/{agents-template.d.ts → agents/agents-template.d.ts} +0 -0
  75. /package/dist/{command-guide.d.ts → cli/command-guide.d.ts} +0 -0
  76. /package/dist/{command-guide.js → cli/command-guide.js} +0 -0
  77. /package/dist/{help.d.ts → cli/help.d.ts} +0 -0
  78. /package/dist/{run-cli.d.ts → cli/run-cli.d.ts} +0 -0
  79. /package/dist/{version.d.ts → meta/version.d.ts} +0 -0
  80. /package/dist/{bundled-recipes.d.ts → recipes/bundled-recipes.d.ts} +0 -0
  81. /package/dist/{bundled-recipes.js → recipes/bundled-recipes.js} +0 -0
  82. /package/dist/{comment-format.d.ts → shared/comment-format.d.ts} +0 -0
  83. /package/dist/{comment-format.js → shared/comment-format.js} +0 -0
  84. /package/dist/{env.d.ts → shared/env.d.ts} +0 -0
  85. /package/dist/{env.js → shared/env.js} +0 -0
@@ -6,6 +6,8 @@ export declare function captureStdIO(): {
6
6
  readonly stderr: string;
7
7
  restore(): void;
8
8
  };
9
+ export declare function silenceStdIO(): () => void;
10
+ export declare function runCliSilent(args: string[]): Promise<number>;
9
11
  export declare function mkGitRepoRoot(): Promise<string>;
10
12
  export declare function mkTempDir(): Promise<string>;
11
13
  export declare function writeDefaultConfig(root: string): Promise<void>;
@@ -30,6 +32,10 @@ export declare function createRecipeArchiveWithManifest(opts: {
30
32
  format?: "tar" | "zip";
31
33
  wrapDir?: boolean;
32
34
  }): Promise<string>;
35
+ export declare function createUnsafeRecipeArchive(opts: {
36
+ format: "tar" | "zip";
37
+ entryPath?: string;
38
+ }): Promise<string>;
33
39
  export declare function createUpgradeBundle(files: Record<string, string>): Promise<{
34
40
  bundlePath: string;
35
41
  checksumPath: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.test-helpers.d.ts","sourceRoot":"","sources":["../../src/cli/run-cli.test-helpers.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAuCpD,wBAAgB,sBAAsB,IAAI,IAAI,CAsB7C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,YAAY;;;;EAgC3B;AAED,wBAAgB,YAAY,IAAI,MAAM,IAAI,CAkBzC;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAKrD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAEjD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CAKhE;AAED,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CA+FtE;AAED,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlB;AAED,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+ClB;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAiBD;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI7E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED,wBAAgB,WAAW,IAAI,MAAM,CAAC,UAAU,CAS/C;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpF;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
@@ -6,10 +6,14 @@ import path from "node:path";
6
6
  import { promisify } from "node:util";
7
7
  import { afterAll, beforeAll } from "vitest";
8
8
  import { defaultConfig } from "@agentplaneorg/core";
9
+ import { runCli } from "./run-cli.js";
9
10
  const execFileAsync = promisify(execFile);
10
11
  let agentplaneHome = null;
11
12
  const originalAgentplaneHome = process.env.AGENTPLANE_HOME;
12
13
  const originalNoUpdateCheck = process.env.AGENTPLANE_NO_UPDATE_CHECK;
14
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
15
+ const originalStderrWrite = process.stderr.write.bind(process.stderr);
16
+ let stdioSilenceDepth = 0;
13
17
  const recipeArchiveCache = new Map();
14
18
  let gitTemplateRoot = null;
15
19
  let gitTemplatePromise = null;
@@ -85,6 +89,34 @@ export function captureStdIO() {
85
89
  },
86
90
  };
87
91
  }
92
+ export function silenceStdIO() {
93
+ if (stdioSilenceDepth === 0) {
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ process.stdout.write = () => true;
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ process.stderr.write = () => true;
98
+ }
99
+ stdioSilenceDepth += 1;
100
+ return () => {
101
+ stdioSilenceDepth -= 1;
102
+ if (stdioSilenceDepth <= 0) {
103
+ stdioSilenceDepth = 0;
104
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
105
+ process.stdout.write = originalStdoutWrite;
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ process.stderr.write = originalStderrWrite;
108
+ }
109
+ };
110
+ }
111
+ export async function runCliSilent(args) {
112
+ const io = captureStdIO();
113
+ try {
114
+ return await runCli(args);
115
+ }
116
+ finally {
117
+ io.restore();
118
+ }
119
+ }
88
120
  export async function mkGitRepoRoot() {
89
121
  const template = await ensureGitTemplateRoot();
90
122
  const root = await mkdtemp(path.join(os.tmpdir(), "agentplane-cli-test-"));
@@ -215,6 +247,41 @@ export async function createRecipeArchiveWithManifest(opts) {
215
247
  }
216
248
  return archivePath;
217
249
  }
250
+ export async function createUnsafeRecipeArchive(opts) {
251
+ const baseDir = await mkdtemp(path.join(os.tmpdir(), "agentplane-recipe-unsafe-"));
252
+ const recipeDir = path.join(baseDir, "recipe");
253
+ await mkdir(recipeDir, { recursive: true });
254
+ const manifest = {
255
+ schema_version: "1",
256
+ id: "unsafe",
257
+ version: "0.0.1",
258
+ name: "Unsafe",
259
+ summary: "Unsafe recipe",
260
+ description: "Used for archive validation tests.",
261
+ agents: [{ id: "RECIPE_AGENT", summary: "Recipe agent", file: "agents/recipe.json" }],
262
+ tools: [
263
+ { id: "RECIPE_TOOL", summary: "Recipe tool", runtime: "bash", entrypoint: "tools/run.sh" },
264
+ ],
265
+ scenarios: [{ id: "RECIPE_SCENARIO", summary: "Recipe scenario" }],
266
+ };
267
+ await writeFile(path.join(recipeDir, "manifest.json"), JSON.stringify(manifest, null, 2), "utf8");
268
+ const agentsDir = path.join(recipeDir, "agents");
269
+ await mkdir(agentsDir, { recursive: true });
270
+ await writeFile(path.join(agentsDir, "recipe.json"), JSON.stringify({ id: "RECIPE_AGENT", role: "Recipe agent" }, null, 2), "utf8");
271
+ const toolsDir = path.join(recipeDir, "tools");
272
+ await mkdir(toolsDir, { recursive: true });
273
+ await writeFile(path.join(toolsDir, "run.sh"), "#!/usr/bin/env bash\n", "utf8");
274
+ const scenariosDir = path.join(recipeDir, "scenarios");
275
+ await mkdir(scenariosDir, { recursive: true });
276
+ await writeFile(path.join(scenariosDir, "recipe-scenario.json"), JSON.stringify({ schema_version: "1", id: "RECIPE_SCENARIO", summary: "Recipe scenario" }, null, 2), "utf8");
277
+ const entryPath = opts.entryPath ?? "../evil.txt";
278
+ await writeFile(path.join(baseDir, "evil.txt"), "evil", "utf8");
279
+ const archivePath = opts.format === "zip" ? path.join(baseDir, "unsafe.zip") : path.join(baseDir, "unsafe.tar.gz");
280
+ await (opts.format === "zip"
281
+ ? execFileAsync("zip", ["-qr", archivePath, ".", entryPath], { cwd: recipeDir })
282
+ : execFileAsync("tar", ["-czf", archivePath, "-C", recipeDir, ".", entryPath]));
283
+ return archivePath;
284
+ }
218
285
  export async function createUpgradeBundle(files) {
219
286
  const baseDir = await mkdtemp(path.join(os.tmpdir(), "agentplane-upgrade-bundle-"));
220
287
  const bundleDir = path.join(baseDir, "bundle");
@@ -0,0 +1,31 @@
1
+ export declare const UPDATE_CHECK_SCHEMA_VERSION: 1;
2
+ export declare const UPDATE_CHECK_TTL_MS: number;
3
+ export declare const UPDATE_CHECK_TIMEOUT_MS = 1500;
4
+ export type UpdateCheckStatus = "ok" | "error" | "not_modified";
5
+ export type UpdateCheckCache = {
6
+ schema_version: typeof UPDATE_CHECK_SCHEMA_VERSION;
7
+ checked_at: string;
8
+ latest_version: string | null;
9
+ etag: string | null;
10
+ status: UpdateCheckStatus;
11
+ };
12
+ export type UpdateCheckFetchResult = {
13
+ status: "ok";
14
+ latestVersion: string;
15
+ etag: string | null;
16
+ } | {
17
+ status: "not_modified";
18
+ etag: string | null;
19
+ } | {
20
+ status: "error";
21
+ };
22
+ export declare function resolveUpdateCheckCachePath(agentplaneHome: string): string;
23
+ export declare function shouldCheckNow(checkedAt: string | null | undefined, now: Date, ttlMs: number): boolean;
24
+ export declare function readUpdateCheckCache(filePath: string): Promise<UpdateCheckCache | null>;
25
+ export declare function writeUpdateCheckCache(filePath: string, cache: UpdateCheckCache): Promise<void>;
26
+ export declare function fetchLatestNpmVersion(opts: {
27
+ url: string;
28
+ timeoutMs: number;
29
+ etag?: string | null;
30
+ }): Promise<UpdateCheckFetchResult>;
31
+ //# sourceMappingURL=update-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/cli/update-check.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,EAAG,CAAU,CAAC;AACtD,eAAO,MAAM,mBAAmB,QAAsB,CAAC;AACvD,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,GAAG,cAAc,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,OAAO,2BAA2B,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAIF,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC5D;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAExB,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,GACZ,OAAO,CAKT;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAU7F;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAsBlC"}
@@ -0,0 +1,86 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ export const UPDATE_CHECK_SCHEMA_VERSION = 1;
5
+ export const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;
6
+ export const UPDATE_CHECK_TIMEOUT_MS = 1500;
7
+ export function resolveUpdateCheckCachePath(agentplaneHome) {
8
+ return path.join(agentplaneHome, "cache", "update-check.json");
9
+ }
10
+ export function shouldCheckNow(checkedAt, now, ttlMs) {
11
+ if (!checkedAt)
12
+ return true;
13
+ const timestamp = Date.parse(checkedAt);
14
+ if (!Number.isFinite(timestamp))
15
+ return true;
16
+ return now.getTime() - timestamp >= ttlMs;
17
+ }
18
+ export async function readUpdateCheckCache(filePath) {
19
+ try {
20
+ const raw = await readFile(filePath, "utf8");
21
+ const parsed = JSON.parse(raw);
22
+ return coerceCache(parsed);
23
+ }
24
+ catch (err) {
25
+ const code = err?.code;
26
+ if (code === "ENOENT")
27
+ return null;
28
+ return null;
29
+ }
30
+ }
31
+ export async function writeUpdateCheckCache(filePath, cache) {
32
+ const dir = path.dirname(filePath);
33
+ await mkdir(dir, { recursive: true });
34
+ const tmpName = `.update-check.${process.pid}.${randomBytes(6).toString("hex")}.tmp`;
35
+ const tmpPath = path.join(dir, tmpName);
36
+ const payload = JSON.stringify(cache, null, 2);
37
+ await writeFile(tmpPath, payload, "utf8");
38
+ await rename(tmpPath, filePath);
39
+ }
40
+ export async function fetchLatestNpmVersion(opts) {
41
+ const controller = new AbortController();
42
+ const timeout = setTimeout(() => controller.abort(), opts.timeoutMs);
43
+ try {
44
+ const headers = { "User-Agent": "agentplane" };
45
+ if (opts.etag)
46
+ headers["If-None-Match"] = opts.etag;
47
+ const res = await fetch(opts.url, { headers, signal: controller.signal });
48
+ const responseEtag = res.headers.get("etag");
49
+ const normalizedEtag = responseEtag && responseEtag.trim().length > 0 ? responseEtag : null;
50
+ if (res.status === 304) {
51
+ return { status: "not_modified", etag: normalizedEtag ?? opts.etag ?? null };
52
+ }
53
+ if (!res.ok)
54
+ return { status: "error" };
55
+ const data = (await res.json());
56
+ const version = typeof data.version === "string" ? data.version.trim() : "";
57
+ if (!version)
58
+ return { status: "error" };
59
+ return { status: "ok", latestVersion: version, etag: normalizedEtag };
60
+ }
61
+ catch {
62
+ return { status: "error" };
63
+ }
64
+ finally {
65
+ clearTimeout(timeout);
66
+ }
67
+ }
68
+ function coerceCache(raw) {
69
+ if (raw.schema_version !== UPDATE_CHECK_SCHEMA_VERSION)
70
+ return null;
71
+ const checkedAt = typeof raw.checked_at === "string" ? raw.checked_at : null;
72
+ if (!checkedAt)
73
+ return null;
74
+ const status = raw.status;
75
+ if (status !== "ok" && status !== "error" && status !== "not_modified")
76
+ return null;
77
+ const latestVersion = typeof raw.latest_version === "string" ? raw.latest_version : null;
78
+ const etag = typeof raw.etag === "string" ? raw.etag : null;
79
+ return {
80
+ schema_version: UPDATE_CHECK_SCHEMA_VERSION,
81
+ checked_at: checkedAt,
82
+ latest_version: latestVersion,
83
+ etag,
84
+ status,
85
+ };
86
+ }
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { runCli } from "./run-cli.js";
2
+ import { runCli } from "./cli/run-cli.js";
3
3
  void runCli(process.argv.slice(2)).then((code) => {
4
4
  process.exit(code);
5
5
  });
@@ -0,0 +1,15 @@
1
+ export declare const BACKEND_SYNC_USAGE = "Usage: agentplane backend sync <id> --direction <push|pull> [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
2
+ export declare const BACKEND_SYNC_USAGE_EXAMPLE = "agentplane backend sync local --direction pull";
3
+ export declare const SYNC_USAGE = "Usage: agentplane sync [<id>] [--direction <push|pull>] [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
4
+ export declare const SYNC_USAGE_EXAMPLE = "agentplane sync --direction push --yes";
5
+ export declare function cmdBackendSync(opts: {
6
+ cwd: string;
7
+ rootOverride?: string;
8
+ args: string[];
9
+ }): Promise<number>;
10
+ export declare function cmdSync(opts: {
11
+ cwd: string;
12
+ rootOverride?: string;
13
+ args: string[];
14
+ }): Promise<number>;
15
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/commands/backend.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,sIACsG,CAAC;AACtI,eAAO,MAAM,0BAA0B,mDAAmD,CAAC;AAC3F,eAAO,MAAM,UAAU,kIAC0G,CAAC;AAClI,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AA8J3E,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClB"}
@@ -0,0 +1,211 @@
1
+ import { backendNotSupportedMessage, usageMessage } from "../cli/output.js";
2
+ import { mapBackendError } from "../cli/error-map.js";
3
+ import { CliError } from "../shared/errors.js";
4
+ import { loadTaskBackend } from "../backends/task-backend.js";
5
+ export const BACKEND_SYNC_USAGE = "Usage: agentplane backend sync <id> --direction <push|pull> [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
6
+ export const BACKEND_SYNC_USAGE_EXAMPLE = "agentplane backend sync local --direction pull";
7
+ export const SYNC_USAGE = "Usage: agentplane sync [<id>] [--direction <push|pull>] [--conflict <diff|prefer-local|prefer-remote|fail>] [--yes] [--quiet]";
8
+ export const SYNC_USAGE_EXAMPLE = "agentplane sync --direction push --yes";
9
+ function parseBackendSyncArgs(args) {
10
+ let backendId = "";
11
+ let direction = null;
12
+ let conflict = "diff";
13
+ let confirm = false;
14
+ let quiet = false;
15
+ for (let i = 0; i < args.length; i++) {
16
+ const arg = args[i];
17
+ if (!arg)
18
+ continue;
19
+ if (!arg.startsWith("--")) {
20
+ if (backendId) {
21
+ throw new CliError({
22
+ exitCode: 2,
23
+ code: "E_USAGE",
24
+ message: usageMessage(BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE),
25
+ });
26
+ }
27
+ backendId = arg;
28
+ continue;
29
+ }
30
+ if (arg === "--direction") {
31
+ const next = args[i + 1];
32
+ if (!next || (next !== "push" && next !== "pull")) {
33
+ throw new CliError({
34
+ exitCode: 2,
35
+ code: "E_USAGE",
36
+ message: usageMessage(BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE),
37
+ });
38
+ }
39
+ direction = next;
40
+ i++;
41
+ continue;
42
+ }
43
+ if (arg === "--conflict") {
44
+ const next = args[i + 1];
45
+ if (!next || !["diff", "prefer-local", "prefer-remote", "fail"].includes(next)) {
46
+ throw new CliError({
47
+ exitCode: 2,
48
+ code: "E_USAGE",
49
+ message: usageMessage(BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE),
50
+ });
51
+ }
52
+ conflict = next;
53
+ i++;
54
+ continue;
55
+ }
56
+ if (arg === "--yes") {
57
+ confirm = true;
58
+ continue;
59
+ }
60
+ if (arg === "--quiet") {
61
+ quiet = true;
62
+ continue;
63
+ }
64
+ throw new CliError({
65
+ exitCode: 2,
66
+ code: "E_USAGE",
67
+ message: usageMessage(BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE),
68
+ });
69
+ }
70
+ if (!backendId || !direction) {
71
+ throw new CliError({
72
+ exitCode: 2,
73
+ code: "E_USAGE",
74
+ message: usageMessage(BACKEND_SYNC_USAGE, BACKEND_SYNC_USAGE_EXAMPLE),
75
+ });
76
+ }
77
+ return { backendId, direction, conflict, confirm, quiet };
78
+ }
79
+ function parseSyncArgs(args) {
80
+ let backendId = null;
81
+ let direction = "push";
82
+ let conflict = "diff";
83
+ let confirm = false;
84
+ let quiet = false;
85
+ for (let i = 0; i < args.length; i++) {
86
+ const arg = args[i];
87
+ if (!arg)
88
+ continue;
89
+ if (!arg.startsWith("--")) {
90
+ if (backendId) {
91
+ throw new CliError({
92
+ exitCode: 2,
93
+ code: "E_USAGE",
94
+ message: usageMessage(SYNC_USAGE, SYNC_USAGE_EXAMPLE),
95
+ });
96
+ }
97
+ backendId = arg;
98
+ continue;
99
+ }
100
+ if (arg === "--direction") {
101
+ const next = args[i + 1];
102
+ if (!next || (next !== "push" && next !== "pull")) {
103
+ throw new CliError({
104
+ exitCode: 2,
105
+ code: "E_USAGE",
106
+ message: usageMessage(SYNC_USAGE, SYNC_USAGE_EXAMPLE),
107
+ });
108
+ }
109
+ direction = next;
110
+ i++;
111
+ continue;
112
+ }
113
+ if (arg === "--conflict") {
114
+ const next = args[i + 1];
115
+ if (!next || !["diff", "prefer-local", "prefer-remote", "fail"].includes(next)) {
116
+ throw new CliError({
117
+ exitCode: 2,
118
+ code: "E_USAGE",
119
+ message: usageMessage(SYNC_USAGE, SYNC_USAGE_EXAMPLE),
120
+ });
121
+ }
122
+ conflict = next;
123
+ i++;
124
+ continue;
125
+ }
126
+ if (arg === "--yes") {
127
+ confirm = true;
128
+ continue;
129
+ }
130
+ if (arg === "--quiet") {
131
+ quiet = true;
132
+ continue;
133
+ }
134
+ throw new CliError({
135
+ exitCode: 2,
136
+ code: "E_USAGE",
137
+ message: usageMessage(SYNC_USAGE, SYNC_USAGE_EXAMPLE),
138
+ });
139
+ }
140
+ return { backendId, direction, conflict, confirm, quiet };
141
+ }
142
+ export async function cmdBackendSync(opts) {
143
+ const flags = parseBackendSyncArgs(opts.args);
144
+ try {
145
+ const { backend, backendId } = await loadTaskBackend({
146
+ cwd: opts.cwd,
147
+ rootOverride: opts.rootOverride ?? null,
148
+ });
149
+ if (flags.backendId && backendId && flags.backendId !== backendId) {
150
+ throw new CliError({
151
+ exitCode: 2,
152
+ code: "E_USAGE",
153
+ message: `Configured backend is "${backendId}", not "${flags.backendId}"`,
154
+ });
155
+ }
156
+ if (!backend.sync) {
157
+ throw new CliError({
158
+ exitCode: 2,
159
+ code: "E_USAGE",
160
+ message: backendNotSupportedMessage("sync()"),
161
+ });
162
+ }
163
+ await backend.sync({
164
+ direction: flags.direction,
165
+ conflict: flags.conflict,
166
+ quiet: flags.quiet,
167
+ confirm: flags.confirm,
168
+ });
169
+ return 0;
170
+ }
171
+ catch (err) {
172
+ if (err instanceof CliError)
173
+ throw err;
174
+ throw mapBackendError(err, { command: "backend sync", root: opts.rootOverride ?? null });
175
+ }
176
+ }
177
+ export async function cmdSync(opts) {
178
+ const flags = parseSyncArgs(opts.args);
179
+ try {
180
+ const { backend, backendId } = await loadTaskBackend({
181
+ cwd: opts.cwd,
182
+ rootOverride: opts.rootOverride ?? null,
183
+ });
184
+ if (flags.backendId && backendId && flags.backendId !== backendId) {
185
+ throw new CliError({
186
+ exitCode: 2,
187
+ code: "E_USAGE",
188
+ message: `Configured backend is "${backendId}", not "${flags.backendId}"`,
189
+ });
190
+ }
191
+ if (!backend.sync) {
192
+ throw new CliError({
193
+ exitCode: 2,
194
+ code: "E_USAGE",
195
+ message: backendNotSupportedMessage("sync()"),
196
+ });
197
+ }
198
+ await backend.sync({
199
+ direction: flags.direction,
200
+ conflict: flags.conflict,
201
+ quiet: flags.quiet,
202
+ confirm: flags.confirm,
203
+ });
204
+ return 0;
205
+ }
206
+ catch (err) {
207
+ if (err instanceof CliError)
208
+ throw err;
209
+ throw mapBackendError(err, { command: "sync", root: opts.rootOverride ?? null });
210
+ }
211
+ }
@@ -0,0 +1,13 @@
1
+ export declare function cmdRecipes(opts: {
2
+ cwd: string;
3
+ rootOverride?: string;
4
+ command?: string;
5
+ args: string[];
6
+ }): Promise<number>;
7
+ export declare function cmdScenario(opts: {
8
+ cwd: string;
9
+ rootOverride?: string;
10
+ command?: string;
11
+ args: string[];
12
+ }): Promise<number>;
13
+ //# sourceMappingURL=recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/commands/recipes.ts"],"names":[],"mappings":"AA2kEA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwGlB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDlB"}