@kynetic-ai/spec 0.1.2 → 0.3.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 +250 -17
- package/dist/acp/client.d.ts +18 -4
- package/dist/acp/client.d.ts.map +1 -1
- package/dist/acp/client.js +44 -26
- package/dist/acp/client.js.map +1 -1
- package/dist/acp/framing.d.ts +2 -2
- package/dist/acp/framing.d.ts.map +1 -1
- package/dist/acp/framing.js +37 -29
- package/dist/acp/framing.js.map +1 -1
- package/dist/acp/index.d.ts +6 -7
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js +3 -3
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/types.d.ts +5 -5
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js +18 -18
- package/dist/acp/types.js.map +1 -1
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/adapters.js +24 -13
- package/dist/agents/adapters.js.map +1 -1
- package/dist/agents/index.d.ts +2 -2
- package/dist/agents/index.js +2 -2
- package/dist/agents/spawner.d.ts +4 -4
- package/dist/agents/spawner.d.ts.map +1 -1
- package/dist/agents/spawner.js +6 -6
- package/dist/agents/spawner.js.map +1 -1
- package/dist/cli/batch-context.d.ts +43 -0
- package/dist/cli/batch-context.d.ts.map +1 -0
- package/dist/cli/batch-context.js +93 -0
- package/dist/cli/batch-context.js.map +1 -0
- package/dist/cli/batch-exec.d.ts +116 -0
- package/dist/cli/batch-exec.d.ts.map +1 -0
- package/dist/cli/batch-exec.js +694 -0
- package/dist/cli/batch-exec.js.map +1 -0
- package/dist/cli/batch.d.ts +4 -2
- package/dist/cli/batch.d.ts.map +1 -1
- package/dist/cli/batch.js +15 -14
- package/dist/cli/batch.js.map +1 -1
- package/dist/cli/command-annotations.d.ts +23 -0
- package/dist/cli/command-annotations.d.ts.map +1 -0
- package/dist/cli/command-annotations.js +27 -0
- package/dist/cli/command-annotations.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +46 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +377 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/batch.d.ts +20 -0
- package/dist/cli/commands/batch.d.ts.map +1 -0
- package/dist/cli/commands/batch.js +214 -0
- package/dist/cli/commands/batch.js.map +1 -0
- package/dist/cli/commands/clone-for-testing.d.ts +1 -1
- package/dist/cli/commands/clone-for-testing.d.ts.map +1 -1
- package/dist/cli/commands/clone-for-testing.js +37 -47
- package/dist/cli/commands/clone-for-testing.js.map +1 -1
- package/dist/cli/commands/derive.d.ts +1 -1
- package/dist/cli/commands/derive.d.ts.map +1 -1
- package/dist/cli/commands/derive.js +140 -88
- package/dist/cli/commands/derive.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +11 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +152 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +12 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +134 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/help.d.ts +1 -1
- package/dist/cli/commands/help.d.ts.map +1 -1
- package/dist/cli/commands/help.js +163 -37
- package/dist/cli/commands/help.js.map +1 -1
- package/dist/cli/commands/inbox.d.ts +1 -1
- package/dist/cli/commands/inbox.d.ts.map +1 -1
- package/dist/cli/commands/inbox.js +178 -56
- package/dist/cli/commands/inbox.js.map +1 -1
- package/dist/cli/commands/index.d.ts +31 -19
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +31 -19
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +5 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +108 -57
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/item.d.ts +1 -1
- package/dist/cli/commands/item.d.ts.map +1 -1
- package/dist/cli/commands/item.js +557 -274
- package/dist/cli/commands/item.js.map +1 -1
- package/dist/cli/commands/link.d.ts +1 -1
- package/dist/cli/commands/link.d.ts.map +1 -1
- package/dist/cli/commands/link.js +55 -46
- package/dist/cli/commands/link.js.map +1 -1
- package/dist/cli/commands/log.d.ts +1 -1
- package/dist/cli/commands/log.d.ts.map +1 -1
- package/dist/cli/commands/log.js +57 -51
- package/dist/cli/commands/log.js.map +1 -1
- package/dist/cli/commands/merge-driver.d.ts +19 -0
- package/dist/cli/commands/merge-driver.d.ts.map +1 -0
- package/dist/cli/commands/merge-driver.js +398 -0
- package/dist/cli/commands/merge-driver.js.map +1 -0
- package/dist/cli/commands/meta.d.ts +1 -1
- package/dist/cli/commands/meta.d.ts.map +1 -1
- package/dist/cli/commands/meta.js +533 -399
- package/dist/cli/commands/meta.js.map +1 -1
- package/dist/cli/commands/module.d.ts +1 -1
- package/dist/cli/commands/module.d.ts.map +1 -1
- package/dist/cli/commands/module.js +30 -25
- package/dist/cli/commands/module.js.map +1 -1
- package/dist/cli/commands/plan-import.d.ts +11 -0
- package/dist/cli/commands/plan-import.d.ts.map +1 -0
- package/dist/cli/commands/plan-import.js +516 -0
- package/dist/cli/commands/plan-import.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +10 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +421 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/ralph.d.ts +1 -1
- package/dist/cli/commands/ralph.d.ts.map +1 -1
- package/dist/cli/commands/ralph.js +1097 -169
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/commands/refs.d.ts +13 -0
- package/dist/cli/commands/refs.d.ts.map +1 -0
- package/dist/cli/commands/refs.js +283 -0
- package/dist/cli/commands/refs.js.map +1 -0
- package/dist/cli/commands/search.d.ts +1 -1
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +199 -37
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/serve.d.ts +10 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +491 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/session.d.ts +25 -6
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +811 -127
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/setup-seeding.d.ts +81 -0
- package/dist/cli/commands/setup-seeding.d.ts.map +1 -0
- package/dist/cli/commands/setup-seeding.js +292 -0
- package/dist/cli/commands/setup-seeding.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +77 -3
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +1233 -274
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/shadow.d.ts +1 -1
- package/dist/cli/commands/shadow.d.ts.map +1 -1
- package/dist/cli/commands/shadow.js +70 -50
- package/dist/cli/commands/shadow.js.map +1 -1
- package/dist/cli/commands/skill-crud.d.ts +58 -0
- package/dist/cli/commands/skill-crud.d.ts.map +1 -0
- package/dist/cli/commands/skill-crud.js +753 -0
- package/dist/cli/commands/skill-crud.js.map +1 -0
- package/dist/cli/commands/skill-diff.d.ts +27 -0
- package/dist/cli/commands/skill-diff.d.ts.map +1 -0
- package/dist/cli/commands/skill-diff.js +840 -0
- package/dist/cli/commands/skill-diff.js.map +1 -0
- package/dist/cli/commands/skill-install.d.ts +53 -0
- package/dist/cli/commands/skill-install.d.ts.map +1 -0
- package/dist/cli/commands/skill-install.js +452 -0
- package/dist/cli/commands/skill-install.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +20 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +36 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/commands/task.d.ts +1 -1
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +569 -346
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/tasks.d.ts +26 -1
- package/dist/cli/commands/tasks.d.ts.map +1 -1
- package/dist/cli/commands/tasks.js +227 -122
- package/dist/cli/commands/tasks.js.map +1 -1
- package/dist/cli/commands/trait.d.ts +1 -1
- package/dist/cli/commands/trait.d.ts.map +1 -1
- package/dist/cli/commands/trait.js +166 -101
- package/dist/cli/commands/trait.js.map +1 -1
- package/dist/cli/commands/triage.d.ts +7 -0
- package/dist/cli/commands/triage.d.ts.map +1 -0
- package/dist/cli/commands/triage.js +569 -0
- package/dist/cli/commands/triage.js.map +1 -0
- package/dist/cli/commands/util.d.ts +7 -0
- package/dist/cli/commands/util.d.ts.map +1 -0
- package/dist/cli/commands/util.js +30 -0
- package/dist/cli/commands/util.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +264 -83
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +851 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/exit-codes.d.ts +7 -0
- package/dist/cli/exit-codes.d.ts.map +1 -1
- package/dist/cli/exit-codes.js +26 -18
- package/dist/cli/exit-codes.js.map +1 -1
- package/dist/cli/help/content.d.ts.map +1 -1
- package/dist/cli/help/content.js +86 -71
- package/dist/cli/help/content.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +131 -19
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/introspection.d.ts +6 -2
- package/dist/cli/introspection.d.ts.map +1 -1
- package/dist/cli/introspection.js +11 -8
- package/dist/cli/introspection.js.map +1 -1
- package/dist/cli/output.d.ts +64 -4
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +235 -85
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/parse-utils.d.ts +21 -0
- package/dist/cli/parse-utils.d.ts.map +1 -0
- package/dist/cli/parse-utils.js +32 -0
- package/dist/cli/parse-utils.js.map +1 -0
- package/dist/cli/pid-utils.d.ts +72 -0
- package/dist/cli/pid-utils.d.ts.map +1 -0
- package/dist/cli/pid-utils.js +174 -0
- package/dist/cli/pid-utils.js.map +1 -0
- package/dist/cli/suggest.d.ts.map +1 -1
- package/dist/cli/suggest.js +1 -2
- package/dist/cli/suggest.js.map +1 -1
- package/dist/cli/validators.d.ts +43 -0
- package/dist/cli/validators.d.ts.map +1 -0
- package/dist/cli/validators.js +84 -0
- package/dist/cli/validators.js.map +1 -0
- package/dist/daemon/index.ts +52 -0
- package/dist/daemon/middleware/project-context.ts +126 -0
- package/dist/daemon/pid.ts +179 -0
- package/dist/daemon/project-context.ts +343 -0
- package/dist/daemon/routes/inbox.ts +164 -0
- package/dist/daemon/routes/items.ts +322 -0
- package/dist/daemon/routes/meta.ts +118 -0
- package/dist/daemon/routes/projects.ts +162 -0
- package/dist/daemon/routes/tasks.ts +327 -0
- package/dist/daemon/routes/triage.ts +468 -0
- package/dist/daemon/routes/validation.ts +248 -0
- package/dist/daemon/server.ts +408 -0
- package/dist/daemon/watcher.ts +195 -0
- package/dist/daemon/websocket/handler.ts +138 -0
- package/dist/daemon/websocket/heartbeat.ts +71 -0
- package/dist/daemon/websocket/pubsub.ts +125 -0
- package/dist/daemon/websocket/types.ts +66 -0
- package/dist/export/html.d.ts +19 -0
- package/dist/export/html.d.ts.map +1 -0
- package/dist/export/html.js +239 -0
- package/dist/export/html.js.map +1 -0
- package/dist/export/index.d.ts +10 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +10 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/json.d.ts +24 -0
- package/dist/export/json.d.ts.map +1 -0
- package/dist/export/json.js +198 -0
- package/dist/export/json.js.map +1 -0
- package/dist/export/triage.d.ts +51 -0
- package/dist/export/triage.d.ts.map +1 -0
- package/dist/export/triage.js +83 -0
- package/dist/export/triage.js.map +1 -0
- package/dist/export/types.d.ts +122 -0
- package/dist/export/types.d.ts.map +1 -0
- package/dist/export/types.js +9 -0
- package/dist/export/types.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/lib/claude-plugin-registry.d.ts +66 -0
- package/dist/lib/claude-plugin-registry.d.ts.map +1 -0
- package/dist/lib/claude-plugin-registry.js +318 -0
- package/dist/lib/claude-plugin-registry.js.map +1 -0
- package/dist/merge/arrays.d.ts +87 -0
- package/dist/merge/arrays.d.ts.map +1 -0
- package/dist/merge/arrays.js +164 -0
- package/dist/merge/arrays.js.map +1 -0
- package/dist/merge/file-type.d.ts +32 -0
- package/dist/merge/file-type.d.ts.map +1 -0
- package/dist/merge/file-type.js +70 -0
- package/dist/merge/file-type.js.map +1 -0
- package/dist/merge/index.d.ts +14 -0
- package/dist/merge/index.d.ts.map +1 -0
- package/dist/merge/index.js +11 -0
- package/dist/merge/index.js.map +1 -0
- package/dist/merge/objects.d.ts +46 -0
- package/dist/merge/objects.d.ts.map +1 -0
- package/dist/merge/objects.js +193 -0
- package/dist/merge/objects.js.map +1 -0
- package/dist/merge/parse.d.ts +23 -0
- package/dist/merge/parse.d.ts.map +1 -0
- package/dist/merge/parse.js +78 -0
- package/dist/merge/parse.js.map +1 -0
- package/dist/merge/resolve.d.ts +66 -0
- package/dist/merge/resolve.d.ts.map +1 -0
- package/dist/merge/resolve.js +189 -0
- package/dist/merge/resolve.js.map +1 -0
- package/dist/merge/types.d.ts +82 -0
- package/dist/merge/types.d.ts.map +1 -0
- package/dist/merge/types.js +8 -0
- package/dist/merge/types.js.map +1 -0
- package/dist/parser/agent-data-sections.d.ts +53 -0
- package/dist/parser/agent-data-sections.d.ts.map +1 -0
- package/dist/parser/agent-data-sections.js +118 -0
- package/dist/parser/agent-data-sections.js.map +1 -0
- package/dist/parser/alignment.d.ts +4 -4
- package/dist/parser/alignment.d.ts.map +1 -1
- package/dist/parser/alignment.js +27 -22
- package/dist/parser/alignment.js.map +1 -1
- package/dist/parser/assess.d.ts +5 -5
- package/dist/parser/assess.d.ts.map +1 -1
- package/dist/parser/assess.js +36 -32
- package/dist/parser/assess.js.map +1 -1
- package/dist/parser/config.d.ts +351 -0
- package/dist/parser/config.d.ts.map +1 -0
- package/dist/parser/config.js +326 -0
- package/dist/parser/config.js.map +1 -0
- package/dist/parser/convention-validation.d.ts +1 -1
- package/dist/parser/convention-validation.d.ts.map +1 -1
- package/dist/parser/convention-validation.js +21 -16
- package/dist/parser/convention-validation.js.map +1 -1
- package/dist/parser/coverage-cache.d.ts +49 -0
- package/dist/parser/coverage-cache.d.ts.map +1 -0
- package/dist/parser/coverage-cache.js +123 -0
- package/dist/parser/coverage-cache.js.map +1 -0
- package/dist/parser/daemon-status.d.ts +37 -0
- package/dist/parser/daemon-status.d.ts.map +1 -0
- package/dist/parser/daemon-status.js +67 -0
- package/dist/parser/daemon-status.js.map +1 -0
- package/dist/parser/doctor.d.ts +107 -0
- package/dist/parser/doctor.d.ts.map +1 -0
- package/dist/parser/doctor.js +366 -0
- package/dist/parser/doctor.js.map +1 -0
- package/dist/parser/fix.d.ts +1 -1
- package/dist/parser/fix.d.ts.map +1 -1
- package/dist/parser/fix.js +31 -27
- package/dist/parser/fix.js.map +1 -1
- package/dist/parser/index.d.ts +16 -11
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +16 -11
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/items.d.ts +8 -2
- package/dist/parser/items.d.ts.map +1 -1
- package/dist/parser/items.js +71 -35
- package/dist/parser/items.js.map +1 -1
- package/dist/parser/meta.d.ts +167 -9
- package/dist/parser/meta.d.ts.map +1 -1
- package/dist/parser/meta.js +379 -46
- package/dist/parser/meta.js.map +1 -1
- package/dist/parser/plan-document.d.ts +189 -0
- package/dist/parser/plan-document.d.ts.map +1 -0
- package/dist/parser/plan-document.js +340 -0
- package/dist/parser/plan-document.js.map +1 -0
- package/dist/parser/plans.d.ts +59 -0
- package/dist/parser/plans.d.ts.map +1 -0
- package/dist/parser/plans.js +239 -0
- package/dist/parser/plans.js.map +1 -0
- package/dist/parser/refs.d.ts +22 -9
- package/dist/parser/refs.d.ts.map +1 -1
- package/dist/parser/refs.js +102 -50
- package/dist/parser/refs.js.map +1 -1
- package/dist/parser/setup-status.d.ts +71 -0
- package/dist/parser/setup-status.d.ts.map +1 -0
- package/dist/parser/setup-status.js +269 -0
- package/dist/parser/setup-status.js.map +1 -0
- package/dist/parser/shadow.d.ts +150 -19
- package/dist/parser/shadow.d.ts.map +1 -1
- package/dist/parser/shadow.js +548 -187
- package/dist/parser/shadow.js.map +1 -1
- package/dist/parser/skill-render.d.ts +317 -0
- package/dist/parser/skill-render.d.ts.map +1 -0
- package/dist/parser/skill-render.js +943 -0
- package/dist/parser/skill-render.js.map +1 -0
- package/dist/parser/traits.d.ts +3 -3
- package/dist/parser/traits.d.ts.map +1 -1
- package/dist/parser/traits.js +2 -2
- package/dist/parser/traits.js.map +1 -1
- package/dist/parser/validate-skills.d.ts +32 -0
- package/dist/parser/validate-skills.d.ts.map +1 -0
- package/dist/parser/validate-skills.js +202 -0
- package/dist/parser/validate-skills.js.map +1 -0
- package/dist/parser/validate.d.ts +45 -3
- package/dist/parser/validate.d.ts.map +1 -1
- package/dist/parser/validate.js +622 -105
- package/dist/parser/validate.js.map +1 -1
- package/dist/parser/yaml.d.ts +83 -19
- package/dist/parser/yaml.d.ts.map +1 -1
- package/dist/parser/yaml.js +478 -173
- package/dist/parser/yaml.js.map +1 -1
- package/dist/ralph/cli-renderer.d.ts +8 -1
- package/dist/ralph/cli-renderer.d.ts.map +1 -1
- package/dist/ralph/cli-renderer.js +105 -34
- package/dist/ralph/cli-renderer.js.map +1 -1
- package/dist/ralph/events.d.ts +10 -10
- package/dist/ralph/events.d.ts.map +1 -1
- package/dist/ralph/events.js +277 -98
- package/dist/ralph/events.js.map +1 -1
- package/dist/ralph/index.d.ts +5 -2
- package/dist/ralph/index.d.ts.map +1 -1
- package/dist/ralph/index.js +9 -3
- package/dist/ralph/index.js.map +1 -1
- package/dist/ralph/loop-errors.d.ts +83 -0
- package/dist/ralph/loop-errors.d.ts.map +1 -0
- package/dist/ralph/loop-errors.js +150 -0
- package/dist/ralph/loop-errors.js.map +1 -0
- package/dist/ralph/subagent.d.ts +83 -0
- package/dist/ralph/subagent.d.ts.map +1 -0
- package/dist/ralph/subagent.js +174 -0
- package/dist/ralph/subagent.js.map +1 -0
- package/dist/ralph/wrap-up.d.ts +125 -0
- package/dist/ralph/wrap-up.d.ts.map +1 -0
- package/dist/ralph/wrap-up.js +270 -0
- package/dist/ralph/wrap-up.js.map +1 -0
- package/dist/schema/batch.d.ts +95 -0
- package/dist/schema/batch.d.ts.map +1 -0
- package/dist/schema/batch.js +24 -0
- package/dist/schema/batch.js.map +1 -0
- package/dist/schema/common.d.ts +2 -2
- package/dist/schema/common.d.ts.map +1 -1
- package/dist/schema/common.js +34 -31
- package/dist/schema/common.js.map +1 -1
- package/dist/schema/inbox.d.ts +12 -12
- package/dist/schema/inbox.js +4 -4
- package/dist/schema/inbox.js.map +1 -1
- package/dist/schema/index.d.ts +8 -5
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +8 -5
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/meta.d.ts +1454 -27
- package/dist/schema/meta.d.ts.map +1 -1
- package/dist/schema/meta.js +198 -21
- package/dist/schema/meta.js.map +1 -1
- package/dist/schema/plan.d.ts +285 -0
- package/dist/schema/plan.d.ts.map +1 -0
- package/dist/schema/plan.js +81 -0
- package/dist/schema/plan.js.map +1 -0
- package/dist/schema/spec.d.ts +72 -33
- package/dist/schema/spec.d.ts.map +1 -1
- package/dist/schema/spec.js +22 -9
- package/dist/schema/spec.js.map +1 -1
- package/dist/schema/task.d.ts +172 -161
- package/dist/schema/task.d.ts.map +1 -1
- package/dist/schema/task.js +21 -12
- package/dist/schema/task.js.map +1 -1
- package/dist/schema/triage.d.ts +266 -0
- package/dist/schema/triage.d.ts.map +1 -0
- package/dist/schema/triage.js +134 -0
- package/dist/schema/triage.js.map +1 -0
- package/dist/sessions/index.d.ts +2 -2
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +3 -3
- package/dist/sessions/index.js.map +1 -1
- package/dist/sessions/store.d.ts +233 -1
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +628 -31
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +10 -10
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js +10 -9
- package/dist/sessions/types.js.map +1 -1
- package/dist/strings/errors.d.ts +51 -0
- package/dist/strings/errors.d.ts.map +1 -1
- package/dist/strings/errors.js +136 -106
- package/dist/strings/errors.js.map +1 -1
- package/dist/strings/guidance.d.ts.map +1 -1
- package/dist/strings/guidance.js +16 -16
- package/dist/strings/guidance.js.map +1 -1
- package/dist/strings/index.d.ts +4 -4
- package/dist/strings/index.d.ts.map +1 -1
- package/dist/strings/index.js +4 -4
- package/dist/strings/index.js.map +1 -1
- package/dist/strings/labels.d.ts +4 -0
- package/dist/strings/labels.d.ts.map +1 -1
- package/dist/strings/labels.js +45 -41
- package/dist/strings/labels.js.map +1 -1
- package/dist/strings/validation.d.ts.map +1 -1
- package/dist/strings/validation.js +71 -71
- package/dist/strings/validation.js.map +1 -1
- package/dist/utils/commit.d.ts +1 -1
- package/dist/utils/commit.d.ts.map +1 -1
- package/dist/utils/commit.js +28 -26
- package/dist/utils/commit.js.map +1 -1
- package/dist/utils/git.d.ts +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +40 -38
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/grep.js +11 -11
- package/dist/utils/grep.js.map +1 -1
- package/dist/utils/index.d.ts +7 -7
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +10 -10
- package/dist/utils/time.js.map +1 -1
- package/package.json +28 -5
- package/plugin/.claude-plugin/marketplace.json +17 -0
- package/plugin/.claude-plugin/plugin.json +5 -0
- package/plugin/plugins/kspec/skills/help/SKILL.md +42 -0
- package/plugin/plugins/kspec/skills/triage/SKILL.md +206 -0
- package/plugin/plugins/kspec/skills/triage/docs/automation.md +120 -0
- package/plugin/plugins/kspec/skills/triage/docs/inbox.md +144 -0
- package/plugin/plugins/kspec/skills/triage/docs/observations.md +85 -0
- package/templates/agents-sections/01-quick-start.md +22 -0
- package/templates/agents-sections/02-shadow-branch.md +34 -0
- package/templates/agents-sections/03-task-lifecycle.md +48 -0
- package/templates/agents-sections/04-pr-workflow.md +17 -0
- package/templates/agents-sections/05-commit-convention.md +27 -0
- package/templates/agents-sections/06-ralph-loop.md +45 -0
- package/templates/hooks/pre-commit +34 -0
- package/templates/skills/help/SKILL.md +37 -0
- package/templates/skills/manifest.yaml +15 -0
- package/templates/skills/triage/SKILL.md +199 -0
- package/templates/skills/triage/docs/automation.md +120 -0
- package/templates/skills/triage/docs/inbox.md +144 -0
- package/templates/skills/triage/docs/observations.md +85 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-level configuration for kspec.
|
|
3
|
+
*
|
|
4
|
+
* Loads kspec.config.yaml from the project root (main branch) before shadow
|
|
5
|
+
* branch detection. All fields are optional with backward-compatible defaults.
|
|
6
|
+
*
|
|
7
|
+
* Priority: env vars > config file > defaults
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
/**
|
|
13
|
+
* Complete schema for kspec.config.yaml.
|
|
14
|
+
*
|
|
15
|
+
* AC: @project-config ac-4 — unknown fields are ignored via passthrough
|
|
16
|
+
*/
|
|
17
|
+
export declare const KspecConfigSchema: z.ZodObject<{
|
|
18
|
+
/** Shadow branch configuration */
|
|
19
|
+
shadow: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
/** Branch name for shadow branch (default: kspec-meta) */
|
|
21
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
22
|
+
/** Worktree directory name (default: .kspec) */
|
|
23
|
+
directory: z.ZodOptional<z.ZodString>;
|
|
24
|
+
/**
|
|
25
|
+
* Remote target for shadow branch. Can be:
|
|
26
|
+
* - Named remote (e.g., "origin", "specs-origin")
|
|
27
|
+
* - Local filesystem path (starts with /, ./, or ~)
|
|
28
|
+
* - Git URL (contains :// or starts with git@)
|
|
29
|
+
*/
|
|
30
|
+
remote: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, "strict", z.ZodTypeAny, {
|
|
32
|
+
branch?: string | undefined;
|
|
33
|
+
directory?: string | undefined;
|
|
34
|
+
remote?: string | undefined;
|
|
35
|
+
}, {
|
|
36
|
+
branch?: string | undefined;
|
|
37
|
+
directory?: string | undefined;
|
|
38
|
+
remote?: string | undefined;
|
|
39
|
+
}>>;
|
|
40
|
+
/** Identity configuration */
|
|
41
|
+
identity: z.ZodOptional<z.ZodObject<{
|
|
42
|
+
/** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
|
|
43
|
+
author: z.ZodOptional<z.ZodString>;
|
|
44
|
+
}, "strict", z.ZodTypeAny, {
|
|
45
|
+
author?: string | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
author?: string | undefined;
|
|
48
|
+
}>>;
|
|
49
|
+
/** Validation configuration */
|
|
50
|
+
validation: z.ZodOptional<z.ZodObject<{
|
|
51
|
+
/**
|
|
52
|
+
* When true, dangling references are treated as errors instead of warnings.
|
|
53
|
+
* AC: @config-validation ac-2 ac-3 — strict_refs configurable
|
|
54
|
+
*/
|
|
55
|
+
strict_refs: z.ZodOptional<z.ZodBoolean>;
|
|
56
|
+
/**
|
|
57
|
+
* When true, specs missing acceptance criteria are reported as errors not warnings.
|
|
58
|
+
* AC: @config-validation ac-1 — require_acceptance configurable
|
|
59
|
+
*/
|
|
60
|
+
require_acceptance: z.ZodOptional<z.ZodBoolean>;
|
|
61
|
+
}, "strict", z.ZodTypeAny, {
|
|
62
|
+
strict_refs?: boolean | undefined;
|
|
63
|
+
require_acceptance?: boolean | undefined;
|
|
64
|
+
}, {
|
|
65
|
+
strict_refs?: boolean | undefined;
|
|
66
|
+
require_acceptance?: boolean | undefined;
|
|
67
|
+
}>>;
|
|
68
|
+
/** Daemon configuration */
|
|
69
|
+
daemon: z.ZodOptional<z.ZodObject<{
|
|
70
|
+
/** Default port for daemon (default: 3456) */
|
|
71
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
/** Host to bind to (default: localhost) */
|
|
73
|
+
host: z.ZodOptional<z.ZodString>;
|
|
74
|
+
/**
|
|
75
|
+
* Whether to auto-start daemon when running kspec commands.
|
|
76
|
+
* AC: @config-daemon ac-3 — auto_start configurable
|
|
77
|
+
*/
|
|
78
|
+
auto_start: z.ZodOptional<z.ZodBoolean>;
|
|
79
|
+
}, "strict", z.ZodTypeAny, {
|
|
80
|
+
auto_start?: boolean | undefined;
|
|
81
|
+
port?: number | undefined;
|
|
82
|
+
host?: string | undefined;
|
|
83
|
+
}, {
|
|
84
|
+
auto_start?: boolean | undefined;
|
|
85
|
+
port?: number | undefined;
|
|
86
|
+
host?: string | undefined;
|
|
87
|
+
}>>;
|
|
88
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
89
|
+
/** Shadow branch configuration */
|
|
90
|
+
shadow: z.ZodOptional<z.ZodObject<{
|
|
91
|
+
/** Branch name for shadow branch (default: kspec-meta) */
|
|
92
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
93
|
+
/** Worktree directory name (default: .kspec) */
|
|
94
|
+
directory: z.ZodOptional<z.ZodString>;
|
|
95
|
+
/**
|
|
96
|
+
* Remote target for shadow branch. Can be:
|
|
97
|
+
* - Named remote (e.g., "origin", "specs-origin")
|
|
98
|
+
* - Local filesystem path (starts with /, ./, or ~)
|
|
99
|
+
* - Git URL (contains :// or starts with git@)
|
|
100
|
+
*/
|
|
101
|
+
remote: z.ZodOptional<z.ZodString>;
|
|
102
|
+
}, "strict", z.ZodTypeAny, {
|
|
103
|
+
branch?: string | undefined;
|
|
104
|
+
directory?: string | undefined;
|
|
105
|
+
remote?: string | undefined;
|
|
106
|
+
}, {
|
|
107
|
+
branch?: string | undefined;
|
|
108
|
+
directory?: string | undefined;
|
|
109
|
+
remote?: string | undefined;
|
|
110
|
+
}>>;
|
|
111
|
+
/** Identity configuration */
|
|
112
|
+
identity: z.ZodOptional<z.ZodObject<{
|
|
113
|
+
/** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
|
|
114
|
+
author: z.ZodOptional<z.ZodString>;
|
|
115
|
+
}, "strict", z.ZodTypeAny, {
|
|
116
|
+
author?: string | undefined;
|
|
117
|
+
}, {
|
|
118
|
+
author?: string | undefined;
|
|
119
|
+
}>>;
|
|
120
|
+
/** Validation configuration */
|
|
121
|
+
validation: z.ZodOptional<z.ZodObject<{
|
|
122
|
+
/**
|
|
123
|
+
* When true, dangling references are treated as errors instead of warnings.
|
|
124
|
+
* AC: @config-validation ac-2 ac-3 — strict_refs configurable
|
|
125
|
+
*/
|
|
126
|
+
strict_refs: z.ZodOptional<z.ZodBoolean>;
|
|
127
|
+
/**
|
|
128
|
+
* When true, specs missing acceptance criteria are reported as errors not warnings.
|
|
129
|
+
* AC: @config-validation ac-1 — require_acceptance configurable
|
|
130
|
+
*/
|
|
131
|
+
require_acceptance: z.ZodOptional<z.ZodBoolean>;
|
|
132
|
+
}, "strict", z.ZodTypeAny, {
|
|
133
|
+
strict_refs?: boolean | undefined;
|
|
134
|
+
require_acceptance?: boolean | undefined;
|
|
135
|
+
}, {
|
|
136
|
+
strict_refs?: boolean | undefined;
|
|
137
|
+
require_acceptance?: boolean | undefined;
|
|
138
|
+
}>>;
|
|
139
|
+
/** Daemon configuration */
|
|
140
|
+
daemon: z.ZodOptional<z.ZodObject<{
|
|
141
|
+
/** Default port for daemon (default: 3456) */
|
|
142
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
143
|
+
/** Host to bind to (default: localhost) */
|
|
144
|
+
host: z.ZodOptional<z.ZodString>;
|
|
145
|
+
/**
|
|
146
|
+
* Whether to auto-start daemon when running kspec commands.
|
|
147
|
+
* AC: @config-daemon ac-3 — auto_start configurable
|
|
148
|
+
*/
|
|
149
|
+
auto_start: z.ZodOptional<z.ZodBoolean>;
|
|
150
|
+
}, "strict", z.ZodTypeAny, {
|
|
151
|
+
auto_start?: boolean | undefined;
|
|
152
|
+
port?: number | undefined;
|
|
153
|
+
host?: string | undefined;
|
|
154
|
+
}, {
|
|
155
|
+
auto_start?: boolean | undefined;
|
|
156
|
+
port?: number | undefined;
|
|
157
|
+
host?: string | undefined;
|
|
158
|
+
}>>;
|
|
159
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
160
|
+
/** Shadow branch configuration */
|
|
161
|
+
shadow: z.ZodOptional<z.ZodObject<{
|
|
162
|
+
/** Branch name for shadow branch (default: kspec-meta) */
|
|
163
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
164
|
+
/** Worktree directory name (default: .kspec) */
|
|
165
|
+
directory: z.ZodOptional<z.ZodString>;
|
|
166
|
+
/**
|
|
167
|
+
* Remote target for shadow branch. Can be:
|
|
168
|
+
* - Named remote (e.g., "origin", "specs-origin")
|
|
169
|
+
* - Local filesystem path (starts with /, ./, or ~)
|
|
170
|
+
* - Git URL (contains :// or starts with git@)
|
|
171
|
+
*/
|
|
172
|
+
remote: z.ZodOptional<z.ZodString>;
|
|
173
|
+
}, "strict", z.ZodTypeAny, {
|
|
174
|
+
branch?: string | undefined;
|
|
175
|
+
directory?: string | undefined;
|
|
176
|
+
remote?: string | undefined;
|
|
177
|
+
}, {
|
|
178
|
+
branch?: string | undefined;
|
|
179
|
+
directory?: string | undefined;
|
|
180
|
+
remote?: string | undefined;
|
|
181
|
+
}>>;
|
|
182
|
+
/** Identity configuration */
|
|
183
|
+
identity: z.ZodOptional<z.ZodObject<{
|
|
184
|
+
/** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
|
|
185
|
+
author: z.ZodOptional<z.ZodString>;
|
|
186
|
+
}, "strict", z.ZodTypeAny, {
|
|
187
|
+
author?: string | undefined;
|
|
188
|
+
}, {
|
|
189
|
+
author?: string | undefined;
|
|
190
|
+
}>>;
|
|
191
|
+
/** Validation configuration */
|
|
192
|
+
validation: z.ZodOptional<z.ZodObject<{
|
|
193
|
+
/**
|
|
194
|
+
* When true, dangling references are treated as errors instead of warnings.
|
|
195
|
+
* AC: @config-validation ac-2 ac-3 — strict_refs configurable
|
|
196
|
+
*/
|
|
197
|
+
strict_refs: z.ZodOptional<z.ZodBoolean>;
|
|
198
|
+
/**
|
|
199
|
+
* When true, specs missing acceptance criteria are reported as errors not warnings.
|
|
200
|
+
* AC: @config-validation ac-1 — require_acceptance configurable
|
|
201
|
+
*/
|
|
202
|
+
require_acceptance: z.ZodOptional<z.ZodBoolean>;
|
|
203
|
+
}, "strict", z.ZodTypeAny, {
|
|
204
|
+
strict_refs?: boolean | undefined;
|
|
205
|
+
require_acceptance?: boolean | undefined;
|
|
206
|
+
}, {
|
|
207
|
+
strict_refs?: boolean | undefined;
|
|
208
|
+
require_acceptance?: boolean | undefined;
|
|
209
|
+
}>>;
|
|
210
|
+
/** Daemon configuration */
|
|
211
|
+
daemon: z.ZodOptional<z.ZodObject<{
|
|
212
|
+
/** Default port for daemon (default: 3456) */
|
|
213
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
214
|
+
/** Host to bind to (default: localhost) */
|
|
215
|
+
host: z.ZodOptional<z.ZodString>;
|
|
216
|
+
/**
|
|
217
|
+
* Whether to auto-start daemon when running kspec commands.
|
|
218
|
+
* AC: @config-daemon ac-3 — auto_start configurable
|
|
219
|
+
*/
|
|
220
|
+
auto_start: z.ZodOptional<z.ZodBoolean>;
|
|
221
|
+
}, "strict", z.ZodTypeAny, {
|
|
222
|
+
auto_start?: boolean | undefined;
|
|
223
|
+
port?: number | undefined;
|
|
224
|
+
host?: string | undefined;
|
|
225
|
+
}, {
|
|
226
|
+
auto_start?: boolean | undefined;
|
|
227
|
+
port?: number | undefined;
|
|
228
|
+
host?: string | undefined;
|
|
229
|
+
}>>;
|
|
230
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
231
|
+
/**
|
|
232
|
+
* Raw config type as parsed from YAML file.
|
|
233
|
+
*/
|
|
234
|
+
export type KspecConfig = z.infer<typeof KspecConfigSchema>;
|
|
235
|
+
/**
|
|
236
|
+
* Remote type for shadow branch configuration.
|
|
237
|
+
* - "named": Git remote name (e.g., "origin", "specs-origin")
|
|
238
|
+
* - "path": Local filesystem path
|
|
239
|
+
* - "url": Git URL (https://, git@, etc.)
|
|
240
|
+
*/
|
|
241
|
+
export type ShadowRemoteType = "named" | "path" | "url";
|
|
242
|
+
/**
|
|
243
|
+
* Resolved shadow remote configuration.
|
|
244
|
+
*/
|
|
245
|
+
export interface ResolvedShadowRemote {
|
|
246
|
+
/** The remote value from config */
|
|
247
|
+
value: string;
|
|
248
|
+
/** Detected type of the remote */
|
|
249
|
+
type: ShadowRemoteType;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Detect the type of a shadow remote string.
|
|
253
|
+
*
|
|
254
|
+
* AC: @config-shadow ac-3 ac-4 ac-5 — remote type detection
|
|
255
|
+
*
|
|
256
|
+
* @param remote Remote string from config
|
|
257
|
+
* @returns Detected type: "path" for filesystem, "url" for git URLs, "named" for git remote names
|
|
258
|
+
*/
|
|
259
|
+
export declare function detectRemoteType(remote: string): ShadowRemoteType;
|
|
260
|
+
/**
|
|
261
|
+
* Resolved config with all values finalized (env vars applied, defaults filled).
|
|
262
|
+
*/
|
|
263
|
+
export interface ResolvedKspecConfig {
|
|
264
|
+
shadow: {
|
|
265
|
+
/** Branch name (default: kspec-meta) */
|
|
266
|
+
branch: string;
|
|
267
|
+
/** Worktree directory name (default: .kspec) */
|
|
268
|
+
directory: string;
|
|
269
|
+
/** Remote configuration, null if not specified */
|
|
270
|
+
remote: ResolvedShadowRemote | null;
|
|
271
|
+
};
|
|
272
|
+
identity: {
|
|
273
|
+
author: string | null;
|
|
274
|
+
};
|
|
275
|
+
validation: {
|
|
276
|
+
/**
|
|
277
|
+
* When true, dangling references are treated as errors instead of warnings.
|
|
278
|
+
* AC: @config-validation ac-2 ac-3
|
|
279
|
+
*/
|
|
280
|
+
strict_refs: boolean;
|
|
281
|
+
/**
|
|
282
|
+
* When true, specs missing acceptance criteria are reported as errors not warnings.
|
|
283
|
+
* AC: @config-validation ac-1
|
|
284
|
+
*/
|
|
285
|
+
require_acceptance: boolean;
|
|
286
|
+
};
|
|
287
|
+
daemon: {
|
|
288
|
+
port: number;
|
|
289
|
+
host: string;
|
|
290
|
+
/**
|
|
291
|
+
* Whether to auto-start daemon when running kspec commands.
|
|
292
|
+
* AC: @config-daemon ac-3
|
|
293
|
+
*/
|
|
294
|
+
auto_start: boolean;
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Result of loading project config.
|
|
299
|
+
*/
|
|
300
|
+
export interface LoadConfigResult {
|
|
301
|
+
/** Resolved configuration with all values finalized */
|
|
302
|
+
config: ResolvedKspecConfig;
|
|
303
|
+
/** Path to config file if found, null otherwise */
|
|
304
|
+
configPath: string | null;
|
|
305
|
+
/** Warning message if config had issues but was recoverable */
|
|
306
|
+
warning: string | null;
|
|
307
|
+
/** The git root directory where config was loaded from */
|
|
308
|
+
gitRoot: string | null;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Find git root directory, handling KSPEC_SPEC_DIR batch mode.
|
|
312
|
+
*
|
|
313
|
+
* AC: @project-config ac-7 — in batch mode, we need the REAL project root
|
|
314
|
+
*
|
|
315
|
+
* When KSPEC_SPEC_DIR is set (batch atomic mode), the cwd might be the temp
|
|
316
|
+
* directory. We need to find the real project root by checking:
|
|
317
|
+
* 1. If KSPEC_BATCH_PROJECT_ROOT is set, use that (set by batch executor)
|
|
318
|
+
* 2. Otherwise, use git root from cwd
|
|
319
|
+
*
|
|
320
|
+
* AC: @project-config ac-6 — loads from git root, not cwd subdirectory
|
|
321
|
+
*/
|
|
322
|
+
export declare function findProjectRoot(startDir: string): string | null;
|
|
323
|
+
/**
|
|
324
|
+
* Load project configuration from kspec.config.yaml.
|
|
325
|
+
*
|
|
326
|
+
* AC: @project-config ac-1 — no config = all defaults
|
|
327
|
+
* AC: @project-config ac-2 — config parsed and available before shadow detection
|
|
328
|
+
* AC: @project-config ac-3 — invalid YAML = defaults + warning
|
|
329
|
+
* AC: @project-config ac-4 — unknown fields ignored
|
|
330
|
+
* AC: @project-config ac-5 — env vars take precedence
|
|
331
|
+
* AC: @project-config ac-6 — loads from git root
|
|
332
|
+
* AC: @project-config ac-7 — batch mode uses real project root
|
|
333
|
+
*
|
|
334
|
+
* @param startDir Starting directory for git root detection
|
|
335
|
+
*/
|
|
336
|
+
export declare function loadProjectConfig(startDir?: string): Promise<LoadConfigResult>;
|
|
337
|
+
/**
|
|
338
|
+
* Resolve configuration by merging file config with env vars and defaults.
|
|
339
|
+
*
|
|
340
|
+
* Priority: env vars > config file > defaults
|
|
341
|
+
*
|
|
342
|
+
* AC: @project-config ac-5 — env vars take precedence
|
|
343
|
+
*/
|
|
344
|
+
export declare function resolveConfig(fileConfig: KspecConfig | null): ResolvedKspecConfig;
|
|
345
|
+
/**
|
|
346
|
+
* Get the default configuration (no file, no env vars).
|
|
347
|
+
* Useful for testing or when config loading fails completely.
|
|
348
|
+
* Returns a deep copy to prevent mutation of shared defaults.
|
|
349
|
+
*/
|
|
350
|
+
export declare function getDefaultConfig(): ResolvedKspecConfig;
|
|
351
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/parser/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgFxB;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;IAE1B,kCAAkC;;QA1ElC,0DAA0D;;QAE1D,gDAAgD;;QAEhD;;;;;WAKG;;;;;;;;;;;IAmEH,6BAA6B;;QAxD7B,0EAA0E;;;;;;;IA0D1E,+BAA+B;;QA7C/B;;;WAGG;;QAEH;;;WAGG;;;;;;;;;IAuCH,2BAA2B;;QA1B3B,8CAA8C;;QAE9C,2CAA2C;;QAE3C;;;WAGG;;;;;;;;;;;;IAaH,kCAAkC;;QA1ElC,0DAA0D;;QAE1D,gDAAgD;;QAEhD;;;;;WAKG;;;;;;;;;;;IAmEH,6BAA6B;;QAxD7B,0EAA0E;;;;;;;IA0D1E,+BAA+B;;QA7C/B;;;WAGG;;QAEH;;;WAGG;;;;;;;;;IAuCH,2BAA2B;;QA1B3B,8CAA8C;;QAE9C,2CAA2C;;QAE3C;;;WAGG;;;;;;;;;;;;IAaH,kCAAkC;;QA1ElC,0DAA0D;;QAE1D,gDAAgD;;QAEhD;;;;;WAKG;;;;;;;;;;;IAmEH,6BAA6B;;QAxD7B,0EAA0E;;;;;;;IA0D1E,+BAA+B;;QA7C/B;;;WAGG;;QAEH;;;WAGG;;;;;;;;;IAuCH,2BAA2B;;QA1B3B,8CAA8C;;QAE9C,2CAA2C;;QAE3C;;;WAGG;;;;;;;;;;;gCAsBS,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAgBjE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE;QACN,wCAAwC;QACxC,MAAM,EAAE,MAAM,CAAC;QACf,gDAAgD;QAChD,SAAS,EAAE,MAAM,CAAC;QAClB,kDAAkD;QAClD,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;KACrC,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,UAAU,EAAE;QACV;;;WAGG;QACH,WAAW,EAAE,OAAO,CAAC;QACrB;;;WAGG;QACH,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb;;;WAGG;QACH,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAoCD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mDAAmD;IACnD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAkE3B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI,GAAG,mBAAmB,CA8CjF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,mBAAmB,CAkBtD"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-level configuration for kspec.
|
|
3
|
+
*
|
|
4
|
+
* Loads kspec.config.yaml from the project root (main branch) before shadow
|
|
5
|
+
* branch detection. All fields are optional with backward-compatible defaults.
|
|
6
|
+
*
|
|
7
|
+
* Priority: env vars > config file > defaults
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from "node:fs/promises";
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import * as YAML from "yaml";
|
|
15
|
+
import { getGitRoot } from "./shadow.js";
|
|
16
|
+
// ── Schema ──────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Schema for shadow branch configuration.
|
|
19
|
+
*
|
|
20
|
+
* AC: @config-shadow — shadow.branch, shadow.directory, shadow.remote configurable
|
|
21
|
+
*/
|
|
22
|
+
const ShadowConfigSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
/** Branch name for shadow branch (default: kspec-meta) */
|
|
25
|
+
branch: z.string().optional(),
|
|
26
|
+
/** Worktree directory name (default: .kspec) */
|
|
27
|
+
directory: z.string().optional(),
|
|
28
|
+
/**
|
|
29
|
+
* Remote target for shadow branch. Can be:
|
|
30
|
+
* - Named remote (e.g., "origin", "specs-origin")
|
|
31
|
+
* - Local filesystem path (starts with /, ./, or ~)
|
|
32
|
+
* - Git URL (contains :// or starts with git@)
|
|
33
|
+
*/
|
|
34
|
+
remote: z.string().optional(),
|
|
35
|
+
})
|
|
36
|
+
.strict()
|
|
37
|
+
.optional();
|
|
38
|
+
/**
|
|
39
|
+
* Schema for identity configuration.
|
|
40
|
+
*/
|
|
41
|
+
const IdentityConfigSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
/** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
|
|
44
|
+
author: z.string().optional(),
|
|
45
|
+
})
|
|
46
|
+
.strict()
|
|
47
|
+
.optional();
|
|
48
|
+
/**
|
|
49
|
+
* Schema for validation configuration.
|
|
50
|
+
*
|
|
51
|
+
* AC: @config-validation — validation settings configurable in kspec.config.yaml
|
|
52
|
+
*/
|
|
53
|
+
const ValidationConfigSchema = z
|
|
54
|
+
.object({
|
|
55
|
+
/**
|
|
56
|
+
* When true, dangling references are treated as errors instead of warnings.
|
|
57
|
+
* AC: @config-validation ac-2 ac-3 — strict_refs configurable
|
|
58
|
+
*/
|
|
59
|
+
strict_refs: z.boolean().optional(),
|
|
60
|
+
/**
|
|
61
|
+
* When true, specs missing acceptance criteria are reported as errors not warnings.
|
|
62
|
+
* AC: @config-validation ac-1 — require_acceptance configurable
|
|
63
|
+
*/
|
|
64
|
+
require_acceptance: z.boolean().optional(),
|
|
65
|
+
})
|
|
66
|
+
.strict()
|
|
67
|
+
.optional();
|
|
68
|
+
/**
|
|
69
|
+
* Schema for daemon configuration.
|
|
70
|
+
*
|
|
71
|
+
* AC: @config-daemon — daemon.port, daemon.auto_start configurable
|
|
72
|
+
*/
|
|
73
|
+
const DaemonConfigSchema = z
|
|
74
|
+
.object({
|
|
75
|
+
/** Default port for daemon (default: 3456) */
|
|
76
|
+
port: z.number().int().min(1).max(65535).optional(),
|
|
77
|
+
/** Host to bind to (default: localhost) */
|
|
78
|
+
host: z.string().optional(),
|
|
79
|
+
/**
|
|
80
|
+
* Whether to auto-start daemon when running kspec commands.
|
|
81
|
+
* AC: @config-daemon ac-3 — auto_start configurable
|
|
82
|
+
*/
|
|
83
|
+
auto_start: z.boolean().optional(),
|
|
84
|
+
})
|
|
85
|
+
.strict()
|
|
86
|
+
.optional();
|
|
87
|
+
/**
|
|
88
|
+
* Complete schema for kspec.config.yaml.
|
|
89
|
+
*
|
|
90
|
+
* AC: @project-config ac-4 — unknown fields are ignored via passthrough
|
|
91
|
+
*/
|
|
92
|
+
export const KspecConfigSchema = z
|
|
93
|
+
.object({
|
|
94
|
+
/** Shadow branch configuration */
|
|
95
|
+
shadow: ShadowConfigSchema,
|
|
96
|
+
/** Identity configuration */
|
|
97
|
+
identity: IdentityConfigSchema,
|
|
98
|
+
/** Validation configuration */
|
|
99
|
+
validation: ValidationConfigSchema,
|
|
100
|
+
/** Daemon configuration */
|
|
101
|
+
daemon: DaemonConfigSchema,
|
|
102
|
+
})
|
|
103
|
+
.passthrough(); // AC: ac-4 — ignore unknown fields
|
|
104
|
+
/**
|
|
105
|
+
* Detect the type of a shadow remote string.
|
|
106
|
+
*
|
|
107
|
+
* AC: @config-shadow ac-3 ac-4 ac-5 — remote type detection
|
|
108
|
+
*
|
|
109
|
+
* @param remote Remote string from config
|
|
110
|
+
* @returns Detected type: "path" for filesystem, "url" for git URLs, "named" for git remote names
|
|
111
|
+
*/
|
|
112
|
+
export function detectRemoteType(remote) {
|
|
113
|
+
// AC: ac-4 — Local filesystem path (starts with /, ./, ../, or ~)
|
|
114
|
+
if (remote.startsWith("/") ||
|
|
115
|
+
remote.startsWith("./") ||
|
|
116
|
+
remote.startsWith("../") ||
|
|
117
|
+
remote.startsWith("~")) {
|
|
118
|
+
return "path";
|
|
119
|
+
}
|
|
120
|
+
// AC: ac-5 — Git URL (contains :// or starts with git@)
|
|
121
|
+
if (remote.includes("://") || remote.startsWith("git@")) {
|
|
122
|
+
return "url";
|
|
123
|
+
}
|
|
124
|
+
// AC: ac-3 — Otherwise it's a named remote
|
|
125
|
+
return "named";
|
|
126
|
+
}
|
|
127
|
+
// ── Defaults ────────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Default configuration values.
|
|
130
|
+
*
|
|
131
|
+
* AC: @project-config ac-1 — these are the current defaults
|
|
132
|
+
*/
|
|
133
|
+
const DEFAULT_CONFIG = {
|
|
134
|
+
shadow: {
|
|
135
|
+
branch: "kspec-meta",
|
|
136
|
+
directory: ".kspec",
|
|
137
|
+
remote: null,
|
|
138
|
+
},
|
|
139
|
+
identity: {
|
|
140
|
+
author: null,
|
|
141
|
+
},
|
|
142
|
+
validation: {
|
|
143
|
+
// AC: @config-validation — defaults preserve existing behavior
|
|
144
|
+
// strict_refs: true = dangling refs are errors (existing behavior)
|
|
145
|
+
// require_acceptance: false = missing AC is warning (existing behavior)
|
|
146
|
+
strict_refs: true,
|
|
147
|
+
require_acceptance: false,
|
|
148
|
+
},
|
|
149
|
+
daemon: {
|
|
150
|
+
port: 3456,
|
|
151
|
+
host: "localhost",
|
|
152
|
+
auto_start: true, // AC: @config-daemon — default auto-start enabled
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
// ── Loading ─────────────────────────────────────────────────────────────
|
|
156
|
+
const CONFIG_FILENAME = "kspec.config.yaml";
|
|
157
|
+
/**
|
|
158
|
+
* Find git root directory, handling KSPEC_SPEC_DIR batch mode.
|
|
159
|
+
*
|
|
160
|
+
* AC: @project-config ac-7 — in batch mode, we need the REAL project root
|
|
161
|
+
*
|
|
162
|
+
* When KSPEC_SPEC_DIR is set (batch atomic mode), the cwd might be the temp
|
|
163
|
+
* directory. We need to find the real project root by checking:
|
|
164
|
+
* 1. If KSPEC_BATCH_PROJECT_ROOT is set, use that (set by batch executor)
|
|
165
|
+
* 2. Otherwise, use git root from cwd
|
|
166
|
+
*
|
|
167
|
+
* AC: @project-config ac-6 — loads from git root, not cwd subdirectory
|
|
168
|
+
*/
|
|
169
|
+
export function findProjectRoot(startDir) {
|
|
170
|
+
// In batch mode, the batch executor should set this to the real root
|
|
171
|
+
// before redirecting KSPEC_SPEC_DIR
|
|
172
|
+
const batchRoot = process.env.KSPEC_BATCH_PROJECT_ROOT;
|
|
173
|
+
if (batchRoot) {
|
|
174
|
+
return batchRoot;
|
|
175
|
+
}
|
|
176
|
+
// Normal mode: find git root
|
|
177
|
+
return getGitRoot(startDir);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Load project configuration from kspec.config.yaml.
|
|
181
|
+
*
|
|
182
|
+
* AC: @project-config ac-1 — no config = all defaults
|
|
183
|
+
* AC: @project-config ac-2 — config parsed and available before shadow detection
|
|
184
|
+
* AC: @project-config ac-3 — invalid YAML = defaults + warning
|
|
185
|
+
* AC: @project-config ac-4 — unknown fields ignored
|
|
186
|
+
* AC: @project-config ac-5 — env vars take precedence
|
|
187
|
+
* AC: @project-config ac-6 — loads from git root
|
|
188
|
+
* AC: @project-config ac-7 — batch mode uses real project root
|
|
189
|
+
*
|
|
190
|
+
* @param startDir Starting directory for git root detection
|
|
191
|
+
*/
|
|
192
|
+
export async function loadProjectConfig(startDir = process.cwd()) {
|
|
193
|
+
const gitRoot = findProjectRoot(startDir);
|
|
194
|
+
if (!gitRoot) {
|
|
195
|
+
// Not in a git repo, use defaults
|
|
196
|
+
return {
|
|
197
|
+
config: resolveConfig(null),
|
|
198
|
+
configPath: null,
|
|
199
|
+
warning: null,
|
|
200
|
+
gitRoot: null,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const configPath = path.join(gitRoot, CONFIG_FILENAME);
|
|
204
|
+
// Check if config file exists
|
|
205
|
+
try {
|
|
206
|
+
await fs.access(configPath);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// AC: ac-1 — no config file, use defaults
|
|
210
|
+
return {
|
|
211
|
+
config: resolveConfig(null),
|
|
212
|
+
configPath: null,
|
|
213
|
+
warning: null,
|
|
214
|
+
gitRoot,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Try to load and parse config
|
|
218
|
+
try {
|
|
219
|
+
const content = await fs.readFile(configPath, "utf-8");
|
|
220
|
+
const raw = YAML.parse(content);
|
|
221
|
+
// Validate against schema
|
|
222
|
+
const result = KspecConfigSchema.safeParse(raw);
|
|
223
|
+
if (!result.success) {
|
|
224
|
+
// AC: ac-3 — validation error = defaults + warning
|
|
225
|
+
const issues = result.error.issues
|
|
226
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
227
|
+
.join("; ");
|
|
228
|
+
return {
|
|
229
|
+
config: resolveConfig(null),
|
|
230
|
+
configPath,
|
|
231
|
+
warning: `Config validation failed: ${issues}. Using defaults.`,
|
|
232
|
+
gitRoot,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// AC: ac-5 — apply env var overrides during resolution
|
|
236
|
+
return {
|
|
237
|
+
config: resolveConfig(result.data),
|
|
238
|
+
configPath,
|
|
239
|
+
warning: null,
|
|
240
|
+
gitRoot,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
// AC: ac-3 — parse error = defaults + warning
|
|
245
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
246
|
+
return {
|
|
247
|
+
config: resolveConfig(null),
|
|
248
|
+
configPath,
|
|
249
|
+
warning: `Failed to parse ${CONFIG_FILENAME}: ${message}. Using defaults.`,
|
|
250
|
+
gitRoot,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Resolve configuration by merging file config with env vars and defaults.
|
|
256
|
+
*
|
|
257
|
+
* Priority: env vars > config file > defaults
|
|
258
|
+
*
|
|
259
|
+
* AC: @project-config ac-5 — env vars take precedence
|
|
260
|
+
*/
|
|
261
|
+
export function resolveConfig(fileConfig) {
|
|
262
|
+
const file = fileConfig || {};
|
|
263
|
+
// Get env var overrides
|
|
264
|
+
const envAuthor = process.env.KSPEC_AUTHOR;
|
|
265
|
+
const envPort = process.env.KSPEC_DAEMON_PORT
|
|
266
|
+
? parseInt(process.env.KSPEC_DAEMON_PORT, 10)
|
|
267
|
+
: undefined;
|
|
268
|
+
const envHost = process.env.KSPEC_DAEMON_HOST;
|
|
269
|
+
// Resolve shadow remote if specified
|
|
270
|
+
const remoteValue = file.shadow?.remote;
|
|
271
|
+
const resolvedRemote = remoteValue
|
|
272
|
+
? { value: remoteValue, type: detectRemoteType(remoteValue) }
|
|
273
|
+
: DEFAULT_CONFIG.shadow.remote;
|
|
274
|
+
return {
|
|
275
|
+
shadow: {
|
|
276
|
+
branch: file.shadow?.branch ?? DEFAULT_CONFIG.shadow.branch,
|
|
277
|
+
directory: file.shadow?.directory ?? DEFAULT_CONFIG.shadow.directory,
|
|
278
|
+
remote: resolvedRemote,
|
|
279
|
+
},
|
|
280
|
+
identity: {
|
|
281
|
+
// AC: ac-5 — env var takes precedence
|
|
282
|
+
author: envAuthor ?? file.identity?.author ?? DEFAULT_CONFIG.identity.author,
|
|
283
|
+
},
|
|
284
|
+
validation: {
|
|
285
|
+
// AC: @config-validation ac-2 ac-3 — strict_refs from config
|
|
286
|
+
strict_refs: file.validation?.strict_refs ?? DEFAULT_CONFIG.validation.strict_refs,
|
|
287
|
+
// AC: @config-validation ac-1 — require_acceptance from config
|
|
288
|
+
require_acceptance: file.validation?.require_acceptance ?? DEFAULT_CONFIG.validation.require_acceptance,
|
|
289
|
+
},
|
|
290
|
+
daemon: {
|
|
291
|
+
// AC: ac-5 — env vars take precedence
|
|
292
|
+
port: (envPort && !isNaN(envPort) ? envPort : undefined) ??
|
|
293
|
+
file.daemon?.port ??
|
|
294
|
+
DEFAULT_CONFIG.daemon.port,
|
|
295
|
+
// AC: @config-daemon ac-5 ac-6 — host from config/env
|
|
296
|
+
host: envHost ?? file.daemon?.host ?? DEFAULT_CONFIG.daemon.host,
|
|
297
|
+
// AC: @config-daemon ac-3 — auto_start from config
|
|
298
|
+
auto_start: file.daemon?.auto_start ?? DEFAULT_CONFIG.daemon.auto_start,
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get the default configuration (no file, no env vars).
|
|
304
|
+
* Useful for testing or when config loading fails completely.
|
|
305
|
+
* Returns a deep copy to prevent mutation of shared defaults.
|
|
306
|
+
*/
|
|
307
|
+
export function getDefaultConfig() {
|
|
308
|
+
return {
|
|
309
|
+
shadow: {
|
|
310
|
+
branch: DEFAULT_CONFIG.shadow.branch,
|
|
311
|
+
directory: DEFAULT_CONFIG.shadow.directory,
|
|
312
|
+
remote: DEFAULT_CONFIG.shadow.remote,
|
|
313
|
+
},
|
|
314
|
+
identity: { ...DEFAULT_CONFIG.identity },
|
|
315
|
+
validation: {
|
|
316
|
+
strict_refs: DEFAULT_CONFIG.validation.strict_refs,
|
|
317
|
+
require_acceptance: DEFAULT_CONFIG.validation.require_acceptance,
|
|
318
|
+
},
|
|
319
|
+
daemon: {
|
|
320
|
+
port: DEFAULT_CONFIG.daemon.port,
|
|
321
|
+
host: DEFAULT_CONFIG.daemon.host,
|
|
322
|
+
auto_start: DEFAULT_CONFIG.daemon.auto_start,
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=config.js.map
|