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.
Files changed (123) hide show
  1. package/dist/.build-manifest.json +159 -54
  2. package/dist/backends/task-backend/redmine/backend-runtime.d.ts +4 -146
  3. package/dist/backends/task-backend/redmine/backend-runtime.d.ts.map +1 -1
  4. package/dist/backends/task-backend/redmine/backend-runtime.js +4 -258
  5. package/dist/backends/task-backend/redmine/mapping.js +1 -1
  6. package/dist/backends/task-backend/redmine/runtime-context.d.ts +98 -0
  7. package/dist/backends/task-backend/redmine/runtime-context.d.ts.map +1 -0
  8. package/dist/backends/task-backend/redmine/runtime-context.js +57 -0
  9. package/dist/backends/task-backend/redmine/runtime-methods.d.ts +33 -0
  10. package/dist/backends/task-backend/redmine/runtime-methods.d.ts.map +1 -0
  11. package/dist/backends/task-backend/redmine/runtime-methods.js +86 -0
  12. package/dist/backends/task-backend/redmine/runtime-operations.d.ts +19 -0
  13. package/dist/backends/task-backend/redmine/runtime-operations.d.ts.map +1 -0
  14. package/dist/backends/task-backend/redmine/runtime-operations.js +83 -0
  15. package/dist/backends/task-backend/redmine/runtime-state.d.ts +10 -0
  16. package/dist/backends/task-backend/redmine/runtime-state.d.ts.map +1 -0
  17. package/dist/backends/task-backend/redmine/runtime-state.js +45 -0
  18. package/dist/backends/task-backend/shared/constants.d.ts +1 -1
  19. package/dist/backends/task-backend/shared/constants.d.ts.map +1 -1
  20. package/dist/backends/task-backend/shared/constants.js +1 -1
  21. package/dist/backends/task-index.d.ts +0 -4
  22. package/dist/backends/task-index.d.ts.map +1 -1
  23. package/dist/backends/task-index.js +0 -33
  24. package/dist/cli/exit-codes.d.ts.map +1 -1
  25. package/dist/cli/exit-codes.js +1 -0
  26. package/dist/cli/http.d.ts.map +1 -1
  27. package/dist/cli/http.js +34 -15
  28. package/dist/cli/run-cli/command-loaders.d.ts +1 -5
  29. package/dist/cli/run-cli/command-loaders.d.ts.map +1 -1
  30. package/dist/cli/spec/errors.d.ts +5 -0
  31. package/dist/cli/spec/errors.d.ts.map +1 -1
  32. package/dist/cli/spec/errors.js +14 -1
  33. package/dist/cli/spec/parse.d.ts.map +1 -1
  34. package/dist/cli/spec/parse.js +8 -1
  35. package/dist/commands/branch/work-start.d.ts.map +1 -1
  36. package/dist/commands/branch/work-start.direct.d.ts +13 -0
  37. package/dist/commands/branch/work-start.direct.d.ts.map +1 -0
  38. package/dist/commands/branch/work-start.direct.js +75 -0
  39. package/dist/commands/branch/work-start.git.d.ts +3 -0
  40. package/dist/commands/branch/work-start.git.d.ts.map +1 -0
  41. package/dist/commands/branch/work-start.git.js +19 -0
  42. package/dist/commands/branch/work-start.hook-shim.d.ts +2 -0
  43. package/dist/commands/branch/work-start.hook-shim.d.ts.map +1 -0
  44. package/dist/commands/branch/work-start.hook-shim.js +38 -0
  45. package/dist/commands/branch/work-start.js +6 -235
  46. package/dist/commands/branch/work-start.materialize.d.ts +16 -0
  47. package/dist/commands/branch/work-start.materialize.d.ts.map +1 -0
  48. package/dist/commands/branch/work-start.materialize.js +110 -0
  49. package/dist/commands/doctor/fixes.d.ts +0 -5
  50. package/dist/commands/doctor/fixes.d.ts.map +1 -1
  51. package/dist/commands/doctor/fixes.js +0 -70
  52. package/dist/commands/doctor/workflow.d.ts.map +1 -1
  53. package/dist/commands/doctor/workflow.js +2 -23
  54. package/dist/commands/doctor.run.d.ts.map +1 -1
  55. package/dist/commands/doctor.run.js +1 -3
  56. package/dist/commands/hooks/index.d.ts +4 -20
  57. package/dist/commands/hooks/index.d.ts.map +1 -1
  58. package/dist/commands/hooks/index.js +4 -432
  59. package/dist/commands/hooks/install.d.ts +11 -0
  60. package/dist/commands/hooks/install.d.ts.map +1 -0
  61. package/dist/commands/hooks/install.js +136 -0
  62. package/dist/commands/hooks/run.commit-msg.d.ts +3 -0
  63. package/dist/commands/hooks/run.commit-msg.d.ts.map +1 -0
  64. package/dist/commands/hooks/run.commit-msg.js +67 -0
  65. package/dist/commands/hooks/run.d.ts +9 -0
  66. package/dist/commands/hooks/run.d.ts.map +1 -0
  67. package/dist/commands/hooks/run.js +45 -0
  68. package/dist/commands/hooks/run.post-merge.d.ts +3 -0
  69. package/dist/commands/hooks/run.post-merge.d.ts.map +1 -0
  70. package/dist/commands/hooks/run.post-merge.js +44 -0
  71. package/dist/commands/hooks/run.pre-commit.d.ts +3 -0
  72. package/dist/commands/hooks/run.pre-commit.d.ts.map +1 -0
  73. package/dist/commands/hooks/run.pre-commit.js +48 -0
  74. package/dist/commands/hooks/run.pre-push.d.ts +6 -0
  75. package/dist/commands/hooks/run.pre-push.d.ts.map +1 -0
  76. package/dist/commands/hooks/run.pre-push.js +88 -0
  77. package/dist/commands/hooks/shared.d.ts +7 -0
  78. package/dist/commands/hooks/shared.d.ts.map +1 -0
  79. package/dist/commands/hooks/shared.js +41 -0
  80. package/dist/commands/recipes/impl/index.d.ts.map +1 -1
  81. package/dist/commands/recipes/impl/index.js +13 -3
  82. package/dist/commands/task/hosted-close-pr.command.d.ts +2 -7
  83. package/dist/commands/task/hosted-close-pr.command.d.ts.map +1 -1
  84. package/dist/commands/task/hosted-close-pr.command.js +9 -373
  85. package/dist/commands/task/hosted-close-pr.execute.d.ts +3 -0
  86. package/dist/commands/task/hosted-close-pr.execute.d.ts.map +1 -0
  87. package/dist/commands/task/hosted-close-pr.execute.js +135 -0
  88. package/dist/commands/task/hosted-close-pr.postcheck.d.ts +3 -0
  89. package/dist/commands/task/hosted-close-pr.postcheck.d.ts.map +1 -0
  90. package/dist/commands/task/hosted-close-pr.postcheck.js +13 -0
  91. package/dist/commands/task/hosted-close-pr.precheck.d.ts +4 -0
  92. package/dist/commands/task/hosted-close-pr.precheck.d.ts.map +1 -0
  93. package/dist/commands/task/hosted-close-pr.precheck.js +288 -0
  94. package/dist/commands/task/hosted-close-pr.report.d.ts +4 -0
  95. package/dist/commands/task/hosted-close-pr.report.d.ts.map +1 -0
  96. package/dist/commands/task/hosted-close-pr.report.js +42 -0
  97. package/dist/commands/task/hosted-close-pr.types.d.ts +75 -0
  98. package/dist/commands/task/hosted-close-pr.types.d.ts.map +1 -0
  99. package/dist/commands/task/hosted-close-pr.types.js +1 -0
  100. package/dist/commands/upgrade/materialize.d.ts.map +1 -1
  101. package/dist/commands/upgrade/materialize.js +0 -7
  102. package/dist/commands/upgrade/source.d.ts +0 -1
  103. package/dist/commands/upgrade/source.d.ts.map +1 -1
  104. package/dist/commands/upgrade/source.js +1 -9
  105. package/dist/runner/context/base-prompts.d.ts.map +1 -1
  106. package/dist/runner/context/base-prompts.js +4 -0
  107. package/dist/runner/context/project-skill-prompt-blocks.d.ts +5 -0
  108. package/dist/runner/context/project-skill-prompt-blocks.d.ts.map +1 -0
  109. package/dist/runner/context/project-skill-prompt-blocks.js +57 -0
  110. package/dist/runner/process-supervision/run.d.ts.map +1 -1
  111. package/dist/runner/process-supervision/run.js +61 -59
  112. package/dist/shared/errors.d.ts +4 -1
  113. package/dist/shared/errors.d.ts.map +1 -1
  114. package/dist/shared/errors.js +6 -0
  115. package/dist/shared/workflow-artifacts.d.ts.map +1 -1
  116. package/dist/shared/workflow-artifacts.js +1 -8
  117. package/dist/workflow-runtime/file-ops.d.ts.map +1 -1
  118. package/dist/workflow-runtime/file-ops.js +1 -20
  119. package/dist/workflow-runtime/paths.d.ts.map +1 -1
  120. package/dist/workflow-runtime/paths.js +0 -1
  121. package/dist/workflow-runtime/types.d.ts +0 -1
  122. package/dist/workflow-runtime/types.d.ts.map +1 -1
  123. package/package.json +3 -3
@@ -0,0 +1,288 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolveBaseBranch } from "@agentplaneorg/core";
3
+ import { exitCodeForError } from "../../cli/exit-codes.js";
4
+ import { fileExists } from "../../cli/fs-utils.js";
5
+ import { CliError } from "../../shared/errors.js";
6
+ import { resolveDefaultGithubRepo, runGhApiJson } from "../pr/internal/gh-api.js";
7
+ import { resolvePrPaths } from "../pr/internal/pr-paths.js";
8
+ import { execFileAsync, gitEnv } from "../shared/git.js";
9
+ import { parseTaskIdFromCloseBranch } from "../shared/git-worktree.js";
10
+ import { parsePrMeta } from "../shared/pr-meta.js";
11
+ import { loadTaskFromContext, resolveTaskBranchFromContext, } from "../shared/task-backend.js";
12
+ async function resolveGithubRepo(opts) {
13
+ const repo = opts.repoOverride?.trim() ?? "";
14
+ if (repo)
15
+ return repo;
16
+ return await resolveDefaultGithubRepo(opts.gitRoot);
17
+ }
18
+ function selectMergedPullRecord(opts) {
19
+ const merged = opts.pulls.filter((record) => {
20
+ if (typeof record.merged_at !== "string" || record.merged_at.trim().length === 0)
21
+ return false;
22
+ const headRef = record.head?.ref?.trim() ?? "";
23
+ if (opts.sourceBranch && headRef && headRef !== opts.sourceBranch)
24
+ return false;
25
+ const baseRef = record.base?.ref?.trim() ?? "";
26
+ if (opts.baseBranch && baseRef && baseRef !== opts.baseBranch)
27
+ return false;
28
+ return true;
29
+ });
30
+ if (merged.length === 0)
31
+ return null;
32
+ if (typeof opts.prNumber === "number" && opts.prNumber > 0) {
33
+ const exact = merged.find((record) => Number(record.number ?? 0) === opts.prNumber);
34
+ if (exact)
35
+ return exact;
36
+ }
37
+ return ([...merged].toSorted((left, right) => {
38
+ const leftAt = Date.parse(left.merged_at ?? "");
39
+ const rightAt = Date.parse(right.merged_at ?? "");
40
+ return Number.isNaN(rightAt) || Number.isNaN(leftAt) ? 0 : rightAt - leftAt;
41
+ })[0] ?? null);
42
+ }
43
+ async function resolveHostedCloseMergeRecord(opts) {
44
+ const owner = opts.repo.split("/")[0]?.trim() ?? "";
45
+ if (!owner)
46
+ return null;
47
+ const query = new URLSearchParams({
48
+ state: "closed",
49
+ head: `${owner}:${opts.sourceBranch}`,
50
+ });
51
+ if (opts.baseBranch)
52
+ query.set("base", opts.baseBranch);
53
+ const records = await runGhApiJson(opts.gitRoot, [
54
+ `repos/${opts.repo}/pulls?${query.toString()}`,
55
+ ]);
56
+ return selectMergedPullRecord({
57
+ pulls: Array.isArray(records) ? records : [],
58
+ sourceBranch: opts.sourceBranch,
59
+ baseBranch: opts.baseBranch,
60
+ prNumber: opts.prNumber,
61
+ });
62
+ }
63
+ async function resolveHostedCloseMergeRecordByCommit(opts) {
64
+ const records = await runGhApiJson(opts.gitRoot, [
65
+ `repos/${opts.repo}/commits/${opts.mergeCommit}/pulls`,
66
+ ]);
67
+ return selectMergedPullRecord({
68
+ pulls: Array.isArray(records) ? records : [],
69
+ sourceBranch: opts.sourceBranch,
70
+ baseBranch: opts.baseBranch,
71
+ prNumber: opts.prNumber,
72
+ });
73
+ }
74
+ async function readHostedCloseState(opts) {
75
+ const task = (await opts.ctx.taskBackend.getTask(opts.taskId)) ??
76
+ (await loadTaskFromContext({
77
+ ctx: opts.ctx,
78
+ taskId: opts.taskId,
79
+ preferBranchSnapshot: false,
80
+ }));
81
+ const taskBranch = await resolveTaskBranchFromContext({ ctx: opts.ctx, taskId: opts.taskId });
82
+ const { metaPath, config } = await resolvePrPaths({
83
+ ctx: opts.ctx,
84
+ cwd: opts.cwd,
85
+ rootOverride: opts.rootOverride,
86
+ taskId: opts.taskId,
87
+ });
88
+ if (config.workflow_mode !== "branch_pr") {
89
+ throw new CliError({
90
+ exitCode: exitCodeForError("E_USAGE"),
91
+ code: "E_USAGE",
92
+ message: `Invalid workflow_mode: ${config.workflow_mode} (expected branch_pr)`,
93
+ });
94
+ }
95
+ if (!(await fileExists(metaPath))) {
96
+ return { meta: null, task, taskBranch };
97
+ }
98
+ const meta = parsePrMeta(await readFile(metaPath, "utf8"), opts.taskId);
99
+ return { meta, task, taskBranch };
100
+ }
101
+ async function listRemoteTaskCloseBranches(opts) {
102
+ const { stdout } = await execFileAsync("git", ["ls-remote", "--heads", "origin", `task-close/${opts.taskId}/*`], {
103
+ cwd: opts.gitRoot,
104
+ env: gitEnv(),
105
+ maxBuffer: 10 * 1024 * 1024,
106
+ });
107
+ return stdout
108
+ .split("\n")
109
+ .map((line) => line.trim())
110
+ .filter((line) => line.length > 0)
111
+ .map((line) => line.split(/\s+/, 2)[1] ?? "")
112
+ .map((ref) => ref.replace(/^refs\/heads\//, ""))
113
+ .filter((ref) => ref.length > 0);
114
+ }
115
+ export function shortHostedCloseSha(value) {
116
+ return value.trim().slice(0, 12);
117
+ }
118
+ function stripBranchRef(branch) {
119
+ return branch.startsWith("refs/heads/") ? branch.slice("refs/heads/".length) : branch;
120
+ }
121
+ async function resolveHostedCloseBranch(opts) {
122
+ const remoteBranches = await listRemoteTaskCloseBranches({
123
+ gitRoot: opts.gitRoot,
124
+ taskId: opts.taskId,
125
+ });
126
+ const explicitBranch = stripBranchRef(opts.explicitBranch?.trim() ?? "");
127
+ if (explicitBranch) {
128
+ const parsedTaskId = parseTaskIdFromCloseBranch(explicitBranch);
129
+ if (parsedTaskId && parsedTaskId !== opts.taskId) {
130
+ throw new CliError({
131
+ exitCode: exitCodeForError("E_VALIDATION"),
132
+ code: "E_VALIDATION",
133
+ message: `Branch ${explicitBranch} does not belong to task ${opts.taskId}.`,
134
+ });
135
+ }
136
+ if (!remoteBranches.includes(explicitBranch)) {
137
+ throw new CliError({
138
+ exitCode: exitCodeForError("E_VALIDATION"),
139
+ code: "E_VALIDATION",
140
+ message: `Remote hosted closure branch not found: ${explicitBranch}.`,
141
+ });
142
+ }
143
+ return explicitBranch;
144
+ }
145
+ if (opts.mergeCommit) {
146
+ const expected = `task-close/${opts.taskId}/${shortHostedCloseSha(opts.mergeCommit)}`;
147
+ if (remoteBranches.includes(expected))
148
+ return expected;
149
+ if (remoteBranches.length === 1)
150
+ return remoteBranches[0] ?? expected;
151
+ if (remoteBranches.length > 1) {
152
+ throw new CliError({
153
+ exitCode: exitCodeForError("E_VALIDATION"),
154
+ code: "E_VALIDATION",
155
+ message: `Multiple remote hosted closure branches match ${opts.taskId}: ${remoteBranches.join(", ")} (use --branch).`,
156
+ });
157
+ }
158
+ throw new CliError({
159
+ exitCode: exitCodeForError("E_VALIDATION"),
160
+ code: "E_VALIDATION",
161
+ message: `Remote hosted closure branch not found for ${opts.taskId}: ${expected}.`,
162
+ });
163
+ }
164
+ if (remoteBranches.length === 1)
165
+ return remoteBranches[0] ?? "";
166
+ if (remoteBranches.length > 1) {
167
+ throw new CliError({
168
+ exitCode: exitCodeForError("E_VALIDATION"),
169
+ code: "E_VALIDATION",
170
+ message: `Multiple remote hosted closure branches match ${opts.taskId}: ${remoteBranches.join(", ")} (use --branch).`,
171
+ });
172
+ }
173
+ throw new CliError({
174
+ exitCode: exitCodeForError("E_VALIDATION"),
175
+ code: "E_VALIDATION",
176
+ message: `Could not resolve remote hosted closure branch for ${opts.taskId}.`,
177
+ });
178
+ }
179
+ export async function precheckHostedClosePr(opts) {
180
+ const { meta, task, taskBranch } = await readHostedCloseState({
181
+ ctx: opts.ctx,
182
+ cwd: opts.cwd,
183
+ rootOverride: opts.rootOverride,
184
+ taskId: opts.taskId,
185
+ });
186
+ const gitRoot = opts.ctx.resolvedProject.gitRoot;
187
+ const repo = await resolveGithubRepo({ gitRoot, repoOverride: opts.repo ?? null });
188
+ const defaultBaseBranch = await resolveBaseBranch({
189
+ cwd: opts.cwd,
190
+ rootOverride: opts.rootOverride ?? null,
191
+ cliBaseOpt: null,
192
+ mode: opts.ctx.config.workflow_mode,
193
+ });
194
+ let sourceBranch = meta?.branch?.trim() ?? taskBranch?.trim() ?? "";
195
+ let baseBranch = meta?.base?.trim() ?? defaultBaseBranch?.trim() ?? "";
196
+ const localMergeCommit = meta?.merge_commit?.trim() ?? task.commit?.hash?.trim() ?? "";
197
+ const canonicalCloseAlreadyPresent = meta?.status === "MERGED" &&
198
+ sourceBranch.length > 0 &&
199
+ localMergeCommit.length > 0 &&
200
+ String(task.status || "TODO").toUpperCase() === "DONE" &&
201
+ (task.commit?.hash?.trim() ?? "") === localMergeCommit;
202
+ if (canonicalCloseAlreadyPresent) {
203
+ return {
204
+ kind: "skip",
205
+ outcome: {
206
+ kind: "canonical-already-present",
207
+ taskId: opts.taskId,
208
+ baseBranch,
209
+ mergeCommit: localMergeCommit,
210
+ },
211
+ };
212
+ }
213
+ const prNumber = typeof meta?.pr_number === "number" ? meta.pr_number : null;
214
+ let mergedRecord = sourceBranch.length > 0 && (meta?.status !== "MERGED" || !localMergeCommit)
215
+ ? await resolveHostedCloseMergeRecord({
216
+ gitRoot,
217
+ repo,
218
+ sourceBranch,
219
+ baseBranch: baseBranch || null,
220
+ prNumber,
221
+ })
222
+ : null;
223
+ if (!mergedRecord && localMergeCommit) {
224
+ mergedRecord = await resolveHostedCloseMergeRecordByCommit({
225
+ gitRoot,
226
+ repo,
227
+ mergeCommit: localMergeCommit,
228
+ sourceBranch: sourceBranch || null,
229
+ baseBranch: baseBranch || null,
230
+ prNumber,
231
+ });
232
+ }
233
+ if (!sourceBranch) {
234
+ sourceBranch = mergedRecord?.head?.ref?.trim() ?? "";
235
+ }
236
+ if (!baseBranch) {
237
+ baseBranch = mergedRecord?.base?.ref?.trim() ?? defaultBaseBranch?.trim() ?? "";
238
+ }
239
+ const mergeCommit = meta?.merge_commit?.trim() ??
240
+ task.commit?.hash?.trim() ??
241
+ mergedRecord?.merge_commit_sha?.trim() ??
242
+ "";
243
+ if (!sourceBranch) {
244
+ throw new CliError({
245
+ exitCode: exitCodeForError("E_VALIDATION"),
246
+ code: "E_VALIDATION",
247
+ message: `Missing hosted close source branch for ${opts.taskId}.`,
248
+ });
249
+ }
250
+ if (!mergeCommit) {
251
+ throw new CliError({
252
+ exitCode: exitCodeForError("E_VALIDATION"),
253
+ code: "E_VALIDATION",
254
+ message: `Missing hosted close merge commit for ${opts.taskId}.`,
255
+ });
256
+ }
257
+ if (meta?.status !== "MERGED" && !mergedRecord?.merged_at) {
258
+ throw new CliError({
259
+ exitCode: exitCodeForError("E_USAGE"),
260
+ code: "E_USAGE",
261
+ message: `Task ${opts.taskId} is not in MERGED hosted-close state.`,
262
+ });
263
+ }
264
+ const closeBranch = await resolveHostedCloseBranch({
265
+ gitRoot,
266
+ taskId: opts.taskId,
267
+ explicitBranch: opts.branch ?? null,
268
+ mergeCommit,
269
+ });
270
+ return {
271
+ kind: "ready",
272
+ plan: {
273
+ taskId: opts.taskId,
274
+ gitRoot,
275
+ workflowDir: opts.ctx.config.paths.workflow_dir,
276
+ repo,
277
+ sourceBranch,
278
+ baseBranch,
279
+ mergeCommit,
280
+ closeBranch,
281
+ sourcePrNumber: typeof meta?.pr_number === "number"
282
+ ? meta.pr_number
283
+ : typeof mergedRecord?.number === "number"
284
+ ? mergedRecord.number
285
+ : null,
286
+ },
287
+ };
288
+ }
@@ -0,0 +1,4 @@
1
+ import type { HostedClosePrExecutionResult, HostedClosePrOutcome } from "./hosted-close-pr.types.js";
2
+ export declare function reportHostedClosePrOutcome(outcome: HostedClosePrOutcome): void;
3
+ export declare function reportHostedClosePrExecutionResult(result: HostedClosePrExecutionResult): void;
4
+ //# sourceMappingURL=hosted-close-pr.report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-close-pr.report.d.ts","sourceRoot":"","sources":["../../../src/commands/task/hosted-close-pr.report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,4BAA4B,EAE5B,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAoBpC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE9E;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI,CAyC7F"}
@@ -0,0 +1,42 @@
1
+ import { createCliEmitter } from "../../cli/output.js";
2
+ import { shortHostedCloseSha } from "./hosted-close-pr.precheck.js";
3
+ function normalizeGithubPrLink(prNumber, prUrl, verb) {
4
+ return prUrl?.trim()
5
+ ? `${verb} GitHub PR #${prNumber}: ${prUrl.trim()}`
6
+ : `${verb} GitHub PR #${prNumber}`;
7
+ }
8
+ function reportNotice(output, notice) {
9
+ if (notice.level === "warn") {
10
+ output.warn(notice.message);
11
+ return;
12
+ }
13
+ output.info(notice.message);
14
+ }
15
+ export function reportHostedClosePrOutcome(outcome) {
16
+ reportHostedClosePrExecutionResult({ notices: [], outcome });
17
+ }
18
+ export function reportHostedClosePrExecutionResult(result) {
19
+ const output = createCliEmitter();
20
+ for (const notice of result.notices) {
21
+ reportNotice(output, notice);
22
+ }
23
+ switch (result.outcome.kind) {
24
+ case "canonical-already-present": {
25
+ output.info(`hosted-close-pr skipped: ${result.outcome.taskId} is already closed on ${result.outcome.baseBranch || "the base branch"} for merge ${shortHostedCloseSha(result.outcome.mergeCommit)}`);
26
+ return;
27
+ }
28
+ case "base-already-recorded": {
29
+ output.info(`hosted close already recorded on ${result.outcome.baseBranch}; no follow-up PR needed`);
30
+ output.success("task hosted-close-pr", result.outcome.taskId, `hosted close already recorded on ${result.outcome.baseBranch}; skipped follow-up PR`);
31
+ return;
32
+ }
33
+ case "existing-pr": {
34
+ output.success("task hosted-close-pr", result.outcome.taskId, normalizeGithubPrLink(result.outcome.prNumber, result.outcome.prUrl, "linked to"));
35
+ return;
36
+ }
37
+ case "created-pr": {
38
+ output.success("task hosted-close-pr", result.outcome.taskId, normalizeGithubPrLink(result.outcome.prNumber, result.outcome.prUrl, "created"));
39
+ return;
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,75 @@
1
+ import type { CommandContext } from "../shared/task-backend.js";
2
+ export type TaskHostedClosePrParsed = {
3
+ taskIds: string[];
4
+ branch: string | null;
5
+ repo: string | null;
6
+ };
7
+ export type GithubPullRequestRecord = {
8
+ number?: number;
9
+ html_url?: string | null;
10
+ state?: string | null;
11
+ merged_at?: string | null;
12
+ merge_commit_sha?: string | null;
13
+ head?: {
14
+ ref?: string | null;
15
+ } | null;
16
+ base?: {
17
+ ref?: string | null;
18
+ } | null;
19
+ };
20
+ export type HostedClosePrPrecheckOptions = {
21
+ ctx: CommandContext;
22
+ cwd: string;
23
+ rootOverride?: string;
24
+ taskId: string;
25
+ branch?: string | null;
26
+ repo?: string | null;
27
+ };
28
+ export type HostedClosePrPlan = {
29
+ taskId: string;
30
+ gitRoot: string;
31
+ workflowDir: string;
32
+ repo: string;
33
+ sourceBranch: string;
34
+ baseBranch: string;
35
+ mergeCommit: string;
36
+ closeBranch: string;
37
+ sourcePrNumber: number | null;
38
+ };
39
+ export type HostedClosePrOutcome = {
40
+ kind: "canonical-already-present";
41
+ taskId: string;
42
+ baseBranch: string;
43
+ mergeCommit: string;
44
+ } | {
45
+ kind: "base-already-recorded";
46
+ taskId: string;
47
+ baseBranch: string;
48
+ } | {
49
+ kind: "existing-pr";
50
+ taskId: string;
51
+ prNumber: number;
52
+ prUrl: string | null;
53
+ } | {
54
+ kind: "created-pr";
55
+ taskId: string;
56
+ closeBranch: string;
57
+ prNumber: number;
58
+ prUrl: string | null;
59
+ };
60
+ export type HostedClosePrPrecheckResult = {
61
+ kind: "skip";
62
+ outcome: HostedClosePrOutcome;
63
+ } | {
64
+ kind: "ready";
65
+ plan: HostedClosePrPlan;
66
+ };
67
+ export type HostedClosePrNotice = {
68
+ level: "info" | "warn";
69
+ message: string;
70
+ };
71
+ export type HostedClosePrExecutionResult = {
72
+ notices: HostedClosePrNotice[];
73
+ outcome: HostedClosePrOutcome;
74
+ };
75
+ //# sourceMappingURL=hosted-close-pr.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-close-pr.types.d.ts","sourceRoot":"","sources":["../../../src/commands/task/hosted-close-pr.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB,GAAG,IAAI,CAAC;IACT,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB,GAAG,IAAI,CAAC;CACV,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,GAAG,EAAE,cAAc,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,2BAA2B,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEN,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../../src/commands/upgrade/materialize.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAOnE,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkK/B"}
1
+ {"version":3,"file":"materialize.d.ts","sourceRoot":"","sources":["../../../src/commands/upgrade/materialize.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,YAAY,CAAC;AAOnE,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,KAAK,EAAE,gBAAgB,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuJ/B"}
@@ -56,15 +56,8 @@ export async function materializeUpgradeSource(opts) {
56
56
  }
57
57
  }
58
58
  else {
59
- const sourceFromFlags = typeof flags.source === "string" && flags.source.trim().length > 0;
60
59
  const originalSource = flags.source ?? opts.frameworkSource;
61
60
  const normalized = normalizeFrameworkSourceForUpgrade(originalSource);
62
- if (!sourceFromFlags && normalized.migrated) {
63
- normalizedSourceToPersist = normalized.source;
64
- }
65
- if (normalized.migrated) {
66
- process.stderr.write(`${warnMessage(`config.framework.source uses deprecated repo basilisk-labs/agent-plane; using ${normalized.source}`)}\n`);
67
- }
68
61
  const releaseUrl = flags.tag
69
62
  ? `https://api.github.com/repos/${normalized.owner}/${normalized.repo}/releases/tags/${flags.tag}`
70
63
  : `https://api.github.com/repos/${normalized.owner}/${normalized.repo}/releases/latest`;
@@ -9,7 +9,6 @@ export declare function normalizeFrameworkSourceForUpgrade(source: string): {
9
9
  source: string;
10
10
  owner: string;
11
11
  repo: string;
12
- migrated: boolean;
13
12
  };
14
13
  export declare function resolveUpgradeDownloadFromRelease(opts: {
15
14
  release: GitHubRelease;
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/commands/upgrade/source.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACjE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAMT;AAED,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAmBD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB,CAWA;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,GACG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAqB1C;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAgBT;AAED,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/commands/upgrade/source.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,YAAY,EAAE,cAAc,GAAG,gBAAgB,GAAG,cAAc,CAAC;IACjE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,CAMT;AAED,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAmBD,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAGA;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,GACG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAqB1C;AAQD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAgBT;AAED,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ9E"}
@@ -46,15 +46,7 @@ function parseGitHubRepo(source) {
46
46
  }
47
47
  export function normalizeFrameworkSourceForUpgrade(source) {
48
48
  const { owner, repo } = parseGitHubRepo(source);
49
- if (owner === "basilisk-labs" && repo === "agent-plane") {
50
- return {
51
- source: `https://github.com/${owner}/agentplane`,
52
- owner,
53
- repo: "agentplane",
54
- migrated: true,
55
- };
56
- }
57
- return { source: `https://github.com/${owner}/${repo}`, owner, repo, migrated: false };
49
+ return { source: `https://github.com/${owner}/${repo}`, owner, repo };
58
50
  }
59
51
  export function resolveUpgradeDownloadFromRelease(opts) {
60
52
  const assets = Array.isArray(opts.release.assets) ? opts.release.assets : [];
@@ -1 +1 @@
1
- {"version":3,"file":"base-prompts.d.ts","sourceRoot":"","sources":["../../../src/runner/context/base-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAChG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAS9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,0BAA0B,CAAC;AAElC,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B,CAAC,EAAE,mBAAmB,CAAC;IACrD,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,iBAAiB,CAAC,EAAE,+BAA+B,CAAC;CACrD,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqC/B"}
1
+ {"version":3,"file":"base-prompts.d.ts","sourceRoot":"","sources":["../../../src/runner/context/base-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAChG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAU9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,0BAA0B,CAAC;AAElC,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B,CAAC,EAAE,mBAAmB,CAAC;IACrD,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,iBAAiB,CAAC,EAAE,+BAA+B,CAAC;CACrD,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwC/B"}
@@ -1,5 +1,6 @@
1
1
  import { loadExecutionProfilePrompt, loadOwnerProfilePrompt, loadPolicyGatewayPrompt, } from "./base-prompt-sources.js";
2
2
  import { collectOverlayPromptBlocks } from "./overlay-prompt-blocks.js";
3
+ import { collectProjectSkillPromptBlocks } from "./project-skill-prompt-blocks.js";
3
4
  import { loadFrameworkRunnerPrompt, normalizeOwnerId } from "./prompt-block-shared.js";
4
5
  import { collectRecipePromptBlocks } from "./recipe-prompt-blocks.js";
5
6
  export { resolveOwnerProfilePromptSource, resolvePolicyGatewayPromptSource, } from "./base-prompt-sources.js";
@@ -26,6 +27,9 @@ export async function collectRunnerBasePrompts(opts) {
26
27
  task: opts.task,
27
28
  command: opts.command,
28
29
  })),
30
+ ...(await collectProjectSkillPromptBlocks({
31
+ git_root: opts.git_root,
32
+ })),
29
33
  ...(await collectRecipePromptBlocks({
30
34
  git_root: opts.git_root,
31
35
  recipe: opts.recipe ?? { recipe_id: "", scenario_id: "" },
@@ -0,0 +1,5 @@
1
+ import type { RunnerPromptBlock } from "../types.js";
2
+ export declare function collectProjectSkillPromptBlocks(opts: {
3
+ git_root: string;
4
+ }): Promise<RunnerPromptBlock[]>;
5
+ //# sourceMappingURL=project-skill-prompt-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-skill-prompt-blocks.d.ts","sourceRoot":"","sources":["../../../src/runner/context/project-skill-prompt-blocks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8BrD,wBAAsB,+BAA+B,CAAC,IAAI,EAAE;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA4B/B"}
@@ -0,0 +1,57 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileExists } from "../../cli/fs-utils.js";
4
+ import { normalizeText } from "./prompt-block-shared.js";
5
+ const PROJECT_SKILLS_PRIORITY = 350;
6
+ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
7
+ function parseFrontmatterStringField(frontmatter, key) {
8
+ const line = frontmatter.split(/\r?\n/).find((entry) => entry.trimStart().startsWith(`${key}:`));
9
+ if (!line)
10
+ return null;
11
+ const raw = line.slice(line.indexOf(":") + 1).trim();
12
+ if (!raw)
13
+ return null;
14
+ return raw.replaceAll(/^['"]|['"]$/g, "").trim() || null;
15
+ }
16
+ function parseSkillMetadata(source, text) {
17
+ const match = FRONTMATTER_RE.exec(text);
18
+ if (!match)
19
+ return null;
20
+ const frontmatter = match[1] ?? "";
21
+ const name = parseFrontmatterStringField(frontmatter, "name");
22
+ const description = parseFrontmatterStringField(frontmatter, "description");
23
+ if (!name || !description)
24
+ return null;
25
+ return { name, description, source };
26
+ }
27
+ export async function collectProjectSkillPromptBlocks(opts) {
28
+ const skillsRoot = path.join(opts.git_root, "skills");
29
+ if (!(await fileExists(skillsRoot)))
30
+ return [];
31
+ const entries = await readdir(skillsRoot, { withFileTypes: true });
32
+ const metadata = [];
33
+ for (const entry of entries) {
34
+ if (!entry.isDirectory())
35
+ continue;
36
+ const skillPath = path.join(skillsRoot, entry.name, "SKILL.md");
37
+ if (!(await fileExists(skillPath)))
38
+ continue;
39
+ const source = path.relative(opts.git_root, skillPath).replaceAll("\\", "/");
40
+ const parsed = parseSkillMetadata(source, await readFile(skillPath, "utf8"));
41
+ if (parsed)
42
+ metadata.push(parsed);
43
+ }
44
+ if (metadata.length === 0)
45
+ return [];
46
+ metadata.sort((left, right) => left.name.localeCompare(right.name));
47
+ return [
48
+ {
49
+ id: "project.skills_index",
50
+ role: "context",
51
+ title: "Repository Skill Discovery",
52
+ source: "skills/*/SKILL.md",
53
+ priority: PROJECT_SKILLS_PRIORITY,
54
+ content: normalizeText(JSON.stringify({ skills: metadata }, null, 2)),
55
+ },
56
+ ];
57
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/runner/process-supervision/run.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmVnC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/runner/process-supervision/run.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,cAAc,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC3C,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAqVnC"}