@jskit-ai/jskit-cli 0.2.88 → 0.2.90
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/package.json +4 -4
- package/src/server/commandHandlers/session.js +173 -142
- package/src/server/core/argParser.js +0 -4
- package/src/server/core/commandCatalog.js +47 -35
- package/src/server/sessionRuntime/constants.js +130 -353
- package/src/server/sessionRuntime/io.js +2 -2
- package/src/server/sessionRuntime/preconditions.js +40 -144
- package/src/server/sessionRuntime/promptRenderer.js +2 -15
- package/src/server/sessionRuntime/prompts/app_blueprint.md +2 -7
- package/src/server/sessionRuntime/prompts/{automated_checks.md → automated_checks_run.md} +2 -17
- package/src/server/sessionRuntime/prompts/{update_blueprint.md → blueprint_updated.md} +2 -11
- package/src/server/sessionRuntime/prompts/{deep_ui_check.md → deep_ui_check_run.md} +2 -19
- package/src/server/sessionRuntime/prompts/final_report_created.md +44 -0
- package/src/server/sessionRuntime/prompts/issue_created.md +26 -0
- package/src/server/sessionRuntime/prompts/issue_prompt_rendered.md +1 -0
- package/src/server/sessionRuntime/prompts/{plan_issue.md → make_plan.md} +8 -37
- package/src/server/sessionRuntime/prompts/{execute_plan.md → plan_executed.md} +4 -29
- package/src/server/sessionRuntime/prompts/{prepare_pr_merge.md → pr_merge_prepared.md} +3 -3
- package/src/server/sessionRuntime/prompts/{resolve_deslop_findings.md → review_changes_accepted_resolve.md} +2 -6
- package/src/server/sessionRuntime/prompts/{review_changes.md → review_prompt_rendered.md} +3 -28
- package/src/server/sessionRuntime/prompts/{user_check.md → user_check_completed.md} +1 -11
- package/src/server/sessionRuntime/responses.js +504 -295
- package/src/server/sessionRuntime.js +1300 -961
- package/src/server/sessionRuntime/prompts/issue_details.md +0 -49
- package/src/server/sessionRuntime/prompts/new_issue.md +0 -46
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/jskit-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.90",
|
|
4
4
|
"description": "Bundle and package orchestration CLI for JSKIT apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"test": "node --test"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@jskit-ai/jskit-catalog": "0.1.
|
|
24
|
-
"@jskit-ai/kernel": "0.1.
|
|
25
|
-
"@jskit-ai/shell-web": "0.1.
|
|
23
|
+
"@jskit-ai/jskit-catalog": "0.1.89",
|
|
24
|
+
"@jskit-ai/kernel": "0.1.81",
|
|
25
|
+
"@jskit-ai/shell-web": "0.1.80",
|
|
26
26
|
"@vue/compiler-sfc": "^3.5.29",
|
|
27
27
|
"ts-morph": "^28.0.0"
|
|
28
28
|
},
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import {
|
|
3
3
|
abandonSession,
|
|
4
|
+
advanceSessionStep,
|
|
4
5
|
adoptCodexThreadId,
|
|
5
6
|
buildSessionErrorResponse,
|
|
6
7
|
createSession,
|
|
@@ -8,7 +9,8 @@ import {
|
|
|
8
9
|
inspectSessionDetails,
|
|
9
10
|
listSessions,
|
|
10
11
|
rewindSession,
|
|
11
|
-
runSessionStep
|
|
12
|
+
runSessionStep,
|
|
13
|
+
runSessionStepAction
|
|
12
14
|
} from "../sessionRuntime.js";
|
|
13
15
|
|
|
14
16
|
function writeJson(stdout, payload) {
|
|
@@ -77,6 +79,12 @@ function writeSessionText(stdout, payload) {
|
|
|
77
79
|
if (payload.nextCommand) {
|
|
78
80
|
stdout.write(`Next: ${payload.nextCommand}\n`);
|
|
79
81
|
}
|
|
82
|
+
if (payload.actionCommands?.length) {
|
|
83
|
+
stdout.write("Available commands:\n");
|
|
84
|
+
for (const command of payload.actionCommands) {
|
|
85
|
+
stdout.write(`- ${command.command}\n`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
async function readStream(stream) {
|
|
@@ -161,66 +169,6 @@ async function resolveStepInputs({
|
|
|
161
169
|
};
|
|
162
170
|
}
|
|
163
171
|
|
|
164
|
-
const issueTitle = await resolveTextInput({
|
|
165
|
-
codePrefix: "issue_title",
|
|
166
|
-
fileOption: "issue-title-file",
|
|
167
|
-
inlineOptions,
|
|
168
|
-
io,
|
|
169
|
-
repairCommand: `jskit session ${sessionId} step --issue-title "<title>" --issue -`,
|
|
170
|
-
cwd,
|
|
171
|
-
sessionId,
|
|
172
|
-
stdinOption: "-",
|
|
173
|
-
textOption: "issue-title"
|
|
174
|
-
});
|
|
175
|
-
if (issueTitle.ok === false) {
|
|
176
|
-
return issueTitle;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
const issue = await resolveTextInput({
|
|
180
|
-
codePrefix: "issue",
|
|
181
|
-
fileOption: "issue-file",
|
|
182
|
-
inlineOptions,
|
|
183
|
-
io,
|
|
184
|
-
repairCommand: `jskit session ${sessionId} step --issue -`,
|
|
185
|
-
cwd,
|
|
186
|
-
sessionId,
|
|
187
|
-
stdinOption: "-",
|
|
188
|
-
textOption: "issue"
|
|
189
|
-
});
|
|
190
|
-
if (issue.ok === false) {
|
|
191
|
-
return issue;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const plan = await resolveTextInput({
|
|
195
|
-
codePrefix: "plan",
|
|
196
|
-
fileOption: "plan-file",
|
|
197
|
-
inlineOptions,
|
|
198
|
-
io,
|
|
199
|
-
repairCommand: `jskit session ${sessionId} step --plan -`,
|
|
200
|
-
cwd,
|
|
201
|
-
sessionId,
|
|
202
|
-
stdinOption: "-",
|
|
203
|
-
textOption: "plan"
|
|
204
|
-
});
|
|
205
|
-
if (plan.ok === false) {
|
|
206
|
-
return plan;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const issueDetails = await resolveTextInput({
|
|
210
|
-
codePrefix: "issue_details",
|
|
211
|
-
fileOption: "issue-details-file",
|
|
212
|
-
inlineOptions,
|
|
213
|
-
io,
|
|
214
|
-
repairCommand: `jskit session ${sessionId} step --issue-details -`,
|
|
215
|
-
cwd,
|
|
216
|
-
sessionId,
|
|
217
|
-
stdinOption: "-",
|
|
218
|
-
textOption: "issue-details"
|
|
219
|
-
});
|
|
220
|
-
if (issueDetails.ok === false) {
|
|
221
|
-
return issueDetails;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
172
|
const reworkNotes = await resolveTextInput({
|
|
225
173
|
codePrefix: "rework_notes",
|
|
226
174
|
fileOption: "rework-notes-file",
|
|
@@ -241,7 +189,7 @@ async function resolveStepInputs({
|
|
|
241
189
|
fileOption: "skip-reason-file",
|
|
242
190
|
inlineOptions,
|
|
243
191
|
io,
|
|
244
|
-
repairCommand: `jskit session ${sessionId}
|
|
192
|
+
repairCommand: `jskit session ${sessionId} skip --skip-reason "<reason>"`,
|
|
245
193
|
cwd,
|
|
246
194
|
sessionId,
|
|
247
195
|
stdinOption: "-",
|
|
@@ -251,60 +199,8 @@ async function resolveStepInputs({
|
|
|
251
199
|
return skipReason;
|
|
252
200
|
}
|
|
253
201
|
|
|
254
|
-
const agentDecisions = await resolveTextInput({
|
|
255
|
-
codePrefix: "agent_decisions",
|
|
256
|
-
fileOption: "agent-decisions-file",
|
|
257
|
-
inlineOptions,
|
|
258
|
-
io,
|
|
259
|
-
repairCommand: `jskit session ${sessionId} step --agent-decisions -`,
|
|
260
|
-
cwd,
|
|
261
|
-
sessionId,
|
|
262
|
-
stdinOption: "-",
|
|
263
|
-
textOption: "agent-decisions"
|
|
264
|
-
});
|
|
265
|
-
if (agentDecisions.ok === false) {
|
|
266
|
-
return agentDecisions;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const closeReason = await resolveTextInput({
|
|
270
|
-
codePrefix: "close_reason",
|
|
271
|
-
fileOption: "close-reason-file",
|
|
272
|
-
inlineOptions,
|
|
273
|
-
io,
|
|
274
|
-
repairCommand: `jskit session ${sessionId} step --skip-merge --close-reason "<reason>"`,
|
|
275
|
-
cwd,
|
|
276
|
-
sessionId,
|
|
277
|
-
stdinOption: "-",
|
|
278
|
-
textOption: "close-reason"
|
|
279
|
-
});
|
|
280
|
-
if (closeReason.ok === false) {
|
|
281
|
-
return closeReason;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const codexResult = await resolveTextInput({
|
|
285
|
-
codePrefix: "codex_result",
|
|
286
|
-
fileOption: "codex-result-file",
|
|
287
|
-
inlineOptions,
|
|
288
|
-
io,
|
|
289
|
-
repairCommand: `jskit session ${sessionId} step --codex-result -`,
|
|
290
|
-
cwd,
|
|
291
|
-
sessionId,
|
|
292
|
-
stdinOption: "-",
|
|
293
|
-
textOption: "codex-result"
|
|
294
|
-
});
|
|
295
|
-
if (codexResult.ok === false) {
|
|
296
|
-
return codexResult;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
202
|
return {
|
|
300
|
-
agentDecisions: agentDecisions.value,
|
|
301
|
-
closeReason: closeReason.value,
|
|
302
|
-
codexResult: codexResult.value,
|
|
303
|
-
issue: issue.value,
|
|
304
|
-
issueTitle: issueTitle.value,
|
|
305
203
|
ok: true,
|
|
306
|
-
plan: plan.value,
|
|
307
|
-
issueDetails: issueDetails.value,
|
|
308
204
|
reworkNotes: reworkNotes.value,
|
|
309
205
|
skipReason: skipReason.value
|
|
310
206
|
};
|
|
@@ -313,15 +209,14 @@ async function resolveStepInputs({
|
|
|
313
209
|
function normalizeStepOptions(inlineOptions = {}) {
|
|
314
210
|
const options = {
|
|
315
211
|
...inlineOptions,
|
|
316
|
-
closeWithoutMerge: inlineOptions["close-without-merge"] === "true" ||
|
|
317
|
-
inlineOptions.closeWithoutMerge === true ||
|
|
318
|
-
inlineOptions["skip-merge"] === "true" ||
|
|
319
|
-
inlineOptions.skipMerge === true,
|
|
320
212
|
mergePr: inlineOptions["merge-pr"] === "true" || inlineOptions.mergePr === true,
|
|
321
213
|
prompt: inlineOptions.prompt,
|
|
322
214
|
reviewFindings: inlineOptions["review-findings"] || inlineOptions.reviewFindings,
|
|
323
|
-
|
|
324
|
-
|
|
215
|
+
resolveDeslop: inlineOptions["resolve-deslop"] === "true" || inlineOptions.resolveDeslop === true,
|
|
216
|
+
skipStep: inlineOptions["skip-step"] === "true" ||
|
|
217
|
+
inlineOptions.skipStep === true ||
|
|
218
|
+
inlineOptions.skip === true ||
|
|
219
|
+
inlineOptions.skip === "true",
|
|
325
220
|
userCheck: inlineOptions["user-check"] || inlineOptions.userCheck
|
|
326
221
|
};
|
|
327
222
|
if (Object.hasOwn(inlineOptions, "review-findings-remaining") || Object.hasOwn(inlineOptions, "reviewFindingsRemaining")) {
|
|
@@ -345,6 +240,96 @@ function resolveListArchiveOption(options = {}) {
|
|
|
345
240
|
return archives.length > 0 ? archives : "active";
|
|
346
241
|
}
|
|
347
242
|
|
|
243
|
+
async function runSessionStepCommand({
|
|
244
|
+
cwd,
|
|
245
|
+
inlineOptions = {},
|
|
246
|
+
io = {},
|
|
247
|
+
sessionId
|
|
248
|
+
}) {
|
|
249
|
+
const stepInputs = await resolveStepInputs({
|
|
250
|
+
inlineOptions,
|
|
251
|
+
io,
|
|
252
|
+
cwd,
|
|
253
|
+
sessionId
|
|
254
|
+
});
|
|
255
|
+
return stepInputs.ok === false
|
|
256
|
+
? stepInputs.payload
|
|
257
|
+
: runSessionStep({
|
|
258
|
+
targetRoot: cwd,
|
|
259
|
+
sessionId,
|
|
260
|
+
options: {
|
|
261
|
+
...normalizeStepOptions(inlineOptions),
|
|
262
|
+
reworkNotes: stepInputs.reworkNotes,
|
|
263
|
+
skipReason: stepInputs.skipReason
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function runNextSessionStep({
|
|
269
|
+
cwd,
|
|
270
|
+
sessionId
|
|
271
|
+
}) {
|
|
272
|
+
return advanceSessionStep({
|
|
273
|
+
targetRoot: cwd,
|
|
274
|
+
sessionId
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
async function runSkipSessionStep({
|
|
279
|
+
cwd,
|
|
280
|
+
inlineOptions = {},
|
|
281
|
+
io = {},
|
|
282
|
+
sessionId
|
|
283
|
+
}) {
|
|
284
|
+
return runSessionStepCommand({
|
|
285
|
+
cwd,
|
|
286
|
+
inlineOptions: {
|
|
287
|
+
...inlineOptions,
|
|
288
|
+
skipStep: true
|
|
289
|
+
},
|
|
290
|
+
io,
|
|
291
|
+
sessionId
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
async function runDeslopSessionStep({
|
|
296
|
+
cwd,
|
|
297
|
+
sessionId
|
|
298
|
+
}) {
|
|
299
|
+
const details = await inspectSessionDetails({
|
|
300
|
+
targetRoot: cwd,
|
|
301
|
+
sessionId
|
|
302
|
+
});
|
|
303
|
+
if (details.ok === false) {
|
|
304
|
+
return details;
|
|
305
|
+
}
|
|
306
|
+
if (details.currentStep === "review_changes_accepted") {
|
|
307
|
+
const accepted = await runSessionStep({
|
|
308
|
+
targetRoot: cwd,
|
|
309
|
+
sessionId,
|
|
310
|
+
options: {
|
|
311
|
+
reviewFindingsRemaining: true
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
if (accepted.ok === false) {
|
|
315
|
+
return accepted;
|
|
316
|
+
}
|
|
317
|
+
} else if (details.currentStep !== "review_prompt_rendered") {
|
|
318
|
+
return buildSessionErrorResponse({
|
|
319
|
+
targetRoot: cwd,
|
|
320
|
+
sessionId,
|
|
321
|
+
code: "deslop_not_current_step",
|
|
322
|
+
message: `Cannot run deslop while current step is ${details.currentStep || "done"}.`,
|
|
323
|
+
repairCommand: `jskit session ${sessionId}`
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return runSessionStep({
|
|
327
|
+
targetRoot: cwd,
|
|
328
|
+
sessionId,
|
|
329
|
+
options: {}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
348
333
|
function createSessionCommands() {
|
|
349
334
|
return {
|
|
350
335
|
async commandSession({
|
|
@@ -354,7 +339,7 @@ function createSessionCommands() {
|
|
|
354
339
|
stdout,
|
|
355
340
|
io = {}
|
|
356
341
|
} = {}) {
|
|
357
|
-
const [first, second] = positional;
|
|
342
|
+
const [first, second, third] = positional;
|
|
358
343
|
const inlineOptions = options.inlineOptions || {};
|
|
359
344
|
let payload;
|
|
360
345
|
|
|
@@ -363,33 +348,79 @@ function createSessionCommands() {
|
|
|
363
348
|
targetRoot: cwd,
|
|
364
349
|
archive: resolveListArchiveOption(options)
|
|
365
350
|
});
|
|
366
|
-
} else if (first === "create") {
|
|
351
|
+
} else if (first === "create" || first === "new") {
|
|
367
352
|
payload = await createSession({ targetRoot: cwd });
|
|
368
353
|
} else if (second === "step") {
|
|
369
|
-
|
|
354
|
+
payload = await inspectSessionDetails({
|
|
355
|
+
targetRoot: cwd,
|
|
356
|
+
sessionId: first
|
|
357
|
+
});
|
|
358
|
+
} else if (second === "run") {
|
|
359
|
+
const details = await inspectSessionDetails({
|
|
360
|
+
targetRoot: cwd,
|
|
361
|
+
sessionId: first
|
|
362
|
+
});
|
|
363
|
+
payload = {
|
|
364
|
+
...details,
|
|
365
|
+
ok: false,
|
|
366
|
+
errors: [
|
|
367
|
+
{
|
|
368
|
+
code: "explicit_session_action_required",
|
|
369
|
+
message: "Generic run is not a session action. Use one of the available step commands, then run next."
|
|
370
|
+
}
|
|
371
|
+
]
|
|
372
|
+
};
|
|
373
|
+
} else if ([
|
|
374
|
+
"create_worktree",
|
|
375
|
+
"run_npm_install",
|
|
376
|
+
"define_issue",
|
|
377
|
+
"create_issue_file",
|
|
378
|
+
"create_issue_on_gh",
|
|
379
|
+
"make_plan",
|
|
380
|
+
"execute_plan",
|
|
381
|
+
"run_deep_ui_check",
|
|
382
|
+
"run_automated_checks",
|
|
383
|
+
"update_blueprint",
|
|
384
|
+
"commit_changes",
|
|
385
|
+
"create_pull_request_file",
|
|
386
|
+
"create_pr_on_gh",
|
|
387
|
+
"prepare_for_merge",
|
|
388
|
+
"merge_pr",
|
|
389
|
+
"sync_main_checkout",
|
|
390
|
+
"finish_session"
|
|
391
|
+
].includes(second)) {
|
|
392
|
+
payload = await runSessionStepAction({
|
|
393
|
+
action: second,
|
|
394
|
+
targetRoot: cwd,
|
|
395
|
+
sessionId: first,
|
|
396
|
+
options: normalizeStepOptions(inlineOptions)
|
|
397
|
+
});
|
|
398
|
+
} else if (second === "next") {
|
|
399
|
+
payload = await runNextSessionStep({
|
|
400
|
+
cwd,
|
|
401
|
+
sessionId: first
|
|
402
|
+
});
|
|
403
|
+
} else if (second === "skip") {
|
|
404
|
+
payload = await runSkipSessionStep({
|
|
405
|
+
cwd,
|
|
370
406
|
inlineOptions,
|
|
371
407
|
io,
|
|
408
|
+
sessionId: first
|
|
409
|
+
});
|
|
410
|
+
} else if (second === "deslop") {
|
|
411
|
+
payload = await runDeslopSessionStep({
|
|
372
412
|
cwd,
|
|
373
413
|
sessionId: first
|
|
374
414
|
});
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
:
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
plan: stepInputs.plan,
|
|
385
|
-
issueDetails: stepInputs.issueDetails,
|
|
386
|
-
reworkNotes: stepInputs.reworkNotes,
|
|
387
|
-
skipReason: stepInputs.skipReason,
|
|
388
|
-
agentDecisions: stepInputs.agentDecisions,
|
|
389
|
-
closeReason: stepInputs.closeReason,
|
|
390
|
-
codexResult: stepInputs.codexResult
|
|
391
|
-
}
|
|
392
|
-
});
|
|
415
|
+
} else if (second === "resolve-deslop") {
|
|
416
|
+
payload = await runSessionStepAction({
|
|
417
|
+
action: "resolve_deslop",
|
|
418
|
+
targetRoot: cwd,
|
|
419
|
+
sessionId: first,
|
|
420
|
+
options: {
|
|
421
|
+
resolveDeslop: true
|
|
422
|
+
}
|
|
423
|
+
});
|
|
393
424
|
} else if (second === "abandon") {
|
|
394
425
|
payload = await abandonSession({
|
|
395
426
|
targetRoot: cwd,
|
|
@@ -404,7 +435,7 @@ function createSessionCommands() {
|
|
|
404
435
|
payload = await rewindSession({
|
|
405
436
|
targetRoot: cwd,
|
|
406
437
|
sessionId: first,
|
|
407
|
-
stepId: inlineOptions.step
|
|
438
|
+
stepId: inlineOptions.step || third
|
|
408
439
|
});
|
|
409
440
|
} else if (second === "adopt-codex-thread") {
|
|
410
441
|
payload = await adoptCodexThreadId({
|
|
@@ -137,10 +137,6 @@ function parseArgs(argv, { createCliError } = {}) {
|
|
|
137
137
|
options.inlineOptions.install = "true";
|
|
138
138
|
continue;
|
|
139
139
|
}
|
|
140
|
-
if (token === "--skip-ui-check") {
|
|
141
|
-
options.inlineOptions["skip-ui-check"] = "true";
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
140
|
if (token === "--close-without-merge") {
|
|
145
141
|
options.inlineOptions["close-without-merge"] = "true";
|
|
146
142
|
continue;
|
|
@@ -212,8 +212,8 @@ const COMMAND_DESCRIPTORS = Object.freeze({
|
|
|
212
212
|
description: "Create a session, inspect a session, or run a session subcommand."
|
|
213
213
|
}),
|
|
214
214
|
Object.freeze({
|
|
215
|
-
name: "[step|diff|rewind|abandon|adopt-codex-thread]",
|
|
216
|
-
description: "
|
|
215
|
+
name: "[step|create_worktree|run_npm_install|define_issue|create_issue_file|create_issue_on_gh|make_plan|execute_plan|run_deep_ui_check|run_automated_checks|update_blueprint|commit_changes|create_pull_request_file|create_pr_on_gh|prepare_for_merge|merge_pr|sync_main_checkout|finish_session|next|skip|deslop|resolve-deslop|diff|rewind|abandon|adopt-codex-thread]",
|
|
216
|
+
description: "Inspect, run an explicit step command, continue, skip, deslop, inspect a diff, rewind, abandon, or attach a Codex thread id."
|
|
217
217
|
})
|
|
218
218
|
]),
|
|
219
219
|
defaults: Object.freeze([
|
|
@@ -222,22 +222,22 @@ const COMMAND_DESCRIPTORS = Object.freeze({
|
|
|
222
222
|
"The session id is timestamp-based and is the primary key.",
|
|
223
223
|
"Bare list output includes active sessions only; use --abandoned, --completed, or --all for archived sessions.",
|
|
224
224
|
"Use --json for the stable machine-readable contract consumed by JSKIT AI Studio.",
|
|
225
|
-
"
|
|
226
|
-
"Use
|
|
227
|
-
"Use
|
|
228
|
-
"Use
|
|
229
|
-
"Use
|
|
230
|
-
"Use
|
|
231
|
-
"Use
|
|
232
|
-
"Use
|
|
233
|
-
"Use --
|
|
234
|
-
"Use --review-findings-remaining
|
|
235
|
-
"Use
|
|
236
|
-
"Use --
|
|
237
|
-
"Use
|
|
238
|
-
"Use
|
|
239
|
-
"Use
|
|
240
|
-
"Use
|
|
225
|
+
"Issue handoff is file-based: Codex writes issue.md under the session root, then the user runs next. Plans stay in the terminal.",
|
|
226
|
+
"Use step to inspect the current step without running its work.",
|
|
227
|
+
"Use explicit step commands such as create_worktree, run_npm_install, define_issue, create_issue_file, create_issue_on_gh, make_plan, execute_plan, run_deep_ui_check, run_automated_checks, update_blueprint, commit_changes, create_pull_request_file, create_pr_on_gh, prepare_for_merge, merge_pr, sync_main_checkout, and finish_session to do the current step's work.",
|
|
228
|
+
"Use next to move to the next step after the current step's required work/result exists.",
|
|
229
|
+
"Use skip to record the current step as skipped and move to the next step.",
|
|
230
|
+
"Use deslop to run the review/deslop prompt from either review/deslop step.",
|
|
231
|
+
"Use resolve-deslop to send the explicit resolve review/deslop prompt. Nothing advances automatically afterward.",
|
|
232
|
+
"Use rewind <step_id> or rewind --step <step_id> to delete a completed step and later JSKIT-owned session artifacts.",
|
|
233
|
+
"Use --rework-notes - with --user-check failed to stay on user check and decide where to rewind.",
|
|
234
|
+
"Use deslop instead of hand-writing --review-findings-remaining true.",
|
|
235
|
+
"Use next instead of hand-writing --review-findings-remaining false.",
|
|
236
|
+
"Use skip --skip-reason \"<reason>\" when a step is intentionally skipped.",
|
|
237
|
+
"Use prepare_for_merge at Merge PR to render the Codex prep prompt.",
|
|
238
|
+
"Use merge_pr at Merge PR to attempt the GitHub merge.",
|
|
239
|
+
"Use sync_main_checkout at Sync main checkout after a successful merge.",
|
|
240
|
+
"Use finish_session at Congratulations! to archive the completed session.",
|
|
241
241
|
"Run the blueprint step once to render its Codex prompt, then again after Codex updates .jskit/APP_BLUEPRINT.md."
|
|
242
242
|
]),
|
|
243
243
|
examples: Object.freeze([
|
|
@@ -246,29 +246,41 @@ const COMMAND_DESCRIPTORS = Object.freeze({
|
|
|
246
246
|
lines: Object.freeze([
|
|
247
247
|
"jskit session create",
|
|
248
248
|
"jskit session 2026-05-11_21-42-08 step",
|
|
249
|
-
"jskit session 2026-05-11_21-42-08
|
|
250
|
-
"jskit session 2026-05-11_21-42-08
|
|
251
|
-
"jskit session 2026-05-11_21-42-08
|
|
252
|
-
"jskit session 2026-05-11_21-42-08
|
|
253
|
-
"jskit session 2026-05-11_21-42-08
|
|
254
|
-
"jskit session 2026-05-11_21-42-08
|
|
255
|
-
"jskit session 2026-05-11_21-42-08
|
|
256
|
-
"jskit session 2026-05-11_21-42-08
|
|
257
|
-
"jskit session 2026-05-11_21-42-08
|
|
258
|
-
"jskit session 2026-05-11_21-42-08
|
|
259
|
-
"jskit session 2026-05-11_21-42-08
|
|
260
|
-
"jskit session 2026-05-11_21-42-08
|
|
261
|
-
"jskit session 2026-05-11_21-42-08
|
|
262
|
-
"jskit session 2026-05-11_21-42-08
|
|
263
|
-
"jskit session 2026-05-11_21-42-08
|
|
249
|
+
"jskit session 2026-05-11_21-42-08 create_worktree",
|
|
250
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
251
|
+
"jskit session 2026-05-11_21-42-08 run_npm_install",
|
|
252
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
253
|
+
"jskit session 2026-05-11_21-42-08 define_issue --prompt \"Fix the customer filters\"",
|
|
254
|
+
"jskit session 2026-05-11_21-42-08 skip --skip-reason \"Handled outside JSKIT\"",
|
|
255
|
+
"jskit session 2026-05-11_21-42-08 create_issue_file",
|
|
256
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
257
|
+
"jskit session 2026-05-11_21-42-08 create_issue_on_gh",
|
|
258
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
259
|
+
"jskit session 2026-05-11_21-42-08 make_plan",
|
|
260
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
261
|
+
"jskit session 2026-05-11_21-42-08 execute_plan",
|
|
262
|
+
"jskit session 2026-05-11_21-42-08 deslop",
|
|
263
|
+
"jskit session 2026-05-11_21-42-08 resolve-deslop",
|
|
264
|
+
"jskit session 2026-05-11_21-42-08 commit_changes",
|
|
265
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
266
|
+
"jskit session 2026-05-11_21-42-08 create_pull_request_file",
|
|
267
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
268
|
+
"jskit session 2026-05-11_21-42-08 create_pr_on_gh",
|
|
269
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
270
|
+
"jskit session 2026-05-11_21-42-08 prepare_for_merge",
|
|
271
|
+
"jskit session 2026-05-11_21-42-08 merge_pr",
|
|
272
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
273
|
+
"jskit session 2026-05-11_21-42-08 sync_main_checkout",
|
|
274
|
+
"jskit session 2026-05-11_21-42-08 next",
|
|
275
|
+
"jskit session 2026-05-11_21-42-08 finish_session",
|
|
264
276
|
"jskit session 2026-05-11_21-42-08 step --user-check failed --rework-notes -",
|
|
265
|
-
"jskit session 2026-05-11_21-42-08 rewind
|
|
277
|
+
"jskit session 2026-05-11_21-42-08 rewind plan_made --json",
|
|
266
278
|
"jskit session 2026-05-11_21-42-08 diff --json"
|
|
267
279
|
])
|
|
268
280
|
})
|
|
269
281
|
]),
|
|
270
282
|
fullUse:
|
|
271
|
-
"jskit session [create|<sessionId>] [step|diff|rewind|abandon|adopt-codex-thread] [
|
|
283
|
+
"jskit session [create|new|<sessionId>] [step|create_worktree|run_npm_install|define_issue|create_issue_file|create_issue_on_gh|make_plan|execute_plan|run_deep_ui_check|run_automated_checks|update_blueprint|commit_changes|create_pull_request_file|create_pr_on_gh|prepare_for_merge|merge_pr|sync_main_checkout|finish_session|next|skip|deslop|resolve-deslop|diff|rewind|abandon|adopt-codex-thread] [step_id] [--step <step_id>] [--prompt <text>] [--review-findings-remaining true|--review-findings-remaining false] [--resolve-deslop true] [--skip-step true|skip --skip-reason <text>] [--user-check <passed|failed>] [--rework-notes <text>|--rework-notes-file <path>] [--codex-thread-id <id>] [--abandoned|--completed|--all] [--json]",
|
|
272
284
|
showHelpOnBareInvocation: false,
|
|
273
285
|
handlerName: "commandSession",
|
|
274
286
|
allowedFlagKeys: Object.freeze(["json", "abandoned", "completed", "all"]),
|