agentplane 0.3.16 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-manifest.json +159 -54
- package/dist/backends/task-backend/redmine/backend-runtime.d.ts +4 -146
- package/dist/backends/task-backend/redmine/backend-runtime.d.ts.map +1 -1
- package/dist/backends/task-backend/redmine/backend-runtime.js +4 -258
- package/dist/backends/task-backend/redmine/mapping.js +1 -1
- package/dist/backends/task-backend/redmine/runtime-context.d.ts +98 -0
- package/dist/backends/task-backend/redmine/runtime-context.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-context.js +57 -0
- package/dist/backends/task-backend/redmine/runtime-methods.d.ts +33 -0
- package/dist/backends/task-backend/redmine/runtime-methods.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-methods.js +86 -0
- package/dist/backends/task-backend/redmine/runtime-operations.d.ts +19 -0
- package/dist/backends/task-backend/redmine/runtime-operations.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-operations.js +83 -0
- package/dist/backends/task-backend/redmine/runtime-state.d.ts +10 -0
- package/dist/backends/task-backend/redmine/runtime-state.d.ts.map +1 -0
- package/dist/backends/task-backend/redmine/runtime-state.js +45 -0
- package/dist/backends/task-backend/shared/constants.d.ts +1 -1
- package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
- package/dist/backends/task-backend/shared/constants.js +1 -1
- package/dist/backends/task-index.d.ts +0 -4
- package/dist/backends/task-index.d.ts.map +1 -1
- package/dist/backends/task-index.js +0 -33
- package/dist/cli/exit-codes.d.ts.map +1 -1
- package/dist/cli/exit-codes.js +1 -0
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +34 -15
- package/dist/cli/run-cli/command-loaders.d.ts +1 -5
- package/dist/cli/run-cli/command-loaders.d.ts.map +1 -1
- package/dist/cli/spec/errors.d.ts +5 -0
- package/dist/cli/spec/errors.d.ts.map +1 -1
- package/dist/cli/spec/errors.js +14 -1
- package/dist/cli/spec/parse.d.ts.map +1 -1
- package/dist/cli/spec/parse.js +8 -1
- package/dist/commands/branch/work-start.d.ts.map +1 -1
- package/dist/commands/branch/work-start.direct.d.ts +13 -0
- package/dist/commands/branch/work-start.direct.d.ts.map +1 -0
- package/dist/commands/branch/work-start.direct.js +75 -0
- package/dist/commands/branch/work-start.git.d.ts +3 -0
- package/dist/commands/branch/work-start.git.d.ts.map +1 -0
- package/dist/commands/branch/work-start.git.js +19 -0
- package/dist/commands/branch/work-start.hook-shim.d.ts +2 -0
- package/dist/commands/branch/work-start.hook-shim.d.ts.map +1 -0
- package/dist/commands/branch/work-start.hook-shim.js +38 -0
- package/dist/commands/branch/work-start.js +6 -235
- package/dist/commands/branch/work-start.materialize.d.ts +16 -0
- package/dist/commands/branch/work-start.materialize.d.ts.map +1 -0
- package/dist/commands/branch/work-start.materialize.js +110 -0
- package/dist/commands/doctor/fixes.d.ts +0 -5
- package/dist/commands/doctor/fixes.d.ts.map +1 -1
- package/dist/commands/doctor/fixes.js +0 -70
- package/dist/commands/doctor/workflow.d.ts.map +1 -1
- package/dist/commands/doctor/workflow.js +2 -23
- package/dist/commands/doctor.run.d.ts.map +1 -1
- package/dist/commands/doctor.run.js +1 -3
- package/dist/commands/hooks/index.d.ts +4 -20
- package/dist/commands/hooks/index.d.ts.map +1 -1
- package/dist/commands/hooks/index.js +4 -432
- package/dist/commands/hooks/install.d.ts +11 -0
- package/dist/commands/hooks/install.d.ts.map +1 -0
- package/dist/commands/hooks/install.js +136 -0
- package/dist/commands/hooks/run.commit-msg.d.ts +3 -0
- package/dist/commands/hooks/run.commit-msg.d.ts.map +1 -0
- package/dist/commands/hooks/run.commit-msg.js +67 -0
- package/dist/commands/hooks/run.d.ts +9 -0
- package/dist/commands/hooks/run.d.ts.map +1 -0
- package/dist/commands/hooks/run.js +45 -0
- package/dist/commands/hooks/run.post-merge.d.ts +3 -0
- package/dist/commands/hooks/run.post-merge.d.ts.map +1 -0
- package/dist/commands/hooks/run.post-merge.js +44 -0
- package/dist/commands/hooks/run.pre-commit.d.ts +3 -0
- package/dist/commands/hooks/run.pre-commit.d.ts.map +1 -0
- package/dist/commands/hooks/run.pre-commit.js +48 -0
- package/dist/commands/hooks/run.pre-push.d.ts +6 -0
- package/dist/commands/hooks/run.pre-push.d.ts.map +1 -0
- package/dist/commands/hooks/run.pre-push.js +88 -0
- package/dist/commands/hooks/shared.d.ts +7 -0
- package/dist/commands/hooks/shared.d.ts.map +1 -0
- package/dist/commands/hooks/shared.js +41 -0
- package/dist/commands/recipes/impl/index.d.ts.map +1 -1
- package/dist/commands/recipes/impl/index.js +13 -3
- package/dist/commands/task/hosted-close-pr.command.d.ts +2 -7
- package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
- package/dist/commands/task/hosted-close-pr.command.js +9 -373
- package/dist/commands/task/hosted-close-pr.execute.d.ts +3 -0
- package/dist/commands/task/hosted-close-pr.execute.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.execute.js +135 -0
- package/dist/commands/task/hosted-close-pr.postcheck.d.ts +3 -0
- package/dist/commands/task/hosted-close-pr.postcheck.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.postcheck.js +13 -0
- package/dist/commands/task/hosted-close-pr.precheck.d.ts +4 -0
- package/dist/commands/task/hosted-close-pr.precheck.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.precheck.js +288 -0
- package/dist/commands/task/hosted-close-pr.report.d.ts +4 -0
- package/dist/commands/task/hosted-close-pr.report.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.report.js +42 -0
- package/dist/commands/task/hosted-close-pr.types.d.ts +75 -0
- package/dist/commands/task/hosted-close-pr.types.d.ts.map +1 -0
- package/dist/commands/task/hosted-close-pr.types.js +1 -0
- package/dist/commands/upgrade/materialize.d.ts.map +1 -1
- package/dist/commands/upgrade/materialize.js +0 -7
- package/dist/commands/upgrade/source.d.ts +0 -1
- package/dist/commands/upgrade/source.d.ts.map +1 -1
- package/dist/commands/upgrade/source.js +1 -9
- package/dist/runner/context/base-prompts.d.ts.map +1 -1
- package/dist/runner/context/base-prompts.js +4 -0
- package/dist/runner/context/project-skill-prompt-blocks.d.ts +5 -0
- package/dist/runner/context/project-skill-prompt-blocks.d.ts.map +1 -0
- package/dist/runner/context/project-skill-prompt-blocks.js +57 -0
- package/dist/runner/process-supervision/run.d.ts.map +1 -1
- package/dist/runner/process-supervision/run.js +61 -59
- package/dist/shared/errors.d.ts +4 -1
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +6 -0
- package/dist/shared/workflow-artifacts.d.ts.map +1 -1
- package/dist/shared/workflow-artifacts.js +1 -8
- package/dist/workflow-runtime/file-ops.d.ts.map +1 -1
- package/dist/workflow-runtime/file-ops.js +1 -20
- package/dist/workflow-runtime/paths.d.ts.map +1 -1
- package/dist/workflow-runtime/paths.js +0 -1
- package/dist/workflow-runtime/types.d.ts +0 -1
- package/dist/workflow-runtime/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { DOC_VERSION } from "../shared.js";
|
|
2
|
+
import { appendCommentNotes as appendCommentNotesImpl, normalizeComments as normalizeCommentsImpl, } from "./comments.js";
|
|
3
|
+
import { requestJson as requestRedmineJson } from "./client.js";
|
|
4
|
+
import { appendCustomField as appendRedmineCustomField, customFieldValue as redmineCustomFieldValue, } from "./fields.js";
|
|
5
|
+
import { issueToTask as issueToTaskImpl, taskToIssuePayload as taskToIssuePayloadImpl, } from "./mapping.js";
|
|
6
|
+
import { maybeParseJson as maybeParseRedmineJson } from "./parse.js";
|
|
7
|
+
import { findIssueByTaskId as findIssueByTaskIdImpl, listTasksRemote as listTasksRemoteImpl, } from "./remote.js";
|
|
8
|
+
import { diffRedmineTasks, redmineTasksDiffer } from "./backend-report.js";
|
|
9
|
+
import { redmineTaskIdFieldId } from "./runtime-state.js";
|
|
10
|
+
export async function listRedmineRemoteTasks(host) {
|
|
11
|
+
const taskFieldId = redmineTaskIdFieldId(host);
|
|
12
|
+
return await listTasksRemoteImpl({
|
|
13
|
+
projectId: host.projectId,
|
|
14
|
+
taskFieldId,
|
|
15
|
+
issueCache: host.issueCache,
|
|
16
|
+
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
17
|
+
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
18
|
+
issueToTask: (issue, taskIdOverride) => host.issueToTask(issue, taskIdOverride),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function findRedmineIssueByTaskId(host, taskId) {
|
|
22
|
+
const taskFieldId = redmineTaskIdFieldId(host);
|
|
23
|
+
return await findIssueByTaskIdImpl({
|
|
24
|
+
taskId,
|
|
25
|
+
projectId: host.projectId,
|
|
26
|
+
taskFieldId,
|
|
27
|
+
issueCache: host.issueCache,
|
|
28
|
+
requestJson: async (method, reqPath, payload, params) => await host.requestJson(method, reqPath, payload, params),
|
|
29
|
+
customFieldValue: (issue, fieldId) => host.customFieldValue(issue, fieldId),
|
|
30
|
+
refreshList: async () => {
|
|
31
|
+
await host.listTasksRemote();
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export function redmineIssueToTask(host, issue, taskIdOverride) {
|
|
36
|
+
return issueToTaskImpl({
|
|
37
|
+
issue,
|
|
38
|
+
taskIdOverride,
|
|
39
|
+
reverseStatus: host.reverseStatus,
|
|
40
|
+
customFields: host.customFields,
|
|
41
|
+
ownerAgent: host.ownerAgent,
|
|
42
|
+
defaultDocVersion: DOC_VERSION,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export function redmineTaskToIssuePayload(host, task, existingIssue) {
|
|
46
|
+
return taskToIssuePayloadImpl({
|
|
47
|
+
task,
|
|
48
|
+
existingIssue,
|
|
49
|
+
statusMap: host.statusMap,
|
|
50
|
+
assigneeId: host.assigneeId,
|
|
51
|
+
customFields: host.customFields,
|
|
52
|
+
appendCustomField: (fields, key, value) => appendRedmineBackendCustomField(host, fields, key, value),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function appendRedmineBackendCustomField(host, fields, key, value) {
|
|
56
|
+
appendRedmineCustomField({ customFields: host.customFields, fields, key, value });
|
|
57
|
+
}
|
|
58
|
+
export function normalizeRedmineBackendComments(value) {
|
|
59
|
+
return normalizeCommentsImpl(value);
|
|
60
|
+
}
|
|
61
|
+
export async function appendRedmineBackendCommentNotes(host, issueId, existingComments, desiredComments) {
|
|
62
|
+
await appendCommentNotesImpl({
|
|
63
|
+
issueId,
|
|
64
|
+
existingComments,
|
|
65
|
+
desiredComments,
|
|
66
|
+
requestJson: async (method, reqPath, payload, params) => await requestRedmineBackendJson(host, method, reqPath, payload, params),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export function redmineBackendCustomFieldValue(issue, fieldId) {
|
|
70
|
+
return redmineCustomFieldValue(issue, fieldId);
|
|
71
|
+
}
|
|
72
|
+
export function maybeParseRedmineBackendJson(value) {
|
|
73
|
+
return maybeParseRedmineJson(value);
|
|
74
|
+
}
|
|
75
|
+
export function diffRedmineBackendTasks(localTask, remoteTask) {
|
|
76
|
+
return diffRedmineTasks(localTask, remoteTask);
|
|
77
|
+
}
|
|
78
|
+
export function redmineBackendTasksDiffer(localTask, remoteTask) {
|
|
79
|
+
return redmineTasksDiffer(localTask, remoteTask);
|
|
80
|
+
}
|
|
81
|
+
export async function requestRedmineBackendJson(host, method, reqPath, payload, params, opts) {
|
|
82
|
+
return await requestRedmineJson({ baseUrl: host.baseUrl, apiKey: host.apiKey }, method, reqPath, payload, params, opts);
|
|
83
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TaskData, type TaskDocMeta, type TaskWriteOptions } from "../shared.js";
|
|
2
|
+
import type { RedmineBackendRuntimeHost } from "./runtime-context.js";
|
|
3
|
+
export declare function ensureRedmineDocMetadata(task: TaskDocMeta): void;
|
|
4
|
+
export declare function cacheRedmineTask(host: RedmineBackendRuntimeHost, task: TaskData, dirty: boolean): Promise<void>;
|
|
5
|
+
export declare function assertRedmineExpectedRevisionSupported(host: RedmineBackendRuntimeHost, taskId: string, opts?: TaskWriteOptions): void;
|
|
6
|
+
export declare function assertRedmineExpectedRevision(taskId: string, expectedRevision: number | undefined, currentRevision: number): void;
|
|
7
|
+
export declare function redmineTaskIdFieldId(host: RedmineBackendRuntimeHost): unknown;
|
|
8
|
+
export declare function setRedmineIssueCustomField(issue: Record<string, unknown>, fieldId: unknown, value: unknown): void;
|
|
9
|
+
export declare function coerceRedmineBackendDocVersion(value: unknown): 2 | 3 | null;
|
|
10
|
+
//# sourceMappingURL=runtime-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/redmine/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEtE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKhE;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,yBAAyB,EAC/B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,yBAAyB,EAC/B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,IAAI,CAON;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,GACtB,IAAI,CASN;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAO7E;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,GACb,IAAI,CAEN;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAG3E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DEFAULT_DOC_UPDATED_BY, BackendError, normalizeDocVersion, nowIso, redmineConfigMissingEnvMessage, } from "../shared.js";
|
|
2
|
+
import { setIssueCustomFieldValue as setRedmineIssueCustomFieldValue } from "./fields.js";
|
|
3
|
+
export function ensureRedmineDocMetadata(task) {
|
|
4
|
+
if (task.doc === undefined)
|
|
5
|
+
return;
|
|
6
|
+
task.doc_version = normalizeDocVersion(task.doc_version);
|
|
7
|
+
task.doc_updated_at ??= nowIso();
|
|
8
|
+
task.doc_updated_by ??= DEFAULT_DOC_UPDATED_BY;
|
|
9
|
+
}
|
|
10
|
+
export async function cacheRedmineTask(host, task, dirty) {
|
|
11
|
+
if (!host.cache)
|
|
12
|
+
return;
|
|
13
|
+
const next = { ...task, dirty };
|
|
14
|
+
await host.cache.writeTask(next);
|
|
15
|
+
}
|
|
16
|
+
export function assertRedmineExpectedRevisionSupported(host, taskId, opts) {
|
|
17
|
+
if (opts?.expectedRevision === undefined)
|
|
18
|
+
return;
|
|
19
|
+
if (host.capabilities.supports_revision_guarded_writes)
|
|
20
|
+
return;
|
|
21
|
+
throw new BackendError(`Task revision guarding is unavailable for ${taskId} without AGENTPLANE_REDMINE_CUSTOM_FIELDS_CANONICAL_STATE`, "E_BACKEND");
|
|
22
|
+
}
|
|
23
|
+
export function assertRedmineExpectedRevision(taskId, expectedRevision, currentRevision) {
|
|
24
|
+
if (expectedRevision === undefined)
|
|
25
|
+
return;
|
|
26
|
+
const expected = Math.trunc(expectedRevision);
|
|
27
|
+
if (expected <= 0 || expected === currentRevision)
|
|
28
|
+
return;
|
|
29
|
+
throw new BackendError(`Task revision changed concurrently: ${taskId} ` +
|
|
30
|
+
`(expected revision ${expected}, current revision ${currentRevision})`, "E_BACKEND");
|
|
31
|
+
}
|
|
32
|
+
export function redmineTaskIdFieldId(host) {
|
|
33
|
+
const fieldId = host.customFields?.task_id;
|
|
34
|
+
if (fieldId)
|
|
35
|
+
return fieldId;
|
|
36
|
+
throw new BackendError(redmineConfigMissingEnvMessage("AGENTPLANE_REDMINE_CUSTOM_FIELDS_TASK_ID"), "E_BACKEND");
|
|
37
|
+
}
|
|
38
|
+
export function setRedmineIssueCustomField(issue, fieldId, value) {
|
|
39
|
+
setRedmineIssueCustomFieldValue(issue, fieldId, value);
|
|
40
|
+
}
|
|
41
|
+
export function coerceRedmineBackendDocVersion(value) {
|
|
42
|
+
if (value === 2 || value === 3)
|
|
43
|
+
return value;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
@@ -2,5 +2,5 @@ import { type TaskDocVersion } from "@agentplaneorg/core";
|
|
|
2
2
|
export declare const TASK_ID_RE: RegExp;
|
|
3
3
|
export declare const DEFAULT_DOC_UPDATED_BY = "agentplane";
|
|
4
4
|
export declare const DOC_VERSION: TaskDocVersion;
|
|
5
|
-
export declare const SUPPORTED_DOC_VERSIONS: readonly [
|
|
5
|
+
export declare const SUPPORTED_DOC_VERSIONS: readonly [3];
|
|
6
6
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE5E,eAAO,MAAM,UAAU,QAA6D,CAAC;AACrF,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,WAAW,EAAE,cAAkB,CAAC;AAC7C,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/backends/task-backend/shared/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE5E,eAAO,MAAM,UAAU,QAA6D,CAAC;AACrF,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,WAAW,EAAE,cAAkB,CAAC;AAC7C,eAAO,MAAM,sBAAsB,cAAe,CAAC"}
|
|
@@ -2,4 +2,4 @@ import { TASK_ID_ALPHABET } from "@agentplaneorg/core";
|
|
|
2
2
|
export const TASK_ID_RE = new RegExp(String.raw `^\d{12}-[${TASK_ID_ALPHABET}]{4,}$`);
|
|
3
3
|
export const DEFAULT_DOC_UPDATED_BY = "agentplane";
|
|
4
4
|
export const DOC_VERSION = 3;
|
|
5
|
-
export const SUPPORTED_DOC_VERSIONS = [
|
|
5
|
+
export const SUPPORTED_DOC_VERSIONS = [3];
|
|
@@ -5,10 +5,6 @@ export type TaskIndexEntry = {
|
|
|
5
5
|
readmePath: string;
|
|
6
6
|
mtimeMs: number;
|
|
7
7
|
};
|
|
8
|
-
export type TaskIndexFileV1 = {
|
|
9
|
-
schema_version: 1;
|
|
10
|
-
tasks: TaskIndexEntry[];
|
|
11
|
-
};
|
|
12
8
|
export type TaskIndexFileV2 = {
|
|
13
9
|
schema_version: 2;
|
|
14
10
|
byId: Record<string, TaskIndexEntry>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-index.d.ts","sourceRoot":"","sources":["../../src/backends/task-index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/D,eAAO,MAAM,yBAAyB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"task-index.d.ts","sourceRoot":"","sources":["../../src/backends/task-index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/D,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAG3C,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,CAAC,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;AAE5C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU7D;AAsDD,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAIpF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,cAAc,CAgBhB"}
|
|
@@ -3,7 +3,6 @@ import path from "node:path";
|
|
|
3
3
|
import { writeJsonStableIfChanged } from "../shared/write-if-changed.js";
|
|
4
4
|
export const TASK_INDEX_SCHEMA_VERSION = 2;
|
|
5
5
|
const TASK_INDEX_FILENAME = "tasks-index.v2.json";
|
|
6
|
-
const LEGACY_TASK_INDEX_FILENAME = "tasks-index.v1.json";
|
|
7
6
|
export function resolveTaskIndexPath(tasksDir) {
|
|
8
7
|
const normalized = path.normalize(tasksDir);
|
|
9
8
|
const parts = normalized.split(path.sep);
|
|
@@ -18,11 +17,6 @@ export function resolveTaskIndexPath(tasksDir) {
|
|
|
18
17
|
function isRecord(value) {
|
|
19
18
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
20
19
|
}
|
|
21
|
-
function resolveLegacyIndexPath(indexPath) {
|
|
22
|
-
// Best-effort migration path: when upgrading from v1->v2, the v1 file may still exist.
|
|
23
|
-
const dir = path.dirname(indexPath);
|
|
24
|
-
return path.join(dir, LEGACY_TASK_INDEX_FILENAME);
|
|
25
|
-
}
|
|
26
20
|
function isTaskIndexEntry(value) {
|
|
27
21
|
if (!isRecord(value))
|
|
28
22
|
return false;
|
|
@@ -53,18 +47,6 @@ function isTaskIndexEntry(value) {
|
|
|
53
47
|
return false;
|
|
54
48
|
return true;
|
|
55
49
|
}
|
|
56
|
-
function toV2FromEntries(entries) {
|
|
57
|
-
const byId = {};
|
|
58
|
-
const byPath = {};
|
|
59
|
-
for (const entry of entries) {
|
|
60
|
-
const id = entry.task.id;
|
|
61
|
-
if (typeof id !== "string" || !id.trim())
|
|
62
|
-
continue;
|
|
63
|
-
byId[id] = entry;
|
|
64
|
-
byPath[entry.readmePath] = id;
|
|
65
|
-
}
|
|
66
|
-
return { schema_version: 2, byId, byPath };
|
|
67
|
-
}
|
|
68
50
|
function isTaskIndexFileV2(value) {
|
|
69
51
|
if (!isRecord(value))
|
|
70
52
|
return false;
|
|
@@ -85,15 +67,6 @@ function isTaskIndexFileV2(value) {
|
|
|
85
67
|
}
|
|
86
68
|
return true;
|
|
87
69
|
}
|
|
88
|
-
function isTaskIndexFileV1(value) {
|
|
89
|
-
if (!isRecord(value))
|
|
90
|
-
return false;
|
|
91
|
-
if (value.schema_version !== 1)
|
|
92
|
-
return false;
|
|
93
|
-
if (!Array.isArray(value.tasks))
|
|
94
|
-
return false;
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
70
|
async function readJsonFile(p) {
|
|
98
71
|
let raw = "";
|
|
99
72
|
try {
|
|
@@ -113,12 +86,6 @@ export async function loadTaskIndex(indexPath) {
|
|
|
113
86
|
const v2 = await readJsonFile(indexPath);
|
|
114
87
|
if (v2 && isTaskIndexFileV2(v2))
|
|
115
88
|
return v2;
|
|
116
|
-
const legacyPath = resolveLegacyIndexPath(indexPath);
|
|
117
|
-
const v1 = await readJsonFile(legacyPath);
|
|
118
|
-
if (v1 && isTaskIndexFileV1(v1)) {
|
|
119
|
-
const entries = v1.tasks.filter((entry) => isTaskIndexEntry(entry));
|
|
120
|
-
return toV2FromEntries(entries);
|
|
121
|
-
}
|
|
122
89
|
return null;
|
|
123
90
|
}
|
|
124
91
|
export async function saveTaskIndex(indexPath, index) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/E,oBAAY,QAAQ;IAClB,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,UAAU,IAAI;IACd,EAAE,IAAI;IACN,GAAG,IAAI;IACP,OAAO,IAAI;IACX,OAAO,IAAI;IACX,OAAO,IAAI;IACX,OAAO,IAAI;CACZ;AAED,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/cli/exit-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/E,oBAAY,QAAQ;IAClB,QAAQ,IAAI;IACZ,KAAK,IAAI;IACT,UAAU,IAAI;IACd,EAAE,IAAI;IACN,GAAG,IAAI;IACP,OAAO,IAAI;IACX,OAAO,IAAI;IACX,OAAO,IAAI;IACX,OAAO,IAAI;CACZ;AAED,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAW/D,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,CAE1D"}
|
package/dist/cli/exit-codes.js
CHANGED
|
@@ -13,6 +13,7 @@ export var ExitCode;
|
|
|
13
13
|
})(ExitCode || (ExitCode = {}));
|
|
14
14
|
export const ERROR_TO_EXIT = {
|
|
15
15
|
E_USAGE: DEFAULT_ERROR_EXIT_CODES.E_USAGE,
|
|
16
|
+
E_DEPRECATED_FLAG: DEFAULT_ERROR_EXIT_CODES.E_DEPRECATED_FLAG,
|
|
16
17
|
E_VALIDATION: DEFAULT_ERROR_EXIT_CODES.E_VALIDATION,
|
|
17
18
|
E_IO: DEFAULT_ERROR_EXIT_CODES.E_IO,
|
|
18
19
|
E_GIT: DEFAULT_ERROR_EXIT_CODES.E_GIT,
|
package/dist/cli/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/cli/http.ts"],"names":[],"mappings":"AA+CA,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,SAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,SAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,SAAS,SAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAkCf"}
|
package/dist/cli/http.js
CHANGED
|
@@ -4,16 +4,46 @@ import { Readable } from "node:stream";
|
|
|
4
4
|
import { pipeline } from "node:stream/promises";
|
|
5
5
|
import { exitCodeForError } from "./exit-codes.js";
|
|
6
6
|
import { CliError } from "../shared/errors.js";
|
|
7
|
-
const DEFAULT_FETCH_TIMEOUT_MS =
|
|
7
|
+
const DEFAULT_FETCH_TIMEOUT_MS = 5000;
|
|
8
8
|
const DEFAULT_DOWNLOAD_TIMEOUT_MS = 30_000;
|
|
9
|
-
|
|
9
|
+
const FETCH_ATTEMPTS = 2;
|
|
10
|
+
const FETCH_RETRY_BACKOFF_MS = 100;
|
|
11
|
+
function delay(ms) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
setTimeout(resolve, ms);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
async function fetchWithTimeout(url, timeoutMs) {
|
|
10
17
|
const controller = new AbortController();
|
|
11
18
|
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
12
19
|
try {
|
|
13
|
-
|
|
20
|
+
return await fetch(url, {
|
|
14
21
|
headers: { "User-Agent": "agentplane" },
|
|
15
22
|
signal: controller.signal,
|
|
16
23
|
});
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
clearTimeout(timeout);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function fetchWithRetry(url, timeoutMs) {
|
|
30
|
+
let lastError;
|
|
31
|
+
for (let attempt = 1; attempt <= FETCH_ATTEMPTS; attempt += 1) {
|
|
32
|
+
try {
|
|
33
|
+
return await fetchWithTimeout(url, timeoutMs);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
lastError = err;
|
|
37
|
+
if (attempt < FETCH_ATTEMPTS) {
|
|
38
|
+
await delay(FETCH_RETRY_BACKOFF_MS * attempt);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
throw lastError;
|
|
43
|
+
}
|
|
44
|
+
export async function fetchJson(url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) {
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetchWithRetry(url, timeoutMs);
|
|
17
47
|
if (!res.ok) {
|
|
18
48
|
throw new CliError({
|
|
19
49
|
exitCode: exitCodeForError("E_NETWORK"),
|
|
@@ -32,18 +62,10 @@ export async function fetchJson(url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) {
|
|
|
32
62
|
message: `Failed to fetch ${url}`,
|
|
33
63
|
});
|
|
34
64
|
}
|
|
35
|
-
finally {
|
|
36
|
-
clearTimeout(timeout);
|
|
37
|
-
}
|
|
38
65
|
}
|
|
39
66
|
export async function fetchText(url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) {
|
|
40
|
-
const controller = new AbortController();
|
|
41
|
-
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
42
67
|
try {
|
|
43
|
-
const res = await
|
|
44
|
-
headers: { "User-Agent": "agentplane" },
|
|
45
|
-
signal: controller.signal,
|
|
46
|
-
});
|
|
68
|
+
const res = await fetchWithRetry(url, timeoutMs);
|
|
47
69
|
if (!res.ok) {
|
|
48
70
|
throw new CliError({
|
|
49
71
|
exitCode: exitCodeForError("E_NETWORK"),
|
|
@@ -62,9 +84,6 @@ export async function fetchText(url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) {
|
|
|
62
84
|
message: `Failed to fetch ${url}`,
|
|
63
85
|
});
|
|
64
86
|
}
|
|
65
|
-
finally {
|
|
66
|
-
clearTimeout(timeout);
|
|
67
|
-
}
|
|
68
87
|
}
|
|
69
88
|
export async function downloadToFile(url, destPath, timeoutMs = DEFAULT_DOWNLOAD_TIMEOUT_MS) {
|
|
70
89
|
const controller = new AbortController();
|
|
@@ -67,11 +67,7 @@ export declare const fromCommandsTaskVerifyCommand: <TParsed>(spec: import("../s
|
|
|
67
67
|
export declare const fromCommandsTaskResumeContextCommand: <TParsed>(spec: import("../spec/spec.js").CommandSpec<TParsed>, runExport: "taskResumeContextSpec" | "runTaskResumeContext", meta?: import("./command-catalog/shared.js").CommandMeta) => import("./command-catalog/shared.js").CommandEntry;
|
|
68
68
|
export declare const fromTaskHandoffShowSpec: <TParsed>(spec: import("../spec/spec.js").CommandSpec<TParsed>, runExport: "taskHandoffShowSpec" | "runTaskHandoffShow", meta?: import("./command-catalog/shared.js").CommandMeta) => import("./command-catalog/shared.js").CommandEntry;
|
|
69
69
|
export declare const loadTaskHostedCloseSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, parsed: import("../../commands/task/hosted-close.command.js").TaskHostedCloseParsed) => Promise<number>>;
|
|
70
|
-
export declare const loadTaskHostedClosePrSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, p:
|
|
71
|
-
taskIds: string[];
|
|
72
|
-
branch: string | null;
|
|
73
|
-
repo: string | null;
|
|
74
|
-
}) => Promise<number>>;
|
|
70
|
+
export declare const loadTaskHostedClosePrSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, p: import("../../commands/task/hosted-close-pr.types.js").TaskHostedClosePrParsed) => Promise<number>>;
|
|
75
71
|
export declare const loadTaskListSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, p: import("../../commands/task/list.spec.js").TaskListParsed) => Promise<number>>;
|
|
76
72
|
export declare const loadTaskNextSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, p: import("../../commands/task/next.spec.js").TaskNextParsed) => Promise<number>>;
|
|
77
73
|
export declare const loadTaskSearchSpec: (deps: RunDeps) => Promise<(ctx: import("../spec/spec.js").CommandCtx, p: import("../../commands/task/search.spec.js").TaskSearchParsed) => Promise<number>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-loaders.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/command-loaders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE1E,eAAO,MAAM,gBAAgB,oNAAoD,CAAC;AAClF,eAAO,MAAM,0BAA0B,0NAEtC,CAAC;AACF,eAAO,MAAM,iCAAiC,0NAE7C,CAAC;AACF,eAAO,MAAM,8BAA8B,kOAE1C,CAAC;AACF,eAAO,MAAM,+BAA+B,wUAE3C,CAAC;AACF,eAAO,MAAM,0BAA0B,gOAEtC,CAAC;AACF,eAAO,MAAM,yBAAyB,8NAErC,CAAC;AACF,eAAO,MAAM,iBAAiB,6TAAqD,CAAC;AACpF,eAAO,MAAM,0BAA0B,kUAEtC,CAAC;AACF,eAAO,MAAM,qCAAqC,8NAEjD,CAAC;AACF,eAAO,MAAM,oBAAoB,oNAAyD,CAAC;AAC3F,eAAO,MAAM,qBAAqB,yMAA8D,CAAC;AACjG,eAAO,MAAM,2BAA2B,4NAEvC,CAAC;AACF,eAAO,MAAM,gCAAgC,sOAE5C,CAAC;AACF,eAAO,MAAM,kCAAkC,0OAE9C,CAAC;AACF,eAAO,MAAM,mCAAmC,wTAE/C,CAAC;AACF,eAAO,MAAM,0BAA0B,GAAI,MAAM,OAAO,8GAC6B,CAAC;AACtF,eAAO,MAAM,wBAAwB,GAAI,MAAM,OAAO;;;;sBAGnD,CAAC;AACJ,eAAO,MAAM,uBAAuB,GAAI,MAAM,OAAO;;;;;;;;sBAGlD,CAAC;AACJ,eAAO,MAAM,cAAc,GAAI,MAAM,OAAO;;GACmC,CAAC;AAChF,eAAO,MAAM,kBAAkB,GAAI,MAAM,OAAO;;GAC8B,CAAC;AAC/E,eAAO,MAAM,iBAAiB,GAAI,MAAM,OAAO;;;GAC8B,CAAC;AAC9E,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO;;GAC8B,CAAC;AAC5E,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO;;GAC8B,CAAC;AAC5E,eAAO,MAAM,kBAAkB,GAAI,MAAM,OAAO;;GAC8B,CAAC;AAC/E,eAAO,MAAM,eAAe,GAAI,MAAM,OAAO;;GAC2B,CAAC;AACzE,eAAO,MAAM,2BAA2B,oNAEvC,CAAC;AACF,eAAO,MAAM,8BAA8B,kOAE1C,CAAC;AACF,eAAO,MAAM,oCAAoC,8OAEhD,CAAC;AACF,eAAO,MAAM,8BAA8B,kOAE1C,CAAC;AACF,eAAO,MAAM,8BAA8B,kOAE1C,CAAC;AACF,eAAO,MAAM,gCAAgC,sOAE5C,CAAC;AACF,eAAO,MAAM,+BAA+B,oOAE3C,CAAC;AACF,eAAO,MAAM,+BAA+B,oOAE3C,CAAC;AACF,eAAO,MAAM,0BAA0B,0NAEtC,CAAC;AACF,eAAO,MAAM,2BAA2B,4NAEvC,CAAC;AACF,eAAO,MAAM,iCAAiC,wOAE7C,CAAC;AACF,eAAO,MAAM,6BAA6B,gOAEzC,CAAC;AACF,eAAO,MAAM,oCAAoC,8OAEhD,CAAC;AACF,eAAO,MAAM,uBAAuB,0OAEnC,CAAC;AACF,eAAO,MAAM,uBAAuB,GAAI,MAAM,OAAO,iKAGlD,CAAC;AACJ,eAAO,MAAM,yBAAyB,GAAI,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"command-loaders.d.ts","sourceRoot":"","sources":["../../../src/cli/run-cli/command-loaders.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,4 +18,9 @@ export declare function usageError(opts: {
|
|
|
18
18
|
command?: string;
|
|
19
19
|
context?: Record<string, unknown>;
|
|
20
20
|
}): CliError;
|
|
21
|
+
export declare function deprecatedFlagError(opts: {
|
|
22
|
+
option: string;
|
|
23
|
+
deprecated: string;
|
|
24
|
+
spec?: CommandSpec<unknown>;
|
|
25
|
+
}): CliError;
|
|
21
26
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,QAAQ,CAcX"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GAAG,QAAQ,CAcX;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC7B,GAAG,QAAQ,CAgBX"}
|
package/dist/cli/spec/errors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UsageError } from "../../shared/errors.js";
|
|
1
|
+
import { DeprecatedFlagError, UsageError } from "../../shared/errors.js";
|
|
2
2
|
import { renderCommandHelpText } from "./help-render.js";
|
|
3
3
|
/**
|
|
4
4
|
* Usage-error helpers for command-spec parsing/rendering only.
|
|
@@ -26,3 +26,16 @@ export function usageError(opts) {
|
|
|
26
26
|
context: Object.keys(context).length > 0 ? context : undefined,
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
+
export function deprecatedFlagError(opts) {
|
|
30
|
+
const command = opts.spec ? opts.spec.id.join(" ") : undefined;
|
|
31
|
+
const usage = opts.spec && renderCommandHelpText(opts.spec, { compact: true, includeHeader: false });
|
|
32
|
+
const fullMessage = `Deprecated option ${opts.option} is ${opts.deprecated}; remove it or use the documented replacement.${usage ? `\n\n${usage}` : ""}`;
|
|
33
|
+
return new DeprecatedFlagError({
|
|
34
|
+
message: fullMessage,
|
|
35
|
+
context: {
|
|
36
|
+
option: opts.option,
|
|
37
|
+
deprecated: opts.deprecated,
|
|
38
|
+
...(command ? { command } : {}),
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,WAAW,CAAC;AAIpE,KAAK,aAAa,CAAC,OAAO,IAAI;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/cli/spec/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,WAAW,CAAC;AAIpE,KAAK,aAAa,CAAC,OAAO,IAAI;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAkFF,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,aAAa,CAAC,OAAO,CAAC,CAmIxB"}
|
package/dist/cli/spec/parse.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { suggestOne } from "./suggest.js";
|
|
2
|
-
import { usageError } from "./errors.js";
|
|
2
|
+
import { deprecatedFlagError, usageError } from "./errors.js";
|
|
3
3
|
function isOptionToken(tok) {
|
|
4
4
|
return tok.startsWith("-") && tok !== "-";
|
|
5
5
|
}
|
|
@@ -67,6 +67,11 @@ function normalizeForValidation(opt, rawValue) {
|
|
|
67
67
|
const coerced = opt.coerce(rawValue);
|
|
68
68
|
return typeof coerced === "string" ? coerced : rawValue;
|
|
69
69
|
}
|
|
70
|
+
function assertNotDeprecated(spec, opt, token) {
|
|
71
|
+
if (!opt.deprecated)
|
|
72
|
+
return;
|
|
73
|
+
throw deprecatedFlagError({ spec, option: token, deprecated: opt.deprecated });
|
|
74
|
+
}
|
|
70
75
|
export function parseCommandArgv(spec, argv) {
|
|
71
76
|
const { byLong, byShort, candidates } = indexOptions(spec);
|
|
72
77
|
const raw = { args: {}, opts: {}, extra: [] };
|
|
@@ -93,6 +98,7 @@ export function parseCommandArgv(spec, argv) {
|
|
|
93
98
|
const suffix = sugg ? ` Did you mean ${sugg}?` : "";
|
|
94
99
|
throw usageError({ spec, message: `Unknown option: ${head}.${suffix}` });
|
|
95
100
|
}
|
|
101
|
+
assertNotDeprecated(spec, opt, head);
|
|
96
102
|
if (opt.kind === "boolean") {
|
|
97
103
|
if (eq === -1) {
|
|
98
104
|
setOpt(raw, opt, true);
|
|
@@ -118,6 +124,7 @@ export function parseCommandArgv(spec, argv) {
|
|
|
118
124
|
const suffix = sugg ? ` Did you mean ${sugg}?` : "";
|
|
119
125
|
throw usageError({ spec, message: `Unknown option: ${tok}.${suffix}` });
|
|
120
126
|
}
|
|
127
|
+
assertNotDeprecated(spec, opt, tok);
|
|
121
128
|
if (opt.kind === "boolean") {
|
|
122
129
|
setOpt(raw, opt, true);
|
|
123
130
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-start.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/work-start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"work-start.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/work-start.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,2BAA2B,CAAC;AAmBnC,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+JlB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type DirectWorkLock = {
|
|
2
|
+
task_id: string;
|
|
3
|
+
agent: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
started_at: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function directWorkLockPath(agentplaneDir: string): string;
|
|
9
|
+
export declare function readDirectWorkLock(agentplaneDir: string): Promise<DirectWorkLock | null>;
|
|
10
|
+
export declare function writeDirectWorkLock(agentplaneDir: string, lock: DirectWorkLock): Promise<void>;
|
|
11
|
+
export declare function ensureGitClean(gitRoot: string): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=work-start.direct.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-start.direct.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/work-start.direct.ts"],"names":[],"mappings":"AAOA,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAkB9F;AAED,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCnE"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { exitCodeForError } from "../../cli/exit-codes.js";
|
|
4
|
+
import { CliError } from "../../shared/errors.js";
|
|
5
|
+
import { execFileAsync, gitEnv } from "../shared/git.js";
|
|
6
|
+
export function directWorkLockPath(agentplaneDir) {
|
|
7
|
+
// Intentionally under cache/ so it stays out of git by default.
|
|
8
|
+
return path.join(agentplaneDir, "cache", "direct-work.json");
|
|
9
|
+
}
|
|
10
|
+
export async function readDirectWorkLock(agentplaneDir) {
|
|
11
|
+
try {
|
|
12
|
+
const text = await readFile(directWorkLockPath(agentplaneDir), "utf8");
|
|
13
|
+
const parsed = JSON.parse(text);
|
|
14
|
+
if (!parsed || typeof parsed !== "object")
|
|
15
|
+
return null;
|
|
16
|
+
if (typeof parsed.task_id !== "string" ||
|
|
17
|
+
typeof parsed.agent !== "string" ||
|
|
18
|
+
typeof parsed.slug !== "string" ||
|
|
19
|
+
typeof parsed.branch !== "string" ||
|
|
20
|
+
typeof parsed.started_at !== "string") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function writeDirectWorkLock(agentplaneDir, lock) {
|
|
30
|
+
const dir = path.dirname(directWorkLockPath(agentplaneDir));
|
|
31
|
+
await mkdir(dir, { recursive: true });
|
|
32
|
+
await writeFile(directWorkLockPath(agentplaneDir), JSON.stringify(lock, null, 2) + "\n", "utf8");
|
|
33
|
+
}
|
|
34
|
+
export async function ensureGitClean(gitRoot) {
|
|
35
|
+
const { stdout } = await execFileAsync("git", ["status", "--porcelain"], {
|
|
36
|
+
cwd: gitRoot,
|
|
37
|
+
env: gitEnv(),
|
|
38
|
+
});
|
|
39
|
+
const lines = stdout
|
|
40
|
+
.split("\n")
|
|
41
|
+
.map((line) => line.trimEnd())
|
|
42
|
+
.filter((line) => line.trim().length > 0);
|
|
43
|
+
if (lines.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
// Allow task workflow artifacts to be dirty. In direct mode we want a single-stream
|
|
46
|
+
// workflow without task branches, but we still expect task docs to change.
|
|
47
|
+
const allowedPrefixes = [
|
|
48
|
+
".agentplane/tasks/",
|
|
49
|
+
".agentplane/tasks.json",
|
|
50
|
+
".agentplane/cache/",
|
|
51
|
+
".agentplane/.upgrade/",
|
|
52
|
+
".agentplane/upgrade/",
|
|
53
|
+
];
|
|
54
|
+
const isAllowed = (p) => allowedPrefixes.some((prefix) => p.startsWith(prefix));
|
|
55
|
+
const dirty = lines
|
|
56
|
+
.map((line) => {
|
|
57
|
+
// Format: XY <path> (we only need the path-ish tail).
|
|
58
|
+
const rest = line.slice(2).trim();
|
|
59
|
+
if (!rest)
|
|
60
|
+
return "";
|
|
61
|
+
// Rename/copy format: "old -> new"
|
|
62
|
+
const arrow = rest.lastIndexOf(" -> ");
|
|
63
|
+
if (arrow === -1)
|
|
64
|
+
return rest;
|
|
65
|
+
return rest.slice(arrow + 4).trim();
|
|
66
|
+
})
|
|
67
|
+
.filter((p) => p.length > 0 && !isAllowed(p));
|
|
68
|
+
if (dirty.length === 0)
|
|
69
|
+
return;
|
|
70
|
+
throw new CliError({
|
|
71
|
+
exitCode: exitCodeForError("E_GIT"),
|
|
72
|
+
code: "E_GIT",
|
|
73
|
+
message: "Working tree has non-task changes. In workflow_mode=direct, agentplane runs tasks in a single stream on the current branch; commit/stash your changes before starting a different task.",
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-start.git.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/work-start.git.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAchG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { exitCodeForError } from "../../cli/exit-codes.js";
|
|
2
|
+
import { CliError } from "../../shared/errors.js";
|
|
3
|
+
import { gitAheadBehind } from "../shared/git-diff.js";
|
|
4
|
+
import { gitBranchUpstream } from "../shared/git-ops.js";
|
|
5
|
+
export { resolveBaseBranch } from "@agentplaneorg/core";
|
|
6
|
+
export async function ensureCurrentBaseBranch(gitRoot, baseBranch) {
|
|
7
|
+
const upstreamBranch = await gitBranchUpstream(gitRoot, baseBranch);
|
|
8
|
+
if (!upstreamBranch)
|
|
9
|
+
return;
|
|
10
|
+
const { behind } = await gitAheadBehind(gitRoot, upstreamBranch, baseBranch);
|
|
11
|
+
if (behind === 0)
|
|
12
|
+
return;
|
|
13
|
+
throw new CliError({
|
|
14
|
+
exitCode: exitCodeForError("E_GIT"),
|
|
15
|
+
code: "E_GIT",
|
|
16
|
+
message: `Base branch ${baseBranch} is behind its upstream ${upstreamBranch} by ${behind} commit(s). ` +
|
|
17
|
+
"Refresh the base branch before `agentplane work start` to avoid DIRTY hosted PRs.",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-start.hook-shim.d.ts","sourceRoot":"","sources":["../../../src/commands/branch/work-start.hook-shim.ts"],"names":[],"mappings":"AAkCA,wBAAsB,8BAA8B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF"}
|