@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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-task integration: sync rules and linkage.
|
|
3
|
+
*
|
|
4
|
+
* Implements the synchronization rules between review records and task
|
|
5
|
+
* lifecycle without replacing the lightweight task workflow model.
|
|
6
|
+
*
|
|
7
|
+
* AC: @review-task-lifecycle-integration ac-1 - review_ref linkage
|
|
8
|
+
* AC: @review-task-lifecycle-integration ac-2 - auto-set review_ref on task subject
|
|
9
|
+
* AC: @review-task-lifecycle-integration ac-3 - auto-set review_ref on related task
|
|
10
|
+
* AC: @review-task-lifecycle-integration ac-4 - verdict drives task transition
|
|
11
|
+
* AC: @review-task-lifecycle-integration ac-5 - inconsistent linkage warning
|
|
12
|
+
* AC: @review-task-lifecycle-integration ac-6 - history preserved through fix cycles
|
|
13
|
+
* AC: @review-task-lifecycle-integration ac-7 - external links as compatibility
|
|
14
|
+
*/
|
|
15
|
+
import type { ReviewRecord, ReviewVerdictDecision } from "../schema/index.js";
|
|
16
|
+
import type { KspecContext, LoadedTask } from "./yaml.js";
|
|
17
|
+
import { type LoadedReviewRecord } from "./reviews.js";
|
|
18
|
+
/**
|
|
19
|
+
* Result of linking a review to task(s).
|
|
20
|
+
*/
|
|
21
|
+
export interface ReviewTaskLinkResult {
|
|
22
|
+
/** Tasks that had their review_ref updated. */
|
|
23
|
+
linkedTasks: Array<{
|
|
24
|
+
ulid: string;
|
|
25
|
+
slug?: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Link a newly created review to associated tasks by setting review_ref.
|
|
30
|
+
*
|
|
31
|
+
* AC: @review-task-lifecycle-integration ac-2 - task subject auto-link
|
|
32
|
+
* AC: @review-task-lifecycle-integration ac-3 - related_refs auto-link
|
|
33
|
+
*
|
|
34
|
+
* When a review is created with:
|
|
35
|
+
* - A task subject (type: "task"): sets review_ref on the subject task
|
|
36
|
+
* - related_refs containing task refs: sets review_ref on each related task
|
|
37
|
+
*
|
|
38
|
+
* Uses the first slug as the review ref, falling back to @ULID.
|
|
39
|
+
*/
|
|
40
|
+
export declare function linkReviewToTasks(ctx: KspecContext, review: ReviewRecord, allTasks: LoadedTask[]): Promise<ReviewTaskLinkResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Handle verdict-driven task transition.
|
|
43
|
+
*
|
|
44
|
+
* AC: @review-task-lifecycle-integration ac-4
|
|
45
|
+
*
|
|
46
|
+
* When a changes_requested verdict is recorded on a review:
|
|
47
|
+
* - If the review has a task subject, transition that task to needs_work
|
|
48
|
+
* - If the review has related task refs, transition those tasks to needs_work
|
|
49
|
+
*
|
|
50
|
+
* Only transitions tasks that are currently in pending_review.
|
|
51
|
+
* Returns the list of tasks that were transitioned.
|
|
52
|
+
*/
|
|
53
|
+
export declare function handleVerdictTaskTransition(ctx: KspecContext, review: ReviewRecord, decision: ReviewVerdictDecision, allTasks: LoadedTask[], reviewer?: string): Promise<Array<{
|
|
54
|
+
ulid: string;
|
|
55
|
+
slug?: string;
|
|
56
|
+
transitioned: boolean;
|
|
57
|
+
}>>;
|
|
58
|
+
/**
|
|
59
|
+
* Warning about inconsistent review linkage on a task.
|
|
60
|
+
*
|
|
61
|
+
* AC: @review-task-lifecycle-integration ac-5
|
|
62
|
+
*/
|
|
63
|
+
export interface ReviewLinkageWarning {
|
|
64
|
+
taskRef: string;
|
|
65
|
+
taskTitle: string;
|
|
66
|
+
message: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check tasks for inconsistent review linkage.
|
|
70
|
+
*
|
|
71
|
+
* AC: @review-task-lifecycle-integration ac-5
|
|
72
|
+
*
|
|
73
|
+
* Surfaces warnings when:
|
|
74
|
+
* - A task is in pending_review with no review_ref
|
|
75
|
+
* - A task is in pending_review with a review_ref pointing at a closed/archived review
|
|
76
|
+
*/
|
|
77
|
+
export declare function checkReviewLinkageConsistency(tasks: LoadedTask[], reviews: LoadedReviewRecord[]): ReviewLinkageWarning[];
|
|
78
|
+
//# sourceMappingURL=review-task-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-task-integration.d.ts","sourceRoot":"","sources":["../../src/parser/review-task-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAsC,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,UAAU,EAAE,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAoD/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAsExE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,kBAAkB,EAAE,GAC5B,oBAAoB,EAAE,CAmCxB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-task integration: sync rules and linkage.
|
|
3
|
+
*
|
|
4
|
+
* Implements the synchronization rules between review records and task
|
|
5
|
+
* lifecycle without replacing the lightweight task workflow model.
|
|
6
|
+
*
|
|
7
|
+
* AC: @review-task-lifecycle-integration ac-1 - review_ref linkage
|
|
8
|
+
* AC: @review-task-lifecycle-integration ac-2 - auto-set review_ref on task subject
|
|
9
|
+
* AC: @review-task-lifecycle-integration ac-3 - auto-set review_ref on related task
|
|
10
|
+
* AC: @review-task-lifecycle-integration ac-4 - verdict drives task transition
|
|
11
|
+
* AC: @review-task-lifecycle-integration ac-5 - inconsistent linkage warning
|
|
12
|
+
* AC: @review-task-lifecycle-integration ac-6 - history preserved through fix cycles
|
|
13
|
+
* AC: @review-task-lifecycle-integration ac-7 - external links as compatibility
|
|
14
|
+
*/
|
|
15
|
+
import { createNote, getAuthor, mutateTaskAtomically } from "./yaml.js";
|
|
16
|
+
import { findReviewByRef } from "./reviews.js";
|
|
17
|
+
/**
|
|
18
|
+
* Link a newly created review to associated tasks by setting review_ref.
|
|
19
|
+
*
|
|
20
|
+
* AC: @review-task-lifecycle-integration ac-2 - task subject auto-link
|
|
21
|
+
* AC: @review-task-lifecycle-integration ac-3 - related_refs auto-link
|
|
22
|
+
*
|
|
23
|
+
* When a review is created with:
|
|
24
|
+
* - A task subject (type: "task"): sets review_ref on the subject task
|
|
25
|
+
* - related_refs containing task refs: sets review_ref on each related task
|
|
26
|
+
*
|
|
27
|
+
* Uses the first slug as the review ref, falling back to @ULID.
|
|
28
|
+
*/
|
|
29
|
+
export async function linkReviewToTasks(ctx, review, allTasks) {
|
|
30
|
+
const result = { linkedTasks: [] };
|
|
31
|
+
const reviewRef = review.slugs.length > 0
|
|
32
|
+
? `@${review.slugs[0]}`
|
|
33
|
+
: `@${review._ulid}`;
|
|
34
|
+
// Collect task refs to link
|
|
35
|
+
const taskRefsToLink = new Set();
|
|
36
|
+
// AC: @review-task-lifecycle-integration ac-2 - task subject
|
|
37
|
+
if (review.subject.type === "task") {
|
|
38
|
+
taskRefsToLink.add(review.subject.ref);
|
|
39
|
+
}
|
|
40
|
+
// AC: @review-task-lifecycle-integration ac-3 - related_refs
|
|
41
|
+
for (const ref of review.related_refs) {
|
|
42
|
+
// Only link refs that resolve to tasks
|
|
43
|
+
const cleanRef = ref.startsWith("@") ? ref.slice(1) : ref;
|
|
44
|
+
const matchedTask = allTasks.find((t) => t._ulid === cleanRef ||
|
|
45
|
+
t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
|
|
46
|
+
t.slugs.includes(cleanRef));
|
|
47
|
+
if (matchedTask) {
|
|
48
|
+
taskRefsToLink.add(ref);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Set review_ref on each matched task
|
|
52
|
+
for (const taskRef of taskRefsToLink) {
|
|
53
|
+
const cleanRef = taskRef.startsWith("@") ? taskRef.slice(1) : taskRef;
|
|
54
|
+
const task = allTasks.find((t) => t._ulid === cleanRef ||
|
|
55
|
+
t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
|
|
56
|
+
t.slugs.includes(cleanRef));
|
|
57
|
+
if (!task)
|
|
58
|
+
continue;
|
|
59
|
+
await mutateTaskAtomically(ctx, task, (latestTask) => ({
|
|
60
|
+
...latestTask,
|
|
61
|
+
review_ref: reviewRef,
|
|
62
|
+
}));
|
|
63
|
+
result.linkedTasks.push({
|
|
64
|
+
ulid: task._ulid,
|
|
65
|
+
slug: task.slugs[0],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Handle verdict-driven task transition.
|
|
72
|
+
*
|
|
73
|
+
* AC: @review-task-lifecycle-integration ac-4
|
|
74
|
+
*
|
|
75
|
+
* When a changes_requested verdict is recorded on a review:
|
|
76
|
+
* - If the review has a task subject, transition that task to needs_work
|
|
77
|
+
* - If the review has related task refs, transition those tasks to needs_work
|
|
78
|
+
*
|
|
79
|
+
* Only transitions tasks that are currently in pending_review.
|
|
80
|
+
* Returns the list of tasks that were transitioned.
|
|
81
|
+
*/
|
|
82
|
+
export async function handleVerdictTaskTransition(ctx, review, decision, allTasks, reviewer) {
|
|
83
|
+
if (decision !== "request_changes") {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
const results = [];
|
|
87
|
+
// Collect task refs from subject and related_refs
|
|
88
|
+
const taskRefsToCheck = new Set();
|
|
89
|
+
if (review.subject.type === "task") {
|
|
90
|
+
taskRefsToCheck.add(review.subject.ref);
|
|
91
|
+
}
|
|
92
|
+
for (const ref of review.related_refs) {
|
|
93
|
+
const cleanRef = ref.startsWith("@") ? ref.slice(1) : ref;
|
|
94
|
+
const matchedTask = allTasks.find((t) => t._ulid === cleanRef ||
|
|
95
|
+
t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
|
|
96
|
+
t.slugs.includes(cleanRef));
|
|
97
|
+
if (matchedTask) {
|
|
98
|
+
taskRefsToCheck.add(ref);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const taskRef of taskRefsToCheck) {
|
|
102
|
+
const cleanRef = taskRef.startsWith("@") ? taskRef.slice(1) : taskRef;
|
|
103
|
+
const task = allTasks.find((t) => t._ulid === cleanRef ||
|
|
104
|
+
t._ulid.toLowerCase().startsWith(cleanRef.toLowerCase()) ||
|
|
105
|
+
t.slugs.includes(cleanRef));
|
|
106
|
+
if (!task)
|
|
107
|
+
continue;
|
|
108
|
+
if (task.status !== "pending_review") {
|
|
109
|
+
results.push({ ulid: task._ulid, slug: task.slugs[0], transitioned: false });
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// Count existing fix cycles for cycle numbering
|
|
113
|
+
const existingKickbacks = task.notes.filter((note) => note.content.includes("[FIX_CYCLE:")).length;
|
|
114
|
+
const cycleNumber = existingKickbacks + 1;
|
|
115
|
+
await mutateTaskAtomically(ctx, task, (latestTask) => {
|
|
116
|
+
if (latestTask.status !== "pending_review") {
|
|
117
|
+
return latestTask;
|
|
118
|
+
}
|
|
119
|
+
const note = createNote(`[FIX_CYCLE: ${cycleNumber}] Review verdict: changes_requested${reviewer ? ` by ${reviewer}` : ""}`, getAuthor(ctx.config?.identity?.author));
|
|
120
|
+
return {
|
|
121
|
+
...latestTask,
|
|
122
|
+
status: "needs_work",
|
|
123
|
+
session_id: null,
|
|
124
|
+
notes: [...latestTask.notes, note],
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
results.push({ ulid: task._ulid, slug: task.slugs[0], transitioned: true });
|
|
128
|
+
}
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check tasks for inconsistent review linkage.
|
|
133
|
+
*
|
|
134
|
+
* AC: @review-task-lifecycle-integration ac-5
|
|
135
|
+
*
|
|
136
|
+
* Surfaces warnings when:
|
|
137
|
+
* - A task is in pending_review with no review_ref
|
|
138
|
+
* - A task is in pending_review with a review_ref pointing at a closed/archived review
|
|
139
|
+
*/
|
|
140
|
+
export function checkReviewLinkageConsistency(tasks, reviews) {
|
|
141
|
+
const warnings = [];
|
|
142
|
+
for (const task of tasks) {
|
|
143
|
+
if (task.status !== "pending_review")
|
|
144
|
+
continue;
|
|
145
|
+
const taskRef = task.slugs[0] ? `@${task.slugs[0]}` : `@${task._ulid}`;
|
|
146
|
+
if (!task.review_ref) {
|
|
147
|
+
warnings.push({
|
|
148
|
+
taskRef,
|
|
149
|
+
taskTitle: task.title,
|
|
150
|
+
message: `Task ${taskRef} is in pending_review but has no review_ref — review linkage is missing`,
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// Check if review_ref points to a valid, non-closed review
|
|
155
|
+
const review = findReviewByRef(reviews, task.review_ref);
|
|
156
|
+
if (!review) {
|
|
157
|
+
warnings.push({
|
|
158
|
+
taskRef,
|
|
159
|
+
taskTitle: task.title,
|
|
160
|
+
message: `Task ${taskRef} has review_ref ${task.review_ref} but the review record was not found`,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else if (review.lifecycle_state === "closed" || review.lifecycle_state === "archived") {
|
|
164
|
+
warnings.push({
|
|
165
|
+
taskRef,
|
|
166
|
+
taskTitle: task.title,
|
|
167
|
+
message: `Task ${taskRef} is in pending_review but review_ref ${task.review_ref} is ${review.lifecycle_state}`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return warnings;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=review-task-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-task-integration.js","sourceRoot":"","sources":["../../src/parser/review-task-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review thread operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to add threads (general or anchored), add replies,
|
|
5
|
+
* resolve/reopen threads, and compute review disposition based on
|
|
6
|
+
* unresolved blocking threads.
|
|
7
|
+
*
|
|
8
|
+
* AC: @review-comment-threads-and-anchors ac-1 - General thread creation
|
|
9
|
+
* AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
|
|
10
|
+
* AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
|
|
11
|
+
* AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
|
|
12
|
+
* AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
|
|
13
|
+
* AC: @review-comment-threads-and-anchors ac-6 - Disposition computation
|
|
14
|
+
*/
|
|
15
|
+
import type { ReviewRecord, ReviewThread, ReviewThreadEntry, ReviewThreadKind, ReviewAnchor, ReviewDisposition } from "../schema/index.js";
|
|
16
|
+
import type { LoadedReviewRecord } from "./reviews.js";
|
|
17
|
+
import type { KspecContext } from "./yaml.js";
|
|
18
|
+
export interface AddThreadInput {
|
|
19
|
+
author: string;
|
|
20
|
+
body: string;
|
|
21
|
+
kind?: ReviewThreadKind;
|
|
22
|
+
anchor?: ReviewAnchor;
|
|
23
|
+
}
|
|
24
|
+
export interface AddReplyInput {
|
|
25
|
+
threadUlid: string;
|
|
26
|
+
author: string;
|
|
27
|
+
body: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ResolveThreadInput {
|
|
30
|
+
threadUlid: string;
|
|
31
|
+
actor: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Add a new thread to a review record.
|
|
35
|
+
*
|
|
36
|
+
* AC: @review-comment-threads-and-anchors ac-1 - General threads (no anchor)
|
|
37
|
+
* AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
|
|
38
|
+
* AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
|
|
39
|
+
* AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
|
|
40
|
+
*/
|
|
41
|
+
export declare function addThread(review: ReviewRecord, input: AddThreadInput): {
|
|
42
|
+
review: ReviewRecord;
|
|
43
|
+
thread: ReviewThread;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Add a reply to an existing thread.
|
|
47
|
+
*
|
|
48
|
+
* AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
|
|
49
|
+
*/
|
|
50
|
+
export declare function addReply(review: ReviewRecord, input: AddReplyInput): {
|
|
51
|
+
review: ReviewRecord;
|
|
52
|
+
entry: ReviewThreadEntry;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Resolve a thread.
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveThread(review: ReviewRecord, input: ResolveThreadInput): ReviewRecord;
|
|
58
|
+
/**
|
|
59
|
+
* Reopen a previously resolved thread.
|
|
60
|
+
*/
|
|
61
|
+
export declare function reopenThread(review: ReviewRecord, input: ResolveThreadInput): ReviewRecord;
|
|
62
|
+
/**
|
|
63
|
+
* Compute review disposition based on unresolved threads.
|
|
64
|
+
*
|
|
65
|
+
* AC: @review-comment-threads-and-anchors ac-6
|
|
66
|
+
*
|
|
67
|
+
* Only unresolved threads with kind "blocker" prevent approval.
|
|
68
|
+
* Unresolved "nit" and "question" threads do not block.
|
|
69
|
+
*/
|
|
70
|
+
export declare function computeThreadDisposition(review: ReviewRecord): ReviewDisposition;
|
|
71
|
+
/**
|
|
72
|
+
* Get unresolved blocking threads from a review.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getUnresolvedBlockers(review: ReviewRecord): ReviewThread[];
|
|
75
|
+
/**
|
|
76
|
+
* Get all unresolved threads from a review (any kind).
|
|
77
|
+
*/
|
|
78
|
+
export declare function getUnresolvedThreads(review: ReviewRecord): ReviewThread[];
|
|
79
|
+
/**
|
|
80
|
+
* Add a thread to a review with atomic persistence.
|
|
81
|
+
*/
|
|
82
|
+
export declare function addThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: AddThreadInput): Promise<{
|
|
83
|
+
review: LoadedReviewRecord;
|
|
84
|
+
thread: ReviewThread;
|
|
85
|
+
}>;
|
|
86
|
+
/**
|
|
87
|
+
* Add a reply to a thread with atomic persistence.
|
|
88
|
+
*/
|
|
89
|
+
export declare function addReplyAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: AddReplyInput): Promise<{
|
|
90
|
+
review: LoadedReviewRecord;
|
|
91
|
+
entry: ReviewThreadEntry;
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* Resolve a thread with atomic persistence.
|
|
95
|
+
*/
|
|
96
|
+
export declare function resolveThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: ResolveThreadInput): Promise<LoadedReviewRecord>;
|
|
97
|
+
/**
|
|
98
|
+
* Reopen a thread with atomic persistence.
|
|
99
|
+
*/
|
|
100
|
+
export declare function reopenThreadAtomic(ctx: KspecContext, review: LoadedReviewRecord, input: ResolveThreadInput): Promise<LoadedReviewRecord>;
|
|
101
|
+
//# sourceMappingURL=review-threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-threads.d.ts","sourceRoot":"","sources":["../../src/parser/review-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EAEZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAI9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,cAAc,GACpB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAkChD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,aAAa,GACnB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAwCpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,GACxB,YAAY,CA6Bd;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,kBAAkB,GACxB,YAAY,CA6Bd;AAID;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,GACnB,iBAAiB,CAUnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,GACnB,YAAY,EAAE,CAIhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GACnB,YAAY,EAAE,CAEhB;AAID;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC,CAU/D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review thread operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to add threads (general or anchored), add replies,
|
|
5
|
+
* resolve/reopen threads, and compute review disposition based on
|
|
6
|
+
* unresolved blocking threads.
|
|
7
|
+
*
|
|
8
|
+
* AC: @review-comment-threads-and-anchors ac-1 - General thread creation
|
|
9
|
+
* AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
|
|
10
|
+
* AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
|
|
11
|
+
* AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
|
|
12
|
+
* AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
|
|
13
|
+
* AC: @review-comment-threads-and-anchors ac-6 - Disposition computation
|
|
14
|
+
*/
|
|
15
|
+
import { ulid } from "ulid";
|
|
16
|
+
import { mutateReviewAtomically } from "./reviews.js";
|
|
17
|
+
// --- Event helpers ---
|
|
18
|
+
function createEvent(eventType, actor, payload = {}) {
|
|
19
|
+
return {
|
|
20
|
+
_ulid: ulid(),
|
|
21
|
+
event_type: eventType,
|
|
22
|
+
actor,
|
|
23
|
+
timestamp: new Date().toISOString(),
|
|
24
|
+
payload,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// --- Thread operations ---
|
|
28
|
+
/**
|
|
29
|
+
* Add a new thread to a review record.
|
|
30
|
+
*
|
|
31
|
+
* AC: @review-comment-threads-and-anchors ac-1 - General threads (no anchor)
|
|
32
|
+
* AC: @review-comment-threads-and-anchors ac-2 - Code anchor threads
|
|
33
|
+
* AC: @review-comment-threads-and-anchors ac-3 - Structured anchor threads
|
|
34
|
+
* AC: @review-comment-threads-and-anchors ac-5 - Thread kind field
|
|
35
|
+
*/
|
|
36
|
+
export function addThread(review, input) {
|
|
37
|
+
const now = new Date().toISOString();
|
|
38
|
+
const threadUlid = ulid();
|
|
39
|
+
const entryUlid = ulid();
|
|
40
|
+
const entry = {
|
|
41
|
+
_ulid: entryUlid,
|
|
42
|
+
author: input.author,
|
|
43
|
+
body: input.body,
|
|
44
|
+
created_at: now,
|
|
45
|
+
};
|
|
46
|
+
const thread = {
|
|
47
|
+
_ulid: threadUlid,
|
|
48
|
+
kind: input.kind ?? "nit",
|
|
49
|
+
entries: [entry],
|
|
50
|
+
...(input.anchor ? { anchor: input.anchor } : {}),
|
|
51
|
+
};
|
|
52
|
+
const event = createEvent("thread_created", input.author, {
|
|
53
|
+
thread_ulid: threadUlid,
|
|
54
|
+
kind: thread.kind,
|
|
55
|
+
...(input.anchor ? { anchor_type: input.anchor.type } : {}),
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
review: {
|
|
59
|
+
...review,
|
|
60
|
+
threads: [...review.threads, thread],
|
|
61
|
+
events: [...review.events, event],
|
|
62
|
+
updated_at: now,
|
|
63
|
+
},
|
|
64
|
+
thread,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Add a reply to an existing thread.
|
|
69
|
+
*
|
|
70
|
+
* AC: @review-comment-threads-and-anchors ac-4 - Threaded replies
|
|
71
|
+
*/
|
|
72
|
+
export function addReply(review, input) {
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
const entryUlid = ulid();
|
|
75
|
+
const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
|
|
76
|
+
if (threadIndex === -1) {
|
|
77
|
+
throw new Error(`Thread not found: ${input.threadUlid}`);
|
|
78
|
+
}
|
|
79
|
+
const entry = {
|
|
80
|
+
_ulid: entryUlid,
|
|
81
|
+
author: input.author,
|
|
82
|
+
body: input.body,
|
|
83
|
+
created_at: now,
|
|
84
|
+
};
|
|
85
|
+
const updatedThread = {
|
|
86
|
+
...review.threads[threadIndex],
|
|
87
|
+
entries: [...review.threads[threadIndex].entries, entry],
|
|
88
|
+
};
|
|
89
|
+
const updatedThreads = [...review.threads];
|
|
90
|
+
updatedThreads[threadIndex] = updatedThread;
|
|
91
|
+
const event = createEvent("thread_replied", input.author, {
|
|
92
|
+
thread_ulid: input.threadUlid,
|
|
93
|
+
entry_ulid: entryUlid,
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
review: {
|
|
97
|
+
...review,
|
|
98
|
+
threads: updatedThreads,
|
|
99
|
+
events: [...review.events, event],
|
|
100
|
+
updated_at: now,
|
|
101
|
+
},
|
|
102
|
+
entry,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a thread.
|
|
107
|
+
*/
|
|
108
|
+
export function resolveThread(review, input) {
|
|
109
|
+
const now = new Date().toISOString();
|
|
110
|
+
const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
|
|
111
|
+
if (threadIndex === -1) {
|
|
112
|
+
throw new Error(`Thread not found: ${input.threadUlid}`);
|
|
113
|
+
}
|
|
114
|
+
const updatedThread = {
|
|
115
|
+
...review.threads[threadIndex],
|
|
116
|
+
resolved_at: now,
|
|
117
|
+
resolved_by: input.actor,
|
|
118
|
+
};
|
|
119
|
+
const updatedThreads = [...review.threads];
|
|
120
|
+
updatedThreads[threadIndex] = updatedThread;
|
|
121
|
+
const event = createEvent("thread_resolved", input.actor, {
|
|
122
|
+
thread_ulid: input.threadUlid,
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
...review,
|
|
126
|
+
threads: updatedThreads,
|
|
127
|
+
events: [...review.events, event],
|
|
128
|
+
updated_at: now,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Reopen a previously resolved thread.
|
|
133
|
+
*/
|
|
134
|
+
export function reopenThread(review, input) {
|
|
135
|
+
const now = new Date().toISOString();
|
|
136
|
+
const threadIndex = review.threads.findIndex((t) => t._ulid === input.threadUlid);
|
|
137
|
+
if (threadIndex === -1) {
|
|
138
|
+
throw new Error(`Thread not found: ${input.threadUlid}`);
|
|
139
|
+
}
|
|
140
|
+
const updatedThread = {
|
|
141
|
+
...review.threads[threadIndex],
|
|
142
|
+
resolved_at: null,
|
|
143
|
+
resolved_by: null,
|
|
144
|
+
};
|
|
145
|
+
const updatedThreads = [...review.threads];
|
|
146
|
+
updatedThreads[threadIndex] = updatedThread;
|
|
147
|
+
const event = createEvent("thread_reopened", input.actor, {
|
|
148
|
+
thread_ulid: input.threadUlid,
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
...review,
|
|
152
|
+
threads: updatedThreads,
|
|
153
|
+
events: [...review.events, event],
|
|
154
|
+
updated_at: now,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// --- Disposition computation ---
|
|
158
|
+
/**
|
|
159
|
+
* Compute review disposition based on unresolved threads.
|
|
160
|
+
*
|
|
161
|
+
* AC: @review-comment-threads-and-anchors ac-6
|
|
162
|
+
*
|
|
163
|
+
* Only unresolved threads with kind "blocker" prevent approval.
|
|
164
|
+
* Unresolved "nit" and "question" threads do not block.
|
|
165
|
+
*/
|
|
166
|
+
export function computeThreadDisposition(review) {
|
|
167
|
+
const hasUnresolvedBlockers = review.threads.some((t) => t.kind === "blocker" && !t.resolved_at);
|
|
168
|
+
if (hasUnresolvedBlockers) {
|
|
169
|
+
return "changes_requested";
|
|
170
|
+
}
|
|
171
|
+
return "pending";
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get unresolved blocking threads from a review.
|
|
175
|
+
*/
|
|
176
|
+
export function getUnresolvedBlockers(review) {
|
|
177
|
+
return review.threads.filter((t) => t.kind === "blocker" && !t.resolved_at);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get all unresolved threads from a review (any kind).
|
|
181
|
+
*/
|
|
182
|
+
export function getUnresolvedThreads(review) {
|
|
183
|
+
return review.threads.filter((t) => !t.resolved_at);
|
|
184
|
+
}
|
|
185
|
+
// --- Atomic persistence wrappers ---
|
|
186
|
+
/**
|
|
187
|
+
* Add a thread to a review with atomic persistence.
|
|
188
|
+
*/
|
|
189
|
+
export async function addThreadAtomic(ctx, review, input) {
|
|
190
|
+
let createdThread;
|
|
191
|
+
const updated = await mutateReviewAtomically(ctx, review, (latest) => {
|
|
192
|
+
const result = addThread(latest, input);
|
|
193
|
+
createdThread = result.thread;
|
|
194
|
+
return result.review;
|
|
195
|
+
});
|
|
196
|
+
return { review: updated, thread: createdThread };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Add a reply to a thread with atomic persistence.
|
|
200
|
+
*/
|
|
201
|
+
export async function addReplyAtomic(ctx, review, input) {
|
|
202
|
+
let createdEntry;
|
|
203
|
+
const updated = await mutateReviewAtomically(ctx, review, (latest) => {
|
|
204
|
+
const result = addReply(latest, input);
|
|
205
|
+
createdEntry = result.entry;
|
|
206
|
+
return result.review;
|
|
207
|
+
});
|
|
208
|
+
return { review: updated, entry: createdEntry };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Resolve a thread with atomic persistence.
|
|
212
|
+
*/
|
|
213
|
+
export async function resolveThreadAtomic(ctx, review, input) {
|
|
214
|
+
return mutateReviewAtomically(ctx, review, (latest) => resolveThread(latest, input));
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Reopen a thread with atomic persistence.
|
|
218
|
+
*/
|
|
219
|
+
export async function reopenThreadAtomic(ctx, review, input) {
|
|
220
|
+
return mutateReviewAtomically(ctx, review, (latest) => reopenThread(latest, input));
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=review-threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-threads.js","sourceRoot":"","sources":["../../src/parser/review-threads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation module for review records.
|
|
3
|
+
*
|
|
4
|
+
* Provides schema validation for review records, threads, checks, verdicts,
|
|
5
|
+
* events, and subject bindings. Used during parsing, persistence, and
|
|
6
|
+
* command mutation to ensure review data integrity.
|
|
7
|
+
*
|
|
8
|
+
* AC: @review-record-validation ac-1, ac-2
|
|
9
|
+
*/
|
|
10
|
+
import type { SchemaValidationError } from "./validate.js";
|
|
11
|
+
/**
|
|
12
|
+
* Result of validating a single review record.
|
|
13
|
+
*/
|
|
14
|
+
export interface ReviewValidationResult {
|
|
15
|
+
valid: boolean;
|
|
16
|
+
errors: SchemaValidationError[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate a single review record against the full ReviewRecordSchema.
|
|
20
|
+
* Use this when validating persisted or loaded review records.
|
|
21
|
+
*
|
|
22
|
+
* AC: @review-record-validation ac-1
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateReviewRecord(data: unknown, source?: string): ReviewValidationResult;
|
|
25
|
+
/**
|
|
26
|
+
* Validate review record input (for creating new reviews).
|
|
27
|
+
* Uses ReviewRecordInputSchema which has relaxed requirements.
|
|
28
|
+
*
|
|
29
|
+
* AC: @review-record-validation ac-1, ac-2
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateReviewRecordInput(data: unknown, source?: string): ReviewValidationResult;
|
|
32
|
+
/**
|
|
33
|
+
* Validate a reviews YAML file (project.reviews.yaml).
|
|
34
|
+
* Validates the file-level schema and each individual review record.
|
|
35
|
+
*
|
|
36
|
+
* AC: @review-record-validation ac-1, ac-2
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateReviewsFile(filePath: string): Promise<SchemaValidationError[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Find review files in a directory (files matching *.reviews.yaml).
|
|
41
|
+
*/
|
|
42
|
+
export declare function findReviewFiles(dir: string): Promise<string[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Convenience: parse and validate a review record, returning the typed
|
|
45
|
+
* result on success or errors on failure.
|
|
46
|
+
*
|
|
47
|
+
* AC: @review-record-validation ac-1, ac-2
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseReviewRecord(data: unknown, source?: string): {
|
|
50
|
+
ok: true;
|
|
51
|
+
data: import("../schema/review-records.js").ReviewRecord;
|
|
52
|
+
} | {
|
|
53
|
+
ok: false;
|
|
54
|
+
errors: SchemaValidationError[];
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Convenience: parse and validate review record input, returning the typed
|
|
58
|
+
* result on success or errors on failure.
|
|
59
|
+
*
|
|
60
|
+
* AC: @review-record-validation ac-1, ac-2
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseReviewRecordInput(data: unknown, source?: string): {
|
|
63
|
+
ok: true;
|
|
64
|
+
data: import("../schema/review-records.js").ReviewRecordInput;
|
|
65
|
+
} | {
|
|
66
|
+
ok: false;
|
|
67
|
+
errors: SchemaValidationError[];
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=review-validation.d.ts.map
|