@cleocode/cleo 2026.4.10 → 2026.4.11
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/dist/cli/commander-shim.d.ts +112 -0
- package/dist/cli/commander-shim.d.ts.map +1 -0
- package/dist/cli/commander-shim.js +233 -0
- package/dist/cli/commander-shim.js.map +1 -0
- package/dist/cli/commands/add.d.ts +12 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +98 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +12 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +59 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/adr.d.ts +27 -0
- package/dist/cli/commands/adr.d.ts.map +1 -0
- package/dist/cli/commands/adr.js +79 -0
- package/dist/cli/commands/adr.js.map +1 -0
- package/dist/cli/commands/agent-profile-status.d.ts +98 -0
- package/dist/cli/commands/agent-profile-status.d.ts.map +1 -0
- package/dist/cli/commands/agent-profile-status.js +71 -0
- package/dist/cli/commands/agent-profile-status.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +38 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +1125 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +17 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +20 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +12 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +20 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/archive-stats.d.ts +18 -0
- package/dist/cli/commands/archive-stats.d.ts.map +1 -0
- package/dist/cli/commands/archive-stats.js +49 -0
- package/dist/cli/commands/archive-stats.js.map +1 -0
- package/dist/cli/commands/archive.d.ts +12 -0
- package/dist/cli/commands/archive.d.ts.map +1 -0
- package/dist/cli/commands/archive.js +32 -0
- package/dist/cli/commands/archive.js.map +1 -0
- package/dist/cli/commands/backfill.d.ts +38 -0
- package/dist/cli/commands/backfill.d.ts.map +1 -0
- package/dist/cli/commands/backfill.js +147 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/backup.d.ts +8 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +35 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/blockers.d.ts +7 -0
- package/dist/cli/commands/blockers.d.ts.map +1 -0
- package/dist/cli/commands/blockers.js +16 -0
- package/dist/cli/commands/blockers.js.map +1 -0
- package/dist/cli/commands/brain.d.ts +29 -0
- package/dist/cli/commands/brain.d.ts.map +1 -0
- package/dist/cli/commands/brain.js +107 -0
- package/dist/cli/commands/brain.js.map +1 -0
- package/dist/cli/commands/briefing.d.ts +22 -0
- package/dist/cli/commands/briefing.d.ts.map +1 -0
- package/dist/cli/commands/briefing.js +45 -0
- package/dist/cli/commands/briefing.js.map +1 -0
- package/dist/cli/commands/bug.d.ts +12 -0
- package/dist/cli/commands/bug.d.ts.map +1 -0
- package/dist/cli/commands/bug.js +81 -0
- package/dist/cli/commands/bug.js.map +1 -0
- package/dist/cli/commands/cant.d.ts +32 -0
- package/dist/cli/commands/cant.d.ts.map +1 -0
- package/dist/cli/commands/cant.js +281 -0
- package/dist/cli/commands/cant.js.map +1 -0
- package/dist/cli/commands/check.d.ts +22 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +164 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/checkpoint.d.ts +15 -0
- package/dist/cli/commands/checkpoint.d.ts.map +1 -0
- package/dist/cli/commands/checkpoint.js +91 -0
- package/dist/cli/commands/checkpoint.js.map +1 -0
- package/dist/cli/commands/code.d.ts +11 -0
- package/dist/cli/commands/code.d.ts.map +1 -0
- package/dist/cli/commands/code.js +114 -0
- package/dist/cli/commands/code.js.map +1 -0
- package/dist/cli/commands/commands.d.ts +13 -0
- package/dist/cli/commands/commands.d.ts.map +1 -0
- package/dist/cli/commands/commands.js +29 -0
- package/dist/cli/commands/commands.js.map +1 -0
- package/dist/cli/commands/complete.d.ts +12 -0
- package/dist/cli/commands/complete.d.ts.map +1 -0
- package/dist/cli/commands/complete.js +43 -0
- package/dist/cli/commands/complete.js.map +1 -0
- package/dist/cli/commands/compliance.d.ts +8 -0
- package/dist/cli/commands/compliance.d.ts.map +1 -0
- package/dist/cli/commands/compliance.js +85 -0
- package/dist/cli/commands/compliance.js.map +1 -0
- package/dist/cli/commands/config.d.ts +10 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +69 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/consensus.d.ts +13 -0
- package/dist/cli/commands/consensus.d.ts.map +1 -0
- package/dist/cli/commands/consensus.js +45 -0
- package/dist/cli/commands/consensus.js.map +1 -0
- package/dist/cli/commands/context.d.ts +8 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +40 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/contribution.d.ts +13 -0
- package/dist/cli/commands/contribution.d.ts.map +1 -0
- package/dist/cli/commands/contribution.js +41 -0
- package/dist/cli/commands/contribution.js.map +1 -0
- package/dist/cli/commands/current.d.ts +13 -0
- package/dist/cli/commands/current.d.ts.map +1 -0
- package/dist/cli/commands/current.js +20 -0
- package/dist/cli/commands/current.js.map +1 -0
- package/dist/cli/commands/dash.d.ts +12 -0
- package/dist/cli/commands/dash.d.ts.map +1 -0
- package/dist/cli/commands/dash.js +24 -0
- package/dist/cli/commands/dash.js.map +1 -0
- package/dist/cli/commands/decomposition.d.ts +13 -0
- package/dist/cli/commands/decomposition.d.ts.map +1 -0
- package/dist/cli/commands/decomposition.js +45 -0
- package/dist/cli/commands/decomposition.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +12 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +37 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/deps.d.ts +24 -0
- package/dist/cli/commands/deps.d.ts.map +1 -0
- package/dist/cli/commands/deps.js +98 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/detect-drift.d.ts +15 -0
- package/dist/cli/commands/detect-drift.d.ts.map +1 -0
- package/dist/cli/commands/detect-drift.js +424 -0
- package/dist/cli/commands/detect-drift.js.map +1 -0
- package/dist/cli/commands/detect.d.ts +10 -0
- package/dist/cli/commands/detect.d.ts.map +1 -0
- package/dist/cli/commands/detect.js +24 -0
- package/dist/cli/commands/detect.js.map +1 -0
- package/dist/cli/commands/docs.d.ts +13 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +169 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +15 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +133 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/dynamic.d.ts +24 -0
- package/dist/cli/commands/dynamic.d.ts.map +1 -0
- package/dist/cli/commands/dynamic.js +27 -0
- package/dist/cli/commands/dynamic.js.map +1 -0
- package/dist/cli/commands/env.d.ts +12 -0
- package/dist/cli/commands/env.d.ts.map +1 -0
- package/dist/cli/commands/env.js +44 -0
- package/dist/cli/commands/env.js.map +1 -0
- package/dist/cli/commands/exists.d.ts +22 -0
- package/dist/cli/commands/exists.d.ts.map +1 -0
- package/dist/cli/commands/exists.js +51 -0
- package/dist/cli/commands/exists.js.map +1 -0
- package/dist/cli/commands/export-tasks.d.ts +10 -0
- package/dist/cli/commands/export-tasks.d.ts.map +1 -0
- package/dist/cli/commands/export-tasks.js +47 -0
- package/dist/cli/commands/export-tasks.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +46 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/find.d.ts +14 -0
- package/dist/cli/commands/find.d.ts.map +1 -0
- package/dist/cli/commands/find.js +70 -0
- package/dist/cli/commands/find.js.map +1 -0
- package/dist/cli/commands/generate-changelog.d.ts +14 -0
- package/dist/cli/commands/generate-changelog.d.ts.map +1 -0
- package/dist/cli/commands/generate-changelog.js +252 -0
- package/dist/cli/commands/generate-changelog.js.map +1 -0
- package/dist/cli/commands/grade.d.ts +13 -0
- package/dist/cli/commands/grade.d.ts.map +1 -0
- package/dist/cli/commands/grade.js +26 -0
- package/dist/cli/commands/grade.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +30 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/implementation.d.ts +13 -0
- package/dist/cli/commands/implementation.d.ts.map +1 -0
- package/dist/cli/commands/implementation.js +41 -0
- package/dist/cli/commands/implementation.js.map +1 -0
- package/dist/cli/commands/import-tasks.d.ts +10 -0
- package/dist/cli/commands/import-tasks.d.ts.map +1 -0
- package/dist/cli/commands/import-tasks.js +38 -0
- package/dist/cli/commands/import-tasks.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +28 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +34 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +96 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inject.d.ts +8 -0
- package/dist/cli/commands/inject.d.ts.map +1 -0
- package/dist/cli/commands/inject.js +28 -0
- package/dist/cli/commands/inject.js.map +1 -0
- package/dist/cli/commands/issue.d.ts +17 -0
- package/dist/cli/commands/issue.d.ts.map +1 -0
- package/dist/cli/commands/issue.js +107 -0
- package/dist/cli/commands/issue.js.map +1 -0
- package/dist/cli/commands/labels.d.ts +13 -0
- package/dist/cli/commands/labels.d.ts.map +1 -0
- package/dist/cli/commands/labels.js +44 -0
- package/dist/cli/commands/labels.js.map +1 -0
- package/dist/cli/commands/lifecycle.d.ts +8 -0
- package/dist/cli/commands/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/lifecycle.js +84 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/list.d.ts +14 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +71 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/log.d.ts +12 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +30 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/map.d.ts +10 -0
- package/dist/cli/commands/map.d.ts.map +1 -0
- package/dist/cli/commands/map.js +23 -0
- package/dist/cli/commands/map.js.map +1 -0
- package/dist/cli/commands/memory-brain.d.ts +14 -0
- package/dist/cli/commands/memory-brain.d.ts.map +1 -0
- package/dist/cli/commands/memory-brain.js +157 -0
- package/dist/cli/commands/memory-brain.js.map +1 -0
- package/dist/cli/commands/migrate-claude-mem.d.ts +18 -0
- package/dist/cli/commands/migrate-claude-mem.d.ts.map +1 -0
- package/dist/cli/commands/migrate-claude-mem.js +60 -0
- package/dist/cli/commands/migrate-claude-mem.js.map +1 -0
- package/dist/cli/commands/next.d.ts +9 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +20 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/nexus.d.ts +16 -0
- package/dist/cli/commands/nexus.d.ts.map +1 -0
- package/dist/cli/commands/nexus.js +155 -0
- package/dist/cli/commands/nexus.js.map +1 -0
- package/dist/cli/commands/observe.d.ts +9 -0
- package/dist/cli/commands/observe.d.ts.map +1 -0
- package/dist/cli/commands/observe.js +39 -0
- package/dist/cli/commands/observe.js.map +1 -0
- package/dist/cli/commands/ops.d.ts +10 -0
- package/dist/cli/commands/ops.d.ts.map +1 -0
- package/dist/cli/commands/ops.js +19 -0
- package/dist/cli/commands/ops.js.map +1 -0
- package/dist/cli/commands/orchestrate.d.ts +8 -0
- package/dist/cli/commands/orchestrate.d.ts.map +1 -0
- package/dist/cli/commands/orchestrate.js +58 -0
- package/dist/cli/commands/orchestrate.js.map +1 -0
- package/dist/cli/commands/otel.d.ts +12 -0
- package/dist/cli/commands/otel.d.ts.map +1 -0
- package/dist/cli/commands/otel.js +128 -0
- package/dist/cli/commands/otel.js.map +1 -0
- package/dist/cli/commands/phase.d.ts +12 -0
- package/dist/cli/commands/phase.d.ts.map +1 -0
- package/dist/cli/commands/phase.js +91 -0
- package/dist/cli/commands/phase.js.map +1 -0
- package/dist/cli/commands/phases.d.ts +12 -0
- package/dist/cli/commands/phases.d.ts.map +1 -0
- package/dist/cli/commands/phases.js +37 -0
- package/dist/cli/commands/phases.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +8 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +15 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/promote.d.ts +7 -0
- package/dist/cli/commands/promote.d.ts.map +1 -0
- package/dist/cli/commands/promote.js +15 -0
- package/dist/cli/commands/promote.js.map +1 -0
- package/dist/cli/commands/reason.d.ts +35 -0
- package/dist/cli/commands/reason.d.ts.map +1 -0
- package/dist/cli/commands/reason.js +104 -0
- package/dist/cli/commands/reason.js.map +1 -0
- package/dist/cli/commands/refresh-memory.d.ts +9 -0
- package/dist/cli/commands/refresh-memory.d.ts.map +1 -0
- package/dist/cli/commands/refresh-memory.js +24 -0
- package/dist/cli/commands/refresh-memory.js.map +1 -0
- package/dist/cli/commands/relates.d.ts +12 -0
- package/dist/cli/commands/relates.d.ts.map +1 -0
- package/dist/cli/commands/relates.js +53 -0
- package/dist/cli/commands/relates.js.map +1 -0
- package/dist/cli/commands/release.d.ts +8 -0
- package/dist/cli/commands/release.d.ts.map +1 -0
- package/dist/cli/commands/release.js +72 -0
- package/dist/cli/commands/release.js.map +1 -0
- package/dist/cli/commands/remote.d.ts +12 -0
- package/dist/cli/commands/remote.d.ts.map +1 -0
- package/dist/cli/commands/remote.js +207 -0
- package/dist/cli/commands/remote.js.map +1 -0
- package/dist/cli/commands/reorder.d.ts +7 -0
- package/dist/cli/commands/reorder.d.ts.map +1 -0
- package/dist/cli/commands/reorder.js +20 -0
- package/dist/cli/commands/reorder.js.map +1 -0
- package/dist/cli/commands/reparent.d.ts +10 -0
- package/dist/cli/commands/reparent.d.ts.map +1 -0
- package/dist/cli/commands/reparent.js +19 -0
- package/dist/cli/commands/reparent.js.map +1 -0
- package/dist/cli/commands/research.d.ts +8 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/research.js +129 -0
- package/dist/cli/commands/research.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +11 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +224 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/roadmap.d.ts +8 -0
- package/dist/cli/commands/roadmap.d.ts.map +1 -0
- package/dist/cli/commands/roadmap.js +21 -0
- package/dist/cli/commands/roadmap.js.map +1 -0
- package/dist/cli/commands/safestop.d.ts +14 -0
- package/dist/cli/commands/safestop.d.ts.map +1 -0
- package/dist/cli/commands/safestop.js +32 -0
- package/dist/cli/commands/safestop.js.map +1 -0
- package/dist/cli/commands/self-update.d.ts +15 -0
- package/dist/cli/commands/self-update.d.ts.map +1 -0
- package/dist/cli/commands/self-update.js +329 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/sequence.d.ts +8 -0
- package/dist/cli/commands/sequence.d.ts.map +1 -0
- package/dist/cli/commands/sequence.js +30 -0
- package/dist/cli/commands/sequence.js.map +1 -0
- package/dist/cli/commands/session.d.ts +12 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +175 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/show.d.ts +13 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +20 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +13 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +131 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/snapshot.d.ts +9 -0
- package/dist/cli/commands/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/snapshot.js +50 -0
- package/dist/cli/commands/snapshot.js.map +1 -0
- package/dist/cli/commands/specification.d.ts +13 -0
- package/dist/cli/commands/specification.d.ts.map +1 -0
- package/dist/cli/commands/specification.js +45 -0
- package/dist/cli/commands/specification.js.map +1 -0
- package/dist/cli/commands/start.d.ts +13 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +20 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +12 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +35 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sticky.d.ts +16 -0
- package/dist/cli/commands/sticky.d.ts.map +1 -0
- package/dist/cli/commands/sticky.js +211 -0
- package/dist/cli/commands/sticky.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +13 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +20 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/testing.d.ts +13 -0
- package/dist/cli/commands/testing.d.ts.map +1 -0
- package/dist/cli/commands/testing.js +64 -0
- package/dist/cli/commands/testing.js.map +1 -0
- package/dist/cli/commands/token.d.ts +10 -0
- package/dist/cli/commands/token.d.ts.map +1 -0
- package/dist/cli/commands/token.js +135 -0
- package/dist/cli/commands/token.js.map +1 -0
- package/dist/cli/commands/update.d.ts +12 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +83 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +18 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +103 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +23 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +8 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +28 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/web.d.ts +13 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +277 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/field-context.d.ts +32 -0
- package/dist/cli/field-context.d.ts.map +1 -0
- package/dist/cli/field-context.js +47 -0
- package/dist/cli/field-context.js.map +1 -0
- package/dist/cli/format-context.d.ts +32 -0
- package/dist/cli/format-context.d.ts.map +1 -0
- package/dist/cli/format-context.js +50 -0
- package/dist/cli/format-context.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +3767 -3387
- package/dist/cli/index.js.map +4 -4
- package/dist/cli/logger-bootstrap.d.ts +6 -0
- package/dist/cli/logger-bootstrap.d.ts.map +1 -0
- package/dist/cli/logger-bootstrap.js +10 -0
- package/dist/cli/logger-bootstrap.js.map +1 -0
- package/dist/cli/middleware/output-format.d.ts +30 -0
- package/dist/cli/middleware/output-format.d.ts.map +1 -0
- package/dist/cli/middleware/output-format.js +35 -0
- package/dist/cli/middleware/output-format.js.map +1 -0
- package/dist/cli/progress.d.ts +84 -0
- package/dist/cli/progress.d.ts.map +1 -0
- package/dist/cli/progress.js +169 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/renderers/colors.d.ts +32 -0
- package/dist/cli/renderers/colors.d.ts.map +1 -0
- package/dist/cli/renderers/colors.js +141 -0
- package/dist/cli/renderers/colors.js.map +1 -0
- package/dist/cli/renderers/error.d.ts +13 -0
- package/dist/cli/renderers/error.d.ts.map +1 -0
- package/dist/cli/renderers/error.js +42 -0
- package/dist/cli/renderers/error.js.map +1 -0
- package/dist/cli/renderers/index.d.ts +59 -0
- package/dist/cli/renderers/index.d.ts.map +1 -0
- package/dist/cli/renderers/index.js +208 -0
- package/dist/cli/renderers/index.js.map +1 -0
- package/dist/cli/renderers/lafs-validator.d.ts +97 -0
- package/dist/cli/renderers/lafs-validator.d.ts.map +1 -0
- package/dist/cli/renderers/lafs-validator.js +229 -0
- package/dist/cli/renderers/lafs-validator.js.map +1 -0
- package/dist/cli/renderers/normalizer.d.ts +21 -0
- package/dist/cli/renderers/normalizer.d.ts.map +1 -0
- package/dist/cli/renderers/normalizer.js +106 -0
- package/dist/cli/renderers/normalizer.js.map +1 -0
- package/dist/cli/renderers/system.d.ts +25 -0
- package/dist/cli/renderers/system.d.ts.map +1 -0
- package/dist/cli/renderers/system.js +416 -0
- package/dist/cli/renderers/system.js.map +1 -0
- package/dist/cli/renderers/tasks.d.ts +28 -0
- package/dist/cli/renderers/tasks.d.ts.map +1 -0
- package/dist/cli/renderers/tasks.js +306 -0
- package/dist/cli/renderers/tasks.js.map +1 -0
- package/dist/dispatch/adapters/cli.d.ts +67 -0
- package/dist/dispatch/adapters/cli.d.ts.map +1 -0
- package/dist/dispatch/adapters/cli.js +262 -0
- package/dist/dispatch/adapters/cli.js.map +1 -0
- package/dist/dispatch/context/session-context.d.ts +54 -0
- package/dist/dispatch/context/session-context.d.ts.map +1 -0
- package/dist/dispatch/context/session-context.js +61 -0
- package/dist/dispatch/context/session-context.js.map +1 -0
- package/dist/dispatch/dispatcher.d.ts +23 -0
- package/dist/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/dispatch/dispatcher.js +84 -0
- package/dist/dispatch/dispatcher.js.map +1 -0
- package/dist/dispatch/domains/_base.d.ts +59 -0
- package/dist/dispatch/domains/_base.d.ts.map +1 -0
- package/dist/dispatch/domains/_base.js +77 -0
- package/dist/dispatch/domains/_base.js.map +1 -0
- package/dist/dispatch/domains/_meta.d.ts +23 -0
- package/dist/dispatch/domains/_meta.d.ts.map +1 -0
- package/dist/dispatch/domains/_meta.js +25 -0
- package/dist/dispatch/domains/_meta.js.map +1 -0
- package/dist/dispatch/domains/_routing.d.ts +8 -0
- package/dist/dispatch/domains/_routing.d.ts.map +1 -0
- package/dist/dispatch/domains/_routing.js +20 -0
- package/dist/dispatch/domains/_routing.js.map +1 -0
- package/dist/dispatch/domains/admin.d.ts +25 -0
- package/dist/dispatch/domains/admin.d.ts.map +1 -0
- package/dist/dispatch/domains/admin.js +719 -0
- package/dist/dispatch/domains/admin.js.map +1 -0
- package/dist/dispatch/domains/check.d.ts +22 -0
- package/dist/dispatch/domains/check.d.ts.map +1 -0
- package/dist/dispatch/domains/check.js +360 -0
- package/dist/dispatch/domains/check.js.map +1 -0
- package/dist/dispatch/domains/conduit.d.ts +38 -0
- package/dist/dispatch/domains/conduit.d.ts.map +1 -0
- package/dist/dispatch/domains/conduit.js +247 -0
- package/dist/dispatch/domains/conduit.js.map +1 -0
- package/dist/dispatch/domains/index.d.ts +27 -0
- package/dist/dispatch/domains/index.d.ts.map +1 -0
- package/dist/dispatch/domains/index.js +40 -0
- package/dist/dispatch/domains/index.js.map +1 -0
- package/dist/dispatch/domains/memory.d.ts +22 -0
- package/dist/dispatch/domains/memory.d.ts.map +1 -0
- package/dist/dispatch/domains/memory.js +303 -0
- package/dist/dispatch/domains/memory.js.map +1 -0
- package/dist/dispatch/domains/nexus.d.ts +22 -0
- package/dist/dispatch/domains/nexus.d.ts.map +1 -0
- package/dist/dispatch/domains/nexus.js +286 -0
- package/dist/dispatch/domains/nexus.js.map +1 -0
- package/dist/dispatch/domains/orchestrate.d.ts +19 -0
- package/dist/dispatch/domains/orchestrate.d.ts.map +1 -0
- package/dist/dispatch/domains/orchestrate.js +259 -0
- package/dist/dispatch/domains/orchestrate.js.map +1 -0
- package/dist/dispatch/domains/pipeline.d.ts +35 -0
- package/dist/dispatch/domains/pipeline.d.ts.map +1 -0
- package/dist/dispatch/domains/pipeline.js +593 -0
- package/dist/dispatch/domains/pipeline.js.map +1 -0
- package/dist/dispatch/domains/session.d.ts +22 -0
- package/dist/dispatch/domains/session.d.ts.map +1 -0
- package/dist/dispatch/domains/session.js +257 -0
- package/dist/dispatch/domains/session.js.map +1 -0
- package/dist/dispatch/domains/sticky.d.ts +20 -0
- package/dist/dispatch/domains/sticky.d.ts.map +1 -0
- package/dist/dispatch/domains/sticky.js +164 -0
- package/dist/dispatch/domains/sticky.js.map +1 -0
- package/dist/dispatch/domains/tasks.d.ts +25 -0
- package/dist/dispatch/domains/tasks.d.ts.map +1 -0
- package/dist/dispatch/domains/tasks.js +361 -0
- package/dist/dispatch/domains/tasks.js.map +1 -0
- package/dist/dispatch/domains/tools.d.ts +37 -0
- package/dist/dispatch/domains/tools.d.ts.map +1 -0
- package/dist/dispatch/domains/tools.js +481 -0
- package/dist/dispatch/domains/tools.js.map +1 -0
- package/dist/dispatch/engines/_error.d.ts +85 -0
- package/dist/dispatch/engines/_error.d.ts.map +1 -0
- package/dist/dispatch/engines/_error.js +244 -0
- package/dist/dispatch/engines/_error.js.map +1 -0
- package/dist/dispatch/engines/code-engine.d.ts +18 -0
- package/dist/dispatch/engines/code-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/code-engine.js +71 -0
- package/dist/dispatch/engines/code-engine.js.map +1 -0
- package/dist/dispatch/engines/codebase-map-engine.d.ts +31 -0
- package/dist/dispatch/engines/codebase-map-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/codebase-map-engine.js +43 -0
- package/dist/dispatch/engines/codebase-map-engine.js.map +1 -0
- package/dist/dispatch/engines/config-engine.d.ts +32 -0
- package/dist/dispatch/engines/config-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/config-engine.js +70 -0
- package/dist/dispatch/engines/config-engine.js.map +1 -0
- package/dist/dispatch/engines/hooks-engine.d.ts +96 -0
- package/dist/dispatch/engines/hooks-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/hooks-engine.js +144 -0
- package/dist/dispatch/engines/hooks-engine.js.map +1 -0
- package/dist/dispatch/engines/init-engine.d.ts +56 -0
- package/dist/dispatch/engines/init-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/init-engine.js +78 -0
- package/dist/dispatch/engines/init-engine.js.map +1 -0
- package/dist/dispatch/engines/lifecycle-engine.d.ts +66 -0
- package/dist/dispatch/engines/lifecycle-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/lifecycle-engine.js +224 -0
- package/dist/dispatch/engines/lifecycle-engine.js.map +1 -0
- package/dist/dispatch/engines/memory-engine.d.ts +10 -0
- package/dist/dispatch/engines/memory-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/memory-engine.js +10 -0
- package/dist/dispatch/engines/memory-engine.js.map +1 -0
- package/dist/dispatch/engines/nexus-engine.d.ts +167 -0
- package/dist/dispatch/engines/nexus-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/nexus-engine.js +356 -0
- package/dist/dispatch/engines/nexus-engine.js.map +1 -0
- package/dist/dispatch/engines/orchestrate-engine.d.ts +133 -0
- package/dist/dispatch/engines/orchestrate-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/orchestrate-engine.js +769 -0
- package/dist/dispatch/engines/orchestrate-engine.js.map +1 -0
- package/dist/dispatch/engines/pipeline-engine.d.ts +51 -0
- package/dist/dispatch/engines/pipeline-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/pipeline-engine.js +191 -0
- package/dist/dispatch/engines/pipeline-engine.js.map +1 -0
- package/dist/dispatch/engines/release-engine.d.ts +94 -0
- package/dist/dispatch/engines/release-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/release-engine.js +763 -0
- package/dist/dispatch/engines/release-engine.js.map +1 -0
- package/dist/dispatch/engines/session-engine.d.ts +383 -0
- package/dist/dispatch/engines/session-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/session-engine.js +960 -0
- package/dist/dispatch/engines/session-engine.js.map +1 -0
- package/dist/dispatch/engines/sticky-engine.d.ts +100 -0
- package/dist/dispatch/engines/sticky-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/sticky-engine.js +181 -0
- package/dist/dispatch/engines/sticky-engine.js.map +1 -0
- package/dist/dispatch/engines/system-engine.d.ts +539 -0
- package/dist/dispatch/engines/system-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/system-engine.js +1266 -0
- package/dist/dispatch/engines/system-engine.js.map +1 -0
- package/dist/dispatch/engines/task-engine.d.ts +1055 -0
- package/dist/dispatch/engines/task-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/task-engine.js +1387 -0
- package/dist/dispatch/engines/task-engine.js.map +1 -0
- package/dist/dispatch/engines/template-parser.d.ts +85 -0
- package/dist/dispatch/engines/template-parser.d.ts.map +1 -0
- package/dist/dispatch/engines/template-parser.js +108 -0
- package/dist/dispatch/engines/template-parser.js.map +1 -0
- package/dist/dispatch/engines/tools-engine.d.ts +270 -0
- package/dist/dispatch/engines/tools-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/tools-engine.js +636 -0
- package/dist/dispatch/engines/tools-engine.js.map +1 -0
- package/dist/dispatch/engines/validate-engine.d.ts +218 -0
- package/dist/dispatch/engines/validate-engine.d.ts.map +1 -0
- package/dist/dispatch/engines/validate-engine.js +737 -0
- package/dist/dispatch/engines/validate-engine.js.map +1 -0
- package/dist/dispatch/index.d.ts +20 -0
- package/dist/dispatch/index.d.ts.map +1 -0
- package/dist/dispatch/index.js +19 -0
- package/dist/dispatch/index.js.map +1 -0
- package/dist/dispatch/lib/background-jobs.d.ts +86 -0
- package/dist/dispatch/lib/background-jobs.d.ts.map +1 -0
- package/dist/dispatch/lib/background-jobs.js +183 -0
- package/dist/dispatch/lib/background-jobs.js.map +1 -0
- package/dist/dispatch/lib/budget.d.ts +35 -0
- package/dist/dispatch/lib/budget.d.ts.map +1 -0
- package/dist/dispatch/lib/budget.js +102 -0
- package/dist/dispatch/lib/budget.js.map +1 -0
- package/dist/dispatch/lib/capability-matrix.d.ts +11 -0
- package/dist/dispatch/lib/capability-matrix.d.ts.map +1 -0
- package/dist/dispatch/lib/capability-matrix.js +10 -0
- package/dist/dispatch/lib/capability-matrix.js.map +1 -0
- package/dist/dispatch/lib/config-loader.d.ts +42 -0
- package/dist/dispatch/lib/config-loader.d.ts.map +1 -0
- package/dist/dispatch/lib/config-loader.js +217 -0
- package/dist/dispatch/lib/config-loader.js.map +1 -0
- package/dist/dispatch/lib/config.d.ts +11 -0
- package/dist/dispatch/lib/config.d.ts.map +1 -0
- package/dist/dispatch/lib/config.js +10 -0
- package/dist/dispatch/lib/config.js.map +1 -0
- package/dist/dispatch/lib/defaults.d.ts +117 -0
- package/dist/dispatch/lib/defaults.d.ts.map +1 -0
- package/dist/dispatch/lib/defaults.js +58 -0
- package/dist/dispatch/lib/defaults.js.map +1 -0
- package/dist/dispatch/lib/engine.d.ts +26 -0
- package/dist/dispatch/lib/engine.d.ts.map +1 -0
- package/dist/dispatch/lib/engine.js +46 -0
- package/dist/dispatch/lib/engine.js.map +1 -0
- package/dist/dispatch/lib/gateway-meta.d.ts +37 -0
- package/dist/dispatch/lib/gateway-meta.d.ts.map +1 -0
- package/dist/dispatch/lib/gateway-meta.js +50 -0
- package/dist/dispatch/lib/gateway-meta.js.map +1 -0
- package/dist/dispatch/lib/job-manager-accessor.d.ts +9 -0
- package/dist/dispatch/lib/job-manager-accessor.d.ts.map +1 -0
- package/dist/dispatch/lib/job-manager-accessor.js +13 -0
- package/dist/dispatch/lib/job-manager-accessor.js.map +1 -0
- package/dist/dispatch/lib/meta.d.ts +26 -0
- package/dist/dispatch/lib/meta.d.ts.map +1 -0
- package/dist/dispatch/lib/meta.js +37 -0
- package/dist/dispatch/lib/meta.js.map +1 -0
- package/dist/dispatch/lib/param-utils.d.ts +11 -0
- package/dist/dispatch/lib/param-utils.d.ts.map +1 -0
- package/dist/dispatch/lib/param-utils.js +10 -0
- package/dist/dispatch/lib/param-utils.js.map +1 -0
- package/dist/dispatch/lib/projections.d.ts +56 -0
- package/dist/dispatch/lib/projections.d.ts.map +1 -0
- package/dist/dispatch/lib/projections.js +65 -0
- package/dist/dispatch/lib/projections.js.map +1 -0
- package/dist/dispatch/lib/schema-utils.d.ts +39 -0
- package/dist/dispatch/lib/schema-utils.d.ts.map +1 -0
- package/dist/dispatch/lib/schema-utils.js +88 -0
- package/dist/dispatch/lib/schema-utils.js.map +1 -0
- package/dist/dispatch/lib/security.d.ts +11 -0
- package/dist/dispatch/lib/security.d.ts.map +1 -0
- package/dist/dispatch/lib/security.js +10 -0
- package/dist/dispatch/lib/security.js.map +1 -0
- package/dist/dispatch/middleware/audit.d.ts +23 -0
- package/dist/dispatch/middleware/audit.d.ts.map +1 -0
- package/dist/dispatch/middleware/audit.js +169 -0
- package/dist/dispatch/middleware/audit.js.map +1 -0
- package/dist/dispatch/middleware/field-filter.d.ts +24 -0
- package/dist/dispatch/middleware/field-filter.d.ts.map +1 -0
- package/dist/dispatch/middleware/field-filter.js +65 -0
- package/dist/dispatch/middleware/field-filter.js.map +1 -0
- package/dist/dispatch/middleware/pipeline.d.ts +33 -0
- package/dist/dispatch/middleware/pipeline.d.ts.map +1 -0
- package/dist/dispatch/middleware/pipeline.js +60 -0
- package/dist/dispatch/middleware/pipeline.js.map +1 -0
- package/dist/dispatch/middleware/projection.d.ts +35 -0
- package/dist/dispatch/middleware/projection.d.ts.map +1 -0
- package/dist/dispatch/middleware/projection.js +146 -0
- package/dist/dispatch/middleware/projection.js.map +1 -0
- package/dist/dispatch/middleware/protocol-enforcement.d.ts +27 -0
- package/dist/dispatch/middleware/protocol-enforcement.d.ts.map +1 -0
- package/dist/dispatch/middleware/protocol-enforcement.js +45 -0
- package/dist/dispatch/middleware/protocol-enforcement.js.map +1 -0
- package/dist/dispatch/middleware/rate-limiter.d.ts +72 -0
- package/dist/dispatch/middleware/rate-limiter.d.ts.map +1 -0
- package/dist/dispatch/middleware/rate-limiter.js +127 -0
- package/dist/dispatch/middleware/rate-limiter.js.map +1 -0
- package/dist/dispatch/middleware/sanitizer.d.ts +24 -0
- package/dist/dispatch/middleware/sanitizer.d.ts.map +1 -0
- package/dist/dispatch/middleware/sanitizer.js +56 -0
- package/dist/dispatch/middleware/sanitizer.js.map +1 -0
- package/dist/dispatch/middleware/session-resolver.d.ts +26 -0
- package/dist/dispatch/middleware/session-resolver.d.ts.map +1 -0
- package/dist/dispatch/middleware/session-resolver.js +65 -0
- package/dist/dispatch/middleware/session-resolver.js.map +1 -0
- package/dist/dispatch/middleware/verification-gates.d.ts +22 -0
- package/dist/dispatch/middleware/verification-gates.d.ts.map +1 -0
- package/dist/dispatch/middleware/verification-gates.js +59 -0
- package/dist/dispatch/middleware/verification-gates.js.map +1 -0
- package/dist/dispatch/registry.d.ts +91 -0
- package/dist/dispatch/registry.d.ts.map +1 -0
- package/dist/dispatch/registry.js +3133 -0
- package/dist/dispatch/registry.js.map +1 -0
- package/dist/dispatch/types.d.ts +202 -0
- package/dist/dispatch/types.d.ts.map +1 -0
- package/dist/dispatch/types.js +26 -0
- package/dist/dispatch/types.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,1266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System Engine
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper layer that delegates to core modules.
|
|
5
|
+
* All business logic lives in src/core/.
|
|
6
|
+
*
|
|
7
|
+
* Read-only queries: dash, stats, labels, archive-stats, log, context, sequence,
|
|
8
|
+
* metrics, health, diagnostics, help, roadmap, compliance
|
|
9
|
+
* Mutate operations: inject.generate, backup, restore, migrate, cleanup, audit,
|
|
10
|
+
* sync, safestop, uncancel
|
|
11
|
+
*
|
|
12
|
+
* @task T4631
|
|
13
|
+
* @task T4783
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
16
|
+
import { basename, join } from 'node:path';
|
|
17
|
+
import { auditData, cleanupSystem, systemCreateBackup as createBackup, ensureCleoOsHub, generateInjection, getAccessor, getArchiveStats, getCleoCantWorkflowsDir, getCleoConfigDir, getCleoGlobalAgentsDir, getCleoGlobalJustfilePath, getCleoGlobalRecipesDir, getCleoHome, getCleoPiExtensionsDir, getDashboard, getLabels, getMigrationStatus, getProjectStats, getRoadmap, getRuntimeDiagnostics, getSystemDiagnostics, getSystemHealth, getSystemMetrics, listSystemBackups, repairSequence, restoreBackup, safestop, uncancelTask, } from '@cleocode/core/internal';
|
|
18
|
+
import { engineError } from './_error.js';
|
|
19
|
+
// ===== Help topics (static data, stays in engine) =====
|
|
20
|
+
const HELP_TOPICS = {
|
|
21
|
+
session: {
|
|
22
|
+
topic: 'session',
|
|
23
|
+
content: [
|
|
24
|
+
'Session Management',
|
|
25
|
+
'',
|
|
26
|
+
' cleosession list - List all sessions',
|
|
27
|
+
' cleosession start --scope epic:T001 - Start session',
|
|
28
|
+
' cleosession end --note "Progress" - End session',
|
|
29
|
+
' cleosession resume <id> - Resume session',
|
|
30
|
+
].join('\n'),
|
|
31
|
+
relatedCommands: ['cleo session list', 'cleo session start', 'cleo session end'],
|
|
32
|
+
},
|
|
33
|
+
tasks: {
|
|
34
|
+
topic: 'tasks',
|
|
35
|
+
content: [
|
|
36
|
+
'Task Operations',
|
|
37
|
+
'',
|
|
38
|
+
' cleoadd "Title" --desc "Description" - Create task',
|
|
39
|
+
' cleoupdate T1234 --status active - Update task',
|
|
40
|
+
' cleocomplete T1234 - Complete task',
|
|
41
|
+
' cleofind "query" - Search tasks',
|
|
42
|
+
' cleoshow T1234 - Show task details',
|
|
43
|
+
].join('\n'),
|
|
44
|
+
relatedCommands: ['cleo add', 'cleo update', 'cleo complete', 'cleo find', 'cleo show'],
|
|
45
|
+
},
|
|
46
|
+
focus: {
|
|
47
|
+
topic: 'focus',
|
|
48
|
+
content: [
|
|
49
|
+
'Task Work Management',
|
|
50
|
+
'',
|
|
51
|
+
' cleostart T1234 - Start working on task',
|
|
52
|
+
' cleocurrent - Show current task',
|
|
53
|
+
' cleostop - Stop working on current task',
|
|
54
|
+
].join('\n'),
|
|
55
|
+
relatedCommands: ['cleo start', 'cleo current', 'cleo stop'],
|
|
56
|
+
},
|
|
57
|
+
labels: {
|
|
58
|
+
topic: 'labels',
|
|
59
|
+
content: [
|
|
60
|
+
'Label Operations',
|
|
61
|
+
'',
|
|
62
|
+
' cleolabels - List all labels',
|
|
63
|
+
' cleolabels show <name> - Show tasks with label',
|
|
64
|
+
].join('\n'),
|
|
65
|
+
relatedCommands: ['cleo labels'],
|
|
66
|
+
},
|
|
67
|
+
compliance: {
|
|
68
|
+
topic: 'compliance',
|
|
69
|
+
content: [
|
|
70
|
+
'Compliance Monitoring',
|
|
71
|
+
'',
|
|
72
|
+
' cleocompliance summary - Compliance overview',
|
|
73
|
+
' cleocompliance violations - List violations',
|
|
74
|
+
' cleocompliance trend - Compliance trend',
|
|
75
|
+
].join('\n'),
|
|
76
|
+
relatedCommands: ['cleo compliance summary', 'cleo compliance violations'],
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
// ===== Dashboard =====
|
|
80
|
+
/**
|
|
81
|
+
* Project dashboard: task counts by status, active session info,
|
|
82
|
+
* current focus, recent completions.
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* This is the primary overview endpoint for the CLEO CLI `dash` command.
|
|
86
|
+
* It aggregates task counts, current session/focus state, high-priority tasks,
|
|
87
|
+
* blocked tasks, and recent completions into a single response.
|
|
88
|
+
*
|
|
89
|
+
* @param projectRoot - Absolute path to the project root
|
|
90
|
+
* @param params - Optional parameters to control blocked tasks display limit
|
|
91
|
+
* @returns EngineResult with comprehensive dashboard data
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const result = await systemDash('/project', { blockedTasksLimit: 5 });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export async function systemDash(projectRoot, params) {
|
|
99
|
+
try {
|
|
100
|
+
const accessor = await getAccessor(projectRoot);
|
|
101
|
+
const result = await getDashboard({ cwd: projectRoot, blockedTasksLimit: params?.blockedTasksLimit }, accessor);
|
|
102
|
+
// Add missing fields that core doesn't produce
|
|
103
|
+
const data = result;
|
|
104
|
+
const summary = data.summary;
|
|
105
|
+
return {
|
|
106
|
+
success: true,
|
|
107
|
+
data: {
|
|
108
|
+
project: data.project,
|
|
109
|
+
currentPhase: data.currentPhase,
|
|
110
|
+
summary: {
|
|
111
|
+
pending: summary.pending,
|
|
112
|
+
active: summary.active,
|
|
113
|
+
blocked: summary.blocked,
|
|
114
|
+
done: summary.done,
|
|
115
|
+
cancelled: summary.cancelled ?? 0,
|
|
116
|
+
total: summary.total,
|
|
117
|
+
archived: summary.archived ?? 0,
|
|
118
|
+
grandTotal: summary.grandTotal ?? summary.total,
|
|
119
|
+
},
|
|
120
|
+
taskWork: (data.focus ?? data.taskWork),
|
|
121
|
+
activeSession: data.activeSession ?? null,
|
|
122
|
+
highPriority: data.highPriority,
|
|
123
|
+
blockedTasks: data.blockedTasks,
|
|
124
|
+
recentCompletions: (data.recentCompletions ?? []),
|
|
125
|
+
topLabels: data.topLabels,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
return engineError('E_NOT_INITIALIZED', err.message);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ===== Stats =====
|
|
134
|
+
/**
|
|
135
|
+
* Detailed statistics: tasks by status/priority/type/phase,
|
|
136
|
+
* completion rate, average cycle time.
|
|
137
|
+
*/
|
|
138
|
+
export async function systemStats(projectRoot, params) {
|
|
139
|
+
try {
|
|
140
|
+
const accessor = await getAccessor(projectRoot);
|
|
141
|
+
const result = await getProjectStats({ period: String(params?.period ?? 30), cwd: projectRoot }, accessor);
|
|
142
|
+
// Core stats lacks byPriority, byType, byPhase, cycleTimes — fill from accessor
|
|
143
|
+
const queryResult = await accessor.queryTasks({});
|
|
144
|
+
const tasks = queryResult?.tasks ?? [];
|
|
145
|
+
// Distribution breakdowns: active tasks only (exclude cancelled — not actionable work)
|
|
146
|
+
const activeTasks = tasks.filter((t) => t.status !== 'cancelled');
|
|
147
|
+
const byPriority = {};
|
|
148
|
+
for (const t of activeTasks) {
|
|
149
|
+
byPriority[t.priority] = (byPriority[t.priority] ?? 0) + 1;
|
|
150
|
+
}
|
|
151
|
+
const byType = {};
|
|
152
|
+
for (const t of activeTasks) {
|
|
153
|
+
const type = t.type || 'task';
|
|
154
|
+
byType[type] = (byType[type] ?? 0) + 1;
|
|
155
|
+
}
|
|
156
|
+
const byPhase = {};
|
|
157
|
+
for (const t of activeTasks) {
|
|
158
|
+
const phase = t.phase || 'unassigned';
|
|
159
|
+
byPhase[phase] = (byPhase[phase] ?? 0) + 1;
|
|
160
|
+
}
|
|
161
|
+
// Cycle times
|
|
162
|
+
const completedTasks = tasks.filter((t) => t.status === 'done' && t.completedAt && t.createdAt);
|
|
163
|
+
let totalCycleDays = 0;
|
|
164
|
+
let samples = 0;
|
|
165
|
+
for (const t of completedTasks) {
|
|
166
|
+
const created = new Date(t.createdAt).getTime();
|
|
167
|
+
const completed = new Date(t.completedAt).getTime();
|
|
168
|
+
if (completed > created) {
|
|
169
|
+
totalCycleDays += (completed - created) / 86400000;
|
|
170
|
+
samples++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const averageDays = samples > 0 ? Math.round((totalCycleDays / samples) * 100) / 100 : null;
|
|
174
|
+
const coreData = result;
|
|
175
|
+
const currentState = coreData.currentState;
|
|
176
|
+
const completionMetrics = coreData.completionMetrics;
|
|
177
|
+
const activityMetrics = coreData.activityMetrics;
|
|
178
|
+
const allTime = coreData.allTime;
|
|
179
|
+
return {
|
|
180
|
+
success: true,
|
|
181
|
+
data: {
|
|
182
|
+
currentState: {
|
|
183
|
+
pending: currentState.pending,
|
|
184
|
+
active: currentState.active,
|
|
185
|
+
done: currentState.done,
|
|
186
|
+
blocked: currentState.blocked,
|
|
187
|
+
cancelled: tasks.filter((t) => t.status === 'cancelled').length,
|
|
188
|
+
totalActive: currentState.totalActive,
|
|
189
|
+
archived: currentState.archived ?? 0,
|
|
190
|
+
grandTotal: currentState.grandTotal ?? currentState.totalActive,
|
|
191
|
+
},
|
|
192
|
+
byPriority,
|
|
193
|
+
byType,
|
|
194
|
+
byPhase,
|
|
195
|
+
completionMetrics: completionMetrics,
|
|
196
|
+
activityMetrics: activityMetrics,
|
|
197
|
+
allTime: allTime,
|
|
198
|
+
cycleTimes: { averageDays, samples },
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
return engineError('E_NOT_INITIALIZED', err.message);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ===== Labels =====
|
|
207
|
+
/**
|
|
208
|
+
* List all unique labels across tasks with counts and task IDs per label.
|
|
209
|
+
*/
|
|
210
|
+
export async function systemLabels(projectRoot) {
|
|
211
|
+
try {
|
|
212
|
+
const accessor = await getAccessor(projectRoot);
|
|
213
|
+
const result = await getLabels(projectRoot, accessor);
|
|
214
|
+
return { success: true, data: result };
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return engineError('E_NOT_INITIALIZED', err.message);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ===== Archive Stats =====
|
|
221
|
+
/**
|
|
222
|
+
* Archive metrics: total archived, by reason, average cycle time, archive rate.
|
|
223
|
+
*/
|
|
224
|
+
export async function systemArchiveStats(projectRoot, params) {
|
|
225
|
+
try {
|
|
226
|
+
const accessor = await getAccessor(projectRoot);
|
|
227
|
+
const result = await getArchiveStats({ period: params?.period, cwd: projectRoot }, accessor);
|
|
228
|
+
return { success: true, data: result };
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
return engineError('E_NOT_INITIALIZED', err.message);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ===== Log =====
|
|
235
|
+
/**
|
|
236
|
+
* Query audit log with optional filters.
|
|
237
|
+
* Reads from SQLite audit_log table.
|
|
238
|
+
*
|
|
239
|
+
* @task T4837
|
|
240
|
+
*/
|
|
241
|
+
export async function systemLog(projectRoot, filters) {
|
|
242
|
+
try {
|
|
243
|
+
// Canonical path: SQLite audit_log table.
|
|
244
|
+
const entries = await queryAuditLogSqlite(projectRoot, filters);
|
|
245
|
+
return { success: true, data: entries };
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
return engineError('E_FILE_ERROR', err.message);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Query audit_log from SQLite.
|
|
253
|
+
* Includes dispatch-level fields (domain, requestId, durationMs, success,
|
|
254
|
+
* source, gateway, errorMessage) when present (T4844).
|
|
255
|
+
*
|
|
256
|
+
* @task T4837
|
|
257
|
+
* @task T4844
|
|
258
|
+
*/
|
|
259
|
+
async function queryAuditLogSqlite(projectRoot, filters) {
|
|
260
|
+
try {
|
|
261
|
+
const { join } = await import('node:path');
|
|
262
|
+
const { existsSync } = await import('node:fs');
|
|
263
|
+
const dbPath = join(projectRoot, '.cleo', 'tasks.db');
|
|
264
|
+
if (!existsSync(dbPath)) {
|
|
265
|
+
const offset = filters?.offset ?? 0;
|
|
266
|
+
const limit = filters?.limit ?? 20;
|
|
267
|
+
return {
|
|
268
|
+
entries: [],
|
|
269
|
+
pagination: { total: 0, offset, limit, hasMore: false },
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
const { getDb } = await import('@cleocode/core/internal');
|
|
273
|
+
const { auditLog } = await import('@cleocode/core/internal');
|
|
274
|
+
const { sql } = await import('drizzle-orm');
|
|
275
|
+
const db = await getDb(projectRoot);
|
|
276
|
+
// Check if audit_log table exists and has data
|
|
277
|
+
try {
|
|
278
|
+
// Build dynamic WHERE conditions
|
|
279
|
+
const conditions = [];
|
|
280
|
+
if (filters?.operation) {
|
|
281
|
+
// Match against both legacy 'action' column and new 'operation' column
|
|
282
|
+
conditions.push(sql `(${auditLog.action} = ${filters.operation} OR ${auditLog.operation} = ${filters.operation})`);
|
|
283
|
+
}
|
|
284
|
+
if (filters?.taskId) {
|
|
285
|
+
conditions.push(sql `${auditLog.taskId} = ${filters.taskId}`);
|
|
286
|
+
}
|
|
287
|
+
if (filters?.since) {
|
|
288
|
+
conditions.push(sql `${auditLog.timestamp} >= ${filters.since}`);
|
|
289
|
+
}
|
|
290
|
+
if (filters?.until) {
|
|
291
|
+
conditions.push(sql `${auditLog.timestamp} <= ${filters.until}`);
|
|
292
|
+
}
|
|
293
|
+
const whereClause = conditions.length > 0 ? sql.join(conditions, sql ` AND `) : sql `1=1`;
|
|
294
|
+
// Count total matching entries
|
|
295
|
+
const countResult = await db.all(sql `SELECT count(*) as cnt FROM ${auditLog} WHERE ${whereClause}`);
|
|
296
|
+
const total = countResult[0]?.cnt ?? 0;
|
|
297
|
+
if (total === 0) {
|
|
298
|
+
return {
|
|
299
|
+
entries: [],
|
|
300
|
+
pagination: {
|
|
301
|
+
total: 0,
|
|
302
|
+
offset: filters?.offset ?? 0,
|
|
303
|
+
limit: filters?.limit ?? 20,
|
|
304
|
+
hasMore: false,
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const offset = filters?.offset ?? 0;
|
|
309
|
+
const limit = filters?.limit ?? 20;
|
|
310
|
+
// Fetch paginated results (includes dispatch-level columns)
|
|
311
|
+
const rows = await db.all(sql `SELECT * FROM ${auditLog}
|
|
312
|
+
WHERE ${whereClause}
|
|
313
|
+
ORDER BY ${auditLog.timestamp} DESC
|
|
314
|
+
LIMIT ${limit} OFFSET ${offset}`);
|
|
315
|
+
const entries = rows.map((row) => ({
|
|
316
|
+
operation: row.operation ?? row.action,
|
|
317
|
+
taskId: row.task_id,
|
|
318
|
+
timestamp: row.timestamp,
|
|
319
|
+
actor: row.actor,
|
|
320
|
+
details: row.details_json ? JSON.parse(row.details_json) : {},
|
|
321
|
+
before: row.before_json ? JSON.parse(row.before_json) : undefined,
|
|
322
|
+
after: row.after_json ? JSON.parse(row.after_json) : undefined,
|
|
323
|
+
// Dispatch-level fields (may be null for legacy task-only entries)
|
|
324
|
+
...(row.domain != null && {
|
|
325
|
+
domain: row.domain,
|
|
326
|
+
sessionId: row.session_id,
|
|
327
|
+
requestId: row.request_id,
|
|
328
|
+
durationMs: row.duration_ms,
|
|
329
|
+
success: row.success === 1,
|
|
330
|
+
source: row.source,
|
|
331
|
+
gateway: row.gateway,
|
|
332
|
+
error: row.error_message,
|
|
333
|
+
}),
|
|
334
|
+
}));
|
|
335
|
+
return {
|
|
336
|
+
entries,
|
|
337
|
+
pagination: { total, offset, limit, hasMore: offset + limit < total },
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
const offset = filters?.offset ?? 0;
|
|
342
|
+
const limit = filters?.limit ?? 20;
|
|
343
|
+
return {
|
|
344
|
+
entries: [],
|
|
345
|
+
pagination: { total: 0, offset, limit, hasMore: false },
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
const offset = filters?.offset ?? 0;
|
|
351
|
+
const limit = filters?.limit ?? 20;
|
|
352
|
+
return {
|
|
353
|
+
entries: [],
|
|
354
|
+
pagination: { total: 0, offset, limit, hasMore: false },
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// ===== Context =====
|
|
359
|
+
/**
|
|
360
|
+
* Context window tracking: estimate token usage from current session/state.
|
|
361
|
+
*/
|
|
362
|
+
export function systemContext(projectRoot, params) {
|
|
363
|
+
try {
|
|
364
|
+
const cleoDir = join(projectRoot, '.cleo');
|
|
365
|
+
// Resolve state file
|
|
366
|
+
let stateFile;
|
|
367
|
+
if (params?.session) {
|
|
368
|
+
const sessionFile = join(cleoDir, 'context-states', `context-state-${params.session}.json`);
|
|
369
|
+
stateFile = existsSync(sessionFile) ? sessionFile : join(cleoDir, '.context-state.json');
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const currentSessionPath = join(cleoDir, '.current-session');
|
|
373
|
+
if (existsSync(currentSessionPath)) {
|
|
374
|
+
const currentSession = readFileSync(currentSessionPath, 'utf-8').trim();
|
|
375
|
+
if (currentSession) {
|
|
376
|
+
const sessionFile = join(cleoDir, 'context-states', `context-state-${currentSession}.json`);
|
|
377
|
+
stateFile = existsSync(sessionFile) ? sessionFile : join(cleoDir, '.context-state.json');
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
stateFile = join(cleoDir, '.context-state.json');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
stateFile = join(cleoDir, '.context-state.json');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Collect session files
|
|
388
|
+
const sessions = [];
|
|
389
|
+
const statesDir = join(cleoDir, 'context-states');
|
|
390
|
+
if (existsSync(statesDir)) {
|
|
391
|
+
for (const file of readdirSync(statesDir)) {
|
|
392
|
+
if (file.startsWith('context-state-') && file.endsWith('.json')) {
|
|
393
|
+
try {
|
|
394
|
+
const state = JSON.parse(readFileSync(join(statesDir, file), 'utf-8'));
|
|
395
|
+
sessions.push({
|
|
396
|
+
file: basename(file),
|
|
397
|
+
sessionId: state.sessionId ?? null,
|
|
398
|
+
percentage: state.contextWindow?.percentage ?? 0,
|
|
399
|
+
status: state.status ?? 'unknown',
|
|
400
|
+
timestamp: state.timestamp,
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// skip invalid files
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const singletonFile = join(cleoDir, '.context-state.json');
|
|
410
|
+
if (existsSync(singletonFile)) {
|
|
411
|
+
try {
|
|
412
|
+
const state = JSON.parse(readFileSync(singletonFile, 'utf-8'));
|
|
413
|
+
sessions.push({
|
|
414
|
+
file: '.context-state.json',
|
|
415
|
+
sessionId: state.sessionId ?? 'global',
|
|
416
|
+
percentage: state.contextWindow?.percentage ?? 0,
|
|
417
|
+
status: state.status ?? 'unknown',
|
|
418
|
+
timestamp: state.timestamp,
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
// skip
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (!existsSync(stateFile)) {
|
|
426
|
+
return {
|
|
427
|
+
success: true,
|
|
428
|
+
data: {
|
|
429
|
+
available: false,
|
|
430
|
+
status: 'unavailable',
|
|
431
|
+
percentage: 0,
|
|
432
|
+
currentTokens: 0,
|
|
433
|
+
maxTokens: 0,
|
|
434
|
+
timestamp: null,
|
|
435
|
+
stale: true,
|
|
436
|
+
sessions,
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
const state = JSON.parse(readFileSync(stateFile, 'utf-8'));
|
|
442
|
+
const timestamp = state.timestamp;
|
|
443
|
+
const staleMs = state.staleAfterMs ?? 5000;
|
|
444
|
+
const percentage = state.contextWindow?.percentage ?? 0;
|
|
445
|
+
const current = state.contextWindow?.currentTokens ?? 0;
|
|
446
|
+
const max = state.contextWindow?.maxTokens ?? 0;
|
|
447
|
+
let status = state.status ?? 'unknown';
|
|
448
|
+
const fileTime = new Date(timestamp).getTime();
|
|
449
|
+
if (Date.now() - fileTime > staleMs) {
|
|
450
|
+
status = 'stale';
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
success: true,
|
|
454
|
+
data: {
|
|
455
|
+
available: true,
|
|
456
|
+
status,
|
|
457
|
+
percentage,
|
|
458
|
+
currentTokens: current,
|
|
459
|
+
maxTokens: max,
|
|
460
|
+
timestamp,
|
|
461
|
+
stale: status === 'stale',
|
|
462
|
+
sessions,
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
catch {
|
|
467
|
+
return {
|
|
468
|
+
success: true,
|
|
469
|
+
data: {
|
|
470
|
+
available: false,
|
|
471
|
+
status: 'error',
|
|
472
|
+
percentage: 0,
|
|
473
|
+
currentTokens: 0,
|
|
474
|
+
maxTokens: 0,
|
|
475
|
+
timestamp: null,
|
|
476
|
+
stale: true,
|
|
477
|
+
sessions,
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
return engineError('E_GENERAL', err.message);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// ===== Sequence =====
|
|
487
|
+
/**
|
|
488
|
+
* Read task ID sequence state from canonical SQLite metadata.
|
|
489
|
+
* Supports 'show' and 'check' actions.
|
|
490
|
+
* @task T4815
|
|
491
|
+
*/
|
|
492
|
+
export async function systemSequence(projectRoot, params) {
|
|
493
|
+
const { showSequence, checkSequence } = await import('@cleocode/core/internal');
|
|
494
|
+
try {
|
|
495
|
+
const action = params?.action ?? 'show';
|
|
496
|
+
if (action === 'check') {
|
|
497
|
+
const check = await checkSequence(projectRoot);
|
|
498
|
+
return { success: true, data: check };
|
|
499
|
+
}
|
|
500
|
+
const seq = await showSequence(projectRoot);
|
|
501
|
+
return {
|
|
502
|
+
success: true,
|
|
503
|
+
data: {
|
|
504
|
+
counter: Number(seq.counter ?? 0),
|
|
505
|
+
lastId: String(seq.lastId ?? ''),
|
|
506
|
+
checksum: String(seq.checksum ?? ''),
|
|
507
|
+
nextId: String(seq.nextId ?? ''),
|
|
508
|
+
},
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
return engineError('E_NOT_FOUND', err.message);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// ===== Inject Generate (MVI) =====
|
|
516
|
+
/**
|
|
517
|
+
* Generate Minimum Viable Injection (MVI).
|
|
518
|
+
*/
|
|
519
|
+
export async function systemInjectGenerate(projectRoot) {
|
|
520
|
+
try {
|
|
521
|
+
const root = projectRoot || process.cwd();
|
|
522
|
+
const accessor = await getAccessor(root);
|
|
523
|
+
const result = await generateInjection(root, accessor);
|
|
524
|
+
return { success: true, data: result };
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
return engineError('E_GENERAL', err.message);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
// ===== Metrics =====
|
|
531
|
+
/**
|
|
532
|
+
* System metrics: token usage, compliance summary, session counts.
|
|
533
|
+
* @task T4631
|
|
534
|
+
*/
|
|
535
|
+
export async function systemMetrics(projectRoot, params) {
|
|
536
|
+
try {
|
|
537
|
+
const accessor = await getAccessor(projectRoot);
|
|
538
|
+
const result = await getSystemMetrics(projectRoot, params, accessor);
|
|
539
|
+
return { success: true, data: result };
|
|
540
|
+
}
|
|
541
|
+
catch (err) {
|
|
542
|
+
return engineError('E_GENERAL', err.message);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
// ===== Health =====
|
|
546
|
+
/**
|
|
547
|
+
* System health check: verify core data files exist and are valid.
|
|
548
|
+
* @task T4631
|
|
549
|
+
*/
|
|
550
|
+
export async function systemHealth(projectRoot, params) {
|
|
551
|
+
try {
|
|
552
|
+
const result = await getSystemHealth(projectRoot, params);
|
|
553
|
+
return { success: true, data: result };
|
|
554
|
+
}
|
|
555
|
+
catch (err) {
|
|
556
|
+
return engineError('E_GENERAL', err.message);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// ===== Diagnostics =====
|
|
560
|
+
/**
|
|
561
|
+
* System diagnostics: extended health checks with fix suggestions.
|
|
562
|
+
* @task T4631
|
|
563
|
+
*/
|
|
564
|
+
export async function systemDiagnostics(projectRoot, params) {
|
|
565
|
+
try {
|
|
566
|
+
const result = await getSystemDiagnostics(projectRoot, params);
|
|
567
|
+
return { success: true, data: result };
|
|
568
|
+
}
|
|
569
|
+
catch (err) {
|
|
570
|
+
return engineError('E_GENERAL', err.message);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
// ===== Help =====
|
|
574
|
+
/**
|
|
575
|
+
* Return help text for the system.
|
|
576
|
+
* @task T4631
|
|
577
|
+
*/
|
|
578
|
+
export function systemHelp(_projectRoot, params) {
|
|
579
|
+
const topic = params?.topic;
|
|
580
|
+
if (topic) {
|
|
581
|
+
const topicHelp = HELP_TOPICS[topic];
|
|
582
|
+
if (topicHelp) {
|
|
583
|
+
return { success: true, data: topicHelp };
|
|
584
|
+
}
|
|
585
|
+
return engineError('E_NOT_FOUND', `Unknown help topic: ${topic}. Available topics: ${Object.keys(HELP_TOPICS).join(', ')}`);
|
|
586
|
+
}
|
|
587
|
+
return {
|
|
588
|
+
success: true,
|
|
589
|
+
data: {
|
|
590
|
+
content: [
|
|
591
|
+
'CLEO Task Management System',
|
|
592
|
+
'',
|
|
593
|
+
'Essential Commands:',
|
|
594
|
+
' cleofind "query" - Fuzzy search tasks',
|
|
595
|
+
' cleoshow T1234 - Full task details',
|
|
596
|
+
' cleoadd "Task" - Create task',
|
|
597
|
+
' cleodone <id> - Complete task',
|
|
598
|
+
' cleostart <id> - Start working on task',
|
|
599
|
+
' cleodash - Project overview',
|
|
600
|
+
' cleosession list - List sessions',
|
|
601
|
+
'',
|
|
602
|
+
'Help Topics: session, tasks, focus, labels, compliance',
|
|
603
|
+
].join('\n'),
|
|
604
|
+
relatedCommands: ['cleo find', 'cleo show', 'cleo add', 'cleo done', 'cleo dash'],
|
|
605
|
+
},
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
// ===== Roadmap =====
|
|
609
|
+
/**
|
|
610
|
+
* Generate roadmap from pending epics and optional CHANGELOG history.
|
|
611
|
+
* @task T4631
|
|
612
|
+
*/
|
|
613
|
+
export async function systemRoadmap(projectRoot, params) {
|
|
614
|
+
try {
|
|
615
|
+
const accessor = await getAccessor(projectRoot);
|
|
616
|
+
const result = await getRoadmap({
|
|
617
|
+
includeHistory: params?.includeHistory,
|
|
618
|
+
upcomingOnly: params?.upcomingOnly,
|
|
619
|
+
cwd: projectRoot,
|
|
620
|
+
}, accessor);
|
|
621
|
+
return { success: true, data: result };
|
|
622
|
+
}
|
|
623
|
+
catch (err) {
|
|
624
|
+
return engineError('E_NOT_INITIALIZED', err.message);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
// ===== Compliance =====
|
|
628
|
+
/**
|
|
629
|
+
* System compliance report from COMPLIANCE.jsonl.
|
|
630
|
+
* @task T4631
|
|
631
|
+
*/
|
|
632
|
+
export function systemCompliance(projectRoot, params) {
|
|
633
|
+
try {
|
|
634
|
+
if (params?.subcommand === 'trend') {
|
|
635
|
+
const compliancePath = join(projectRoot, '.cleo', 'metrics', 'COMPLIANCE.jsonl');
|
|
636
|
+
let entries = [];
|
|
637
|
+
if (existsSync(compliancePath)) {
|
|
638
|
+
const content = readFileSync(compliancePath, 'utf-8').trim();
|
|
639
|
+
if (content) {
|
|
640
|
+
entries = content
|
|
641
|
+
.split('\n')
|
|
642
|
+
.filter((l) => l.trim())
|
|
643
|
+
.map((l) => JSON.parse(l));
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
if (params.epic) {
|
|
647
|
+
entries = entries.filter((e) => {
|
|
648
|
+
const ctx = (e._context ?? {});
|
|
649
|
+
return ctx.epic_id === params.epic || ctx.task_id === params.epic;
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
if (params.days) {
|
|
653
|
+
const cutoff = new Date(Date.now() - params.days * 86400000).toISOString();
|
|
654
|
+
entries = entries.filter((e) => e.timestamp >= cutoff);
|
|
655
|
+
}
|
|
656
|
+
const totalEntries = entries.length;
|
|
657
|
+
const compliance = entries.map((e) => (e.compliance ?? {}));
|
|
658
|
+
const avgPassRate = totalEntries > 0
|
|
659
|
+
? Math.round((compliance.reduce((sum, c) => sum + (c.compliance_pass_rate ?? 0), 0) /
|
|
660
|
+
totalEntries) *
|
|
661
|
+
1000) / 1000
|
|
662
|
+
: 0;
|
|
663
|
+
const avgAdherence = totalEntries > 0
|
|
664
|
+
? Math.round((compliance.reduce((sum, c) => sum + (c.rule_adherence_score ?? 0), 0) /
|
|
665
|
+
totalEntries) *
|
|
666
|
+
1000) / 1000
|
|
667
|
+
: 0;
|
|
668
|
+
const totalViolations = compliance.reduce((sum, c) => sum + (c.violation_count ?? 0), 0);
|
|
669
|
+
const byDate = {};
|
|
670
|
+
for (const e of entries) {
|
|
671
|
+
const date = e.timestamp.split('T')[0];
|
|
672
|
+
if (!byDate[date])
|
|
673
|
+
byDate[date] = [];
|
|
674
|
+
byDate[date].push(e);
|
|
675
|
+
}
|
|
676
|
+
const dataPoints = Object.entries(byDate)
|
|
677
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
678
|
+
.map(([date, dayEntries]) => {
|
|
679
|
+
const dayCompliance = dayEntries.map((de) => (de.compliance ?? {}));
|
|
680
|
+
return {
|
|
681
|
+
date,
|
|
682
|
+
entries: dayEntries.length,
|
|
683
|
+
avgPassRate: dayCompliance.reduce((s, c) => s + (c.compliance_pass_rate ?? 0), 0) /
|
|
684
|
+
dayEntries.length,
|
|
685
|
+
violations: dayCompliance.reduce((s, c) => s + (c.violation_count ?? 0), 0),
|
|
686
|
+
};
|
|
687
|
+
});
|
|
688
|
+
let trend;
|
|
689
|
+
if (dataPoints.length >= 2) {
|
|
690
|
+
const first = dataPoints[0].avgPassRate;
|
|
691
|
+
const last = dataPoints[dataPoints.length - 1].avgPassRate;
|
|
692
|
+
trend = last > first ? 'improving' : last < first ? 'declining' : 'stable';
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
trend = 'insufficient_data';
|
|
696
|
+
}
|
|
697
|
+
return {
|
|
698
|
+
success: true,
|
|
699
|
+
data: {
|
|
700
|
+
totalEntries,
|
|
701
|
+
averagePassRate: avgPassRate,
|
|
702
|
+
averageAdherence: avgAdherence,
|
|
703
|
+
totalViolations,
|
|
704
|
+
trend,
|
|
705
|
+
dataPoints,
|
|
706
|
+
},
|
|
707
|
+
};
|
|
708
|
+
}
|
|
709
|
+
// Default: summary (possibly filtered by epic/days)
|
|
710
|
+
const compliancePath = join(projectRoot, '.cleo', 'metrics', 'COMPLIANCE.jsonl');
|
|
711
|
+
let entries = [];
|
|
712
|
+
if (existsSync(compliancePath)) {
|
|
713
|
+
const content = readFileSync(compliancePath, 'utf-8').trim();
|
|
714
|
+
if (content) {
|
|
715
|
+
entries = content
|
|
716
|
+
.split('\n')
|
|
717
|
+
.filter((l) => l.trim())
|
|
718
|
+
.map((l) => JSON.parse(l));
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
if (params?.epic) {
|
|
722
|
+
entries = entries.filter((e) => {
|
|
723
|
+
const ctx = (e._context ?? {});
|
|
724
|
+
return ctx.epic_id === params.epic || ctx.task_id === params.epic;
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
if (params?.days) {
|
|
728
|
+
const cutoff = new Date(Date.now() - params.days * 86400000).toISOString();
|
|
729
|
+
entries = entries.filter((e) => e.timestamp >= cutoff);
|
|
730
|
+
}
|
|
731
|
+
const totalEntries = entries.length;
|
|
732
|
+
const compliance = entries.map((e) => (e.compliance ?? {}));
|
|
733
|
+
const avgPassRate = totalEntries > 0
|
|
734
|
+
? Math.round((compliance.reduce((sum, c) => sum + (c.compliance_pass_rate ?? 0), 0) /
|
|
735
|
+
totalEntries) *
|
|
736
|
+
1000) / 1000
|
|
737
|
+
: 0;
|
|
738
|
+
const avgAdherence = totalEntries > 0
|
|
739
|
+
? Math.round((compliance.reduce((sum, c) => sum + (c.rule_adherence_score ?? 0), 0) /
|
|
740
|
+
totalEntries) *
|
|
741
|
+
1000) / 1000
|
|
742
|
+
: 0;
|
|
743
|
+
const totalViolations = compliance.reduce((sum, c) => sum + (c.violation_count ?? 0), 0);
|
|
744
|
+
return {
|
|
745
|
+
success: true,
|
|
746
|
+
data: {
|
|
747
|
+
totalEntries,
|
|
748
|
+
averagePassRate: avgPassRate,
|
|
749
|
+
averageAdherence: avgAdherence,
|
|
750
|
+
totalViolations,
|
|
751
|
+
},
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
catch (err) {
|
|
755
|
+
return engineError('E_GENERAL', err.message);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
// ===== Backup =====
|
|
759
|
+
/**
|
|
760
|
+
* Create a backup of CLEO data files.
|
|
761
|
+
*
|
|
762
|
+
* Async because `createBackup` (T5158) now opens tasks.db + brain.db via
|
|
763
|
+
* their drizzle accessors before snapshotting so both databases are
|
|
764
|
+
* captured even when the current CLI command path hasn't already opened
|
|
765
|
+
* them (e.g. `cleo backup add` in a fresh process).
|
|
766
|
+
*
|
|
767
|
+
* @task T4631
|
|
768
|
+
* @task T5158
|
|
769
|
+
*/
|
|
770
|
+
export async function systemBackup(projectRoot, params) {
|
|
771
|
+
try {
|
|
772
|
+
const result = await createBackup(projectRoot, params);
|
|
773
|
+
return { success: true, data: result };
|
|
774
|
+
}
|
|
775
|
+
catch (err) {
|
|
776
|
+
return engineError('E_GENERAL', err.message);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
/**
|
|
780
|
+
* List available system backups (read-only).
|
|
781
|
+
* @task T4783
|
|
782
|
+
*/
|
|
783
|
+
export function systemListBackups(projectRoot) {
|
|
784
|
+
try {
|
|
785
|
+
const result = listSystemBackups(projectRoot);
|
|
786
|
+
return { success: true, data: result };
|
|
787
|
+
}
|
|
788
|
+
catch (err) {
|
|
789
|
+
return engineError('E_GENERAL', err.message);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
// ===== Restore =====
|
|
793
|
+
/**
|
|
794
|
+
* Restore from a backup.
|
|
795
|
+
* @task T4631
|
|
796
|
+
*/
|
|
797
|
+
export function systemRestore(projectRoot, params) {
|
|
798
|
+
try {
|
|
799
|
+
const result = restoreBackup(projectRoot, params);
|
|
800
|
+
return { success: true, data: result };
|
|
801
|
+
}
|
|
802
|
+
catch (err) {
|
|
803
|
+
const code = err.code ?? 'E_RESTORE_FAILED';
|
|
804
|
+
return engineError(code, err.message);
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
/**
|
|
808
|
+
* Restore an individual file from backup.
|
|
809
|
+
* @task T5329
|
|
810
|
+
*/
|
|
811
|
+
export async function backupRestore(projectRoot, fileName, options) {
|
|
812
|
+
try {
|
|
813
|
+
const { getBackupDir, getTaskPath, getConfigPath } = await import('@cleocode/core/internal');
|
|
814
|
+
const { restoreFromBackup, listBackups } = await import('@cleocode/core/internal');
|
|
815
|
+
const backupDir = getBackupDir(projectRoot);
|
|
816
|
+
const targetPathMap = {
|
|
817
|
+
'tasks.db': getTaskPath,
|
|
818
|
+
'config.json': getConfigPath,
|
|
819
|
+
};
|
|
820
|
+
const pathGetter = targetPathMap[fileName];
|
|
821
|
+
if (!pathGetter) {
|
|
822
|
+
return engineError('E_INVALID_INPUT', `Unknown file: ${fileName}. Valid files: tasks.db, config.json`);
|
|
823
|
+
}
|
|
824
|
+
const targetPath = pathGetter();
|
|
825
|
+
const backups = await listBackups(fileName, backupDir);
|
|
826
|
+
if (backups.length === 0) {
|
|
827
|
+
return engineError('E_NOT_FOUND', `No backups found for ${fileName}`);
|
|
828
|
+
}
|
|
829
|
+
if (options?.dryRun) {
|
|
830
|
+
return {
|
|
831
|
+
success: true,
|
|
832
|
+
data: {
|
|
833
|
+
restored: false,
|
|
834
|
+
file: fileName,
|
|
835
|
+
from: backups[0],
|
|
836
|
+
targetPath,
|
|
837
|
+
dryRun: true,
|
|
838
|
+
},
|
|
839
|
+
};
|
|
840
|
+
}
|
|
841
|
+
const restoredFrom = await restoreFromBackup(fileName, backupDir, targetPath);
|
|
842
|
+
return {
|
|
843
|
+
success: true,
|
|
844
|
+
data: {
|
|
845
|
+
restored: true,
|
|
846
|
+
file: fileName,
|
|
847
|
+
from: restoredFrom,
|
|
848
|
+
targetPath,
|
|
849
|
+
},
|
|
850
|
+
};
|
|
851
|
+
}
|
|
852
|
+
catch (err) {
|
|
853
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
854
|
+
if (message.includes('not found') || message.includes('No backups')) {
|
|
855
|
+
return engineError('E_NOT_FOUND', message);
|
|
856
|
+
}
|
|
857
|
+
return engineError('E_GENERAL', `Backup restore failed: ${message}`);
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
// ===== Migrate =====
|
|
861
|
+
/**
|
|
862
|
+
* Check/run schema migrations.
|
|
863
|
+
* @task T4631
|
|
864
|
+
*/
|
|
865
|
+
export async function systemMigrate(projectRoot, params) {
|
|
866
|
+
try {
|
|
867
|
+
const result = await getMigrationStatus(projectRoot, params);
|
|
868
|
+
return { success: true, data: result };
|
|
869
|
+
}
|
|
870
|
+
catch (err) {
|
|
871
|
+
const code = err.code ?? 'E_MIGRATE_FAILED';
|
|
872
|
+
return engineError(code, err.message);
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
// ===== Cleanup =====
|
|
876
|
+
/**
|
|
877
|
+
* Cleanup stale data (sessions, backups, logs).
|
|
878
|
+
* @task T4631
|
|
879
|
+
*/
|
|
880
|
+
export async function systemCleanup(projectRoot, params) {
|
|
881
|
+
try {
|
|
882
|
+
const result = await cleanupSystem(projectRoot, params);
|
|
883
|
+
return { success: true, data: result };
|
|
884
|
+
}
|
|
885
|
+
catch (err) {
|
|
886
|
+
const code = err.code ?? 'E_CLEANUP_FAILED';
|
|
887
|
+
return engineError(code, err.message);
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
// ===== Audit =====
|
|
891
|
+
/**
|
|
892
|
+
* Audit data integrity.
|
|
893
|
+
* @task T4631
|
|
894
|
+
*/
|
|
895
|
+
export async function systemAudit(projectRoot, params) {
|
|
896
|
+
try {
|
|
897
|
+
const result = await auditData(projectRoot, params);
|
|
898
|
+
return { success: true, data: result };
|
|
899
|
+
}
|
|
900
|
+
catch (err) {
|
|
901
|
+
return engineError('E_GENERAL', err.message);
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* Sync check (no external sync targets in native mode).
|
|
906
|
+
* @task T4631
|
|
907
|
+
*/
|
|
908
|
+
export function systemSync(_projectRoot, params) {
|
|
909
|
+
return {
|
|
910
|
+
success: true,
|
|
911
|
+
data: {
|
|
912
|
+
direction: params?.direction ?? 'up',
|
|
913
|
+
synced: 0,
|
|
914
|
+
conflicts: 0,
|
|
915
|
+
message: 'Sync is a no-op in native mode (no external sync targets configured)',
|
|
916
|
+
},
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
// ===== Safestop =====
|
|
920
|
+
/**
|
|
921
|
+
* Safe stop: signal clean shutdown for agents.
|
|
922
|
+
* @task T4631
|
|
923
|
+
*/
|
|
924
|
+
export function systemSafestop(projectRoot, params) {
|
|
925
|
+
try {
|
|
926
|
+
const result = safestop(projectRoot, params);
|
|
927
|
+
return { success: true, data: result };
|
|
928
|
+
}
|
|
929
|
+
catch (err) {
|
|
930
|
+
return engineError('E_GENERAL', err.message);
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
// ===== Uncancel =====
|
|
934
|
+
/**
|
|
935
|
+
* Uncancel a cancelled task (restore to pending).
|
|
936
|
+
* @task T4631
|
|
937
|
+
*/
|
|
938
|
+
export async function systemUncancel(projectRoot, params) {
|
|
939
|
+
try {
|
|
940
|
+
const result = await uncancelTask(projectRoot, params);
|
|
941
|
+
return { success: true, data: result };
|
|
942
|
+
}
|
|
943
|
+
catch (err) {
|
|
944
|
+
const code = err.code ?? 'E_UNCANCEL_FAILED';
|
|
945
|
+
return engineError(code, err.message);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
// ===== Doctor Report =====
|
|
949
|
+
/**
|
|
950
|
+
* Run comprehensive doctor diagnostics.
|
|
951
|
+
* @task T4795
|
|
952
|
+
*/
|
|
953
|
+
export async function systemDoctor(projectRoot) {
|
|
954
|
+
const { coreDoctorReport } = await import('@cleocode/core/internal');
|
|
955
|
+
try {
|
|
956
|
+
const result = await coreDoctorReport(projectRoot);
|
|
957
|
+
return { success: true, data: result };
|
|
958
|
+
}
|
|
959
|
+
catch (err) {
|
|
960
|
+
return engineError('E_GENERAL', err.message);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
// ===== Doctor Fix =====
|
|
964
|
+
/**
|
|
965
|
+
* Run auto-fix for failed doctor checks.
|
|
966
|
+
* @task T4795
|
|
967
|
+
*/
|
|
968
|
+
export async function systemFix(projectRoot) {
|
|
969
|
+
const { runDoctorFixes } = await import('@cleocode/core/internal');
|
|
970
|
+
try {
|
|
971
|
+
const result = await runDoctorFixes(projectRoot);
|
|
972
|
+
return { success: true, data: result };
|
|
973
|
+
}
|
|
974
|
+
catch (err) {
|
|
975
|
+
return engineError('E_GENERAL', err.message);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
/**
|
|
979
|
+
* Runtime/channel diagnostics for CLI installation mode checks.
|
|
980
|
+
* @task T4815
|
|
981
|
+
*/
|
|
982
|
+
export async function systemRuntime(_projectRoot, params) {
|
|
983
|
+
try {
|
|
984
|
+
const data = await getRuntimeDiagnostics({ detailed: params?.detailed ?? false });
|
|
985
|
+
return { success: true, data };
|
|
986
|
+
}
|
|
987
|
+
catch (err) {
|
|
988
|
+
return engineError('E_RUNTIME_ERROR', err.message);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Report all resolved CleoOS paths (project + global hub).
|
|
993
|
+
*
|
|
994
|
+
* Backs the `cleo admin paths` CLI command. Read-only: reports current state
|
|
995
|
+
* without mutating the filesystem. Use `systemScaffoldHub()` to create
|
|
996
|
+
* missing hub directories and seed the starter justfile.
|
|
997
|
+
*
|
|
998
|
+
* @task Phase 1 — XDG Foundation + Justfile Hub Skeleton
|
|
999
|
+
*/
|
|
1000
|
+
export async function systemPaths(projectRoot) {
|
|
1001
|
+
try {
|
|
1002
|
+
const cleoHome = getCleoHome();
|
|
1003
|
+
const configDir = getCleoConfigDir();
|
|
1004
|
+
const globalRecipes = getCleoGlobalRecipesDir();
|
|
1005
|
+
const globalJustfile = getCleoGlobalJustfilePath();
|
|
1006
|
+
const piExtensions = getCleoPiExtensionsDir();
|
|
1007
|
+
const cantWorkflows = getCleoCantWorkflowsDir();
|
|
1008
|
+
const globalAgents = getCleoGlobalAgentsDir();
|
|
1009
|
+
return {
|
|
1010
|
+
success: true,
|
|
1011
|
+
data: {
|
|
1012
|
+
projectCleoDir: join(projectRoot, '.cleo'),
|
|
1013
|
+
cleoHome,
|
|
1014
|
+
configDir,
|
|
1015
|
+
hub: {
|
|
1016
|
+
globalRecipes,
|
|
1017
|
+
globalJustfile,
|
|
1018
|
+
piExtensions,
|
|
1019
|
+
cantWorkflows,
|
|
1020
|
+
globalAgents,
|
|
1021
|
+
},
|
|
1022
|
+
scaffolded: {
|
|
1023
|
+
globalRecipes: existsSync(globalRecipes),
|
|
1024
|
+
globalJustfile: existsSync(globalJustfile),
|
|
1025
|
+
piExtensions: existsSync(piExtensions),
|
|
1026
|
+
cantWorkflows: existsSync(cantWorkflows),
|
|
1027
|
+
globalAgents: existsSync(globalAgents),
|
|
1028
|
+
},
|
|
1029
|
+
},
|
|
1030
|
+
};
|
|
1031
|
+
}
|
|
1032
|
+
catch (err) {
|
|
1033
|
+
return engineError('E_PATHS_RESOLVE_FAILED', err.message);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
/**
|
|
1037
|
+
* Create the CleoOS Hub directories and seed the starter justfile if absent.
|
|
1038
|
+
*
|
|
1039
|
+
* Idempotent: safe to call repeatedly. Never overwrites existing user-edited
|
|
1040
|
+
* justfile or README content. Backs the `cleo admin scaffold-hub` CLI
|
|
1041
|
+
* command and is invoked automatically by `cleo init` (Phase 5).
|
|
1042
|
+
*
|
|
1043
|
+
* @task Phase 1 — XDG Foundation + Justfile Hub Skeleton
|
|
1044
|
+
*/
|
|
1045
|
+
export async function systemScaffoldHub() {
|
|
1046
|
+
try {
|
|
1047
|
+
const result = await ensureCleoOsHub();
|
|
1048
|
+
return { success: true, data: result };
|
|
1049
|
+
}
|
|
1050
|
+
catch (err) {
|
|
1051
|
+
return engineError('E_SCAFFOLD_HUB_FAILED', err.message);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
/**
|
|
1055
|
+
* Repair task ID sequence using canonical core implementation.
|
|
1056
|
+
* @task T4815
|
|
1057
|
+
*/
|
|
1058
|
+
export async function systemSequenceRepair(projectRoot) {
|
|
1059
|
+
try {
|
|
1060
|
+
const repair = await repairSequence(projectRoot);
|
|
1061
|
+
return {
|
|
1062
|
+
success: true,
|
|
1063
|
+
data: {
|
|
1064
|
+
repaired: repair.repaired,
|
|
1065
|
+
message: repair.message,
|
|
1066
|
+
counter: repair.counter,
|
|
1067
|
+
oldCounter: repair.oldCounter,
|
|
1068
|
+
newCounter: repair.newCounter,
|
|
1069
|
+
},
|
|
1070
|
+
};
|
|
1071
|
+
}
|
|
1072
|
+
catch (err) {
|
|
1073
|
+
return engineError('E_SEQUENCE_REPAIR_FAILED', err.message);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Smoke-test definitions: one lightweight read-only query per domain.
|
|
1078
|
+
* Each probe exercises the full dispatch pipeline (middleware, handler, engine, core).
|
|
1079
|
+
*/
|
|
1080
|
+
const SMOKE_PROBES = [
|
|
1081
|
+
{ domain: 'admin', operation: 'version' },
|
|
1082
|
+
{ domain: 'tasks', operation: 'find', params: { query: '__smoke_probe__', limit: 1 } },
|
|
1083
|
+
{ domain: 'session', operation: 'status' },
|
|
1084
|
+
{ domain: 'memory', operation: 'find', params: { query: '__smoke_probe__' } },
|
|
1085
|
+
{ domain: 'pipeline', operation: 'list' },
|
|
1086
|
+
{ domain: 'check', operation: 'schema' },
|
|
1087
|
+
{ domain: 'tools', operation: 'list', params: { limit: 1 } },
|
|
1088
|
+
{ domain: 'sticky', operation: 'list', params: { limit: 1 } },
|
|
1089
|
+
{ domain: 'nexus', operation: 'status' },
|
|
1090
|
+
{ domain: 'orchestrate', operation: 'status' },
|
|
1091
|
+
];
|
|
1092
|
+
/**
|
|
1093
|
+
* Run operational smoke tests across all domains.
|
|
1094
|
+
*
|
|
1095
|
+
* Dispatches one read-only query per domain through the full CLI dispatch
|
|
1096
|
+
* pipeline and reports pass/fail with timing. Catches crashes (TypeError,
|
|
1097
|
+
* ReferenceError, etc.) not just structured error responses.
|
|
1098
|
+
*
|
|
1099
|
+
* @task T130
|
|
1100
|
+
*/
|
|
1101
|
+
export async function systemSmoke() {
|
|
1102
|
+
const { dispatchRaw } = await import('../adapters/cli.js');
|
|
1103
|
+
const totalStart = Date.now();
|
|
1104
|
+
const probes = [];
|
|
1105
|
+
for (const probe of SMOKE_PROBES) {
|
|
1106
|
+
const start = Date.now();
|
|
1107
|
+
try {
|
|
1108
|
+
const response = await dispatchRaw('query', probe.domain, probe.operation, probe.params);
|
|
1109
|
+
const elapsed = Date.now() - start;
|
|
1110
|
+
if (response.success) {
|
|
1111
|
+
probes.push({
|
|
1112
|
+
domain: probe.domain,
|
|
1113
|
+
operation: probe.operation,
|
|
1114
|
+
status: 'pass',
|
|
1115
|
+
timeMs: elapsed,
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1118
|
+
else {
|
|
1119
|
+
// Structured error responses that are domain-specific (like "no session") are still valid
|
|
1120
|
+
// operational results — the dispatch pipeline worked. Only treat E_INTERNAL / E_NO_HANDLER as failures.
|
|
1121
|
+
const code = response.error?.code ?? '';
|
|
1122
|
+
const isCrash = code === 'E_INTERNAL' || code === 'E_NO_HANDLER';
|
|
1123
|
+
probes.push({
|
|
1124
|
+
domain: probe.domain,
|
|
1125
|
+
operation: probe.operation,
|
|
1126
|
+
status: isCrash ? 'fail' : 'pass',
|
|
1127
|
+
timeMs: elapsed,
|
|
1128
|
+
...(isCrash ? { error: response.error?.message } : {}),
|
|
1129
|
+
});
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
catch (err) {
|
|
1133
|
+
const elapsed = Date.now() - start;
|
|
1134
|
+
probes.push({
|
|
1135
|
+
domain: probe.domain,
|
|
1136
|
+
operation: probe.operation,
|
|
1137
|
+
status: 'fail',
|
|
1138
|
+
timeMs: elapsed,
|
|
1139
|
+
error: err instanceof Error ? `${err.constructor.name}: ${err.message}` : String(err),
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
// --- DB connectivity and migration state checks ---
|
|
1144
|
+
const dbChecks = [];
|
|
1145
|
+
// tasks.db connectivity + integrity
|
|
1146
|
+
{
|
|
1147
|
+
const start = Date.now();
|
|
1148
|
+
try {
|
|
1149
|
+
const { getDb, getNativeDb } = await import('@cleocode/core/internal');
|
|
1150
|
+
const projectRoot = (await import('@cleocode/core/internal')).getProjectRoot();
|
|
1151
|
+
await getDb(projectRoot);
|
|
1152
|
+
const nativeDb = getNativeDb();
|
|
1153
|
+
if (nativeDb) {
|
|
1154
|
+
const result = nativeDb.prepare('PRAGMA integrity_check').get();
|
|
1155
|
+
const ok = result?.integrity_check === 'ok';
|
|
1156
|
+
dbChecks.push({
|
|
1157
|
+
domain: 'db',
|
|
1158
|
+
operation: 'tasks.db',
|
|
1159
|
+
status: ok ? 'pass' : 'fail',
|
|
1160
|
+
timeMs: Date.now() - start,
|
|
1161
|
+
...(!ok ? { error: 'SQLite integrity check failed' } : {}),
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
else {
|
|
1165
|
+
dbChecks.push({
|
|
1166
|
+
domain: 'db',
|
|
1167
|
+
operation: 'tasks.db',
|
|
1168
|
+
status: 'fail',
|
|
1169
|
+
timeMs: Date.now() - start,
|
|
1170
|
+
error: 'Native DB handle unavailable',
|
|
1171
|
+
});
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
catch (err) {
|
|
1175
|
+
dbChecks.push({
|
|
1176
|
+
domain: 'db',
|
|
1177
|
+
operation: 'tasks.db',
|
|
1178
|
+
status: 'fail',
|
|
1179
|
+
timeMs: Date.now() - start,
|
|
1180
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
// brain.db connectivity
|
|
1185
|
+
{
|
|
1186
|
+
const start = Date.now();
|
|
1187
|
+
try {
|
|
1188
|
+
const { getBrainDb } = await import('@cleocode/core/internal');
|
|
1189
|
+
const projectRoot = (await import('@cleocode/core/internal')).getProjectRoot();
|
|
1190
|
+
const brainDb = await getBrainDb(projectRoot);
|
|
1191
|
+
if (brainDb) {
|
|
1192
|
+
dbChecks.push({
|
|
1193
|
+
domain: 'db',
|
|
1194
|
+
operation: 'brain.db',
|
|
1195
|
+
status: 'pass',
|
|
1196
|
+
timeMs: Date.now() - start,
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
1199
|
+
else {
|
|
1200
|
+
dbChecks.push({
|
|
1201
|
+
domain: 'db',
|
|
1202
|
+
operation: 'brain.db',
|
|
1203
|
+
status: 'fail',
|
|
1204
|
+
timeMs: Date.now() - start,
|
|
1205
|
+
error: 'brain.db not initialized',
|
|
1206
|
+
});
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
catch (err) {
|
|
1210
|
+
dbChecks.push({
|
|
1211
|
+
domain: 'db',
|
|
1212
|
+
operation: 'brain.db',
|
|
1213
|
+
status: 'fail',
|
|
1214
|
+
timeMs: Date.now() - start,
|
|
1215
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
// Migration state validation (detect stale journals)
|
|
1220
|
+
{
|
|
1221
|
+
const start = Date.now();
|
|
1222
|
+
try {
|
|
1223
|
+
const migrationStatus = await getMigrationStatus((await import('@cleocode/core/internal')).getProjectRoot());
|
|
1224
|
+
const hasPending = migrationStatus.migrations.some((m) => !m.applied);
|
|
1225
|
+
dbChecks.push({
|
|
1226
|
+
domain: 'db',
|
|
1227
|
+
operation: 'migrations',
|
|
1228
|
+
status: hasPending ? 'fail' : 'pass',
|
|
1229
|
+
timeMs: Date.now() - start,
|
|
1230
|
+
...(hasPending
|
|
1231
|
+
? {
|
|
1232
|
+
error: `Unapplied migrations detected (${migrationStatus.from} → ${migrationStatus.to}). Run: cleo upgrade`,
|
|
1233
|
+
}
|
|
1234
|
+
: {}),
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
catch (err) {
|
|
1238
|
+
dbChecks.push({
|
|
1239
|
+
domain: 'db',
|
|
1240
|
+
operation: 'migrations',
|
|
1241
|
+
status: 'fail',
|
|
1242
|
+
timeMs: Date.now() - start,
|
|
1243
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1244
|
+
});
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
const allProbes = [...probes, ...dbChecks];
|
|
1248
|
+
const totalMs = Date.now() - totalStart;
|
|
1249
|
+
const passed = allProbes.filter((p) => p.status === 'pass').length;
|
|
1250
|
+
const failed = allProbes.filter((p) => p.status === 'fail').length;
|
|
1251
|
+
const skipped = allProbes.filter((p) => p.status === 'skip').length;
|
|
1252
|
+
return {
|
|
1253
|
+
success: failed === 0,
|
|
1254
|
+
data: { probes, dbChecks, passed, failed, skipped, totalMs },
|
|
1255
|
+
...(failed > 0
|
|
1256
|
+
? {
|
|
1257
|
+
error: {
|
|
1258
|
+
code: 'E_SMOKE_FAILURES',
|
|
1259
|
+
message: `${failed} probe(s) failed smoke test`,
|
|
1260
|
+
exitCode: 1,
|
|
1261
|
+
},
|
|
1262
|
+
}
|
|
1263
|
+
: {}),
|
|
1264
|
+
};
|
|
1265
|
+
}
|
|
1266
|
+
//# sourceMappingURL=system-engine.js.map
|