@openrig/cli 0.3.1 → 0.3.3-rc.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/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +1 -1
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +8 -8
- package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux-transport.js +51 -9
- package/daemon/dist/adapters/cmux-transport.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +34 -5
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +68 -1
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +141 -2
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -1
- package/daemon/dist/db/migrations/041_rig_policy.d.ts +32 -0
- package/daemon/dist/db/migrations/041_rig_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/041_rig_policy.js +47 -0
- package/daemon/dist/db/migrations/041_rig_policy.js.map +1 -0
- package/daemon/dist/db/migrations/042_rig_archive.d.ts +16 -0
- package/daemon/dist/db/migrations/042_rig_archive.d.ts.map +1 -0
- package/daemon/dist/db/migrations/042_rig_archive.js +21 -0
- package/daemon/dist/db/migrations/042_rig_archive.js.map +1 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.js +1 -1
- package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js +2 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +27 -0
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +86 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/bundle-agent-images-router.d.ts +95 -0
- package/daemon/dist/domain/bundle-agent-images-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-agent-images-router.js +140 -0
- package/daemon/dist/domain/bundle-agent-images-router.js.map +1 -0
- package/daemon/dist/domain/bundle-assembler.d.ts +18 -1
- package/daemon/dist/domain/bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-assembler.js +11 -1
- package/daemon/dist/domain/bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/bundle-audit.d.ts +89 -0
- package/daemon/dist/domain/bundle-audit.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-audit.js +87 -0
- package/daemon/dist/domain/bundle-audit.js.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts +57 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.js +49 -0
- package/daemon/dist/domain/bundle-conflict-detector.js.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts +100 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.js +158 -0
- package/daemon/dist/domain/bundle-context-packs-router.js.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts +69 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.js +87 -0
- package/daemon/dist/domain/bundle-plugins-router.js.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts +62 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.js +90 -0
- package/daemon/dist/domain/bundle-skills-router.js.map +1 -0
- package/daemon/dist/domain/bundle-types.d.ts +106 -0
- package/daemon/dist/domain/bundle-types.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-types.js +375 -0
- package/daemon/dist/domain/bundle-types.js.map +1 -1
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts +94 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js +144 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js.map +1 -0
- package/daemon/dist/domain/context-monitor.d.ts +5 -1
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +28 -15
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +6 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +6 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +7 -7
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +18 -0
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +98 -0
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +12 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +25 -1
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts +16 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +11 -1
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +10 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +4 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +28 -1
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +67 -1
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +37 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +99 -2
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +4 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +16 -7
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts +1 -1
- package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
- package/daemon/dist/domain/rig-expansion-service.js +12 -10
- package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts +48 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js +96 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts +46 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js +171 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts +145 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js +52 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts +58 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js +211 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +1 -0
- package/daemon/dist/domain/rig-repository.d.ts +28 -2
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +40 -3
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +177 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +414 -55
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts +19 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +30 -12
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts +1 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +4 -1
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +79 -0
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-activity-service.js +123 -0
- package/daemon/dist/domain/seat-activity-service.js.map +1 -0
- package/daemon/dist/domain/session-transport.d.ts +15 -0
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +8 -3
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.d.ts +12 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.js +23 -0
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-service.js +19 -0
- package/daemon/dist/domain/spec-library-service.js.map +1 -1
- package/daemon/dist/domain/topology-converge.d.ts +97 -0
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -0
- package/daemon/dist/domain/topology-converge.js +70 -0
- package/daemon/dist/domain/topology-converge.js.map +1 -0
- package/daemon/dist/domain/types.d.ts +85 -3
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +8 -0
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +1 -0
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +9 -1
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +41 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +63 -0
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +7 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +156 -3
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +197 -0
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js +448 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +11 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +966 -7
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/config.d.ts.map +1 -1
- package/daemon/dist/routes/config.js +19 -2
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/info.d.ts +3 -0
- package/daemon/dist/routes/info.d.ts.map +1 -0
- package/daemon/dist/routes/info.js +20 -0
- package/daemon/dist/routes/info.js.map +1 -0
- package/daemon/dist/routes/ps.js +4 -1
- package/daemon/dist/routes/ps.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts +18 -0
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +97 -5
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rig-policy.d.ts +9 -0
- package/daemon/dist/routes/rig-policy.d.ts.map +1 -0
- package/daemon/dist/routes/rig-policy.js +174 -0
- package/daemon/dist/routes/rig-policy.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +134 -4
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +26 -3
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/up.d.ts +25 -0
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +70 -3
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/workspace.d.ts.map +1 -1
- package/daemon/dist/routes/workspace.js +80 -1
- package/daemon/dist/routes/workspace.js.map +1 -1
- package/daemon/dist/server.d.ts +10 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +11 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +46 -4
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/getting-started.md +69 -0
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +28 -4
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +361 -15
- package/daemon/specs/agents/shared/skills/core/rig-lifecycle/SKILL.md +2 -2
- package/daemon/specs/rigs/launch/conveyor/rig.yaml +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +115 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/archive.d.ts +10 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +68 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/bootstrap.js +2 -2
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +123 -2
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +40 -5
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/discover.js +2 -2
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/down.d.ts +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +91 -3
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +72 -10
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +6 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +103 -5
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/rig-policy.d.ts +48 -0
- package/dist/commands/rig-policy.d.ts.map +1 -0
- package/dist/commands/rig-policy.js +429 -0
- package/dist/commands/rig-policy.js.map +1 -0
- package/dist/commands/scope.d.ts +6 -0
- package/dist/commands/scope.d.ts.map +1 -0
- package/dist/commands/scope.js +659 -0
- package/dist/commands/scope.js.map +1 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +11 -0
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +28 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +35 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unarchive.d.ts +10 -0
- package/dist/commands/unarchive.d.ts.map +1 -0
- package/dist/commands/unarchive.js +53 -0
- package/dist/commands/unarchive.js.map +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +97 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +4 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workflow.d.ts +9 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +141 -4
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts +20 -0
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +140 -10
- package/dist/commands/workspace.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +48 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +57 -2
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/dot-id.d.ts +43 -0
- package/dist/lib/scope/dot-id.d.ts.map +1 -0
- package/dist/lib/scope/dot-id.js +165 -0
- package/dist/lib/scope/dot-id.js.map +1 -0
- package/dist/lib/scope/scope-fs.d.ts +79 -0
- package/dist/lib/scope/scope-fs.d.ts.map +1 -0
- package/dist/lib/scope/scope-fs.js +468 -0
- package/dist/lib/scope/scope-fs.js.map +1 -0
- package/dist/lib/scope/templates.d.ts +38 -0
- package/dist/lib/scope/templates.d.ts.map +1 -0
- package/dist/lib/scope/templates.js +109 -0
- package/dist/lib/scope/templates.js.map +1 -0
- package/dist/lib/scope/types.d.ts +61 -0
- package/dist/lib/scope/types.d.ts.map +1 -0
- package/dist/lib/scope/types.js +38 -0
- package/dist/lib/scope/types.js.map +1 -0
- package/dist/lib/scope-templates/backlog-deprecation.md +26 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +22 -0
- package/dist/lib/scope-templates/bug-fix.md +30 -0
- package/dist/lib/scope-templates/mission-notes.md +97 -0
- package/dist/lib/scope-templates/mission-placeholder.md +20 -0
- package/dist/lib/scope-templates/mission-release.md +25 -0
- package/dist/lib/scope-templates/placeholder.md +30 -0
- package/dist/lib/scope-templates/release-feature.md +26 -0
- package/dist/lib/scope-templates/research.md +22 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +29 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/release-surface/affected-skills.d.ts +49 -0
- package/dist/release-surface/affected-skills.d.ts.map +1 -0
- package/dist/release-surface/affected-skills.js +153 -0
- package/dist/release-surface/affected-skills.js.map +1 -0
- package/dist/release-surface/extract-surface.d.ts +23 -0
- package/dist/release-surface/extract-surface.d.ts.map +1 -0
- package/dist/release-surface/extract-surface.js +193 -0
- package/dist/release-surface/extract-surface.js.map +1 -0
- package/dist/release-surface/generate.d.ts +2 -0
- package/dist/release-surface/generate.d.ts.map +1 -0
- package/dist/release-surface/generate.js +51 -0
- package/dist/release-surface/generate.js.map +1 -0
- package/dist/release-surface/surface-diff.d.ts +40 -0
- package/dist/release-surface/surface-diff.d.ts.map +1 -0
- package/dist/release-surface/surface-diff.js +212 -0
- package/dist/release-surface/surface-diff.js.map +1 -0
- package/package.json +2 -2
- package/ui/dist/assets/index-CrJgCmkX.js +552 -0
- package/ui/dist/index.html +1 -1
- package/ui/dist/assets/index-Rl3ZBrUg.js +0 -547
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
// V0.3.1 slice 21 onboarding-conveyor: rich narrative content for the
|
|
2
2
|
// getting-started mission's two slices (the click-through-to-learn
|
|
3
3
|
// teaching surface).
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
4
6
|
import { GETTING_STARTED_NARRATIVE } from "./getting-started-narrative.js";
|
|
7
|
+
// Release-0.3.2 slice 01 (OPR.0.3.2.1) — seeded missions/slices now
|
|
8
|
+
// carry §1 dot-IDs in frontmatter so the scaffold coheres with
|
|
9
|
+
// `conventions/scope-and-versioning`. `getting-started` is a
|
|
10
|
+
// non-release mission → escape band `OPR.99.0.1`; its slices fan out
|
|
11
|
+
// as `OPR.99.0.1.<n>` (numbers monotonic, never reused).
|
|
5
12
|
const DEFAULT_MISSIONS = [
|
|
6
13
|
{
|
|
7
14
|
id: "getting-started",
|
|
15
|
+
dotId: "OPR.99.0.1",
|
|
8
16
|
title: "Getting Started",
|
|
9
17
|
status: "active",
|
|
10
18
|
objective: "Launch the conveyor starter and learn how OpenRig moves work through queue-backed slices.",
|
|
11
19
|
slices: [
|
|
12
20
|
{
|
|
13
21
|
id: "first-conveyor-run",
|
|
22
|
+
dotId: "OPR.99.0.1.1",
|
|
14
23
|
title: "First Conveyor Run",
|
|
15
24
|
status: "active",
|
|
16
25
|
objective: "Move one small packet through intake, planning, build, review, and close on the conveyor starter.",
|
|
17
26
|
},
|
|
18
27
|
{
|
|
19
28
|
id: "inspect-project-evidence",
|
|
29
|
+
dotId: "OPR.99.0.1.2",
|
|
20
30
|
title: "Inspect Project Evidence",
|
|
21
31
|
status: "draft",
|
|
22
32
|
objective: "Open Project, Queue, Story, and Tests to inspect the evidence created by the first conveyor run.",
|
|
@@ -43,7 +53,7 @@ export function workspaceScaffoldDirs() {
|
|
|
43
53
|
function subdirReadmeContent(subdir) {
|
|
44
54
|
switch (subdir) {
|
|
45
55
|
case "missions":
|
|
46
|
-
return "# missions\n\nProject missions live here. Each mission folder maps to one Project mission in the UI and owns a `slices/` child folder.\n\nExpected shape:\n\n```text\nmissions/<mission-
|
|
56
|
+
return "# missions\n\nProject missions live here. Each mission folder maps to one Project mission in the UI and owns a `slices/` child folder.\n\nExpected shape:\n\n```text\nmissions/<mission-name>/README.md\nmissions/<mission-name>/PROGRESS.md\nmissions/<mission-name>/slices/<slice-name>/README.md\n```\n\nEvery mission and slice README carries a stable dot-ID in its frontmatter (`id: OPR.<ver>[.<n>]`) per the scope-and-versioning convention. Use `rig scope mission create <name>` and `rig scope slice create <mission> <slug>` to mint conformant artifacts; the CLI handles the dot-ID + auto-numbering for you. The folder name is the operator-facing slug; the `id:` is the stable handle that survives renames.\n";
|
|
47
57
|
case "artifacts":
|
|
48
58
|
return "# artifacts\n\nWork products live here: plans, drafts, generated outputs, and other files that a slice may reference before closure.\n";
|
|
49
59
|
case "evidence":
|
|
@@ -71,7 +81,7 @@ This workspace is file-backed. The Project UI mirrors this structure:
|
|
|
71
81
|
- \`evidence/\` is for proof notes and verification summaries.
|
|
72
82
|
- \`dogfood-evidence/<proof-packet-id>\` becomes Tests proof when the packet id contains the slice id tokens.
|
|
73
83
|
|
|
74
|
-
Use stable kebab-case
|
|
84
|
+
Use stable kebab-case names for mission and slice folders. Every mission/slice README also carries a stable dot-ID in its frontmatter (\`id: OPR.<ver>[.<n>]\`) per the \`scope-and-versioning\` convention; mint conformant artifacts via \`rig scope mission create <name>\` and \`rig scope slice create <mission> <slug>\`. Folder names are operator-facing slugs; the \`id:\` is the rename-proof handle.
|
|
75
85
|
`;
|
|
76
86
|
const STEERING_PLACEHOLDER = `---
|
|
77
87
|
title: Priority Stack
|
|
@@ -100,6 +110,7 @@ alongside your Project workspace.
|
|
|
100
110
|
`;
|
|
101
111
|
function missionReadme(mission) {
|
|
102
112
|
return `---
|
|
113
|
+
id: ${mission.dotId}
|
|
103
114
|
title: ${mission.title}
|
|
104
115
|
status: ${mission.status}
|
|
105
116
|
mission: ${mission.id}
|
|
@@ -134,6 +145,7 @@ function sliceReadme(mission, slice) {
|
|
|
134
145
|
const narrative = GETTING_STARTED_NARRATIVE[slice.id];
|
|
135
146
|
if (narrative) {
|
|
136
147
|
return `---
|
|
148
|
+
id: ${slice.dotId}
|
|
137
149
|
title: ${slice.title}
|
|
138
150
|
status: ${slice.status}
|
|
139
151
|
mission: ${mission.id}
|
|
@@ -144,6 +156,7 @@ slice: ${slice.id}
|
|
|
144
156
|
${narrative.readme}`;
|
|
145
157
|
}
|
|
146
158
|
return `---
|
|
159
|
+
id: ${slice.dotId}
|
|
147
160
|
title: ${slice.title}
|
|
148
161
|
status: ${slice.status}
|
|
149
162
|
mission: ${mission.id}
|
|
@@ -219,6 +232,134 @@ ${slice.objective}
|
|
|
219
232
|
- [ ] Any proof artifacts are referenced from the slice before closure.
|
|
220
233
|
`;
|
|
221
234
|
}
|
|
235
|
+
// FR-5e A1 (daemon-side symmetry) — MISSION_NOTES template +
|
|
236
|
+
// rendering for the daemon's `/api/config/init-workspace` route so
|
|
237
|
+
// UI-driven init lands the same scaffold as CLI-driven init. The
|
|
238
|
+
// template content is duplicated here from
|
|
239
|
+
// packages/cli/src/lib/scope-templates/mission-notes.md to keep the
|
|
240
|
+
// daemon side dependency-free of the cli package; a parity test in
|
|
241
|
+
// getting-started-narrative-parity.test.ts asserts CLI + daemon emit
|
|
242
|
+
// byte-identical MISSION_NOTES content given the same opts. Same
|
|
243
|
+
// env-var-pivot pattern the CLI surface honors:
|
|
244
|
+
// OPENRIG_MISSION_NOTES_TEMPLATE_PATH > built-in.
|
|
245
|
+
const MISSION_NOTES_BUILT_IN = `---
|
|
246
|
+
mission: {{mission_id}}
|
|
247
|
+
name: {{mission_name}}
|
|
248
|
+
status: active
|
|
249
|
+
authored: {{created_date}}
|
|
250
|
+
last-updated: {{created_date}}
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
# Mission Notes — {{mission_name}}
|
|
254
|
+
|
|
255
|
+
> Read the frontmatter \`last-updated\` first. If stale relative to runtime,
|
|
256
|
+
> treat this file as \`provisional\` and re-verify before relying on it.
|
|
257
|
+
> Pointer-first by design — index durable canonical artifacts; don't duplicate
|
|
258
|
+
> them (duplication is the stale-breadcrumb failure mode this convention
|
|
259
|
+
> exists to kill).
|
|
260
|
+
|
|
261
|
+
## §1. Top-of-mind context
|
|
262
|
+
|
|
263
|
+
(Current most-load-bearing state — gates, open scope-decisions, in-flight
|
|
264
|
+
surprises. Updated by anyone when material changes. Keep to 5-15 lines.)
|
|
265
|
+
|
|
266
|
+
## §2. Active workstreams + drivers + tips
|
|
267
|
+
|
|
268
|
+
(Per-workstream rows. THIS SECTION IS THE MISSION CODEMAP. Each row:
|
|
269
|
+
state / driver / branch+tip-SHA / latest blocker or ACK.)
|
|
270
|
+
|
|
271
|
+
- (workstream-id) — state — driver — tip-SHA — blocker/ACK
|
|
272
|
+
|
|
273
|
+
## §3. Open scope-decisions
|
|
274
|
+
|
|
275
|
+
(Labeled gates the operator owns. Per gate: where the gate is, what's needed,
|
|
276
|
+
who routed.)
|
|
277
|
+
|
|
278
|
+
- OQ-1: (decision needed) — gate at <artifact-path> — surfaced by <seat>
|
|
279
|
+
|
|
280
|
+
## §4. Slice inventory
|
|
281
|
+
|
|
282
|
+
(Full table of slices on this mission.)
|
|
283
|
+
|
|
284
|
+
| # | slice | state | driver | blocker |
|
|
285
|
+
|---|---|---|---|---|
|
|
286
|
+
|
|
287
|
+
## §5. Pending dispatches
|
|
288
|
+
|
|
289
|
+
(Next-go items waiting on driver availability or convergence. Immediately-ready
|
|
290
|
+
set, not full backlog.)
|
|
291
|
+
|
|
292
|
+
## §6. Ledgers
|
|
293
|
+
|
|
294
|
+
(Mission-specific shared ledgers: release version + tag, SC counts, cumulative
|
|
295
|
+
deltas, etc.)
|
|
296
|
+
|
|
297
|
+
## §7. Banked memories that apply here
|
|
298
|
+
|
|
299
|
+
(Bulleted: banked-feedback / banked-project memories load-bearing on restore
|
|
300
|
+
for this mission. Ones learned during this mission go into the same list.)
|
|
301
|
+
|
|
302
|
+
## §8. Convention pointers
|
|
303
|
+
|
|
304
|
+
(Which banked conventions this mission inherits. Cross-reference each by path.
|
|
305
|
+
This section is the principles/conventions inheritance surface for the mission.)
|
|
306
|
+
|
|
307
|
+
- \`conventions/mission-notes/README.md\` — this convention (apply on every restore)
|
|
308
|
+
|
|
309
|
+
## §9. Reconstruction protocol
|
|
310
|
+
|
|
311
|
+
(Commands to run after compaction or for onboarding. Refresh as the mission's
|
|
312
|
+
restore-needs evolve.)
|
|
313
|
+
|
|
314
|
+
1. \`rig whoami --json\` — confirm seat identity
|
|
315
|
+
2. Read this file's §1 + your §A-§X section + this §9
|
|
316
|
+
3. Read \`missions/{{mission_id}}/README.md\` for mission scope
|
|
317
|
+
4. Read \`missions/{{mission_id}}/PROGRESS.md\` for delivery state
|
|
318
|
+
5. \`rig queue list --destination <your-session>\` — your durable inbox
|
|
319
|
+
6. State "restored from {{mission_id}}; resumed at <action>" before acting
|
|
320
|
+
|
|
321
|
+
## §10. What NOT to reconstruct
|
|
322
|
+
|
|
323
|
+
(Explicit pruning — completed slices / merged commits / closed ACK packets are
|
|
324
|
+
recoverable on demand and don't need to be in working memory. Name them to
|
|
325
|
+
free attention.)
|
|
326
|
+
|
|
327
|
+
## §A. <first-seat>@<rig> notes
|
|
328
|
+
|
|
329
|
+
(First seat's notes. Pattern: append cont.N entries with date + state of the
|
|
330
|
+
world from this seat's perspective. Latest = truth. Other seats READ but
|
|
331
|
+
don't modify.)
|
|
332
|
+
|
|
333
|
+
DONE {{created_date}} (cont.0 — mission scaffolded):
|
|
334
|
+
- Mission scaffolded via \`rig scope mission create\`. Template applied; this
|
|
335
|
+
file is the seed state. First substantive cont.1 entry follows when work
|
|
336
|
+
begins.
|
|
337
|
+
|
|
338
|
+
## §B / §C / ... — per-seat sections
|
|
339
|
+
|
|
340
|
+
(Each additional seat adds an h2 ## §X section under their own header as they
|
|
341
|
+
join. Section pattern matches §A.)
|
|
342
|
+
`;
|
|
343
|
+
function applyMissionNotesPlaceholders(content, opts) {
|
|
344
|
+
return content
|
|
345
|
+
.replace(/\{\{mission_id\}\}/g, opts.mission_id)
|
|
346
|
+
.replace(/\{\{mission_name\}\}/g, opts.mission_name)
|
|
347
|
+
.replace(/\{\{created_date\}\}/g, opts.created_date);
|
|
348
|
+
}
|
|
349
|
+
export function renderDaemonMissionNotes(opts) {
|
|
350
|
+
const envValue = process.env.OPENRIG_MISSION_NOTES_TEMPLATE_PATH;
|
|
351
|
+
if (envValue && envValue.trim().length > 0) {
|
|
352
|
+
const absPath = path.resolve(envValue.trim());
|
|
353
|
+
if (!fs.existsSync(absPath)) {
|
|
354
|
+
throw new Error(`OPENRIG_MISSION_NOTES_TEMPLATE_PATH points at "${envValue}", which does not exist. ` +
|
|
355
|
+
"MISSION_NOTES.md not scaffolded. Set it to an absolute path to a readable template file, " +
|
|
356
|
+
"or unset it to use the built-in bundled fallback.");
|
|
357
|
+
}
|
|
358
|
+
const raw = fs.readFileSync(absPath, "utf8");
|
|
359
|
+
return applyMissionNotesPlaceholders(raw, opts);
|
|
360
|
+
}
|
|
361
|
+
return applyMissionNotesPlaceholders(MISSION_NOTES_BUILT_IN, opts);
|
|
362
|
+
}
|
|
222
363
|
export function workspaceScaffoldFiles() {
|
|
223
364
|
const files = [
|
|
224
365
|
{ relPath: "README.md", content: WORKSPACE_README },
|
|
@@ -232,7 +373,19 @@ export function workspaceScaffoldFiles() {
|
|
|
232
373
|
{ relPath: "dogfood-evidence/README.md", content: subdirReadmeContent("dogfood-evidence") },
|
|
233
374
|
];
|
|
234
375
|
for (const mission of DEFAULT_MISSIONS) {
|
|
235
|
-
files.push({ relPath: `missions/${mission.id}/README.md`, content: missionReadme(mission) }, { relPath: `missions/${mission.id}/PROGRESS.md`, content: missionProgress(mission) }
|
|
376
|
+
files.push({ relPath: `missions/${mission.id}/README.md`, content: missionReadme(mission) }, { relPath: `missions/${mission.id}/PROGRESS.md`, content: missionProgress(mission) },
|
|
377
|
+
// FR-5e A1 (daemon-side symmetry) — match CLI scaffold so UI-init
|
|
378
|
+
// produces a workspace that passes doctor check #7. The template
|
|
379
|
+
// resolution + env-var-pivot mirrors the CLI surface;
|
|
380
|
+
// getting-started-narrative-parity.test.ts asserts byte-identity.
|
|
381
|
+
{
|
|
382
|
+
relPath: `missions/${mission.id}/MISSION_NOTES.md`,
|
|
383
|
+
content: renderDaemonMissionNotes({
|
|
384
|
+
mission_id: mission.dotId,
|
|
385
|
+
mission_name: mission.title,
|
|
386
|
+
created_date: new Date().toISOString().slice(0, 10),
|
|
387
|
+
}),
|
|
388
|
+
});
|
|
236
389
|
for (const slice of mission.slices) {
|
|
237
390
|
files.push({ relPath: `missions/${mission.id}/slices/${slice.id}/README.md`, content: sliceReadme(mission, slice) }, { relPath: `missions/${mission.id}/slices/${slice.id}/PROGRESS.md`, content: sliceProgress(mission, slice) }, { relPath: `missions/${mission.id}/slices/${slice.id}/IMPLEMENTATION-PRD.md`, content: slicePrd(mission, slice) });
|
|
238
391
|
// V0.3.1 slice 21: getting-started slices ship a timeline.md
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-workspace-scaffold.js","sourceRoot":"","sources":["../../../src/domain/workspace/default-workspace-scaffold.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,mEAAmE;AACnE,qBAAqB;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"default-workspace-scaffold.js","sourceRoot":"","sources":["../../../src/domain/workspace/default-workspace-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
export type CheckStatus = "ok" | "warn" | "fail";
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
check: string;
|
|
4
|
+
status: CheckStatus;
|
|
5
|
+
message: string;
|
|
6
|
+
fixHint?: string;
|
|
7
|
+
evidence?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export type WorkspaceRootSource = "env" | "file" | "default";
|
|
10
|
+
export interface CheckWorkspaceRootInput {
|
|
11
|
+
workspaceRoot: string;
|
|
12
|
+
source: WorkspaceRootSource;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check #1 — workspace root reachable.
|
|
16
|
+
*
|
|
17
|
+
* Verifies the resolved workspace root exists as a directory. The
|
|
18
|
+
* `source` (env / file / default) is propagated into the fix-hint so
|
|
19
|
+
* the operator gets the right remediation channel.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkWorkspaceRootReachable(opts: CheckWorkspaceRootInput): DoctorCheck;
|
|
22
|
+
export interface CheckMissionsFolderInput {
|
|
23
|
+
workspaceRoot: string;
|
|
24
|
+
/** Resolved `workspace.slicesRoot` per ConfigStore (defaults to
|
|
25
|
+
* `<workspaceRoot>/missions`). Operators who customized
|
|
26
|
+
* `workspace.slices_root` (env or config) point this elsewhere; the
|
|
27
|
+
* check honors the override so a deliberate custom layout doesn't
|
|
28
|
+
* spuriously fail. */
|
|
29
|
+
slicesRoot: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check #2 — missions folder present.
|
|
33
|
+
*
|
|
34
|
+
* Verifies the resolved missions folder (per ConfigStore `workspace.
|
|
35
|
+
* slicesRoot` — defaults to `<workspaceRoot>/missions`) exists as a
|
|
36
|
+
* directory. Fail on absence or wrong-shape; this is the load-bearing
|
|
37
|
+
* folder for Project UI projection.
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkMissionsFolder(opts: CheckMissionsFolderInput): DoctorCheck;
|
|
40
|
+
/**
|
|
41
|
+
* Canonical-decoded allowlist entry as the shipped file API sees it
|
|
42
|
+
* (post `decodeAllowlist`): absolute path, realpath-canonicalized
|
|
43
|
+
* when reachable. Relative paths are silently dropped by the canonical
|
|
44
|
+
* decoder before they reach this shape — see check #3 for the
|
|
45
|
+
* usable-vs-raw entry-count semantics.
|
|
46
|
+
*/
|
|
47
|
+
export interface AllowlistEntry {
|
|
48
|
+
name: string;
|
|
49
|
+
/** Canonical absolute path (post-decodeAllowlist + realpathSync
|
|
50
|
+
* fallback). Equivalent to the file API's `AllowlistRoot.canonicalPath`. */
|
|
51
|
+
path: string;
|
|
52
|
+
}
|
|
53
|
+
export interface CheckFileAllowlistInput {
|
|
54
|
+
workspaceRoot: string;
|
|
55
|
+
/** Raw `files.allowlist` value resolved via ConfigStore
|
|
56
|
+
* (comma-separated `name:/abs/path` pairs, or empty string). */
|
|
57
|
+
allowlistValue: string;
|
|
58
|
+
allowlistSource: WorkspaceRootSource;
|
|
59
|
+
/** Pre-decoded entries; if omitted the check decodes allowlistValue
|
|
60
|
+
* via the canonical `decodeAllowlist` from
|
|
61
|
+
* domain/files/path-safety.ts so the doctor reports exactly what
|
|
62
|
+
* the shipped file API at /api/files/* accepts. Pre-decoded
|
|
63
|
+
* entries MUST be in canonical form (absolute path); raw
|
|
64
|
+
* named-pair strings from SettingsStore should go through
|
|
65
|
+
* allowlistValue + the in-function decode, not parsedEntries. */
|
|
66
|
+
parsedEntries?: AllowlistEntry[];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check #3 — file allowlist sane.
|
|
70
|
+
*
|
|
71
|
+
* IMPL-PRD §43 references `<workspace-root>/.openrig/file-allowlist`
|
|
72
|
+
* as a file — the shipped surface (ConfigStore `files.allowlist` key,
|
|
73
|
+
* env OPENRIG_FILES_ALLOWLIST, default `workspace:${workspaceRoot}`)
|
|
74
|
+
* is a CONFIGSTORE STRING KEY holding comma-separated `name:/abs/path`
|
|
75
|
+
* pairs. There is no per-workspace file. Check #3 verifies the
|
|
76
|
+
* resolved value decodes to at least one USABLE entry (canonical,
|
|
77
|
+
* absolute) covering the workspaceRoot — the same usable-root
|
|
78
|
+
* semantics the shipped file API at /api/files/* enforces via
|
|
79
|
+
* `decodeAllowlist` in domain/files/path-safety.ts:60-80 (silently
|
|
80
|
+
* drops non-absolute paths at line 71).
|
|
81
|
+
*
|
|
82
|
+
* Decoding via the canonical decoder (not a local re-implementation)
|
|
83
|
+
* guarantees the doctor's verdict matches the actual file-API
|
|
84
|
+
* behavior — `workspace:.` or `workspace:relative-root` evaluates
|
|
85
|
+
* to zero usable entries here, mirroring the file API's silent skip.
|
|
86
|
+
*/
|
|
87
|
+
export declare function checkFileAllowlist(opts: CheckFileAllowlistInput): DoctorCheck;
|
|
88
|
+
export interface CheckDaemonWorkspaceInput {
|
|
89
|
+
/** workspace.root the daemon process resolves (server-side). */
|
|
90
|
+
daemonResolvedRoot: string;
|
|
91
|
+
/** workspace.root the doctor caller expects (CLI-side resolved,
|
|
92
|
+
* passed in the request body or matched against the --workspace
|
|
93
|
+
* flag). */
|
|
94
|
+
expectedRoot: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check #4 — daemon points at this workspace.
|
|
98
|
+
*
|
|
99
|
+
* Reports divergence between the workspace.root the daemon resolved at
|
|
100
|
+
* start-time vs the workspace.root the doctor caller expects. The
|
|
101
|
+
* common cause is the daemon being started in a shell with a different
|
|
102
|
+
* OPENRIG_WORKSPACE_ROOT than the operator's current shell.
|
|
103
|
+
*/
|
|
104
|
+
export declare function checkDaemonWorkspace(opts: CheckDaemonWorkspaceInput): DoctorCheck;
|
|
105
|
+
export interface CheckDaemonReloadInput {
|
|
106
|
+
/** Path to the ConfigStore config file on disk. */
|
|
107
|
+
configFilePath: string;
|
|
108
|
+
/** Daemon process start time as a Date. Callers typically capture
|
|
109
|
+
* this once at daemon-startup (e.g.
|
|
110
|
+
* `new Date(Date.now() - process.uptime() * 1000)` at the doctor
|
|
111
|
+
* route handler) and pass it through. Compared to config-file
|
|
112
|
+
* mtime; mtime > startTime → stale daemon. */
|
|
113
|
+
daemonStartTime: Date;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check #5 — daemon reload needed.
|
|
117
|
+
*
|
|
118
|
+
* Compares config-file mtime to the daemon's start-time. A newer
|
|
119
|
+
* mtime means the operator edited config (via CLI / UI) after the
|
|
120
|
+
* daemon started, and the daemon hasn't picked the change up yet.
|
|
121
|
+
* Missing config file is not a fail — fresh installs without an
|
|
122
|
+
* operator-written config use defaults entirely and never need a
|
|
123
|
+
* reload.
|
|
124
|
+
*/
|
|
125
|
+
export declare function checkDaemonReload(opts: CheckDaemonReloadInput): DoctorCheck;
|
|
126
|
+
export interface CheckSliceDocsInput {
|
|
127
|
+
/** Resolved missions folder root. The check walks each
|
|
128
|
+
* `<missionsRoot>/<mission>/slices/<slice>/` and verifies it has
|
|
129
|
+
* README.md OR IMPLEMENTATION-PRD.md OR IMPL-PRD.md. */
|
|
130
|
+
missionsRoot: string;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Check #6 — optional slice docs.
|
|
134
|
+
*
|
|
135
|
+
* Walks each mission's slices subdirectory and reports slices that
|
|
136
|
+
* have NEITHER a README.md, IMPLEMENTATION-PRD.md, nor IMPL-PRD.md.
|
|
137
|
+
* Warn-only (empty slices are sometimes intentional staging per
|
|
138
|
+
* IMPL-PRD §57-59). The walk is bounded to one mission + one slice
|
|
139
|
+
* level; we don't recurse into slice subdirs.
|
|
140
|
+
*/
|
|
141
|
+
export declare function checkOptionalSliceDocs(opts: CheckSliceDocsInput): DoctorCheck;
|
|
142
|
+
export interface CheckMissionNotesInput {
|
|
143
|
+
missionsRoot: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check #7 — MISSION_NOTES presence.
|
|
147
|
+
*
|
|
148
|
+
* Verifies each mission directory has a `MISSION_NOTES.md` (per the
|
|
149
|
+
* FR-3 convention that just merged at LOCAL main e154a5ce). Warn-
|
|
150
|
+
* only because legacy missions predate the convention; the
|
|
151
|
+
* operator can run `rig scope mission create` (which now auto-
|
|
152
|
+
* scaffolds the file per FR-3) for new missions.
|
|
153
|
+
*/
|
|
154
|
+
export declare function checkMissionNotesPresence(opts: CheckMissionNotesInput): DoctorCheck;
|
|
155
|
+
export interface RunDoctorInput {
|
|
156
|
+
/** Workspace root under check (caller's --workspace override or
|
|
157
|
+
* daemon-resolved default). */
|
|
158
|
+
workspaceRoot: string;
|
|
159
|
+
workspaceRootSource: WorkspaceRootSource;
|
|
160
|
+
/** Resolved missions folder per ConfigStore workspace.slices_root,
|
|
161
|
+
* or `<workspaceRoot>/missions` when caller overrode --workspace. */
|
|
162
|
+
slicesRoot: string;
|
|
163
|
+
/** Raw files.allowlist value from SettingsStore (will be decoded
|
|
164
|
+
* via canonical decodeAllowlist). */
|
|
165
|
+
allowlistValue: string;
|
|
166
|
+
allowlistSource: WorkspaceRootSource;
|
|
167
|
+
/** Daemon-resolved workspace.root (for check #4 comparison against
|
|
168
|
+
* the workspace under check). */
|
|
169
|
+
daemonResolvedWorkspaceRoot: string;
|
|
170
|
+
/** Daemon's ConfigStore configPath on disk (for check #5 staleness
|
|
171
|
+
* comparison). */
|
|
172
|
+
configFilePath: string;
|
|
173
|
+
/** Daemon process start time (for check #5). */
|
|
174
|
+
daemonStartTime: Date;
|
|
175
|
+
}
|
|
176
|
+
export interface DoctorReport {
|
|
177
|
+
/** Workspace under check (echoes input.workspaceRoot for clarity). */
|
|
178
|
+
workspaceRoot: string;
|
|
179
|
+
checks: DoctorCheck[];
|
|
180
|
+
summary: {
|
|
181
|
+
ok: number;
|
|
182
|
+
warn: number;
|
|
183
|
+
fail: number;
|
|
184
|
+
};
|
|
185
|
+
/** ISO timestamp of when the daemon ran the report. */
|
|
186
|
+
daemonResolvedAt: string;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Orchestrator — runs all 7 checks in fixed order and returns a
|
|
190
|
+
* structured DoctorReport with aggregate counts. Pure function;
|
|
191
|
+
* filesystem effects are bounded to the individual check helpers
|
|
192
|
+
* (statSync / readdirSync / existsSync). Used by the daemon route
|
|
193
|
+
* POST /api/workspace/doctor (FR-5c) and by the CLI's --json
|
|
194
|
+
* formatter (FR-5d).
|
|
195
|
+
*/
|
|
196
|
+
export declare function runWorkspaceDoctor(input: RunDoctorInput): DoctorReport;
|
|
197
|
+
//# sourceMappingURL=workspace-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-doctor.d.ts","sourceRoot":"","sources":["../../../src/domain/workspace/workspace-doctor.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAoBD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,uBAAuB,GAAG,WAAW,CAgCtF;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB;;;;2BAIuB;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,wBAAwB,GAAG,WAAW,CAoC/E;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;iFAC6E;IAC7E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB;qEACiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,mBAAmB,CAAC;IACrC;;;;;;sEAMkE;IAClE,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,uBAAuB,GAAG,WAAW,CAqC7E;AAoBD,MAAM,WAAW,yBAAyB;IACxC,gEAAgE;IAChE,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;iBAEa;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,yBAAyB,GAAG,WAAW,CAoBjF;AAED,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB;;;;mDAI+C;IAC/C,eAAe,EAAE,IAAI,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,WAAW,CAiD3E;AAED,MAAM,WAAW,mBAAmB;IAClC;;6DAEyD;IACzD,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAuD7E;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,sBAAsB,GAAG,WAAW,CA4CnF;AAED,MAAM,WAAW,cAAc;IAC7B;oCACgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;0EACsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB;0CACsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,mBAAmB,CAAC;IACrC;sCACkC;IAClC,2BAA2B,EAAE,MAAM,CAAC;IACpC;uBACmB;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,eAAe,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,uDAAuD;IACvD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,CAsCtE"}
|