@kynetic-ai/spec 0.10.0 → 0.12.0
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/README.md +55 -455
- package/dist/agent-runtime/bootstrap.d.ts +31 -0
- package/dist/agent-runtime/bootstrap.d.ts.map +1 -0
- package/dist/agent-runtime/bootstrap.js +302 -0
- package/dist/agent-runtime/bootstrap.js.map +1 -0
- package/dist/agent-runtime/dispatch.d.ts +150 -10
- package/dist/agent-runtime/dispatch.d.ts.map +1 -1
- package/dist/agent-runtime/dispatch.js +1248 -244
- package/dist/agent-runtime/dispatch.js.map +1 -1
- package/dist/agent-runtime/invocation.d.ts +28 -1
- package/dist/agent-runtime/invocation.d.ts.map +1 -1
- package/dist/agent-runtime/invocation.js +172 -60
- package/dist/agent-runtime/invocation.js.map +1 -1
- package/dist/agent-runtime/prompts.d.ts +9 -0
- package/dist/agent-runtime/prompts.d.ts.map +1 -1
- package/dist/agent-runtime/prompts.js +42 -7
- package/dist/agent-runtime/prompts.js.map +1 -1
- package/dist/agent-runtime/session-event-accumulator.d.ts +83 -0
- package/dist/agent-runtime/session-event-accumulator.d.ts.map +1 -0
- package/dist/agent-runtime/session-event-accumulator.js +203 -0
- package/dist/agent-runtime/session-event-accumulator.js.map +1 -0
- package/dist/agent-runtime/session-event-types.d.ts +67 -0
- package/dist/agent-runtime/session-event-types.d.ts.map +1 -0
- package/dist/agent-runtime/session-event-types.js +13 -0
- package/dist/agent-runtime/session-event-types.js.map +1 -0
- package/dist/agent-runtime/workspace.d.ts +244 -0
- package/dist/agent-runtime/workspace.d.ts.map +1 -0
- package/dist/agent-runtime/workspace.js +2025 -0
- package/dist/agent-runtime/workspace.js.map +1 -0
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/adapters.js +58 -13
- package/dist/agents/adapters.js.map +1 -1
- package/dist/agents/spawner.d.ts +8 -0
- package/dist/agents/spawner.d.ts.map +1 -1
- package/dist/agents/spawner.js +25 -3
- package/dist/agents/spawner.js.map +1 -1
- package/dist/cli/batch-exec.js +1 -1
- package/dist/cli/batch-exec.js.map +1 -1
- package/dist/cli/command-annotations.d.ts +15 -3
- package/dist/cli/command-annotations.d.ts.map +1 -1
- package/dist/cli/command-annotations.js +23 -3
- package/dist/cli/command-annotations.js.map +1 -1
- package/dist/cli/commands/agent.d.ts +2 -0
- package/dist/cli/commands/agent.d.ts.map +1 -1
- package/dist/cli/commands/agent.js +144 -27
- package/dist/cli/commands/agent.js.map +1 -1
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +5 -5
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +118 -3
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +8 -6
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +20 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/item.d.ts.map +1 -1
- package/dist/cli/commands/item.js +205 -47
- package/dist/cli/commands/item.js.map +1 -1
- package/dist/cli/commands/log.d.ts.map +1 -1
- package/dist/cli/commands/log.js +24 -10
- package/dist/cli/commands/log.js.map +1 -1
- package/dist/cli/commands/meta.d.ts.map +1 -1
- package/dist/cli/commands/meta.js +10 -1
- package/dist/cli/commands/meta.js.map +1 -1
- package/dist/cli/commands/plan-import.d.ts +3 -3
- package/dist/cli/commands/plan-import.d.ts.map +1 -1
- package/dist/cli/commands/plan-import.js +213 -528
- package/dist/cli/commands/plan-import.js.map +1 -1
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +533 -83
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/review.d.ts +14 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +1142 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +1 -0
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +33 -10
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/session/checkpoint.d.ts +2 -4
- package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
- package/dist/cli/commands/session/checkpoint.js +6 -107
- package/dist/cli/commands/session/checkpoint.js.map +1 -1
- package/dist/cli/commands/session/commands.d.ts.map +1 -1
- package/dist/cli/commands/session/commands.js +33 -23
- package/dist/cli/commands/session/commands.js.map +1 -1
- package/dist/cli/commands/session/compact.js +4 -4
- package/dist/cli/commands/session/compact.js.map +1 -1
- package/dist/cli/commands/session/create.js +2 -2
- package/dist/cli/commands/session/create.js.map +1 -1
- package/dist/cli/commands/session/format.d.ts.map +1 -1
- package/dist/cli/commands/session/format.js +1 -6
- package/dist/cli/commands/session/format.js.map +1 -1
- package/dist/cli/commands/session/log.d.ts +32 -7
- package/dist/cli/commands/session/log.d.ts.map +1 -1
- package/dist/cli/commands/session/log.js +166 -60
- package/dist/cli/commands/session/log.js.map +1 -1
- package/dist/cli/commands/session/migrate.d.ts +9 -0
- package/dist/cli/commands/session/migrate.d.ts.map +1 -0
- package/dist/cli/commands/session/migrate.js +46 -0
- package/dist/cli/commands/session/migrate.js.map +1 -0
- package/dist/cli/commands/session/stale-close.d.ts.map +1 -1
- package/dist/cli/commands/session/stale-close.js +5 -8
- package/dist/cli/commands/session/stale-close.js.map +1 -1
- package/dist/cli/commands/session/types.d.ts +1 -1
- package/dist/cli/commands/session/types.d.ts.map +1 -1
- package/dist/cli/commands/setup.d.ts +2 -2
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +287 -257
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/shadow.d.ts.map +1 -1
- package/dist/cli/commands/shadow.js +147 -31
- package/dist/cli/commands/shadow.js.map +1 -1
- package/dist/cli/commands/skill-crud.d.ts +7 -0
- package/dist/cli/commands/skill-crud.d.ts.map +1 -1
- package/dist/cli/commands/skill-crud.js +41 -18
- package/dist/cli/commands/skill-crud.js.map +1 -1
- package/dist/cli/commands/skill-diff.d.ts.map +1 -1
- package/dist/cli/commands/skill-diff.js +29 -3
- package/dist/cli/commands/skill-diff.js.map +1 -1
- package/dist/cli/commands/skill-install.d.ts.map +1 -1
- package/dist/cli/commands/skill-install.js +5 -4
- package/dist/cli/commands/skill-install.js.map +1 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +359 -49
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/trait.d.ts.map +1 -1
- package/dist/cli/commands/trait.js +5 -27
- package/dist/cli/commands/trait.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +113 -52
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +69 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +26 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +108 -1
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/sync-mode.d.ts +44 -0
- package/dist/cli/sync-mode.d.ts.map +1 -0
- package/dist/cli/sync-mode.js +64 -0
- package/dist/cli/sync-mode.js.map +1 -0
- package/dist/daemon/middleware/project-context.ts +25 -7
- package/dist/daemon/project-context.ts +18 -0
- package/dist/daemon/routes/agent-dispatch.ts +107 -23
- package/dist/daemon/routes/aggregation.ts +184 -0
- package/dist/daemon/routes/inbox.ts +5 -0
- package/dist/daemon/routes/items.ts +167 -0
- package/dist/daemon/routes/meta.ts +141 -1
- package/dist/daemon/routes/plans.ts +147 -0
- package/dist/daemon/routes/projects.ts +28 -6
- package/dist/daemon/routes/ref-resolution.ts +119 -0
- package/dist/daemon/routes/refs.ts +42 -0
- package/dist/daemon/routes/session-related.ts +140 -0
- package/dist/daemon/routes/sessions.ts +581 -0
- package/dist/daemon/routes/tasks.ts +257 -2
- package/dist/daemon/routes/triage.ts +40 -1
- package/dist/daemon/routes/validation.ts +1 -1
- package/dist/daemon/server.ts +165 -50
- package/dist/daemon/session-sync.ts +11 -0
- package/dist/daemon/shadow-sync.ts +11 -0
- package/dist/daemon/watcher.ts +56 -5
- package/dist/daemon/websocket/project-resolution.ts +77 -0
- package/dist/export/json.d.ts.map +1 -1
- package/dist/export/json.js +104 -1
- package/dist/export/json.js.map +1 -1
- package/dist/export/types.d.ts +52 -1
- package/dist/export/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/parser/agent-detection.d.ts +1 -1
- package/dist/parser/agent-detection.d.ts.map +1 -1
- package/dist/parser/agent-detection.js +10 -0
- package/dist/parser/agent-detection.js.map +1 -1
- package/dist/parser/alignment.d.ts.map +1 -1
- package/dist/parser/alignment.js +4 -2
- package/dist/parser/alignment.js.map +1 -1
- package/dist/parser/config.d.ts +397 -2
- package/dist/parser/config.d.ts.map +1 -1
- package/dist/parser/config.js +125 -3
- package/dist/parser/config.js.map +1 -1
- package/dist/parser/dispatch-workspaces.d.ts +18 -0
- package/dist/parser/dispatch-workspaces.d.ts.map +1 -0
- package/dist/parser/dispatch-workspaces.js +209 -0
- package/dist/parser/dispatch-workspaces.js.map +1 -0
- package/dist/parser/doctor.d.ts.map +1 -1
- package/dist/parser/doctor.js +27 -8
- package/dist/parser/doctor.js.map +1 -1
- package/dist/parser/file-lock.d.ts.map +1 -1
- package/dist/parser/file-lock.js +9 -2
- package/dist/parser/file-lock.js.map +1 -1
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +6 -0
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/plans.d.ts.map +1 -1
- package/dist/parser/plans.js +1 -0
- package/dist/parser/plans.js.map +1 -1
- package/dist/parser/refs.d.ts +8 -1
- package/dist/parser/refs.d.ts.map +1 -1
- package/dist/parser/refs.js +27 -1
- package/dist/parser/refs.js.map +1 -1
- package/dist/parser/review-operations.d.ts +72 -0
- package/dist/parser/review-operations.d.ts.map +1 -0
- package/dist/parser/review-operations.js +185 -0
- package/dist/parser/review-operations.js.map +1 -0
- package/dist/parser/review-task-integration.d.ts +78 -0
- package/dist/parser/review-task-integration.d.ts.map +1 -0
- package/dist/parser/review-task-integration.js +173 -0
- package/dist/parser/review-task-integration.js.map +1 -0
- package/dist/parser/review-threads.d.ts +101 -0
- package/dist/parser/review-threads.d.ts.map +1 -0
- package/dist/parser/review-threads.js +222 -0
- package/dist/parser/review-threads.js.map +1 -0
- package/dist/parser/review-validation.d.ts +69 -0
- package/dist/parser/review-validation.d.ts.map +1 -0
- package/dist/parser/review-validation.js +207 -0
- package/dist/parser/review-validation.js.map +1 -0
- package/dist/parser/reviews.d.ts +58 -0
- package/dist/parser/reviews.d.ts.map +1 -0
- package/dist/parser/reviews.js +230 -0
- package/dist/parser/reviews.js.map +1 -0
- package/dist/parser/session-branch.d.ts +91 -0
- package/dist/parser/session-branch.d.ts.map +1 -0
- package/dist/parser/session-branch.js +565 -0
- package/dist/parser/session-branch.js.map +1 -0
- package/dist/parser/session-sync-scheduler.d.ts +53 -0
- package/dist/parser/session-sync-scheduler.d.ts.map +1 -0
- package/dist/parser/session-sync-scheduler.js +100 -0
- package/dist/parser/session-sync-scheduler.js.map +1 -0
- package/dist/parser/setup-status.d.ts +7 -1
- package/dist/parser/setup-status.d.ts.map +1 -1
- package/dist/parser/setup-status.js +104 -39
- package/dist/parser/setup-status.js.map +1 -1
- package/dist/parser/shadow-sync-scheduler.d.ts +71 -0
- package/dist/parser/shadow-sync-scheduler.d.ts.map +1 -0
- package/dist/parser/shadow-sync-scheduler.js +139 -0
- package/dist/parser/shadow-sync-scheduler.js.map +1 -0
- package/dist/parser/shadow.d.ts +121 -14
- package/dist/parser/shadow.d.ts.map +1 -1
- package/dist/parser/shadow.js +752 -27
- package/dist/parser/shadow.js.map +1 -1
- package/dist/parser/skill-render.d.ts +24 -0
- package/dist/parser/skill-render.d.ts.map +1 -1
- package/dist/parser/skill-render.js +98 -26
- package/dist/parser/skill-render.js.map +1 -1
- package/dist/parser/validate.d.ts +43 -3
- package/dist/parser/validate.d.ts.map +1 -1
- package/dist/parser/validate.js +204 -30
- package/dist/parser/validate.js.map +1 -1
- package/dist/parser/yaml.d.ts +47 -11
- package/dist/parser/yaml.d.ts.map +1 -1
- package/dist/parser/yaml.js +329 -149
- package/dist/parser/yaml.js.map +1 -1
- package/dist/review/checks.d.ts +97 -0
- package/dist/review/checks.d.ts.map +1 -0
- package/dist/review/checks.js +175 -0
- package/dist/review/checks.js.map +1 -0
- package/dist/review/index.d.ts +3 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +3 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/subject-bindings.d.ts +83 -0
- package/dist/review/subject-bindings.d.ts.map +1 -0
- package/dist/review/subject-bindings.js +175 -0
- package/dist/review/subject-bindings.js.map +1 -0
- package/dist/schema/common.d.ts +26 -0
- package/dist/schema/common.d.ts.map +1 -1
- package/dist/schema/common.js +13 -0
- package/dist/schema/common.js.map +1 -1
- package/dist/schema/dispatch-workspace.d.ts +2643 -0
- package/dist/schema/dispatch-workspace.d.ts.map +1 -0
- package/dist/schema/dispatch-workspace.js +187 -0
- package/dist/schema/dispatch-workspace.js.map +1 -0
- package/dist/schema/inbox.d.ts +8 -8
- package/dist/schema/index.d.ts +2 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/meta.d.ts +663 -116
- package/dist/schema/meta.d.ts.map +1 -1
- package/dist/schema/meta.js +28 -0
- package/dist/schema/meta.js.map +1 -1
- package/dist/schema/plan.d.ts +30 -19
- package/dist/schema/plan.d.ts.map +1 -1
- package/dist/schema/plan.js +3 -1
- package/dist/schema/plan.js.map +1 -1
- package/dist/schema/review-records.d.ts +2676 -0
- package/dist/schema/review-records.d.ts.map +1 -0
- package/dist/schema/review-records.js +232 -0
- package/dist/schema/review-records.js.map +1 -0
- package/dist/schema/spec.d.ts +32 -14
- package/dist/schema/spec.d.ts.map +1 -1
- package/dist/schema/spec.js +5 -0
- package/dist/schema/spec.js.map +1 -1
- package/dist/schema/task.d.ts +187 -29
- package/dist/schema/task.d.ts.map +1 -1
- package/dist/schema/task.js +12 -2
- package/dist/schema/task.js.map +1 -1
- package/dist/schema/triage.d.ts +22 -22
- package/dist/sessions/cache.d.ts +119 -0
- package/dist/sessions/cache.d.ts.map +1 -0
- package/dist/sessions/cache.js +284 -0
- package/dist/sessions/cache.js.map +1 -0
- package/dist/sessions/index.d.ts +1 -0
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/legacy.d.ts +77 -0
- package/dist/sessions/legacy.d.ts.map +1 -0
- package/dist/sessions/legacy.js +146 -0
- package/dist/sessions/legacy.js.map +1 -0
- package/dist/sessions/store.d.ts +115 -71
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +357 -182
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +44 -16
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +11 -2
- package/dist/sessions/types.js.map +1 -1
- package/dist/strings/errors.d.ts +32 -0
- package/dist/strings/errors.d.ts.map +1 -1
- package/dist/strings/errors.js +17 -0
- package/dist/strings/errors.js.map +1 -1
- package/dist/strings/labels.d.ts +1 -0
- package/dist/strings/labels.d.ts.map +1 -1
- package/dist/strings/labels.js +1 -0
- package/dist/strings/labels.js.map +1 -1
- package/dist/utils/activity.d.ts +101 -0
- package/dist/utils/activity.d.ts.map +1 -0
- package/dist/utils/activity.js +408 -0
- package/dist/utils/activity.js.map +1 -0
- package/dist/utils/git.d.ts +31 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +87 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/web-ui/_app/immutable/assets/0.tmlwn-Ih.css +1 -0
- package/dist/web-ui/_app/immutable/assets/9.BwwJybWx.css +1 -0
- package/dist/web-ui/_app/immutable/chunks/2KqE8gtn.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/70-t_QvE.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/AiWQj974.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B25nWFyA.js +5 -0
- package/dist/web-ui/_app/immutable/chunks/B2bcA_Q_.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B5e5HYyB.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B7-5z6eA.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B7bGmhK0.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/B8tYZKAE.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BFGAyJjD.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BG0850zf.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BG8eSzAd.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BIMxXS8I.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BSzL1fpU.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BYtjHfeq.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/{D1ArdqNb.js → Bp5pFYXL.js} +1 -1
- package/dist/web-ui/_app/immutable/chunks/BsJFsuAT.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BvpNHcD6.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/BypqA25-.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C0w6WDm5.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C5_PAZ0y.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CDRO15Iv.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CF1CoqD5.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CS2sa4_m.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CWUQwB9H.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CY5FDdSU.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/C_7MTDoj.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/CaAJD3dl.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/{i-XnOIX0.js → ChB5iyEL.js} +1 -1
- package/dist/web-ui/_app/immutable/chunks/ChQD-6N8.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/{BCkp8Hs8.js → CqbsoCwA.js} +1 -1
- package/dist/web-ui/_app/immutable/chunks/DCeJW50p.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DJtZNgcs.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DKIeaprD.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DLd2uVIA.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DW_subyT.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/DbU6lVn0.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Dc7ZCC5m.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Dd5umPsk.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/Dg_zDpDS.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Dgqu8Yuc.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DmxsPZTB.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DphTaFUB.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DqK4iHp0.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DqT6OH_u.js +2 -0
- package/dist/web-ui/_app/immutable/chunks/Ds9I9wQb.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Du5ng3u4.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/DxJw79Wi.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/GFTX8GgV.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/HNjs76Zz.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/HVMjDi4_.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/P0A_fJvS.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/T3vGWjIL.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/VTmrX9Qu.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Xvwhx_F1.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/Yyz1XMQA.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/dh5HeqUr.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/fZMteyca.js +62 -0
- package/dist/web-ui/_app/immutable/chunks/{D28BF5MJ.js → gPrj-hqC.js} +1 -1
- package/dist/web-ui/_app/immutable/chunks/htcWMiYN.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/oTsvd9y4.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/qJfLUwU4.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/xCtiO_JE.js +1 -0
- package/dist/web-ui/_app/immutable/chunks/y4GeEH6k.js +1 -0
- package/dist/web-ui/_app/immutable/entry/app.C4h_eOn6.js +2 -0
- package/dist/web-ui/_app/immutable/entry/start.CQFTf9ep.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/0.Dh1xO970.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/1.l75D3Opx.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/10.DBidBPc-.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/11.Ab0gUKWe.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/12.CMsnoxfs.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/13.D8YKuknB.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/14.DZ0aan7y.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/15.CUIKreDL.js +2 -0
- package/dist/web-ui/_app/immutable/nodes/16.BWc8--BO.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/2.CDUonbuh.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/3.Ctg3M00i.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/4.Ci-JDwbA.js +2 -0
- package/dist/web-ui/_app/immutable/nodes/5.CTyEDAq0.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/6.BTZZqsAb.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/7.BI52g_Jo.js +137 -0
- package/dist/web-ui/_app/immutable/nodes/8.3hZPaB9x.js +1 -0
- package/dist/web-ui/_app/immutable/nodes/9.DS49kvwl.js +29 -0
- package/dist/web-ui/_app/version.json +1 -1
- package/dist/web-ui/favicon-192.png +0 -0
- package/dist/web-ui/favicon-32.png +0 -0
- package/dist/web-ui/favicon.ico +0 -0
- package/dist/web-ui/index.html +14 -11
- package/package.json +14 -7
- package/plugin/.claude-plugin/marketplace.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/plugins/kspec/skills/merge/SKILL.md +127 -0
- package/plugin/plugins/kspec/skills/plan/SKILL.md +55 -26
- package/plugin/plugins/kspec/skills/review/SKILL.md +350 -133
- package/plugin/plugins/kspec/skills/task-work/SKILL.md +96 -106
- package/templates/agents-sections/04-pr-workflow.md +15 -12
- package/templates/agents-sections/06-ralph-loop.md +15 -10
- package/templates/skills/manifest.yaml +25 -7
- package/templates/skills/merge/SKILL.md +120 -0
- package/templates/skills/plan/SKILL.md +55 -26
- package/templates/skills/review/SKILL.md +346 -130
- package/templates/skills/task-work/SKILL.md +93 -103
- package/dist/web-ui/_app/immutable/assets/0.BxCxvrZR.css +0 -1
- package/dist/web-ui/_app/immutable/chunks/B-CZR0q8.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/B1IR5Su5.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/B_Cvvtc4.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/BtFaGGII.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/Bu8JVsCH.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/C87u-CNA.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/CrFkBTYp.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/D6RtLpzL.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/D7FHSgx2.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DBXrsxZQ.js +0 -2
- package/dist/web-ui/_app/immutable/chunks/Da_hHMuA.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/Do6LchSF.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DoNPtcAw.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DtUbXRZz.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DyFPRlLl.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DzAP8lRM.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/DzVXElzN.js +0 -2
- package/dist/web-ui/_app/immutable/chunks/aoPBFken.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/laxtrUO3.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/q1nIWgqB.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/sTLbk5Nm.js +0 -1
- package/dist/web-ui/_app/immutable/chunks/vwKgQu5P.js +0 -5
- package/dist/web-ui/_app/immutable/entry/app.BCwMcqnT.js +0 -2
- package/dist/web-ui/_app/immutable/entry/start.wKCQH-tt.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/0.CjGVMG74.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/1.B6_AIPan.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/2.q4oCS7Ws.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/3.rTKZf9o2.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/4.DVIDRu1d.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/5.8PtPXIOd.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/6.ZZrTemy_.js +0 -1
- package/dist/web-ui/_app/immutable/nodes/7.IP-gxCxi.js +0 -1
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session branch worktree management.
|
|
3
|
+
*
|
|
4
|
+
* When sessions.storage is "branch", sessions are stored in a git worktree
|
|
5
|
+
* on a named orphan branch (default: "kspec-sessions") at .kspec-sessions/.
|
|
6
|
+
* This provides git-tracked session persistence independent of kspec-meta.
|
|
7
|
+
*
|
|
8
|
+
* AC: @session-branch-worktree — all ACs
|
|
9
|
+
*/
|
|
10
|
+
import { execFile, spawnSync } from "node:child_process";
|
|
11
|
+
import * as fs from "node:fs/promises";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { promisify } from "node:util";
|
|
14
|
+
import { branchExists, gitSupportsOrphanWorktree, createOrphanBranchFallback, isGitRepo, isValidWorktree, hasRemoteTracking, SESSIONS_WORKTREE_DIR, } from "./shadow.js";
|
|
15
|
+
import { isBatchMode } from "../cli/batch-context.js";
|
|
16
|
+
const execFileAsync = promisify(execFile);
|
|
17
|
+
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
18
|
+
/** Default session branch name */
|
|
19
|
+
export const SESSION_BRANCH_NAME = "kspec-sessions";
|
|
20
|
+
// ─── Git Helpers ────────────────────────────────────────────────────────────
|
|
21
|
+
async function runGitAsync(cwd, args, env) {
|
|
22
|
+
const { stdout = "", stderr = "" } = await execFileAsync("git", args, {
|
|
23
|
+
cwd,
|
|
24
|
+
env,
|
|
25
|
+
encoding: "utf-8",
|
|
26
|
+
});
|
|
27
|
+
return { stdout: stdout.toString(), stderr: stderr.toString() };
|
|
28
|
+
}
|
|
29
|
+
function isDebugMode() {
|
|
30
|
+
return process.env.KSPEC_DEBUG === "1" || process.env.KSPEC_DEBUG === "true";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the remote name for a branch from git config.
|
|
34
|
+
* Falls back to "origin" if no tracking is configured.
|
|
35
|
+
*
|
|
36
|
+
* AC: @session-branch-worktree ac-sync — resolve configured remote instead of hardcoding "origin"
|
|
37
|
+
*/
|
|
38
|
+
async function resolveRemoteName(cwd, branchName) {
|
|
39
|
+
try {
|
|
40
|
+
const { stdout } = await runGitAsync(cwd, [
|
|
41
|
+
"config",
|
|
42
|
+
`branch.${branchName}.remote`,
|
|
43
|
+
]);
|
|
44
|
+
const configured = stdout.trim();
|
|
45
|
+
if (configured) {
|
|
46
|
+
return configured;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// No tracking configured
|
|
51
|
+
}
|
|
52
|
+
return "origin";
|
|
53
|
+
}
|
|
54
|
+
// ─── Session Branch Status ──────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Get the status of the session branch worktree.
|
|
57
|
+
*
|
|
58
|
+
* AC: @session-branch-worktree ac-status
|
|
59
|
+
*/
|
|
60
|
+
export async function getSessionBranchStatus(projectRoot, branchName = SESSION_BRANCH_NAME) {
|
|
61
|
+
const worktreeDir = path.join(projectRoot, SESSIONS_WORKTREE_DIR);
|
|
62
|
+
const status = {
|
|
63
|
+
exists: false,
|
|
64
|
+
healthy: false,
|
|
65
|
+
branchExists: false,
|
|
66
|
+
worktreeExists: false,
|
|
67
|
+
worktreeLinked: false,
|
|
68
|
+
};
|
|
69
|
+
if (!(await isGitRepo(projectRoot))) {
|
|
70
|
+
status.error = "Not a git repository";
|
|
71
|
+
return status;
|
|
72
|
+
}
|
|
73
|
+
// Check if branch exists
|
|
74
|
+
status.branchExists = await branchExists(projectRoot, branchName);
|
|
75
|
+
// Check if worktree directory exists
|
|
76
|
+
try {
|
|
77
|
+
await fs.access(worktreeDir);
|
|
78
|
+
status.worktreeExists = true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
status.worktreeExists = false;
|
|
82
|
+
}
|
|
83
|
+
// Check if worktree is properly linked
|
|
84
|
+
if (status.worktreeExists) {
|
|
85
|
+
status.worktreeLinked = await isValidWorktree(worktreeDir);
|
|
86
|
+
}
|
|
87
|
+
// Determine overall status
|
|
88
|
+
status.exists = status.branchExists || status.worktreeExists;
|
|
89
|
+
status.healthy =
|
|
90
|
+
status.branchExists && status.worktreeExists && status.worktreeLinked;
|
|
91
|
+
if (!status.healthy && status.exists) {
|
|
92
|
+
if (!status.branchExists) {
|
|
93
|
+
status.error = "Session branch missing but worktree exists";
|
|
94
|
+
}
|
|
95
|
+
else if (!status.worktreeExists) {
|
|
96
|
+
status.error = "Session branch exists but worktree missing";
|
|
97
|
+
}
|
|
98
|
+
else if (!status.worktreeLinked) {
|
|
99
|
+
status.error = "Session worktree exists but not properly linked";
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return status;
|
|
103
|
+
}
|
|
104
|
+
// ─── Session Branch Init ────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Initialize session branch worktree.
|
|
107
|
+
* Creates an orphan branch and worktree at .kspec-sessions/.
|
|
108
|
+
*
|
|
109
|
+
* AC: @session-branch-worktree ac-init
|
|
110
|
+
*/
|
|
111
|
+
export async function initializeSessionBranch(projectRoot, branchName = SESSION_BRANCH_NAME) {
|
|
112
|
+
const result = {
|
|
113
|
+
success: false,
|
|
114
|
+
branchCreated: false,
|
|
115
|
+
worktreeCreated: false,
|
|
116
|
+
alreadyExists: false,
|
|
117
|
+
};
|
|
118
|
+
if (!(await isGitRepo(projectRoot))) {
|
|
119
|
+
result.error = "Not a git repository";
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
const directoryName = SESSIONS_WORKTREE_DIR;
|
|
123
|
+
const worktreeDir = path.join(projectRoot, directoryName);
|
|
124
|
+
// Check current status
|
|
125
|
+
const status = await getSessionBranchStatus(projectRoot, branchName);
|
|
126
|
+
if (status.healthy) {
|
|
127
|
+
result.alreadyExists = true;
|
|
128
|
+
result.success = true;
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
// Resolve remote name from git config instead of hardcoding "origin"
|
|
133
|
+
// AC: @session-branch-worktree ac-sync
|
|
134
|
+
const remoteName = await resolveRemoteName(projectRoot, branchName);
|
|
135
|
+
let remoteHasBranch = false;
|
|
136
|
+
try {
|
|
137
|
+
const { stdout } = await runGitAsync(projectRoot, [
|
|
138
|
+
"remote",
|
|
139
|
+
"get-url",
|
|
140
|
+
remoteName,
|
|
141
|
+
]);
|
|
142
|
+
if (stdout.trim().length > 0) {
|
|
143
|
+
const { stdout: lsOut } = await runGitAsync(projectRoot, [
|
|
144
|
+
"ls-remote",
|
|
145
|
+
"--heads",
|
|
146
|
+
remoteName,
|
|
147
|
+
branchName,
|
|
148
|
+
]);
|
|
149
|
+
remoteHasBranch = lsOut.trim().length > 0;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// No remote configured
|
|
154
|
+
}
|
|
155
|
+
// Remove existing worktree/directory if broken
|
|
156
|
+
if (status.worktreeExists && !status.worktreeLinked) {
|
|
157
|
+
await fs.rm(worktreeDir, { recursive: true, force: true });
|
|
158
|
+
}
|
|
159
|
+
// Remove stale worktree reference
|
|
160
|
+
try {
|
|
161
|
+
await runGitAsync(projectRoot, [
|
|
162
|
+
"worktree",
|
|
163
|
+
"remove",
|
|
164
|
+
directoryName,
|
|
165
|
+
"--force",
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Ignore
|
|
170
|
+
}
|
|
171
|
+
// Prune stale worktree references
|
|
172
|
+
try {
|
|
173
|
+
await runGitAsync(projectRoot, ["worktree", "prune"]);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Ignore
|
|
177
|
+
}
|
|
178
|
+
if (remoteHasBranch) {
|
|
179
|
+
// Fetch from remote and create worktree
|
|
180
|
+
await runGitAsync(projectRoot, [
|
|
181
|
+
"fetch",
|
|
182
|
+
remoteName,
|
|
183
|
+
`${branchName}:${branchName}`,
|
|
184
|
+
]);
|
|
185
|
+
await runGitAsync(projectRoot, [
|
|
186
|
+
"worktree",
|
|
187
|
+
"add",
|
|
188
|
+
directoryName,
|
|
189
|
+
branchName,
|
|
190
|
+
]);
|
|
191
|
+
// Set up tracking
|
|
192
|
+
await runGitAsync(projectRoot, [
|
|
193
|
+
"config",
|
|
194
|
+
`branch.${branchName}.remote`,
|
|
195
|
+
remoteName,
|
|
196
|
+
]);
|
|
197
|
+
await runGitAsync(projectRoot, [
|
|
198
|
+
"config",
|
|
199
|
+
`branch.${branchName}.merge`,
|
|
200
|
+
`refs/heads/${branchName}`,
|
|
201
|
+
]);
|
|
202
|
+
}
|
|
203
|
+
else if (!status.branchExists) {
|
|
204
|
+
// Create orphan branch
|
|
205
|
+
if (gitSupportsOrphanWorktree(projectRoot)) {
|
|
206
|
+
await runGitAsync(projectRoot, [
|
|
207
|
+
"worktree",
|
|
208
|
+
"add",
|
|
209
|
+
"--orphan",
|
|
210
|
+
"-b",
|
|
211
|
+
branchName,
|
|
212
|
+
directoryName,
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
await createOrphanBranchFallback(projectRoot, branchName, directoryName);
|
|
217
|
+
}
|
|
218
|
+
result.branchCreated = true;
|
|
219
|
+
// Create initial empty commit so the branch is valid
|
|
220
|
+
await runGitAsync(worktreeDir, ["add", "-A"], {
|
|
221
|
+
...process.env,
|
|
222
|
+
KSPEC_SHADOW_COMMIT: "1",
|
|
223
|
+
});
|
|
224
|
+
// Create a .gitkeep so the first commit has content
|
|
225
|
+
await fs.writeFile(path.join(worktreeDir, ".gitkeep"), "# Session storage - managed by kspec\n", "utf-8");
|
|
226
|
+
await runGitAsync(worktreeDir, ["add", "-A"], {
|
|
227
|
+
...process.env,
|
|
228
|
+
KSPEC_SHADOW_COMMIT: "1",
|
|
229
|
+
});
|
|
230
|
+
await runGitAsync(worktreeDir, ["commit", "-m", "Initialize session storage"], { ...process.env, KSPEC_SHADOW_COMMIT: "1" });
|
|
231
|
+
// Push to remote if available
|
|
232
|
+
try {
|
|
233
|
+
const { stdout } = await runGitAsync(projectRoot, [
|
|
234
|
+
"remote",
|
|
235
|
+
"get-url",
|
|
236
|
+
remoteName,
|
|
237
|
+
]);
|
|
238
|
+
if (stdout.trim().length > 0) {
|
|
239
|
+
await runGitAsync(worktreeDir, [
|
|
240
|
+
"push",
|
|
241
|
+
"-u",
|
|
242
|
+
remoteName,
|
|
243
|
+
branchName,
|
|
244
|
+
]);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
// No remote, fine
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// Attach to existing local branch
|
|
253
|
+
await runGitAsync(projectRoot, [
|
|
254
|
+
"worktree",
|
|
255
|
+
"add",
|
|
256
|
+
directoryName,
|
|
257
|
+
branchName,
|
|
258
|
+
]);
|
|
259
|
+
}
|
|
260
|
+
result.worktreeCreated = true;
|
|
261
|
+
result.success = true;
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
result.error = error instanceof Error ? error.message : String(error);
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ─── Session Branch Repair ──────────────────────────────────────────────────
|
|
270
|
+
/**
|
|
271
|
+
* Repair a broken session branch worktree.
|
|
272
|
+
*
|
|
273
|
+
* AC: @session-branch-worktree ac-repair
|
|
274
|
+
*/
|
|
275
|
+
export async function repairSessionBranch(projectRoot, branchName = SESSION_BRANCH_NAME) {
|
|
276
|
+
const status = await getSessionBranchStatus(projectRoot, branchName);
|
|
277
|
+
if (status.healthy) {
|
|
278
|
+
return {
|
|
279
|
+
success: true,
|
|
280
|
+
branchCreated: false,
|
|
281
|
+
worktreeCreated: false,
|
|
282
|
+
alreadyExists: true,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (!status.branchExists) {
|
|
286
|
+
return {
|
|
287
|
+
success: false,
|
|
288
|
+
branchCreated: false,
|
|
289
|
+
worktreeCreated: false,
|
|
290
|
+
alreadyExists: false,
|
|
291
|
+
error: "Session branch does not exist. Run `kspec init` or `kspec setup` with sessions.storage=branch to initialize.",
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const directoryName = SESSIONS_WORKTREE_DIR;
|
|
295
|
+
const worktreeDir = path.join(projectRoot, directoryName);
|
|
296
|
+
try {
|
|
297
|
+
// Remove stale worktree reference
|
|
298
|
+
try {
|
|
299
|
+
await runGitAsync(projectRoot, [
|
|
300
|
+
"worktree",
|
|
301
|
+
"remove",
|
|
302
|
+
directoryName,
|
|
303
|
+
"--force",
|
|
304
|
+
]);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Ignore
|
|
308
|
+
}
|
|
309
|
+
// Remove directory if exists
|
|
310
|
+
await fs.rm(worktreeDir, { recursive: true, force: true });
|
|
311
|
+
// Prune stale worktree references
|
|
312
|
+
try {
|
|
313
|
+
await runGitAsync(projectRoot, ["worktree", "prune"]);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
// Ignore
|
|
317
|
+
}
|
|
318
|
+
// Recreate worktree
|
|
319
|
+
await runGitAsync(projectRoot, [
|
|
320
|
+
"worktree",
|
|
321
|
+
"add",
|
|
322
|
+
directoryName,
|
|
323
|
+
branchName,
|
|
324
|
+
]);
|
|
325
|
+
return {
|
|
326
|
+
success: true,
|
|
327
|
+
branchCreated: false,
|
|
328
|
+
worktreeCreated: true,
|
|
329
|
+
alreadyExists: false,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
return {
|
|
334
|
+
success: false,
|
|
335
|
+
branchCreated: false,
|
|
336
|
+
worktreeCreated: false,
|
|
337
|
+
alreadyExists: false,
|
|
338
|
+
error: error instanceof Error ? error.message : String(error),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// ─── Session Branch Auto-Commit ─────────────────────────────────────────────
|
|
343
|
+
/**
|
|
344
|
+
* Auto-commit changes to the session branch.
|
|
345
|
+
* Called at session lifecycle boundaries (create, close, stale cleanup, compact).
|
|
346
|
+
*
|
|
347
|
+
* AC: @session-branch-worktree ac-commit-boundaries
|
|
348
|
+
*/
|
|
349
|
+
export async function sessionBranchAutoCommit(worktreeDir, message) {
|
|
350
|
+
const debug = isDebugMode();
|
|
351
|
+
try {
|
|
352
|
+
if (debug) {
|
|
353
|
+
console.error(`[DEBUG] Session branch auto-commit: git add -A (cwd: ${worktreeDir})`);
|
|
354
|
+
}
|
|
355
|
+
// Stage all changes
|
|
356
|
+
const addResult = spawnSync("git", ["add", "-A"], {
|
|
357
|
+
cwd: worktreeDir,
|
|
358
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
359
|
+
encoding: "utf-8",
|
|
360
|
+
});
|
|
361
|
+
if (addResult.error || addResult.status !== 0) {
|
|
362
|
+
throw new Error(addResult.stderr || "git add failed");
|
|
363
|
+
}
|
|
364
|
+
// Check if there are staged changes
|
|
365
|
+
const diffResult = spawnSync("git", ["diff", "--cached", "--quiet"], {
|
|
366
|
+
cwd: worktreeDir,
|
|
367
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
368
|
+
encoding: "utf-8",
|
|
369
|
+
});
|
|
370
|
+
if (!diffResult.error && diffResult.status === 0) {
|
|
371
|
+
// No changes
|
|
372
|
+
if (debug) {
|
|
373
|
+
console.error(`[DEBUG] Session branch auto-commit: No changes to commit`);
|
|
374
|
+
}
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
if (debug) {
|
|
378
|
+
console.error(`[DEBUG] Session branch auto-commit: git commit -m "${message}"`);
|
|
379
|
+
}
|
|
380
|
+
// Commit with KSPEC_SHADOW_COMMIT=1 to authorize past git hooks
|
|
381
|
+
const commitResult = spawnSync("git", ["commit", "-m", message], {
|
|
382
|
+
cwd: worktreeDir,
|
|
383
|
+
env: { ...process.env, KSPEC_SHADOW_COMMIT: "1" },
|
|
384
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
385
|
+
encoding: "utf-8",
|
|
386
|
+
});
|
|
387
|
+
if (commitResult.error || commitResult.status !== 0) {
|
|
388
|
+
throw new Error(commitResult.stderr || "git commit failed");
|
|
389
|
+
}
|
|
390
|
+
if (debug) {
|
|
391
|
+
console.error(`[DEBUG] Session branch auto-commit: Success`);
|
|
392
|
+
}
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
if (debug) {
|
|
397
|
+
console.error("Session branch auto-commit failed:", error);
|
|
398
|
+
}
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Commit session changes if session branch mode is enabled.
|
|
404
|
+
* Respects batch mode (suppresses commits during atomic batch execution).
|
|
405
|
+
*
|
|
406
|
+
* AC: @session-branch-worktree ac-commit-boundaries
|
|
407
|
+
*/
|
|
408
|
+
export async function commitIfSessionBranch(config, operation, sessionId) {
|
|
409
|
+
// Suppress auto-commits during atomic batch execution
|
|
410
|
+
if (isBatchMode()) {
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (!config?.enabled) {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
const message = sessionId
|
|
417
|
+
? `session: ${operation} (${sessionId})`
|
|
418
|
+
: `session: ${operation}`;
|
|
419
|
+
return sessionBranchAutoCommit(config.worktreeDir, message);
|
|
420
|
+
}
|
|
421
|
+
// ─── Session Branch Sync ────────────────────────────────────────────────────
|
|
422
|
+
/**
|
|
423
|
+
* In-flight dedup for session branch pulls.
|
|
424
|
+
*
|
|
425
|
+
* AC: @session-branch-worktree ac-sync
|
|
426
|
+
*/
|
|
427
|
+
const sessionPullInflight = new Map();
|
|
428
|
+
/**
|
|
429
|
+
* Pull remote changes for the session branch.
|
|
430
|
+
* Uses in-flight dedup to prevent concurrent pulls.
|
|
431
|
+
*
|
|
432
|
+
* AC: @session-branch-worktree ac-sync
|
|
433
|
+
*/
|
|
434
|
+
export function sessionBranchPull(worktreeDir, branchName = SESSION_BRANCH_NAME) {
|
|
435
|
+
const key = path.resolve(worktreeDir);
|
|
436
|
+
const existing = sessionPullInflight.get(key);
|
|
437
|
+
if (existing) {
|
|
438
|
+
return existing;
|
|
439
|
+
}
|
|
440
|
+
const promise = sessionBranchPullImpl(worktreeDir, branchName).finally(() => {
|
|
441
|
+
sessionPullInflight.delete(key);
|
|
442
|
+
});
|
|
443
|
+
sessionPullInflight.set(key, promise);
|
|
444
|
+
return promise;
|
|
445
|
+
}
|
|
446
|
+
async function sessionBranchPullImpl(worktreeDir, branchName) {
|
|
447
|
+
const result = {
|
|
448
|
+
success: false,
|
|
449
|
+
pulled: false,
|
|
450
|
+
pushed: false,
|
|
451
|
+
hadConflict: false,
|
|
452
|
+
};
|
|
453
|
+
// Check if remote tracking is configured
|
|
454
|
+
const options = { branchName };
|
|
455
|
+
if (!(await hasRemoteTracking(worktreeDir, options))) {
|
|
456
|
+
result.success = true;
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
// Resolve configured remote instead of hardcoding "origin"
|
|
460
|
+
// AC: @session-branch-worktree ac-sync
|
|
461
|
+
const projectRoot = path.dirname(worktreeDir);
|
|
462
|
+
const remoteName = await resolveRemoteName(projectRoot, branchName);
|
|
463
|
+
// Fetch
|
|
464
|
+
try {
|
|
465
|
+
await runGitAsync(projectRoot, ["fetch", remoteName]);
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
result.success = true;
|
|
469
|
+
return result;
|
|
470
|
+
}
|
|
471
|
+
// Check if remote branch exists
|
|
472
|
+
try {
|
|
473
|
+
const { stdout } = await runGitAsync(projectRoot, [
|
|
474
|
+
"ls-remote",
|
|
475
|
+
"--heads",
|
|
476
|
+
remoteName,
|
|
477
|
+
branchName,
|
|
478
|
+
]);
|
|
479
|
+
if (stdout.trim().length === 0) {
|
|
480
|
+
result.success = true;
|
|
481
|
+
return result;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
result.success = true;
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
// Stash uncommitted changes
|
|
489
|
+
let stashed = false;
|
|
490
|
+
try {
|
|
491
|
+
const { stdout } = await runGitAsync(worktreeDir, [
|
|
492
|
+
"stash",
|
|
493
|
+
"push",
|
|
494
|
+
"-m",
|
|
495
|
+
"session-sync-auto",
|
|
496
|
+
]);
|
|
497
|
+
stashed = !stdout.includes("No local changes");
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
result.success = true;
|
|
501
|
+
return result;
|
|
502
|
+
}
|
|
503
|
+
const unstash = async () => {
|
|
504
|
+
if (stashed) {
|
|
505
|
+
try {
|
|
506
|
+
await runGitAsync(worktreeDir, ["stash", "pop"]);
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// Leave stash intact if pop fails
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
try {
|
|
514
|
+
// Try fast-forward
|
|
515
|
+
await runGitAsync(worktreeDir, ["pull", "--ff-only"]);
|
|
516
|
+
await unstash();
|
|
517
|
+
result.success = true;
|
|
518
|
+
result.pulled = true;
|
|
519
|
+
return result;
|
|
520
|
+
}
|
|
521
|
+
catch {
|
|
522
|
+
// Fast-forward failed
|
|
523
|
+
}
|
|
524
|
+
try {
|
|
525
|
+
// Fall back to rebase
|
|
526
|
+
await runGitAsync(worktreeDir, ["pull", "--rebase"]);
|
|
527
|
+
await unstash();
|
|
528
|
+
result.success = true;
|
|
529
|
+
result.pulled = true;
|
|
530
|
+
return result;
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
// Rebase failed
|
|
534
|
+
}
|
|
535
|
+
// Abort rebase if in progress
|
|
536
|
+
try {
|
|
537
|
+
await runGitAsync(worktreeDir, ["rebase", "--abort"]);
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
// May not be in rebase state
|
|
541
|
+
}
|
|
542
|
+
await unstash();
|
|
543
|
+
result.hadConflict = true;
|
|
544
|
+
result.error =
|
|
545
|
+
"Session branch sync conflict detected. Run `kspec shadow resolve` to fix.";
|
|
546
|
+
return result;
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Resolve session branch config from manifest.
|
|
550
|
+
* Returns null if sessions.storage is not "branch".
|
|
551
|
+
*/
|
|
552
|
+
export function resolveSessionBranchConfig(projectRoot, manifest) {
|
|
553
|
+
const storage = manifest?.sessions?.storage ?? "local";
|
|
554
|
+
if (storage !== "branch") {
|
|
555
|
+
return null;
|
|
556
|
+
}
|
|
557
|
+
const branchName = manifest?.sessions?.branch ?? SESSION_BRANCH_NAME;
|
|
558
|
+
return {
|
|
559
|
+
enabled: true,
|
|
560
|
+
worktreeDir: path.join(projectRoot, SESSIONS_WORKTREE_DIR),
|
|
561
|
+
branchName,
|
|
562
|
+
projectRoot,
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
//# sourceMappingURL=session-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-branch.js","sourceRoot":"","sources":["../../src/parser/session-branch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Periodic session branch sync for daemon mode.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors ShadowSyncScheduler but operates independently on the session branch.
|
|
5
|
+
* Sync failures on one branch do not affect the other.
|
|
6
|
+
*
|
|
7
|
+
* AC: @session-branch-worktree ac-sync
|
|
8
|
+
*/
|
|
9
|
+
export interface SessionSyncSchedulerOptions {
|
|
10
|
+
/** Path to session worktree (e.g., /project/.kspec-sessions) */
|
|
11
|
+
worktreeDir: string;
|
|
12
|
+
/** Sync interval in seconds (0 = disabled) */
|
|
13
|
+
intervalSeconds: number;
|
|
14
|
+
/** Session branch name */
|
|
15
|
+
branchName: string;
|
|
16
|
+
/** Optional pubsub manager for broadcasting sync events */
|
|
17
|
+
pubsub?: SessionSyncPubSub;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Minimal pubsub interface for broadcasting sync events.
|
|
21
|
+
*/
|
|
22
|
+
export interface SessionSyncPubSub {
|
|
23
|
+
broadcast(channel: string, type: string, data: Record<string, unknown>): void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Manages periodic background session branch pull for the daemon.
|
|
27
|
+
*
|
|
28
|
+
* AC: @session-branch-worktree ac-sync
|
|
29
|
+
*/
|
|
30
|
+
export declare class SessionSyncScheduler {
|
|
31
|
+
private timer;
|
|
32
|
+
private running;
|
|
33
|
+
private readonly worktreeDir;
|
|
34
|
+
private readonly intervalMs;
|
|
35
|
+
private readonly branchName;
|
|
36
|
+
private readonly pubsub?;
|
|
37
|
+
constructor(options: SessionSyncSchedulerOptions);
|
|
38
|
+
/**
|
|
39
|
+
* Start the periodic sync scheduler.
|
|
40
|
+
* Does nothing if interval is 0 or already started.
|
|
41
|
+
*/
|
|
42
|
+
start(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Stop the periodic sync scheduler.
|
|
45
|
+
*/
|
|
46
|
+
stop(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Perform a single sync (pull from remote).
|
|
49
|
+
* Skips if another sync is already in progress or no tracking configured.
|
|
50
|
+
*/
|
|
51
|
+
syncOnce(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=session-sync-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-sync-scheduler.d.ts","sourceRoot":"","sources":["../../src/parser/session-sync-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,2BAA2B;IAC1C,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAAC;CACT;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAoB;gBAEhC,OAAO,EAAE,2BAA2B;IAOhD;;;OAGG;IACH,KAAK,IAAI,IAAI;IAyBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA6ChC"}
|