@jskit-ai/jskit-cli 0.2.89 → 0.2.91

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 (25) hide show
  1. package/package.json +4 -4
  2. package/src/server/commandHandlers/session.js +173 -142
  3. package/src/server/core/argParser.js +0 -4
  4. package/src/server/core/commandCatalog.js +47 -35
  5. package/src/server/sessionRuntime/constants.js +125 -348
  6. package/src/server/sessionRuntime/io.js +2 -2
  7. package/src/server/sessionRuntime/preconditions.js +39 -143
  8. package/src/server/sessionRuntime/promptRenderer.js +2 -15
  9. package/src/server/sessionRuntime/prompts/app_blueprint.md +2 -7
  10. package/src/server/sessionRuntime/prompts/{automated_checks.md → automated_checks_run.md} +2 -17
  11. package/src/server/sessionRuntime/prompts/{update_blueprint.md → blueprint_updated.md} +2 -11
  12. package/src/server/sessionRuntime/prompts/{deep_ui_check.md → deep_ui_check_run.md} +2 -19
  13. package/src/server/sessionRuntime/prompts/final_report_created.md +44 -0
  14. package/src/server/sessionRuntime/prompts/issue_created.md +26 -0
  15. package/src/server/sessionRuntime/prompts/issue_prompt_rendered.md +1 -0
  16. package/src/server/sessionRuntime/prompts/{plan_issue.md → make_plan.md} +8 -37
  17. package/src/server/sessionRuntime/prompts/{execute_plan.md → plan_executed.md} +4 -29
  18. package/src/server/sessionRuntime/prompts/{prepare_pr_merge.md → pr_merge_prepared.md} +3 -3
  19. package/src/server/sessionRuntime/prompts/{resolve_deslop_findings.md → review_changes_accepted_resolve.md} +2 -6
  20. package/src/server/sessionRuntime/prompts/{review_changes.md → review_prompt_rendered.md} +3 -28
  21. package/src/server/sessionRuntime/prompts/{user_check.md → user_check_completed.md} +1 -11
  22. package/src/server/sessionRuntime/responses.js +431 -292
  23. package/src/server/sessionRuntime.js +1201 -926
  24. package/src/server/sessionRuntime/prompts/issue_details.md +0 -49
  25. 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.89",
3
+ "version": "0.2.91",
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.88",
24
- "@jskit-ai/kernel": "0.1.80",
25
- "@jskit-ai/shell-web": "0.1.79",
23
+ "@jskit-ai/jskit-catalog": "0.1.90",
24
+ "@jskit-ai/kernel": "0.1.82",
25
+ "@jskit-ai/shell-web": "0.1.81",
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} step --skip-ui-check --skip-reason "<reason>"`,
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
- skipMainSync: inlineOptions["skip-main-sync"] === "true" || inlineOptions.skipMainSync === true,
324
- skipUiCheck: inlineOptions["skip-ui-check"] === "true" || inlineOptions.skipUiCheck === true,
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
- const stepInputs = await resolveStepInputs({
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
- payload = stepInputs.ok === false
376
- ? stepInputs.payload
377
- : await runSessionStep({
378
- targetRoot: cwd,
379
- sessionId: first,
380
- options: {
381
- ...normalizeStepOptions(inlineOptions),
382
- issue: stepInputs.issue,
383
- issueTitle: stepInputs.issueTitle,
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: "Run the next step, inspect a diff, rewind a session, abandon a session, or attach a Codex thread id."
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
- "Use --issue - to read approved issue body from stdin.",
226
- "Use --issue-title when the approved issue title is separate from the body.",
227
- "Use --issue-details - to read confirmed issue details from stdin.",
228
- "Use --plan - to read the approved implementation plan from stdin.",
229
- "Use --codex-result - after Codex prompt steps to read the final marked Codex result from stdin.",
230
- "Use rewind --step <step_id> to delete a completed step and later JSKIT-owned session artifacts; only plan_made is allowed inside the repeatable cycle.",
231
- "Use --rework-notes - with --user-check failed to start the next plan cycle.",
232
- "Use --agent-decisions - to append session-local decision log entries from implementation, UI review, verification, or repair phases.",
233
- "Use --review-findings-remaining true --review-findings \"<findings>\" when an accepted review pass needs another pass.",
234
- "Use --review-findings-remaining false only when the review/deslop loop is done.",
235
- "Use --skip-ui-check --skip-reason \"<reason>\" only when uiImpact is possible and the Deep UI Check is intentionally skipped.",
236
- "Use --prepare-merge true at PR merge preparation to render the Codex prep prompt.",
237
- "Use --continue-to-merge true when the user decides to advance from preparation to merge decision.",
238
- "Use --merge-pr true at PR finalization to merge the pull request.",
239
- "Use --skip-merge at PR finalization to complete the session without merging.",
240
- "Use --skip-main-sync at Main checkout synced to explicitly leave the main checkout untouched.",
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 step --prompt \"Fix the customer filters\"",
250
- "jskit session 2026-05-11_21-42-08 step --issue-title \"Fix customer filters\" --issue -",
251
- "jskit session 2026-05-11_21-42-08 step --issue-details -",
252
- "jskit session 2026-05-11_21-42-08 step --plan -",
253
- "jskit session 2026-05-11_21-42-08 step --codex-result -",
254
- "jskit session 2026-05-11_21-42-08 step --agent-decisions -",
255
- "jskit session 2026-05-11_21-42-08 step --review-findings-remaining true --review-findings \"A helper duplication fix needs another pass\"",
256
- "jskit session 2026-05-11_21-42-08 step --review-findings-remaining false",
257
- "jskit session 2026-05-11_21-42-08 step --skip-ui-check --skip-reason \"No user-facing UI changes\"",
258
- "jskit session 2026-05-11_21-42-08 step",
259
- "jskit session 2026-05-11_21-42-08 step --prepare-merge true",
260
- "jskit session 2026-05-11_21-42-08 step --continue-to-merge true",
261
- "jskit session 2026-05-11_21-42-08 step --merge-pr true",
262
- "jskit session 2026-05-11_21-42-08 step --skip-merge",
263
- "jskit session 2026-05-11_21-42-08 step --skip-main-sync",
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 --step plan_made --json",
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] [--step <step_id>] [--prompt <text>] [--issue-title <text>|--issue-title-file <path>] [--issue <text>|--issue-file <path>] [--issue-details <text>|--issue-details-file <path>] [--plan <text>|--plan-file <path>] [--codex-result <text>|--codex-result-file <path>] [--agent-decisions <text>|--agent-decisions-file <path>] [--review-findings-remaining true --review-findings <text>|--review-findings-remaining false] [--skip-ui-check --skip-reason <text>] [--prepare-merge true|--continue-to-merge true|--merge-pr true|--skip-merge|--skip-main-sync] [--user-check <passed|failed>] [--rework-notes <text>|--rework-notes-file <path>] [--codex-thread-id <id>] [--abandoned|--completed|--all] [--json]",
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"]),