@cleocode/cleo 2026.4.41 → 2026.4.43
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/index.js +187 -31
- package/dist/cli/index.js.map +3 -3
- package/package.json +12 -8
- package/dist/cli/commander-shim.d.ts +0 -112
- package/dist/cli/commander-shim.d.ts.map +0 -1
- package/dist/cli/commander-shim.js +0 -233
- package/dist/cli/commander-shim.js.map +0 -1
- package/dist/cli/commands/adapter.d.ts +0 -21
- package/dist/cli/commands/adapter.d.ts.map +0 -1
- package/dist/cli/commands/adapter.js +0 -73
- package/dist/cli/commands/adapter.js.map +0 -1
- package/dist/cli/commands/add-batch.d.ts +0 -16
- package/dist/cli/commands/add-batch.d.ts.map +0 -1
- package/dist/cli/commands/add-batch.js +0 -133
- package/dist/cli/commands/add-batch.js.map +0 -1
- package/dist/cli/commands/add.d.ts +0 -12
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -238
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/admin.d.ts +0 -15
- package/dist/cli/commands/admin.d.ts.map +0 -1
- package/dist/cli/commands/admin.js +0 -143
- package/dist/cli/commands/admin.js.map +0 -1
- package/dist/cli/commands/adr.d.ts +0 -27
- package/dist/cli/commands/adr.d.ts.map +0 -1
- package/dist/cli/commands/adr.js +0 -79
- package/dist/cli/commands/adr.js.map +0 -1
- package/dist/cli/commands/agent-profile-status.d.ts +0 -98
- package/dist/cli/commands/agent-profile-status.d.ts.map +0 -1
- package/dist/cli/commands/agent-profile-status.js +0 -71
- package/dist/cli/commands/agent-profile-status.js.map +0 -1
- package/dist/cli/commands/agent.d.ts +0 -41
- package/dist/cli/commands/agent.d.ts.map +0 -1
- package/dist/cli/commands/agent.js +0 -2270
- package/dist/cli/commands/agent.js.map +0 -1
- package/dist/cli/commands/agents.d.ts +0 -17
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/agents.js +0 -20
- package/dist/cli/commands/agents.js.map +0 -1
- package/dist/cli/commands/analyze.d.ts +0 -12
- package/dist/cli/commands/analyze.d.ts.map +0 -1
- package/dist/cli/commands/analyze.js +0 -20
- package/dist/cli/commands/analyze.js.map +0 -1
- package/dist/cli/commands/archive-stats.d.ts +0 -18
- package/dist/cli/commands/archive-stats.d.ts.map +0 -1
- package/dist/cli/commands/archive-stats.js +0 -49
- package/dist/cli/commands/archive-stats.js.map +0 -1
- package/dist/cli/commands/archive.d.ts +0 -12
- package/dist/cli/commands/archive.d.ts.map +0 -1
- package/dist/cli/commands/archive.js +0 -32
- package/dist/cli/commands/archive.js.map +0 -1
- package/dist/cli/commands/backfill.d.ts +0 -38
- package/dist/cli/commands/backfill.d.ts.map +0 -1
- package/dist/cli/commands/backfill.js +0 -144
- package/dist/cli/commands/backfill.js.map +0 -1
- package/dist/cli/commands/backup-inspect.d.ts +0 -24
- package/dist/cli/commands/backup-inspect.d.ts.map +0 -1
- package/dist/cli/commands/backup-inspect.js +0 -417
- package/dist/cli/commands/backup-inspect.js.map +0 -1
- package/dist/cli/commands/backup.d.ts +0 -13
- package/dist/cli/commands/backup.d.ts.map +0 -1
- package/dist/cli/commands/backup.js +0 -479
- package/dist/cli/commands/backup.js.map +0 -1
- package/dist/cli/commands/blockers.d.ts +0 -7
- package/dist/cli/commands/blockers.d.ts.map +0 -1
- package/dist/cli/commands/blockers.js +0 -16
- package/dist/cli/commands/blockers.js.map +0 -1
- package/dist/cli/commands/brain.d.ts +0 -29
- package/dist/cli/commands/brain.d.ts.map +0 -1
- package/dist/cli/commands/brain.js +0 -252
- package/dist/cli/commands/brain.js.map +0 -1
- package/dist/cli/commands/briefing.d.ts +0 -22
- package/dist/cli/commands/briefing.d.ts.map +0 -1
- package/dist/cli/commands/briefing.js +0 -45
- package/dist/cli/commands/briefing.js.map +0 -1
- package/dist/cli/commands/bug.d.ts +0 -12
- package/dist/cli/commands/bug.d.ts.map +0 -1
- package/dist/cli/commands/bug.js +0 -81
- package/dist/cli/commands/bug.js.map +0 -1
- package/dist/cli/commands/cancel.d.ts +0 -17
- package/dist/cli/commands/cancel.d.ts.map +0 -1
- package/dist/cli/commands/cancel.js +0 -28
- package/dist/cli/commands/cancel.js.map +0 -1
- package/dist/cli/commands/cant.d.ts +0 -32
- package/dist/cli/commands/cant.d.ts.map +0 -1
- package/dist/cli/commands/cant.js +0 -264
- package/dist/cli/commands/cant.js.map +0 -1
- package/dist/cli/commands/chain.d.ts +0 -16
- package/dist/cli/commands/chain.d.ts.map +0 -1
- package/dist/cli/commands/chain.js +0 -52
- package/dist/cli/commands/chain.js.map +0 -1
- package/dist/cli/commands/check.d.ts +0 -25
- package/dist/cli/commands/check.d.ts.map +0 -1
- package/dist/cli/commands/check.js +0 -193
- package/dist/cli/commands/check.js.map +0 -1
- package/dist/cli/commands/checkpoint.d.ts +0 -15
- package/dist/cli/commands/checkpoint.d.ts.map +0 -1
- package/dist/cli/commands/checkpoint.js +0 -91
- package/dist/cli/commands/checkpoint.js.map +0 -1
- package/dist/cli/commands/claim.d.ts +0 -27
- package/dist/cli/commands/claim.d.ts.map +0 -1
- package/dist/cli/commands/claim.js +0 -45
- package/dist/cli/commands/claim.js.map +0 -1
- package/dist/cli/commands/code.d.ts +0 -11
- package/dist/cli/commands/code.d.ts.map +0 -1
- package/dist/cli/commands/code.js +0 -114
- package/dist/cli/commands/code.js.map +0 -1
- package/dist/cli/commands/commands.d.ts +0 -13
- package/dist/cli/commands/commands.d.ts.map +0 -1
- package/dist/cli/commands/commands.js +0 -29
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/complete.d.ts +0 -12
- package/dist/cli/commands/complete.d.ts.map +0 -1
- package/dist/cli/commands/complete.js +0 -92
- package/dist/cli/commands/complete.js.map +0 -1
- package/dist/cli/commands/complexity.d.ts +0 -17
- package/dist/cli/commands/complexity.d.ts.map +0 -1
- package/dist/cli/commands/complexity.js +0 -25
- package/dist/cli/commands/complexity.js.map +0 -1
- package/dist/cli/commands/compliance.d.ts +0 -9
- package/dist/cli/commands/compliance.d.ts.map +0 -1
- package/dist/cli/commands/compliance.js +0 -110
- package/dist/cli/commands/compliance.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -10
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -69
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/consensus.d.ts +0 -13
- package/dist/cli/commands/consensus.d.ts.map +0 -1
- package/dist/cli/commands/consensus.js +0 -45
- package/dist/cli/commands/consensus.js.map +0 -1
- package/dist/cli/commands/context.d.ts +0 -15
- package/dist/cli/commands/context.d.ts.map +0 -1
- package/dist/cli/commands/context.js +0 -76
- package/dist/cli/commands/context.js.map +0 -1
- package/dist/cli/commands/contribution.d.ts +0 -13
- package/dist/cli/commands/contribution.d.ts.map +0 -1
- package/dist/cli/commands/contribution.js +0 -41
- package/dist/cli/commands/contribution.js.map +0 -1
- package/dist/cli/commands/current.d.ts +0 -13
- package/dist/cli/commands/current.d.ts.map +0 -1
- package/dist/cli/commands/current.js +0 -20
- package/dist/cli/commands/current.js.map +0 -1
- package/dist/cli/commands/dash.d.ts +0 -12
- package/dist/cli/commands/dash.d.ts.map +0 -1
- package/dist/cli/commands/dash.js +0 -20
- package/dist/cli/commands/dash.js.map +0 -1
- package/dist/cli/commands/decomposition.d.ts +0 -13
- package/dist/cli/commands/decomposition.d.ts.map +0 -1
- package/dist/cli/commands/decomposition.js +0 -45
- package/dist/cli/commands/decomposition.js.map +0 -1
- package/dist/cli/commands/delete.d.ts +0 -12
- package/dist/cli/commands/delete.d.ts.map +0 -1
- package/dist/cli/commands/delete.js +0 -37
- package/dist/cli/commands/delete.js.map +0 -1
- package/dist/cli/commands/deps.d.ts +0 -24
- package/dist/cli/commands/deps.d.ts.map +0 -1
- package/dist/cli/commands/deps.js +0 -98
- package/dist/cli/commands/deps.js.map +0 -1
- package/dist/cli/commands/detect-drift.d.ts +0 -15
- package/dist/cli/commands/detect-drift.d.ts.map +0 -1
- package/dist/cli/commands/detect-drift.js +0 -428
- package/dist/cli/commands/detect-drift.js.map +0 -1
- package/dist/cli/commands/detect.d.ts +0 -13
- package/dist/cli/commands/detect.d.ts.map +0 -1
- package/dist/cli/commands/detect.js +0 -20
- package/dist/cli/commands/detect.js.map +0 -1
- package/dist/cli/commands/docs.d.ts +0 -13
- package/dist/cli/commands/docs.d.ts.map +0 -1
- package/dist/cli/commands/docs.js +0 -169
- package/dist/cli/commands/docs.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -15
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -133
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/dynamic.d.ts +0 -24
- package/dist/cli/commands/dynamic.d.ts.map +0 -1
- package/dist/cli/commands/dynamic.js +0 -27
- package/dist/cli/commands/dynamic.js.map +0 -1
- package/dist/cli/commands/env.d.ts +0 -12
- package/dist/cli/commands/env.d.ts.map +0 -1
- package/dist/cli/commands/env.js +0 -44
- package/dist/cli/commands/env.js.map +0 -1
- package/dist/cli/commands/exists.d.ts +0 -24
- package/dist/cli/commands/exists.d.ts.map +0 -1
- package/dist/cli/commands/exists.js +0 -53
- package/dist/cli/commands/exists.js.map +0 -1
- package/dist/cli/commands/export-tasks.d.ts +0 -10
- package/dist/cli/commands/export-tasks.d.ts.map +0 -1
- package/dist/cli/commands/export-tasks.js +0 -47
- package/dist/cli/commands/export-tasks.js.map +0 -1
- package/dist/cli/commands/export.d.ts +0 -9
- package/dist/cli/commands/export.d.ts.map +0 -1
- package/dist/cli/commands/export.js +0 -46
- package/dist/cli/commands/export.js.map +0 -1
- package/dist/cli/commands/find.d.ts +0 -14
- package/dist/cli/commands/find.d.ts.map +0 -1
- package/dist/cli/commands/find.js +0 -152
- package/dist/cli/commands/find.js.map +0 -1
- package/dist/cli/commands/generate-changelog.d.ts +0 -14
- package/dist/cli/commands/generate-changelog.d.ts.map +0 -1
- package/dist/cli/commands/generate-changelog.js +0 -252
- package/dist/cli/commands/generate-changelog.js.map +0 -1
- package/dist/cli/commands/grade.d.ts +0 -13
- package/dist/cli/commands/grade.d.ts.map +0 -1
- package/dist/cli/commands/grade.js +0 -26
- package/dist/cli/commands/grade.js.map +0 -1
- package/dist/cli/commands/history.d.ts +0 -9
- package/dist/cli/commands/history.d.ts.map +0 -1
- package/dist/cli/commands/history.js +0 -33
- package/dist/cli/commands/history.js.map +0 -1
- package/dist/cli/commands/implementation.d.ts +0 -13
- package/dist/cli/commands/implementation.d.ts.map +0 -1
- package/dist/cli/commands/implementation.js +0 -41
- package/dist/cli/commands/implementation.js.map +0 -1
- package/dist/cli/commands/import-tasks.d.ts +0 -10
- package/dist/cli/commands/import-tasks.d.ts.map +0 -1
- package/dist/cli/commands/import-tasks.js +0 -38
- package/dist/cli/commands/import-tasks.js.map +0 -1
- package/dist/cli/commands/import.d.ts +0 -9
- package/dist/cli/commands/import.d.ts.map +0 -1
- package/dist/cli/commands/import.js +0 -28
- package/dist/cli/commands/import.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -34
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -96
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/inject.d.ts +0 -8
- package/dist/cli/commands/inject.d.ts.map +0 -1
- package/dist/cli/commands/inject.js +0 -28
- package/dist/cli/commands/inject.js.map +0 -1
- package/dist/cli/commands/intelligence.d.ts +0 -22
- package/dist/cli/commands/intelligence.d.ts.map +0 -1
- package/dist/cli/commands/intelligence.js +0 -72
- package/dist/cli/commands/intelligence.js.map +0 -1
- package/dist/cli/commands/issue.d.ts +0 -17
- package/dist/cli/commands/issue.d.ts.map +0 -1
- package/dist/cli/commands/issue.js +0 -107
- package/dist/cli/commands/issue.js.map +0 -1
- package/dist/cli/commands/labels.d.ts +0 -17
- package/dist/cli/commands/labels.d.ts.map +0 -1
- package/dist/cli/commands/labels.js +0 -48
- package/dist/cli/commands/labels.js.map +0 -1
- package/dist/cli/commands/lifecycle.d.ts +0 -8
- package/dist/cli/commands/lifecycle.d.ts.map +0 -1
- package/dist/cli/commands/lifecycle.js +0 -128
- package/dist/cli/commands/lifecycle.js.map +0 -1
- package/dist/cli/commands/list.d.ts +0 -14
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js +0 -143
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/log.d.ts +0 -12
- package/dist/cli/commands/log.d.ts.map +0 -1
- package/dist/cli/commands/log.js +0 -30
- package/dist/cli/commands/log.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -10
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -23
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/memory-brain.d.ts +0 -14
- package/dist/cli/commands/memory-brain.d.ts.map +0 -1
- package/dist/cli/commands/memory-brain.js +0 -377
- package/dist/cli/commands/memory-brain.js.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.d.ts +0 -23
- package/dist/cli/commands/migrate-claude-mem.d.ts.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.js +0 -79
- package/dist/cli/commands/migrate-claude-mem.js.map +0 -1
- package/dist/cli/commands/next.d.ts +0 -9
- package/dist/cli/commands/next.d.ts.map +0 -1
- package/dist/cli/commands/next.js +0 -20
- package/dist/cli/commands/next.js.map +0 -1
- package/dist/cli/commands/nexus.d.ts +0 -20
- package/dist/cli/commands/nexus.d.ts.map +0 -1
- package/dist/cli/commands/nexus.js +0 -1163
- package/dist/cli/commands/nexus.js.map +0 -1
- package/dist/cli/commands/observe.d.ts +0 -13
- package/dist/cli/commands/observe.d.ts.map +0 -1
- package/dist/cli/commands/observe.js +0 -30
- package/dist/cli/commands/observe.js.map +0 -1
- package/dist/cli/commands/ops.d.ts +0 -10
- package/dist/cli/commands/ops.d.ts.map +0 -1
- package/dist/cli/commands/ops.js +0 -19
- package/dist/cli/commands/ops.js.map +0 -1
- package/dist/cli/commands/orchestrate.d.ts +0 -24
- package/dist/cli/commands/orchestrate.d.ts.map +0 -1
- package/dist/cli/commands/orchestrate.js +0 -254
- package/dist/cli/commands/orchestrate.js.map +0 -1
- package/dist/cli/commands/otel.d.ts +0 -12
- package/dist/cli/commands/otel.d.ts.map +0 -1
- package/dist/cli/commands/otel.js +0 -128
- package/dist/cli/commands/otel.js.map +0 -1
- package/dist/cli/commands/phase.d.ts +0 -12
- package/dist/cli/commands/phase.d.ts.map +0 -1
- package/dist/cli/commands/phase.js +0 -91
- package/dist/cli/commands/phase.js.map +0 -1
- package/dist/cli/commands/phases.d.ts +0 -14
- package/dist/cli/commands/phases.d.ts.map +0 -1
- package/dist/cli/commands/phases.js +0 -42
- package/dist/cli/commands/phases.js.map +0 -1
- package/dist/cli/commands/plan.d.ts +0 -8
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.js +0 -15
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/promote.d.ts +0 -11
- package/dist/cli/commands/promote.d.ts.map +0 -1
- package/dist/cli/commands/promote.js +0 -18
- package/dist/cli/commands/promote.js.map +0 -1
- package/dist/cli/commands/provider.d.ts +0 -21
- package/dist/cli/commands/provider.d.ts.map +0 -1
- package/dist/cli/commands/provider.js +0 -88
- package/dist/cli/commands/provider.js.map +0 -1
- package/dist/cli/commands/reason.d.ts +0 -36
- package/dist/cli/commands/reason.d.ts.map +0 -1
- package/dist/cli/commands/reason.js +0 -85
- package/dist/cli/commands/reason.js.map +0 -1
- package/dist/cli/commands/refresh-memory.d.ts +0 -9
- package/dist/cli/commands/refresh-memory.d.ts.map +0 -1
- package/dist/cli/commands/refresh-memory.js +0 -24
- package/dist/cli/commands/refresh-memory.js.map +0 -1
- package/dist/cli/commands/relates.d.ts +0 -12
- package/dist/cli/commands/relates.d.ts.map +0 -1
- package/dist/cli/commands/relates.js +0 -53
- package/dist/cli/commands/relates.js.map +0 -1
- package/dist/cli/commands/release.d.ts +0 -8
- package/dist/cli/commands/release.d.ts.map +0 -1
- package/dist/cli/commands/release.js +0 -82
- package/dist/cli/commands/release.js.map +0 -1
- package/dist/cli/commands/remote.d.ts +0 -12
- package/dist/cli/commands/remote.d.ts.map +0 -1
- package/dist/cli/commands/remote.js +0 -207
- package/dist/cli/commands/remote.js.map +0 -1
- package/dist/cli/commands/reorder.d.ts +0 -17
- package/dist/cli/commands/reorder.d.ts.map +0 -1
- package/dist/cli/commands/reorder.js +0 -41
- package/dist/cli/commands/reorder.js.map +0 -1
- package/dist/cli/commands/reparent.d.ts +0 -10
- package/dist/cli/commands/reparent.d.ts.map +0 -1
- package/dist/cli/commands/reparent.js +0 -19
- package/dist/cli/commands/reparent.js.map +0 -1
- package/dist/cli/commands/research.d.ts +0 -8
- package/dist/cli/commands/research.d.ts.map +0 -1
- package/dist/cli/commands/research.js +0 -164
- package/dist/cli/commands/research.js.map +0 -1
- package/dist/cli/commands/restore.d.ts +0 -54
- package/dist/cli/commands/restore.d.ts.map +0 -1
- package/dist/cli/commands/restore.js +0 -470
- package/dist/cli/commands/restore.js.map +0 -1
- package/dist/cli/commands/roadmap.d.ts +0 -14
- package/dist/cli/commands/roadmap.d.ts.map +0 -1
- package/dist/cli/commands/roadmap.js +0 -26
- package/dist/cli/commands/roadmap.js.map +0 -1
- package/dist/cli/commands/safestop.d.ts +0 -14
- package/dist/cli/commands/safestop.d.ts.map +0 -1
- package/dist/cli/commands/safestop.js +0 -32
- package/dist/cli/commands/safestop.js.map +0 -1
- package/dist/cli/commands/schema.d.ts +0 -27
- package/dist/cli/commands/schema.d.ts.map +0 -1
- package/dist/cli/commands/schema.js +0 -160
- package/dist/cli/commands/schema.js.map +0 -1
- package/dist/cli/commands/self-update.d.ts +0 -15
- package/dist/cli/commands/self-update.d.ts.map +0 -1
- package/dist/cli/commands/self-update.js +0 -363
- package/dist/cli/commands/self-update.js.map +0 -1
- package/dist/cli/commands/sequence.d.ts +0 -11
- package/dist/cli/commands/sequence.d.ts.map +0 -1
- package/dist/cli/commands/sequence.js +0 -40
- package/dist/cli/commands/sequence.js.map +0 -1
- package/dist/cli/commands/session.d.ts +0 -12
- package/dist/cli/commands/session.d.ts.map +0 -1
- package/dist/cli/commands/session.js +0 -219
- package/dist/cli/commands/session.js.map +0 -1
- package/dist/cli/commands/show.d.ts +0 -13
- package/dist/cli/commands/show.d.ts.map +0 -1
- package/dist/cli/commands/show.js +0 -40
- package/dist/cli/commands/show.js.map +0 -1
- package/dist/cli/commands/skills.d.ts +0 -13
- package/dist/cli/commands/skills.d.ts.map +0 -1
- package/dist/cli/commands/skills.js +0 -161
- package/dist/cli/commands/skills.js.map +0 -1
- package/dist/cli/commands/snapshot.d.ts +0 -9
- package/dist/cli/commands/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/snapshot.js +0 -50
- package/dist/cli/commands/snapshot.js.map +0 -1
- package/dist/cli/commands/specification.d.ts +0 -13
- package/dist/cli/commands/specification.d.ts.map +0 -1
- package/dist/cli/commands/specification.js +0 -45
- package/dist/cli/commands/specification.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -13
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/start.js +0 -20
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -12
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -35
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/commands/sticky.d.ts +0 -16
- package/dist/cli/commands/sticky.d.ts.map +0 -1
- package/dist/cli/commands/sticky.js +0 -218
- package/dist/cli/commands/sticky.js.map +0 -1
- package/dist/cli/commands/stop.d.ts +0 -13
- package/dist/cli/commands/stop.d.ts.map +0 -1
- package/dist/cli/commands/stop.js +0 -20
- package/dist/cli/commands/stop.js.map +0 -1
- package/dist/cli/commands/sync.d.ts +0 -26
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js +0 -82
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/testing.d.ts +0 -13
- package/dist/cli/commands/testing.d.ts.map +0 -1
- package/dist/cli/commands/testing.js +0 -65
- package/dist/cli/commands/testing.js.map +0 -1
- package/dist/cli/commands/token.d.ts +0 -10
- package/dist/cli/commands/token.d.ts.map +0 -1
- package/dist/cli/commands/token.js +0 -135
- package/dist/cli/commands/token.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -12
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -83
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/upgrade.d.ts +0 -18
- package/dist/cli/commands/upgrade.d.ts.map +0 -1
- package/dist/cli/commands/upgrade.js +0 -103
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -12
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -24
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.d.ts +0 -8
- package/dist/cli/commands/verify.d.ts.map +0 -1
- package/dist/cli/commands/verify.js +0 -28
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/commands/web.d.ts +0 -13
- package/dist/cli/commands/web.d.ts.map +0 -1
- package/dist/cli/commands/web.js +0 -277
- package/dist/cli/commands/web.js.map +0 -1
- package/dist/cli/field-context.d.ts +0 -32
- package/dist/cli/field-context.d.ts.map +0 -1
- package/dist/cli/field-context.js +0 -47
- package/dist/cli/field-context.js.map +0 -1
- package/dist/cli/format-context.d.ts +0 -32
- package/dist/cli/format-context.d.ts.map +0 -1
- package/dist/cli/format-context.js +0 -50
- package/dist/cli/format-context.js.map +0 -1
- package/dist/cli/help-generator.d.ts +0 -74
- package/dist/cli/help-generator.d.ts.map +0 -1
- package/dist/cli/help-generator.js +0 -229
- package/dist/cli/help-generator.js.map +0 -1
- package/dist/cli/help-renderer.d.ts +0 -28
- package/dist/cli/help-renderer.d.ts.map +0 -1
- package/dist/cli/help-renderer.js +0 -301
- package/dist/cli/help-renderer.js.map +0 -1
- package/dist/cli/index.d.ts +0 -9
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.d.ts +0 -6
- package/dist/cli/logger-bootstrap.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.js +0 -10
- package/dist/cli/logger-bootstrap.js.map +0 -1
- package/dist/cli/middleware/output-format.d.ts +0 -30
- package/dist/cli/middleware/output-format.d.ts.map +0 -1
- package/dist/cli/middleware/output-format.js +0 -35
- package/dist/cli/middleware/output-format.js.map +0 -1
- package/dist/cli/progress.d.ts +0 -84
- package/dist/cli/progress.d.ts.map +0 -1
- package/dist/cli/progress.js +0 -169
- package/dist/cli/progress.js.map +0 -1
- package/dist/cli/renderers/colors.d.ts +0 -32
- package/dist/cli/renderers/colors.d.ts.map +0 -1
- package/dist/cli/renderers/colors.js +0 -141
- package/dist/cli/renderers/colors.js.map +0 -1
- package/dist/cli/renderers/error.d.ts +0 -13
- package/dist/cli/renderers/error.d.ts.map +0 -1
- package/dist/cli/renderers/error.js +0 -42
- package/dist/cli/renderers/error.js.map +0 -1
- package/dist/cli/renderers/index.d.ts +0 -87
- package/dist/cli/renderers/index.d.ts.map +0 -1
- package/dist/cli/renderers/index.js +0 -262
- package/dist/cli/renderers/index.js.map +0 -1
- package/dist/cli/renderers/lafs-validator.d.ts +0 -91
- package/dist/cli/renderers/lafs-validator.d.ts.map +0 -1
- package/dist/cli/renderers/lafs-validator.js +0 -176
- package/dist/cli/renderers/lafs-validator.js.map +0 -1
- package/dist/cli/renderers/normalizer.d.ts +0 -21
- package/dist/cli/renderers/normalizer.d.ts.map +0 -1
- package/dist/cli/renderers/normalizer.js +0 -106
- package/dist/cli/renderers/normalizer.js.map +0 -1
- package/dist/cli/renderers/system.d.ts +0 -25
- package/dist/cli/renderers/system.d.ts.map +0 -1
- package/dist/cli/renderers/system.js +0 -416
- package/dist/cli/renderers/system.js.map +0 -1
- package/dist/cli/renderers/tasks.d.ts +0 -28
- package/dist/cli/renderers/tasks.d.ts.map +0 -1
- package/dist/cli/renderers/tasks.js +0 -306
- package/dist/cli/renderers/tasks.js.map +0 -1
- package/dist/dispatch/adapters/cli.d.ts +0 -67
- package/dist/dispatch/adapters/cli.d.ts.map +0 -1
- package/dist/dispatch/adapters/cli.js +0 -329
- package/dist/dispatch/adapters/cli.js.map +0 -1
- package/dist/dispatch/context/session-context.d.ts +0 -54
- package/dist/dispatch/context/session-context.d.ts.map +0 -1
- package/dist/dispatch/context/session-context.js +0 -61
- package/dist/dispatch/context/session-context.js.map +0 -1
- package/dist/dispatch/dispatcher.d.ts +0 -23
- package/dist/dispatch/dispatcher.d.ts.map +0 -1
- package/dist/dispatch/dispatcher.js +0 -84
- package/dist/dispatch/dispatcher.js.map +0 -1
- package/dist/dispatch/domains/_base.d.ts +0 -59
- package/dist/dispatch/domains/_base.d.ts.map +0 -1
- package/dist/dispatch/domains/_base.js +0 -77
- package/dist/dispatch/domains/_base.js.map +0 -1
- package/dist/dispatch/domains/_meta.d.ts +0 -23
- package/dist/dispatch/domains/_meta.d.ts.map +0 -1
- package/dist/dispatch/domains/_meta.js +0 -25
- package/dist/dispatch/domains/_meta.js.map +0 -1
- package/dist/dispatch/domains/_routing.d.ts +0 -8
- package/dist/dispatch/domains/_routing.d.ts.map +0 -1
- package/dist/dispatch/domains/_routing.js +0 -20
- package/dist/dispatch/domains/_routing.js.map +0 -1
- package/dist/dispatch/domains/admin.d.ts +0 -25
- package/dist/dispatch/domains/admin.d.ts.map +0 -1
- package/dist/dispatch/domains/admin.js +0 -791
- package/dist/dispatch/domains/admin.js.map +0 -1
- package/dist/dispatch/domains/check.d.ts +0 -22
- package/dist/dispatch/domains/check.d.ts.map +0 -1
- package/dist/dispatch/domains/check.js +0 -381
- package/dist/dispatch/domains/check.js.map +0 -1
- package/dist/dispatch/domains/conduit.d.ts +0 -38
- package/dist/dispatch/domains/conduit.d.ts.map +0 -1
- package/dist/dispatch/domains/conduit.js +0 -247
- package/dist/dispatch/domains/conduit.js.map +0 -1
- package/dist/dispatch/domains/index.d.ts +0 -28
- package/dist/dispatch/domains/index.d.ts.map +0 -1
- package/dist/dispatch/domains/index.js +0 -43
- package/dist/dispatch/domains/index.js.map +0 -1
- package/dist/dispatch/domains/intelligence.d.ts +0 -26
- package/dist/dispatch/domains/intelligence.d.ts.map +0 -1
- package/dist/dispatch/domains/intelligence.js +0 -154
- package/dist/dispatch/domains/intelligence.js.map +0 -1
- package/dist/dispatch/domains/memory.d.ts +0 -22
- package/dist/dispatch/domains/memory.d.ts.map +0 -1
- package/dist/dispatch/domains/memory.js +0 -387
- package/dist/dispatch/domains/memory.js.map +0 -1
- package/dist/dispatch/domains/nexus.d.ts +0 -22
- package/dist/dispatch/domains/nexus.d.ts.map +0 -1
- package/dist/dispatch/domains/nexus.js +0 -286
- package/dist/dispatch/domains/nexus.js.map +0 -1
- package/dist/dispatch/domains/orchestrate.d.ts +0 -26
- package/dist/dispatch/domains/orchestrate.d.ts.map +0 -1
- package/dist/dispatch/domains/orchestrate.js +0 -691
- package/dist/dispatch/domains/orchestrate.js.map +0 -1
- package/dist/dispatch/domains/pipeline.d.ts +0 -35
- package/dist/dispatch/domains/pipeline.d.ts.map +0 -1
- package/dist/dispatch/domains/pipeline.js +0 -593
- package/dist/dispatch/domains/pipeline.js.map +0 -1
- package/dist/dispatch/domains/session.d.ts +0 -22
- package/dist/dispatch/domains/session.d.ts.map +0 -1
- package/dist/dispatch/domains/session.js +0 -267
- package/dist/dispatch/domains/session.js.map +0 -1
- package/dist/dispatch/domains/sticky.d.ts +0 -20
- package/dist/dispatch/domains/sticky.d.ts.map +0 -1
- package/dist/dispatch/domains/sticky.js +0 -167
- package/dist/dispatch/domains/sticky.js.map +0 -1
- package/dist/dispatch/domains/tasks.d.ts +0 -25
- package/dist/dispatch/domains/tasks.d.ts.map +0 -1
- package/dist/dispatch/domains/tasks.js +0 -368
- package/dist/dispatch/domains/tasks.js.map +0 -1
- package/dist/dispatch/domains/tools.d.ts +0 -37
- package/dist/dispatch/domains/tools.d.ts.map +0 -1
- package/dist/dispatch/domains/tools.js +0 -481
- package/dist/dispatch/domains/tools.js.map +0 -1
- package/dist/dispatch/engines/_error.d.ts +0 -119
- package/dist/dispatch/engines/_error.d.ts.map +0 -1
- package/dist/dispatch/engines/_error.js +0 -298
- package/dist/dispatch/engines/_error.js.map +0 -1
- package/dist/dispatch/engines/code-engine.d.ts +0 -18
- package/dist/dispatch/engines/code-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/code-engine.js +0 -71
- package/dist/dispatch/engines/code-engine.js.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.d.ts +0 -31
- package/dist/dispatch/engines/codebase-map-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.js +0 -43
- package/dist/dispatch/engines/codebase-map-engine.js.map +0 -1
- package/dist/dispatch/engines/config-engine.d.ts +0 -32
- package/dist/dispatch/engines/config-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/config-engine.js +0 -70
- package/dist/dispatch/engines/config-engine.js.map +0 -1
- package/dist/dispatch/engines/hooks-engine.d.ts +0 -96
- package/dist/dispatch/engines/hooks-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/hooks-engine.js +0 -144
- package/dist/dispatch/engines/hooks-engine.js.map +0 -1
- package/dist/dispatch/engines/init-engine.d.ts +0 -56
- package/dist/dispatch/engines/init-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/init-engine.js +0 -78
- package/dist/dispatch/engines/init-engine.js.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.d.ts +0 -66
- package/dist/dispatch/engines/lifecycle-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.js +0 -224
- package/dist/dispatch/engines/lifecycle-engine.js.map +0 -1
- package/dist/dispatch/engines/memory-engine.d.ts +0 -10
- package/dist/dispatch/engines/memory-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/memory-engine.js +0 -10
- package/dist/dispatch/engines/memory-engine.js.map +0 -1
- package/dist/dispatch/engines/nexus-engine.d.ts +0 -167
- package/dist/dispatch/engines/nexus-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/nexus-engine.js +0 -356
- package/dist/dispatch/engines/nexus-engine.js.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.d.ts +0 -141
- package/dist/dispatch/engines/orchestrate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.js +0 -912
- package/dist/dispatch/engines/orchestrate-engine.js.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.d.ts +0 -51
- package/dist/dispatch/engines/pipeline-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.js +0 -191
- package/dist/dispatch/engines/pipeline-engine.js.map +0 -1
- package/dist/dispatch/engines/release-engine.d.ts +0 -94
- package/dist/dispatch/engines/release-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/release-engine.js +0 -763
- package/dist/dispatch/engines/release-engine.js.map +0 -1
- package/dist/dispatch/engines/session-engine.d.ts +0 -387
- package/dist/dispatch/engines/session-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/session-engine.js +0 -924
- package/dist/dispatch/engines/session-engine.js.map +0 -1
- package/dist/dispatch/engines/sticky-engine.d.ts +0 -100
- package/dist/dispatch/engines/sticky-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/sticky-engine.js +0 -181
- package/dist/dispatch/engines/sticky-engine.js.map +0 -1
- package/dist/dispatch/engines/system-engine.d.ts +0 -543
- package/dist/dispatch/engines/system-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/system-engine.js +0 -1273
- package/dist/dispatch/engines/system-engine.js.map +0 -1
- package/dist/dispatch/engines/task-engine.d.ts +0 -971
- package/dist/dispatch/engines/task-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/task-engine.js +0 -1255
- package/dist/dispatch/engines/task-engine.js.map +0 -1
- package/dist/dispatch/engines/template-parser.d.ts +0 -85
- package/dist/dispatch/engines/template-parser.d.ts.map +0 -1
- package/dist/dispatch/engines/template-parser.js +0 -108
- package/dist/dispatch/engines/template-parser.js.map +0 -1
- package/dist/dispatch/engines/tools-engine.d.ts +0 -270
- package/dist/dispatch/engines/tools-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/tools-engine.js +0 -663
- package/dist/dispatch/engines/tools-engine.js.map +0 -1
- package/dist/dispatch/engines/validate-engine.d.ts +0 -218
- package/dist/dispatch/engines/validate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/validate-engine.js +0 -737
- package/dist/dispatch/engines/validate-engine.js.map +0 -1
- package/dist/dispatch/index.d.ts +0 -20
- package/dist/dispatch/index.d.ts.map +0 -1
- package/dist/dispatch/index.js +0 -19
- package/dist/dispatch/index.js.map +0 -1
- package/dist/dispatch/lib/background-jobs.d.ts +0 -86
- package/dist/dispatch/lib/background-jobs.d.ts.map +0 -1
- package/dist/dispatch/lib/background-jobs.js +0 -183
- package/dist/dispatch/lib/background-jobs.js.map +0 -1
- package/dist/dispatch/lib/budget.d.ts +0 -36
- package/dist/dispatch/lib/budget.d.ts.map +0 -1
- package/dist/dispatch/lib/budget.js +0 -109
- package/dist/dispatch/lib/budget.js.map +0 -1
- package/dist/dispatch/lib/capability-matrix.d.ts +0 -11
- package/dist/dispatch/lib/capability-matrix.d.ts.map +0 -1
- package/dist/dispatch/lib/capability-matrix.js +0 -10
- package/dist/dispatch/lib/capability-matrix.js.map +0 -1
- package/dist/dispatch/lib/config-loader.d.ts +0 -42
- package/dist/dispatch/lib/config-loader.d.ts.map +0 -1
- package/dist/dispatch/lib/config-loader.js +0 -217
- package/dist/dispatch/lib/config-loader.js.map +0 -1
- package/dist/dispatch/lib/config.d.ts +0 -11
- package/dist/dispatch/lib/config.d.ts.map +0 -1
- package/dist/dispatch/lib/config.js +0 -10
- package/dist/dispatch/lib/config.js.map +0 -1
- package/dist/dispatch/lib/defaults.d.ts +0 -115
- package/dist/dispatch/lib/defaults.d.ts.map +0 -1
- package/dist/dispatch/lib/defaults.js +0 -61
- package/dist/dispatch/lib/defaults.js.map +0 -1
- package/dist/dispatch/lib/engine.d.ts +0 -26
- package/dist/dispatch/lib/engine.d.ts.map +0 -1
- package/dist/dispatch/lib/engine.js +0 -46
- package/dist/dispatch/lib/engine.js.map +0 -1
- package/dist/dispatch/lib/exit-codes.d.ts +0 -35
- package/dist/dispatch/lib/exit-codes.d.ts.map +0 -1
- package/dist/dispatch/lib/exit-codes.js +0 -60
- package/dist/dispatch/lib/exit-codes.js.map +0 -1
- package/dist/dispatch/lib/gateway-meta.d.ts +0 -37
- package/dist/dispatch/lib/gateway-meta.d.ts.map +0 -1
- package/dist/dispatch/lib/gateway-meta.js +0 -50
- package/dist/dispatch/lib/gateway-meta.js.map +0 -1
- package/dist/dispatch/lib/job-manager-accessor.d.ts +0 -9
- package/dist/dispatch/lib/job-manager-accessor.d.ts.map +0 -1
- package/dist/dispatch/lib/job-manager-accessor.js +0 -13
- package/dist/dispatch/lib/job-manager-accessor.js.map +0 -1
- package/dist/dispatch/lib/meta.d.ts +0 -26
- package/dist/dispatch/lib/meta.d.ts.map +0 -1
- package/dist/dispatch/lib/meta.js +0 -37
- package/dist/dispatch/lib/meta.js.map +0 -1
- package/dist/dispatch/lib/param-utils.d.ts +0 -11
- package/dist/dispatch/lib/param-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/param-utils.js +0 -10
- package/dist/dispatch/lib/param-utils.js.map +0 -1
- package/dist/dispatch/lib/projections.d.ts +0 -56
- package/dist/dispatch/lib/projections.d.ts.map +0 -1
- package/dist/dispatch/lib/projections.js +0 -65
- package/dist/dispatch/lib/projections.js.map +0 -1
- package/dist/dispatch/lib/proto-envelope.d.ts +0 -56
- package/dist/dispatch/lib/proto-envelope.d.ts.map +0 -1
- package/dist/dispatch/lib/proto-envelope.js +0 -17
- package/dist/dispatch/lib/proto-envelope.js.map +0 -1
- package/dist/dispatch/lib/schema-utils.d.ts +0 -39
- package/dist/dispatch/lib/schema-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/schema-utils.js +0 -88
- package/dist/dispatch/lib/schema-utils.js.map +0 -1
- package/dist/dispatch/lib/security.d.ts +0 -11
- package/dist/dispatch/lib/security.d.ts.map +0 -1
- package/dist/dispatch/lib/security.js +0 -10
- package/dist/dispatch/lib/security.js.map +0 -1
- package/dist/dispatch/middleware/audit.d.ts +0 -23
- package/dist/dispatch/middleware/audit.d.ts.map +0 -1
- package/dist/dispatch/middleware/audit.js +0 -169
- package/dist/dispatch/middleware/audit.js.map +0 -1
- package/dist/dispatch/middleware/field-filter.d.ts +0 -25
- package/dist/dispatch/middleware/field-filter.d.ts.map +0 -1
- package/dist/dispatch/middleware/field-filter.js +0 -70
- package/dist/dispatch/middleware/field-filter.js.map +0 -1
- package/dist/dispatch/middleware/pipeline.d.ts +0 -33
- package/dist/dispatch/middleware/pipeline.d.ts.map +0 -1
- package/dist/dispatch/middleware/pipeline.js +0 -60
- package/dist/dispatch/middleware/pipeline.js.map +0 -1
- package/dist/dispatch/middleware/projection.d.ts +0 -35
- package/dist/dispatch/middleware/projection.d.ts.map +0 -1
- package/dist/dispatch/middleware/projection.js +0 -146
- package/dist/dispatch/middleware/projection.js.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.d.ts +0 -30
- package/dist/dispatch/middleware/protocol-enforcement.d.ts.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.js +0 -56
- package/dist/dispatch/middleware/protocol-enforcement.js.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.d.ts +0 -72
- package/dist/dispatch/middleware/rate-limiter.d.ts.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.js +0 -127
- package/dist/dispatch/middleware/rate-limiter.js.map +0 -1
- package/dist/dispatch/middleware/sanitizer.d.ts +0 -24
- package/dist/dispatch/middleware/sanitizer.d.ts.map +0 -1
- package/dist/dispatch/middleware/sanitizer.js +0 -56
- package/dist/dispatch/middleware/sanitizer.js.map +0 -1
- package/dist/dispatch/middleware/session-resolver.d.ts +0 -26
- package/dist/dispatch/middleware/session-resolver.d.ts.map +0 -1
- package/dist/dispatch/middleware/session-resolver.js +0 -65
- package/dist/dispatch/middleware/session-resolver.js.map +0 -1
- package/dist/dispatch/middleware/verification-gates.d.ts +0 -22
- package/dist/dispatch/middleware/verification-gates.d.ts.map +0 -1
- package/dist/dispatch/middleware/verification-gates.js +0 -59
- package/dist/dispatch/middleware/verification-gates.js.map +0 -1
- package/dist/dispatch/registry.d.ts +0 -91
- package/dist/dispatch/registry.d.ts.map +0 -1
- package/dist/dispatch/registry.js +0 -3457
- package/dist/dispatch/registry.js.map +0 -1
- package/dist/dispatch/types.d.ts +0 -206
- package/dist/dispatch/types.d.ts.map +0 -1
- package/dist/dispatch/types.js +0 -26
- package/dist/dispatch/types.js.map +0 -1
|
@@ -1,1163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI nexus command group - Cross-project NEXUS operations.
|
|
3
|
-
*
|
|
4
|
-
* Thin CLI wrappers routing through the dispatch layer.
|
|
5
|
-
* All business logic lives in src/dispatch/domains/nexus.ts.
|
|
6
|
-
*
|
|
7
|
-
* `nexus analyze` is implemented directly here because it requires
|
|
8
|
-
* `@cleocode/nexus` pipeline access and `@cleocode/core` DB access together,
|
|
9
|
-
* and routing through the dispatch layer would create awkward coupling.
|
|
10
|
-
*
|
|
11
|
-
* @task T4554, T5323, T5330, T481, T534
|
|
12
|
-
* @epic T4545
|
|
13
|
-
*/
|
|
14
|
-
import path from 'node:path';
|
|
15
|
-
import { dispatchFromCli } from '../../dispatch/adapters/cli.js';
|
|
16
|
-
/**
|
|
17
|
-
* Priority score for nexus node kinds when ranking symbol search results.
|
|
18
|
-
*
|
|
19
|
-
* Callable symbols (function, method) rank highest so that `nexus context`
|
|
20
|
-
* and `nexus impact` return meaningful callers/callees instead of
|
|
21
|
-
* file/folder structural nodes which have zero `calls` relations.
|
|
22
|
-
*
|
|
23
|
-
* Lower score = higher priority (sort ascending).
|
|
24
|
-
*/
|
|
25
|
-
const NODE_KIND_PRIORITY = {
|
|
26
|
-
function: 0,
|
|
27
|
-
method: 1,
|
|
28
|
-
constructor: 2,
|
|
29
|
-
class: 3,
|
|
30
|
-
interface: 4,
|
|
31
|
-
type_alias: 5,
|
|
32
|
-
enum: 6,
|
|
33
|
-
constant: 7,
|
|
34
|
-
property: 8,
|
|
35
|
-
variable: 9,
|
|
36
|
-
static: 10,
|
|
37
|
-
struct: 11,
|
|
38
|
-
trait: 12,
|
|
39
|
-
impl: 13,
|
|
40
|
-
macro: 14,
|
|
41
|
-
// Structural/module nodes come last — they have no `calls` relations
|
|
42
|
-
module: 20,
|
|
43
|
-
namespace: 21,
|
|
44
|
-
record: 22,
|
|
45
|
-
delegate: 23,
|
|
46
|
-
union: 24,
|
|
47
|
-
typedef: 25,
|
|
48
|
-
annotation: 26,
|
|
49
|
-
template: 27,
|
|
50
|
-
route: 28,
|
|
51
|
-
tool: 29,
|
|
52
|
-
section: 30,
|
|
53
|
-
import: 31,
|
|
54
|
-
export: 32,
|
|
55
|
-
type: 33,
|
|
56
|
-
file: 40,
|
|
57
|
-
folder: 41,
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Sort symbol search results so that callable nodes (function, method, class)
|
|
61
|
-
* appear before structural nodes (file, folder). Within the same kind, prefer
|
|
62
|
-
* exact name matches over partial matches.
|
|
63
|
-
*/
|
|
64
|
-
function sortMatchingNodes(nodes, symbolName) {
|
|
65
|
-
const lowerSymbol = symbolName.toLowerCase();
|
|
66
|
-
return [...nodes].sort((a, b) => {
|
|
67
|
-
const kindA = String(a['kind'] ?? '');
|
|
68
|
-
const kindB = String(b['kind'] ?? '');
|
|
69
|
-
const prioA = NODE_KIND_PRIORITY[kindA] ?? 15;
|
|
70
|
-
const prioB = NODE_KIND_PRIORITY[kindB] ?? 15;
|
|
71
|
-
if (prioA !== prioB)
|
|
72
|
-
return prioA - prioB;
|
|
73
|
-
// Within same kind: exact name matches before partial matches
|
|
74
|
-
const nameA = String(a['name'] ?? '').toLowerCase();
|
|
75
|
-
const nameB = String(b['name'] ?? '').toLowerCase();
|
|
76
|
-
const exactA = nameA === lowerSymbol ? 0 : 1;
|
|
77
|
-
const exactB = nameB === lowerSymbol ? 0 : 1;
|
|
78
|
-
return exactA - exactB;
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Register the nexus command group.
|
|
83
|
-
* @task T4554
|
|
84
|
-
*/
|
|
85
|
-
export function registerNexusCommand(program) {
|
|
86
|
-
const nexus = program.command('nexus').description('Cross-project NEXUS operations');
|
|
87
|
-
// ── nexus init ──────────────────────────────────────────────────────
|
|
88
|
-
nexus
|
|
89
|
-
.command('init')
|
|
90
|
-
.description('Initialize NEXUS directory structure and registry')
|
|
91
|
-
.action(async () => {
|
|
92
|
-
await dispatchFromCli('mutate', 'nexus', 'init', {}, { command: 'nexus' });
|
|
93
|
-
});
|
|
94
|
-
// ── nexus register ──────────────────────────────────────────────────
|
|
95
|
-
nexus
|
|
96
|
-
.command('register <path>')
|
|
97
|
-
.description('Register a project in the global registry')
|
|
98
|
-
.option('--name <name>', 'Custom project name (default: directory name)')
|
|
99
|
-
.option('--permissions <perms>', 'Permissions: read|write|execute', 'read')
|
|
100
|
-
.action(async (projectPath, opts) => {
|
|
101
|
-
await dispatchFromCli('mutate', 'nexus', 'register', {
|
|
102
|
-
path: projectPath,
|
|
103
|
-
name: opts['name'],
|
|
104
|
-
permission: opts['permissions'],
|
|
105
|
-
}, { command: 'nexus' });
|
|
106
|
-
});
|
|
107
|
-
// ── nexus unregister ────────────────────────────────────────────────
|
|
108
|
-
nexus
|
|
109
|
-
.command('unregister <nameOrHash>')
|
|
110
|
-
.description('Remove a project from the registry')
|
|
111
|
-
.action(async (nameOrHash) => {
|
|
112
|
-
await dispatchFromCli('mutate', 'nexus', 'unregister', {
|
|
113
|
-
name: nameOrHash,
|
|
114
|
-
}, { command: 'nexus' });
|
|
115
|
-
});
|
|
116
|
-
// ── nexus list ──────────────────────────────────────────────────────
|
|
117
|
-
nexus
|
|
118
|
-
.command('list')
|
|
119
|
-
.description('List all registered projects')
|
|
120
|
-
.action(async () => {
|
|
121
|
-
await dispatchFromCli('query', 'nexus', 'list', {}, { command: 'nexus' });
|
|
122
|
-
});
|
|
123
|
-
// ── nexus status ────────────────────────────────────────────────────
|
|
124
|
-
// Shows both NEXUS registry status AND code intelligence index freshness.
|
|
125
|
-
// When invoked with a path, shows index freshness for that project.
|
|
126
|
-
nexus
|
|
127
|
-
.command('status [path]')
|
|
128
|
-
.description('Show code intelligence index freshness: file count, node/relation counts, last indexed time, stale files. Falls back to NEXUS registry status if code-intelligence index is unavailable.')
|
|
129
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from path)')
|
|
130
|
-
.option('--json', 'Output as JSON (LAFS envelope format)')
|
|
131
|
-
.action(async (targetPath, opts) => {
|
|
132
|
-
const jsonOutput = !!opts['json'];
|
|
133
|
-
const projectIdOverride = opts['projectId'];
|
|
134
|
-
const repoPath = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
135
|
-
const startTime = Date.now();
|
|
136
|
-
try {
|
|
137
|
-
const [{ getNexusDb, nexusSchema }, { getIndexStats }] = await Promise.all([
|
|
138
|
-
import('@cleocode/core/store/nexus-sqlite'),
|
|
139
|
-
import('@cleocode/nexus/pipeline'),
|
|
140
|
-
]);
|
|
141
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
142
|
-
const db = await getNexusDb();
|
|
143
|
-
const tables = {
|
|
144
|
-
nexusNodes: nexusSchema.nexusNodes,
|
|
145
|
-
nexusRelations: nexusSchema.nexusRelations,
|
|
146
|
-
};
|
|
147
|
-
const stats = await getIndexStats(projectId, repoPath, db, tables);
|
|
148
|
-
const durationMs = Date.now() - startTime;
|
|
149
|
-
if (jsonOutput) {
|
|
150
|
-
const envelope = {
|
|
151
|
-
success: true,
|
|
152
|
-
data: { projectId, repoPath, ...stats },
|
|
153
|
-
meta: {
|
|
154
|
-
operation: 'nexus.status',
|
|
155
|
-
duration_ms: durationMs,
|
|
156
|
-
timestamp: new Date().toISOString(),
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
process.stdout.write(JSON.stringify(envelope, null, 2) + '\n');
|
|
160
|
-
}
|
|
161
|
-
else if (!stats.indexed) {
|
|
162
|
-
process.stdout.write(`[nexus] Index status for: ${repoPath}\n` +
|
|
163
|
-
` Status: NOT INDEXED\n` +
|
|
164
|
-
` Run 'cleo nexus analyze' to build the index.\n`);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
const staleLabel = stats.staleFileCount < 0
|
|
168
|
-
? 'unknown'
|
|
169
|
-
: stats.staleFileCount === 0
|
|
170
|
-
? 'up to date'
|
|
171
|
-
: `${stats.staleFileCount} stale`;
|
|
172
|
-
process.stdout.write(`[nexus] Index status for: ${repoPath}\n` +
|
|
173
|
-
` Project ID: ${projectId}\n` +
|
|
174
|
-
` Nodes: ${stats.nodeCount}\n` +
|
|
175
|
-
` Relations: ${stats.relationCount}\n` +
|
|
176
|
-
` Files: ${stats.fileCount}\n` +
|
|
177
|
-
` Last indexed: ${stats.lastIndexedAt ?? 'never'}\n` +
|
|
178
|
-
` Staleness: ${staleLabel}\n`);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch (err) {
|
|
182
|
-
// Fall back to NEXUS registry status on error
|
|
183
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
184
|
-
if (jsonOutput) {
|
|
185
|
-
process.stdout.write(JSON.stringify({
|
|
186
|
-
success: false,
|
|
187
|
-
error: { code: 'E_STATUS_FAILED', message: msg },
|
|
188
|
-
meta: {
|
|
189
|
-
operation: 'nexus.status',
|
|
190
|
-
duration_ms: Date.now() - startTime,
|
|
191
|
-
timestamp: new Date().toISOString(),
|
|
192
|
-
},
|
|
193
|
-
}, null, 2) + '\n');
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
197
|
-
await dispatchFromCli('query', 'nexus', 'status', {}, { command: 'nexus' });
|
|
198
|
-
}
|
|
199
|
-
process.exitCode = 1;
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
// ── nexus show ─────────────────────────────────────────────────────
|
|
203
|
-
nexus
|
|
204
|
-
.command('show <name>')
|
|
205
|
-
.description('Show details for a registered project by name')
|
|
206
|
-
.action(async (name) => {
|
|
207
|
-
await dispatchFromCli('query', 'nexus', 'show', {
|
|
208
|
-
name,
|
|
209
|
-
}, { command: 'nexus' });
|
|
210
|
-
});
|
|
211
|
-
// ── nexus resolve ───────────────────────────────────────────────────
|
|
212
|
-
nexus
|
|
213
|
-
.command('resolve <taskRef>')
|
|
214
|
-
.alias('query')
|
|
215
|
-
.description('Resolve a task reference across projects (project:T### or T###)')
|
|
216
|
-
.action(async (taskRef) => {
|
|
217
|
-
await dispatchFromCli('query', 'nexus', 'resolve', {
|
|
218
|
-
query: taskRef,
|
|
219
|
-
}, { command: 'nexus' });
|
|
220
|
-
});
|
|
221
|
-
// ── nexus discover ──────────────────────────────────────────────────
|
|
222
|
-
nexus
|
|
223
|
-
.command('discover <taskQuery>')
|
|
224
|
-
.description('Find related tasks across projects')
|
|
225
|
-
.option('--method <method>', 'Discovery method: labels|description|files|auto', 'auto')
|
|
226
|
-
.option('--limit <n>', 'Max results', parseInt, 10)
|
|
227
|
-
.action(async (taskQuery, opts) => {
|
|
228
|
-
await dispatchFromCli('query', 'nexus', 'discover', {
|
|
229
|
-
query: taskQuery,
|
|
230
|
-
method: opts['method'],
|
|
231
|
-
limit: opts['limit'],
|
|
232
|
-
}, { command: 'nexus' });
|
|
233
|
-
});
|
|
234
|
-
// ── nexus search ────────────────────────────────────────────────────
|
|
235
|
-
nexus
|
|
236
|
-
.command('search <pattern>')
|
|
237
|
-
.description('Search tasks across projects by pattern')
|
|
238
|
-
.option('--project <name>', 'Limit search to specific project')
|
|
239
|
-
.option('--limit <n>', 'Max results', parseInt, 20)
|
|
240
|
-
.action(async (pattern, opts) => {
|
|
241
|
-
await dispatchFromCli('query', 'nexus', 'search', {
|
|
242
|
-
pattern,
|
|
243
|
-
project: opts['project'],
|
|
244
|
-
limit: opts['limit'],
|
|
245
|
-
}, { command: 'nexus' });
|
|
246
|
-
});
|
|
247
|
-
// ── nexus deps ──────────────────────────────────────────────────────
|
|
248
|
-
nexus
|
|
249
|
-
.command('deps <taskQuery>')
|
|
250
|
-
.description('Show cross-project dependencies')
|
|
251
|
-
.option('--reverse', 'Show reverse dependencies (what depends on this)')
|
|
252
|
-
.action(async (taskQuery, opts) => {
|
|
253
|
-
await dispatchFromCli('query', 'nexus', 'deps', {
|
|
254
|
-
query: taskQuery,
|
|
255
|
-
direction: opts['reverse'] ? 'reverse' : 'forward',
|
|
256
|
-
}, { command: 'nexus' });
|
|
257
|
-
});
|
|
258
|
-
// ── nexus critical-path ───────────────────────────────────────────
|
|
259
|
-
nexus
|
|
260
|
-
.command('critical-path')
|
|
261
|
-
.description('Show global critical path across all registered projects')
|
|
262
|
-
.action(async () => {
|
|
263
|
-
await dispatchFromCli('query', 'nexus', 'path.show', {}, { command: 'nexus' });
|
|
264
|
-
});
|
|
265
|
-
// ── nexus blocking ────────────────────────────────────────────────
|
|
266
|
-
nexus
|
|
267
|
-
.command('blocking <taskQuery>')
|
|
268
|
-
.description('Show blocking impact analysis for a task')
|
|
269
|
-
.action(async (taskQuery) => {
|
|
270
|
-
await dispatchFromCli('query', 'nexus', 'blockers.show', {
|
|
271
|
-
query: taskQuery,
|
|
272
|
-
}, { command: 'nexus' });
|
|
273
|
-
});
|
|
274
|
-
// ── nexus orphans ─────────────────────────────────────────────────
|
|
275
|
-
nexus
|
|
276
|
-
.command('orphans')
|
|
277
|
-
.description('Detect broken cross-project dependency references')
|
|
278
|
-
.action(async () => {
|
|
279
|
-
await dispatchFromCli('query', 'nexus', 'orphans.list', {}, { command: 'nexus' });
|
|
280
|
-
});
|
|
281
|
-
// ── nexus sync ──────────────────────────────────────────────────────
|
|
282
|
-
nexus
|
|
283
|
-
.command('sync [project]')
|
|
284
|
-
.description('Sync project metadata (task count, labels)')
|
|
285
|
-
.action(async (project) => {
|
|
286
|
-
if (project) {
|
|
287
|
-
await dispatchFromCli('mutate', 'nexus', 'sync', {
|
|
288
|
-
name: project,
|
|
289
|
-
}, { command: 'nexus' });
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
await dispatchFromCli('mutate', 'nexus', 'sync', {}, { command: 'nexus' });
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
// ── nexus reconcile ──────────────────────────────────────────────────
|
|
296
|
-
nexus
|
|
297
|
-
.command('reconcile')
|
|
298
|
-
.description('Reconcile current project with NEXUS registry (auto-register if new, update path if moved)')
|
|
299
|
-
.option('--path <path>', 'Project path (default: current directory)')
|
|
300
|
-
.action(async (opts) => {
|
|
301
|
-
await dispatchFromCli('mutate', 'nexus', 'reconcile', {
|
|
302
|
-
projectRoot: opts['path'],
|
|
303
|
-
}, { command: 'nexus' });
|
|
304
|
-
});
|
|
305
|
-
// ── nexus graph ───────────────────────────────────────────────────
|
|
306
|
-
nexus
|
|
307
|
-
.command('graph')
|
|
308
|
-
.description('Show full dependency graph across all registered projects')
|
|
309
|
-
.action(async () => {
|
|
310
|
-
await dispatchFromCli('query', 'nexus', 'graph', {}, { command: 'nexus' });
|
|
311
|
-
});
|
|
312
|
-
// ── nexus share-status ────────────────────────────────────────────
|
|
313
|
-
nexus
|
|
314
|
-
.command('share-status')
|
|
315
|
-
.description('Show multi-contributor sharing status for the current project')
|
|
316
|
-
.action(async () => {
|
|
317
|
-
await dispatchFromCli('query', 'nexus', 'share.status', {}, { command: 'nexus' });
|
|
318
|
-
});
|
|
319
|
-
// ── nexus transfer-preview ────────────────────────────────────────
|
|
320
|
-
nexus
|
|
321
|
-
.command('transfer-preview <taskIds...>')
|
|
322
|
-
.description('Preview a task transfer between projects (dry-run, no changes made)')
|
|
323
|
-
.requiredOption('--from <project>', 'Source project name')
|
|
324
|
-
.requiredOption('--to <project>', 'Target project name')
|
|
325
|
-
.option('--mode <mode>', 'Transfer mode: copy|move', 'copy')
|
|
326
|
-
.option('--scope <scope>', 'Transfer scope: single|subtree', 'subtree')
|
|
327
|
-
.action(async (taskIds, opts) => {
|
|
328
|
-
await dispatchFromCli('query', 'nexus', 'transfer.preview', {
|
|
329
|
-
taskIds,
|
|
330
|
-
sourceProject: opts['from'],
|
|
331
|
-
targetProject: opts['to'],
|
|
332
|
-
mode: opts['mode'],
|
|
333
|
-
scope: opts['scope'],
|
|
334
|
-
}, { command: 'nexus' });
|
|
335
|
-
});
|
|
336
|
-
// ── nexus transfer ────────────────────────────────────────────────
|
|
337
|
-
nexus
|
|
338
|
-
.command('transfer <taskIds...>')
|
|
339
|
-
.description('Transfer tasks from one project to another')
|
|
340
|
-
.requiredOption('--from <project>', 'Source project name')
|
|
341
|
-
.requiredOption('--to <project>', 'Target project name')
|
|
342
|
-
.option('--mode <mode>', 'Transfer mode: copy|move', 'copy')
|
|
343
|
-
.option('--scope <scope>', 'Transfer scope: single|subtree', 'subtree')
|
|
344
|
-
.option('--on-conflict <strategy>', 'Conflict strategy: rename|skip|duplicate|fail', 'rename')
|
|
345
|
-
.option('--transfer-brain', 'Also transfer associated brain memory entries', false)
|
|
346
|
-
.action(async (taskIds, opts) => {
|
|
347
|
-
await dispatchFromCli('mutate', 'nexus', 'transfer', {
|
|
348
|
-
taskIds,
|
|
349
|
-
sourceProject: opts['from'],
|
|
350
|
-
targetProject: opts['to'],
|
|
351
|
-
mode: opts['mode'],
|
|
352
|
-
scope: opts['scope'],
|
|
353
|
-
onConflict: opts['onConflict'],
|
|
354
|
-
transferBrain: opts['transferBrain'],
|
|
355
|
-
}, { command: 'nexus' });
|
|
356
|
-
});
|
|
357
|
-
// ── nexus permission ──────────────────────────────────────────────
|
|
358
|
-
const permission = nexus
|
|
359
|
-
.command('permission')
|
|
360
|
-
.description('Manage permissions for registered projects');
|
|
361
|
-
permission
|
|
362
|
-
.command('set <name> <level>')
|
|
363
|
-
.description('Set permission level for a registered project (read|write|execute)')
|
|
364
|
-
.action(async (name, level) => {
|
|
365
|
-
await dispatchFromCli('mutate', 'nexus', 'permission.set', {
|
|
366
|
-
name,
|
|
367
|
-
level,
|
|
368
|
-
}, { command: 'nexus' });
|
|
369
|
-
});
|
|
370
|
-
// ── nexus share ───────────────────────────────────────────────────
|
|
371
|
-
const share = nexus.command('share').description('Multi-contributor sharing operations');
|
|
372
|
-
share
|
|
373
|
-
.command('export')
|
|
374
|
-
.description('Export a snapshot of current project state for sharing')
|
|
375
|
-
.option('--output <path>', 'Output file path (default: auto-generated in current directory)')
|
|
376
|
-
.action(async (opts) => {
|
|
377
|
-
await dispatchFromCli('mutate', 'nexus', 'share.snapshot.export', {
|
|
378
|
-
outputPath: opts['output'],
|
|
379
|
-
}, { command: 'nexus' });
|
|
380
|
-
});
|
|
381
|
-
share
|
|
382
|
-
.command('import <file>')
|
|
383
|
-
.description('Import a shared project snapshot')
|
|
384
|
-
.action(async (file) => {
|
|
385
|
-
await dispatchFromCli('mutate', 'nexus', 'share.snapshot.import', {
|
|
386
|
-
inputPath: file,
|
|
387
|
-
}, { command: 'nexus' });
|
|
388
|
-
});
|
|
389
|
-
// ── nexus clusters ────────────────────────────────────────────────────────
|
|
390
|
-
nexus
|
|
391
|
-
.command('clusters [path]')
|
|
392
|
-
.description('List all detected communities (Louvain clusters) from the last analysis')
|
|
393
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
394
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from path)')
|
|
395
|
-
.action(async (targetPath, opts) => {
|
|
396
|
-
const startTime = Date.now();
|
|
397
|
-
const jsonOutput = !!opts['json'];
|
|
398
|
-
const projectIdOverride = opts['projectId'];
|
|
399
|
-
const repoPath = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
400
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
401
|
-
try {
|
|
402
|
-
const { getNexusDb, nexusSchema } = await import('@cleocode/core/store/nexus-sqlite');
|
|
403
|
-
const db = await getNexusDb();
|
|
404
|
-
// Query all nodes for this project, filter to community kind in-memory
|
|
405
|
-
// (avoids complex Drizzle where clause on an enum column).
|
|
406
|
-
// NodeSQLiteDatabase uses sync Drizzle — .all() returns a plain array,
|
|
407
|
-
// not a Promise, so wrap in try-catch rather than using .catch().
|
|
408
|
-
let rows = [];
|
|
409
|
-
try {
|
|
410
|
-
rows = db.select().from(nexusSchema.nexusNodes).all();
|
|
411
|
-
}
|
|
412
|
-
catch {
|
|
413
|
-
rows = [];
|
|
414
|
-
}
|
|
415
|
-
const communities = rows.filter((r) => r['kind'] === 'community' && r['projectId'] === projectId);
|
|
416
|
-
const durationMs = Date.now() - startTime;
|
|
417
|
-
if (jsonOutput) {
|
|
418
|
-
process.stdout.write(JSON.stringify({
|
|
419
|
-
success: true,
|
|
420
|
-
data: {
|
|
421
|
-
projectId,
|
|
422
|
-
repoPath,
|
|
423
|
-
count: communities.length,
|
|
424
|
-
communities: communities.map((c) => {
|
|
425
|
-
const meta = typeof c['metaJson'] === 'string'
|
|
426
|
-
? JSON.parse(c['metaJson'])
|
|
427
|
-
: {};
|
|
428
|
-
return {
|
|
429
|
-
id: c['id'],
|
|
430
|
-
label: c['label'],
|
|
431
|
-
symbolCount: meta['symbolCount'] ?? 0,
|
|
432
|
-
cohesion: meta['cohesion'] ?? 0,
|
|
433
|
-
};
|
|
434
|
-
}),
|
|
435
|
-
},
|
|
436
|
-
meta: {
|
|
437
|
-
operation: 'nexus.clusters',
|
|
438
|
-
duration_ms: durationMs,
|
|
439
|
-
timestamp: new Date().toISOString(),
|
|
440
|
-
},
|
|
441
|
-
}, null, 2) + '\n');
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
if (communities.length === 0) {
|
|
445
|
-
process.stdout.write(`[nexus] No communities found for project ${projectId}.\n` +
|
|
446
|
-
` Run 'cleo nexus analyze' first.\n`);
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
process.stdout.write(`[nexus] Communities for project ${projectId} (${communities.length} total):\n`);
|
|
450
|
-
for (const c of communities) {
|
|
451
|
-
const meta = typeof c['metaJson'] === 'string'
|
|
452
|
-
? JSON.parse(c['metaJson'])
|
|
453
|
-
: {};
|
|
454
|
-
const symbolCount = meta['symbolCount'] ?? 0;
|
|
455
|
-
const cohesion = typeof meta['cohesion'] === 'number'
|
|
456
|
-
? meta['cohesion'].toFixed(3)
|
|
457
|
-
: '0.000';
|
|
458
|
-
process.stdout.write(` ${String(c['id']).padEnd(16)} label=${String(c['label']).padEnd(24)} symbols=${String(symbolCount).padStart(5)} cohesion=${cohesion}\n`);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
catch (err) {
|
|
464
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
465
|
-
if (jsonOutput) {
|
|
466
|
-
process.stdout.write(JSON.stringify({
|
|
467
|
-
success: false,
|
|
468
|
-
error: { code: 'E_CLUSTERS_FAILED', message: msg },
|
|
469
|
-
meta: {
|
|
470
|
-
operation: 'nexus.clusters',
|
|
471
|
-
duration_ms: Date.now() - startTime,
|
|
472
|
-
timestamp: new Date().toISOString(),
|
|
473
|
-
},
|
|
474
|
-
}, null, 2) + '\n');
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
478
|
-
}
|
|
479
|
-
process.exitCode = 1;
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
// ── nexus flows ───────────────────────────────────────────────────────────
|
|
483
|
-
nexus
|
|
484
|
-
.command('flows [path]')
|
|
485
|
-
.description('List all detected execution flows (processes) from the last analysis')
|
|
486
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
487
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from path)')
|
|
488
|
-
.action(async (targetPath, opts) => {
|
|
489
|
-
const startTime = Date.now();
|
|
490
|
-
const jsonOutput = !!opts['json'];
|
|
491
|
-
const projectIdOverride = opts['projectId'];
|
|
492
|
-
const repoPath = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
493
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
494
|
-
try {
|
|
495
|
-
const { getNexusDb, nexusSchema } = await import('@cleocode/core/store/nexus-sqlite');
|
|
496
|
-
const db = await getNexusDb();
|
|
497
|
-
// NodeSQLiteDatabase uses sync Drizzle — .all() returns a plain array,
|
|
498
|
-
// not a Promise, so wrap in try-catch rather than using .catch().
|
|
499
|
-
let rows = [];
|
|
500
|
-
try {
|
|
501
|
-
rows = db.select().from(nexusSchema.nexusNodes).all();
|
|
502
|
-
}
|
|
503
|
-
catch {
|
|
504
|
-
rows = [];
|
|
505
|
-
}
|
|
506
|
-
const processes = rows.filter((r) => r['kind'] === 'process' && r['projectId'] === projectId);
|
|
507
|
-
const durationMs = Date.now() - startTime;
|
|
508
|
-
if (jsonOutput) {
|
|
509
|
-
process.stdout.write(JSON.stringify({
|
|
510
|
-
success: true,
|
|
511
|
-
data: {
|
|
512
|
-
projectId,
|
|
513
|
-
repoPath,
|
|
514
|
-
count: processes.length,
|
|
515
|
-
flows: processes.map((p) => {
|
|
516
|
-
const meta = typeof p['metaJson'] === 'string'
|
|
517
|
-
? JSON.parse(p['metaJson'])
|
|
518
|
-
: {};
|
|
519
|
-
return {
|
|
520
|
-
id: p['id'],
|
|
521
|
-
label: p['label'],
|
|
522
|
-
stepCount: meta['stepCount'] ?? 0,
|
|
523
|
-
processType: meta['processType'] ?? 'intra_community',
|
|
524
|
-
entryPointId: meta['entryPointId'] ?? null,
|
|
525
|
-
};
|
|
526
|
-
}),
|
|
527
|
-
},
|
|
528
|
-
meta: {
|
|
529
|
-
operation: 'nexus.flows',
|
|
530
|
-
duration_ms: durationMs,
|
|
531
|
-
timestamp: new Date().toISOString(),
|
|
532
|
-
},
|
|
533
|
-
}, null, 2) + '\n');
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
if (processes.length === 0) {
|
|
537
|
-
process.stdout.write(`[nexus] No execution flows found for project ${projectId}.\n` +
|
|
538
|
-
` Run 'cleo nexus analyze' first.\n`);
|
|
539
|
-
}
|
|
540
|
-
else {
|
|
541
|
-
process.stdout.write(`[nexus] Execution flows for project ${projectId} (${processes.length} total):\n`);
|
|
542
|
-
for (const p of processes) {
|
|
543
|
-
const meta = typeof p['metaJson'] === 'string'
|
|
544
|
-
? JSON.parse(p['metaJson'])
|
|
545
|
-
: {};
|
|
546
|
-
const stepCount = meta['stepCount'] ?? 0;
|
|
547
|
-
const processType = String(meta['processType'] ?? 'intra').replace('_community', '');
|
|
548
|
-
process.stdout.write(` ${String(p['id']).padEnd(30)} steps=${String(stepCount).padStart(3)} type=${processType.padEnd(12)} ${String(p['label'])}\n`);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
catch (err) {
|
|
554
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
555
|
-
if (jsonOutput) {
|
|
556
|
-
process.stdout.write(JSON.stringify({
|
|
557
|
-
success: false,
|
|
558
|
-
error: { code: 'E_FLOWS_FAILED', message: msg },
|
|
559
|
-
meta: {
|
|
560
|
-
operation: 'nexus.flows',
|
|
561
|
-
duration_ms: Date.now() - startTime,
|
|
562
|
-
timestamp: new Date().toISOString(),
|
|
563
|
-
},
|
|
564
|
-
}, null, 2) + '\n');
|
|
565
|
-
}
|
|
566
|
-
else {
|
|
567
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
568
|
-
}
|
|
569
|
-
process.exitCode = 1;
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
// ── nexus context ─────────────────────────────────────────────────────────
|
|
573
|
-
nexus
|
|
574
|
-
.command('context <symbol>')
|
|
575
|
-
.description('Show callers, callees, community membership, and process participation for a code symbol')
|
|
576
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
577
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from cwd)')
|
|
578
|
-
.option('--limit <n>', 'Max callers/callees to show per side', parseInt, 20)
|
|
579
|
-
.action(async (symbolName, opts) => {
|
|
580
|
-
const startTime = Date.now();
|
|
581
|
-
const jsonOutput = !!opts['json'];
|
|
582
|
-
const projectIdOverride = opts['projectId'];
|
|
583
|
-
const repoPath = process.cwd();
|
|
584
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
585
|
-
const limit = opts['limit'] ?? 20;
|
|
586
|
-
try {
|
|
587
|
-
const { getNexusDb, nexusSchema } = await import('@cleocode/core/store/nexus-sqlite');
|
|
588
|
-
const db = await getNexusDb();
|
|
589
|
-
// Find nodes matching the symbol name (case-insensitive partial match).
|
|
590
|
-
// NodeSQLiteDatabase uses sync Drizzle — .all() returns a plain array.
|
|
591
|
-
let allNodes = [];
|
|
592
|
-
try {
|
|
593
|
-
allNodes = db.select().from(nexusSchema.nexusNodes).all();
|
|
594
|
-
}
|
|
595
|
-
catch {
|
|
596
|
-
allNodes = [];
|
|
597
|
-
}
|
|
598
|
-
const lowerSymbol = symbolName.toLowerCase();
|
|
599
|
-
const rawMatchingNodes = allNodes.filter((n) => n['projectId'] === projectId &&
|
|
600
|
-
n['name'] != null &&
|
|
601
|
-
String(n['name']).toLowerCase().includes(lowerSymbol) &&
|
|
602
|
-
// Exclude synthetic graph-level nodes from symbol search
|
|
603
|
-
n['kind'] !== 'community' &&
|
|
604
|
-
n['kind'] !== 'process');
|
|
605
|
-
// Sort so callable symbols (function, method, class) rank before
|
|
606
|
-
// structural nodes (file, folder) — structural nodes have no `calls`
|
|
607
|
-
// relations and would produce empty callers/callees lists.
|
|
608
|
-
const matchingNodes = sortMatchingNodes(rawMatchingNodes, symbolName);
|
|
609
|
-
if (matchingNodes.length === 0) {
|
|
610
|
-
const durationMs = Date.now() - startTime;
|
|
611
|
-
if (jsonOutput) {
|
|
612
|
-
process.stdout.write(JSON.stringify({
|
|
613
|
-
success: false,
|
|
614
|
-
error: {
|
|
615
|
-
code: 'E_NOT_FOUND',
|
|
616
|
-
message: `No symbol found matching '${symbolName}' in project ${projectId}`,
|
|
617
|
-
},
|
|
618
|
-
meta: {
|
|
619
|
-
operation: 'nexus.context',
|
|
620
|
-
duration_ms: durationMs,
|
|
621
|
-
timestamp: new Date().toISOString(),
|
|
622
|
-
},
|
|
623
|
-
}, null, 2) + '\n');
|
|
624
|
-
}
|
|
625
|
-
else {
|
|
626
|
-
process.stdout.write(`[nexus] No symbol found matching '${symbolName}'.\n` +
|
|
627
|
-
` Run 'cleo nexus analyze' first, or check the symbol name.\n`);
|
|
628
|
-
}
|
|
629
|
-
process.exitCode = 4;
|
|
630
|
-
return;
|
|
631
|
-
}
|
|
632
|
-
// Load all relations once — cheaper than N queries per node.
|
|
633
|
-
let allRelations = [];
|
|
634
|
-
try {
|
|
635
|
-
allRelations = db.select().from(nexusSchema.nexusRelations).all();
|
|
636
|
-
}
|
|
637
|
-
catch {
|
|
638
|
-
allRelations = [];
|
|
639
|
-
}
|
|
640
|
-
// Build a node-by-id index for fast lookups.
|
|
641
|
-
const nodeById = new Map();
|
|
642
|
-
for (const n of allNodes) {
|
|
643
|
-
nodeById.set(String(n['id']), n);
|
|
644
|
-
}
|
|
645
|
-
// Build context for each matching node.
|
|
646
|
-
const results = matchingNodes.slice(0, 5).map((node) => {
|
|
647
|
-
const nodeId = String(node['id']);
|
|
648
|
-
// Incoming: who calls/imports/references THIS node (target = nodeId)
|
|
649
|
-
const incoming = allRelations
|
|
650
|
-
.filter((r) => r['targetId'] === nodeId &&
|
|
651
|
-
r['projectId'] === projectId &&
|
|
652
|
-
(r['type'] === 'calls' || r['type'] === 'imports' || r['type'] === 'accesses'))
|
|
653
|
-
.slice(0, limit)
|
|
654
|
-
.map((r) => {
|
|
655
|
-
const src = nodeById.get(String(r['sourceId']));
|
|
656
|
-
return {
|
|
657
|
-
relationType: r['type'],
|
|
658
|
-
nodeId: r['sourceId'],
|
|
659
|
-
name: src?.['name'] ?? r['sourceId'],
|
|
660
|
-
kind: src?.['kind'] ?? 'unknown',
|
|
661
|
-
filePath: src?.['filePath'] ?? null,
|
|
662
|
-
};
|
|
663
|
-
});
|
|
664
|
-
// Outgoing: what THIS node calls/imports/accesses (source = nodeId)
|
|
665
|
-
const outgoing = allRelations
|
|
666
|
-
.filter((r) => r['sourceId'] === nodeId &&
|
|
667
|
-
r['projectId'] === projectId &&
|
|
668
|
-
(r['type'] === 'calls' || r['type'] === 'imports' || r['type'] === 'accesses'))
|
|
669
|
-
.slice(0, limit)
|
|
670
|
-
.map((r) => {
|
|
671
|
-
const tgt = nodeById.get(String(r['targetId']));
|
|
672
|
-
return {
|
|
673
|
-
relationType: r['type'],
|
|
674
|
-
nodeId: r['targetId'],
|
|
675
|
-
name: tgt?.['name'] ?? r['targetId'],
|
|
676
|
-
kind: tgt?.['kind'] ?? 'unknown',
|
|
677
|
-
filePath: tgt?.['filePath'] ?? null,
|
|
678
|
-
};
|
|
679
|
-
});
|
|
680
|
-
// Community membership
|
|
681
|
-
const communityId = node['communityId'];
|
|
682
|
-
const community = communityId ? nodeById.get(communityId) : null;
|
|
683
|
-
// Process participation (step_in_process or entry_point_of relations)
|
|
684
|
-
const processRelations = allRelations.filter((r) => r['sourceId'] === nodeId &&
|
|
685
|
-
r['projectId'] === projectId &&
|
|
686
|
-
(r['type'] === 'step_in_process' || r['type'] === 'entry_point_of'));
|
|
687
|
-
const processes = processRelations
|
|
688
|
-
.map((r) => {
|
|
689
|
-
const proc = nodeById.get(String(r['targetId']));
|
|
690
|
-
return {
|
|
691
|
-
processId: r['targetId'],
|
|
692
|
-
label: proc?.['label'] ?? r['targetId'],
|
|
693
|
-
role: r['type'] === 'entry_point_of' ? 'entry_point' : 'step',
|
|
694
|
-
step: r['step'] ?? null,
|
|
695
|
-
};
|
|
696
|
-
})
|
|
697
|
-
.filter((p) => p.label !== p.processId); // filter unresolved
|
|
698
|
-
return {
|
|
699
|
-
nodeId,
|
|
700
|
-
name: node['name'],
|
|
701
|
-
kind: node['kind'],
|
|
702
|
-
filePath: node['filePath'],
|
|
703
|
-
startLine: node['startLine'],
|
|
704
|
-
endLine: node['endLine'],
|
|
705
|
-
isExported: node['isExported'],
|
|
706
|
-
docSummary: node['docSummary'],
|
|
707
|
-
community: community
|
|
708
|
-
? { id: communityId, label: community['label'] }
|
|
709
|
-
: communityId
|
|
710
|
-
? { id: communityId, label: null }
|
|
711
|
-
: null,
|
|
712
|
-
callers: incoming,
|
|
713
|
-
callees: outgoing,
|
|
714
|
-
processes,
|
|
715
|
-
};
|
|
716
|
-
});
|
|
717
|
-
const durationMs = Date.now() - startTime;
|
|
718
|
-
const primary = results[0];
|
|
719
|
-
if (jsonOutput) {
|
|
720
|
-
process.stdout.write(JSON.stringify({
|
|
721
|
-
success: true,
|
|
722
|
-
data: {
|
|
723
|
-
query: symbolName,
|
|
724
|
-
projectId,
|
|
725
|
-
matchCount: matchingNodes.length,
|
|
726
|
-
results,
|
|
727
|
-
},
|
|
728
|
-
meta: {
|
|
729
|
-
operation: 'nexus.context',
|
|
730
|
-
duration_ms: durationMs,
|
|
731
|
-
timestamp: new Date().toISOString(),
|
|
732
|
-
},
|
|
733
|
-
}, null, 2) + '\n');
|
|
734
|
-
}
|
|
735
|
-
else {
|
|
736
|
-
process.stdout.write(`[nexus] Context for symbol '${symbolName}' (${matchingNodes.length} match${matchingNodes.length !== 1 ? 'es' : ''}):\n`);
|
|
737
|
-
for (const r of results) {
|
|
738
|
-
process.stdout.write(`\n Symbol: ${String(r.name)} (${String(r.kind)})\n` +
|
|
739
|
-
` File: ${r.filePath ? String(r.filePath) : 'n/a'}` +
|
|
740
|
-
(r.startLine ? `:${String(r.startLine)}` : '') +
|
|
741
|
-
'\n' +
|
|
742
|
-
(r.docSummary ? ` Doc: ${String(r.docSummary)}\n` : '') +
|
|
743
|
-
(r.community
|
|
744
|
-
? ` Community: ${String(r.community.label ?? r.community.id)}\n`
|
|
745
|
-
: '') +
|
|
746
|
-
` Callers (${r.callers.length}): ${r.callers.length === 0
|
|
747
|
-
? 'none'
|
|
748
|
-
: r.callers.map((c) => `${String(c.name)}[${String(c.kind)}]`).join(', ')}\n` +
|
|
749
|
-
` Callees (${r.callees.length}): ${r.callees.length === 0
|
|
750
|
-
? 'none'
|
|
751
|
-
: r.callees.map((c) => `${String(c.name)}[${String(c.kind)}]`).join(', ')}\n` +
|
|
752
|
-
(r.processes.length > 0
|
|
753
|
-
? ` Processes: ${r.processes.map((p) => `${String(p.label)}(${String(p.role)})`).join(', ')}\n`
|
|
754
|
-
: ''));
|
|
755
|
-
}
|
|
756
|
-
if (matchingNodes.length > 5) {
|
|
757
|
-
process.stdout.write(`\n (Showing 5 of ${matchingNodes.length} matches — use --json for full list)\n`);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
void primary; // referenced to satisfy lint
|
|
761
|
-
}
|
|
762
|
-
catch (err) {
|
|
763
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
764
|
-
if (jsonOutput) {
|
|
765
|
-
process.stdout.write(JSON.stringify({
|
|
766
|
-
success: false,
|
|
767
|
-
error: { code: 'E_CONTEXT_FAILED', message: msg },
|
|
768
|
-
meta: {
|
|
769
|
-
operation: 'nexus.context',
|
|
770
|
-
duration_ms: Date.now() - startTime,
|
|
771
|
-
timestamp: new Date().toISOString(),
|
|
772
|
-
},
|
|
773
|
-
}, null, 2) + '\n');
|
|
774
|
-
}
|
|
775
|
-
else {
|
|
776
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
777
|
-
}
|
|
778
|
-
process.exitCode = 1;
|
|
779
|
-
}
|
|
780
|
-
});
|
|
781
|
-
// ── nexus impact ──────────────────────────────────────────────────────────
|
|
782
|
-
nexus
|
|
783
|
-
.command('impact <symbol>')
|
|
784
|
-
.description('Show blast radius for a code symbol — direct callers (d=1), indirect callers (d=2), transitive (d=3)')
|
|
785
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
786
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from cwd)')
|
|
787
|
-
.option('--depth <n>', 'Maximum traversal depth (default: 3)', parseInt, 3)
|
|
788
|
-
.action(async (symbolName, opts) => {
|
|
789
|
-
const startTime = Date.now();
|
|
790
|
-
const jsonOutput = !!opts['json'];
|
|
791
|
-
const projectIdOverride = opts['projectId'];
|
|
792
|
-
const repoPath = process.cwd();
|
|
793
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
794
|
-
const maxDepth = Math.min(opts['depth'] ?? 3, 5);
|
|
795
|
-
try {
|
|
796
|
-
const { getNexusDb, nexusSchema } = await import('@cleocode/core/store/nexus-sqlite');
|
|
797
|
-
const db = await getNexusDb();
|
|
798
|
-
// Load all nodes and relations for this project once.
|
|
799
|
-
let allNodes = [];
|
|
800
|
-
try {
|
|
801
|
-
allNodes = db.select().from(nexusSchema.nexusNodes).all();
|
|
802
|
-
}
|
|
803
|
-
catch {
|
|
804
|
-
allNodes = [];
|
|
805
|
-
}
|
|
806
|
-
const lowerSymbol = symbolName.toLowerCase();
|
|
807
|
-
const rawMatchingNodes = allNodes.filter((n) => n['projectId'] === projectId &&
|
|
808
|
-
n['name'] != null &&
|
|
809
|
-
String(n['name']).toLowerCase().includes(lowerSymbol) &&
|
|
810
|
-
n['kind'] !== 'community' &&
|
|
811
|
-
n['kind'] !== 'process');
|
|
812
|
-
// Sort so callable symbols (function, method, class) rank before
|
|
813
|
-
// structural nodes (file, folder) — structural nodes have no `calls`
|
|
814
|
-
// relations and would produce zero impact.
|
|
815
|
-
const matchingNodes = sortMatchingNodes(rawMatchingNodes, symbolName);
|
|
816
|
-
if (matchingNodes.length === 0) {
|
|
817
|
-
const durationMs = Date.now() - startTime;
|
|
818
|
-
if (jsonOutput) {
|
|
819
|
-
process.stdout.write(JSON.stringify({
|
|
820
|
-
success: false,
|
|
821
|
-
error: {
|
|
822
|
-
code: 'E_NOT_FOUND',
|
|
823
|
-
message: `No symbol found matching '${symbolName}' in project ${projectId}`,
|
|
824
|
-
},
|
|
825
|
-
meta: {
|
|
826
|
-
operation: 'nexus.impact',
|
|
827
|
-
duration_ms: durationMs,
|
|
828
|
-
timestamp: new Date().toISOString(),
|
|
829
|
-
},
|
|
830
|
-
}, null, 2) + '\n');
|
|
831
|
-
}
|
|
832
|
-
else {
|
|
833
|
-
process.stdout.write(`[nexus] No symbol found matching '${symbolName}'.\n` +
|
|
834
|
-
` Run 'cleo nexus analyze' first, or check the symbol name.\n`);
|
|
835
|
-
}
|
|
836
|
-
process.exitCode = 4;
|
|
837
|
-
return;
|
|
838
|
-
}
|
|
839
|
-
let allRelations = [];
|
|
840
|
-
try {
|
|
841
|
-
allRelations = db.select().from(nexusSchema.nexusRelations).all();
|
|
842
|
-
}
|
|
843
|
-
catch {
|
|
844
|
-
allRelations = [];
|
|
845
|
-
}
|
|
846
|
-
// Build a node-by-id index for fast lookups.
|
|
847
|
-
const nodeById = new Map();
|
|
848
|
-
for (const n of allNodes) {
|
|
849
|
-
nodeById.set(String(n['id']), n);
|
|
850
|
-
}
|
|
851
|
-
// BFS upstream: find all nodes that (transitively) call/import the target.
|
|
852
|
-
const targetNode = matchingNodes[0];
|
|
853
|
-
const targetId = String(targetNode['id']);
|
|
854
|
-
// Build reverse adjacency: targetId → [sourceIds that call it]
|
|
855
|
-
const reverseAdj = new Map();
|
|
856
|
-
for (const r of allRelations) {
|
|
857
|
-
if (r['projectId'] === projectId &&
|
|
858
|
-
(r['type'] === 'calls' || r['type'] === 'imports' || r['type'] === 'accesses')) {
|
|
859
|
-
const tid = String(r['targetId']);
|
|
860
|
-
const sid = String(r['sourceId']);
|
|
861
|
-
if (!reverseAdj.has(tid))
|
|
862
|
-
reverseAdj.set(tid, []);
|
|
863
|
-
reverseAdj.get(tid).push(sid);
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
// BFS traversal up to maxDepth levels.
|
|
867
|
-
const visited = new Set([targetId]);
|
|
868
|
-
const depthMap = new Map(); // nodeId → depth
|
|
869
|
-
const queue = [{ id: targetId, depth: 0 }];
|
|
870
|
-
const impactByDepth = [];
|
|
871
|
-
while (queue.length > 0) {
|
|
872
|
-
const item = queue.shift();
|
|
873
|
-
if (item.depth >= maxDepth)
|
|
874
|
-
continue;
|
|
875
|
-
const callers = reverseAdj.get(item.id) ?? [];
|
|
876
|
-
for (const callerId of callers) {
|
|
877
|
-
if (visited.has(callerId))
|
|
878
|
-
continue;
|
|
879
|
-
visited.add(callerId);
|
|
880
|
-
const depth = item.depth + 1;
|
|
881
|
-
depthMap.set(callerId, depth);
|
|
882
|
-
const callerNode = nodeById.get(callerId);
|
|
883
|
-
if (!impactByDepth[depth - 1])
|
|
884
|
-
impactByDepth[depth - 1] = [];
|
|
885
|
-
impactByDepth[depth - 1].push({
|
|
886
|
-
nodeId: callerId,
|
|
887
|
-
name: String(callerNode?.['name'] ?? callerId),
|
|
888
|
-
kind: String(callerNode?.['kind'] ?? 'unknown'),
|
|
889
|
-
filePath: callerNode?.['filePath'] ? String(callerNode['filePath']) : null,
|
|
890
|
-
});
|
|
891
|
-
queue.push({ id: callerId, depth });
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
const totalImpact = visited.size - 1; // exclude the target itself
|
|
895
|
-
const riskLevel = totalImpact === 0
|
|
896
|
-
? 'NONE'
|
|
897
|
-
: totalImpact <= 3
|
|
898
|
-
? 'LOW'
|
|
899
|
-
: totalImpact <= 10
|
|
900
|
-
? 'MEDIUM'
|
|
901
|
-
: totalImpact <= 25
|
|
902
|
-
? 'HIGH'
|
|
903
|
-
: 'CRITICAL';
|
|
904
|
-
const durationMs = Date.now() - startTime;
|
|
905
|
-
if (jsonOutput) {
|
|
906
|
-
process.stdout.write(JSON.stringify({
|
|
907
|
-
success: true,
|
|
908
|
-
data: {
|
|
909
|
-
query: symbolName,
|
|
910
|
-
projectId,
|
|
911
|
-
targetNodeId: targetId,
|
|
912
|
-
targetName: targetNode['name'],
|
|
913
|
-
targetKind: targetNode['kind'],
|
|
914
|
-
targetFilePath: targetNode['filePath'],
|
|
915
|
-
riskLevel,
|
|
916
|
-
totalImpactedNodes: totalImpact,
|
|
917
|
-
maxDepth,
|
|
918
|
-
impactByDepth: impactByDepth.map((layer, i) => ({
|
|
919
|
-
depth: i + 1,
|
|
920
|
-
label: i === 0
|
|
921
|
-
? 'WILL BREAK (direct callers)'
|
|
922
|
-
: i === 1
|
|
923
|
-
? 'LIKELY AFFECTED'
|
|
924
|
-
: 'MAY NEED TESTING',
|
|
925
|
-
nodes: layer,
|
|
926
|
-
})),
|
|
927
|
-
},
|
|
928
|
-
meta: {
|
|
929
|
-
operation: 'nexus.impact',
|
|
930
|
-
duration_ms: durationMs,
|
|
931
|
-
timestamp: new Date().toISOString(),
|
|
932
|
-
},
|
|
933
|
-
}, null, 2) + '\n');
|
|
934
|
-
}
|
|
935
|
-
else {
|
|
936
|
-
process.stdout.write(`[nexus] Impact analysis for '${symbolName}'\n` +
|
|
937
|
-
` Target: ${String(targetNode['name'])} (${String(targetNode['kind'])})\n` +
|
|
938
|
-
` File: ${targetNode['filePath'] ? String(targetNode['filePath']) : 'n/a'}\n` +
|
|
939
|
-
` Risk: ${riskLevel} (${totalImpact} impacted node${totalImpact !== 1 ? 's' : ''})\n`);
|
|
940
|
-
if (totalImpact === 0) {
|
|
941
|
-
process.stdout.write(' No callers found — safe to modify.\n');
|
|
942
|
-
}
|
|
943
|
-
else {
|
|
944
|
-
for (let i = 0; i < impactByDepth.length; i++) {
|
|
945
|
-
const layer = impactByDepth[i];
|
|
946
|
-
if (!layer || layer.length === 0)
|
|
947
|
-
continue;
|
|
948
|
-
const label = i === 0 ? 'WILL BREAK' : i === 1 ? 'LIKELY AFFECTED' : 'MAY NEED TESTING';
|
|
949
|
-
process.stdout.write(`\n d=${i + 1} ${label} (${layer.length}):\n`);
|
|
950
|
-
for (const node of layer.slice(0, 15)) {
|
|
951
|
-
process.stdout.write(` ${String(node.name).padEnd(36)} ${String(node.kind).padEnd(12)} ${node.filePath ?? ''}\n`);
|
|
952
|
-
}
|
|
953
|
-
if (layer.length > 15) {
|
|
954
|
-
process.stdout.write(` ... and ${layer.length - 15} more\n`);
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
if (matchingNodes.length > 1) {
|
|
959
|
-
process.stdout.write(`\n (Showing analysis for first match — ${matchingNodes.length} total matches for '${symbolName}')\n`);
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
}
|
|
963
|
-
catch (err) {
|
|
964
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
965
|
-
if (jsonOutput) {
|
|
966
|
-
process.stdout.write(JSON.stringify({
|
|
967
|
-
success: false,
|
|
968
|
-
error: { code: 'E_IMPACT_FAILED', message: msg },
|
|
969
|
-
meta: {
|
|
970
|
-
operation: 'nexus.impact',
|
|
971
|
-
duration_ms: Date.now() - startTime,
|
|
972
|
-
timestamp: new Date().toISOString(),
|
|
973
|
-
},
|
|
974
|
-
}, null, 2) + '\n');
|
|
975
|
-
}
|
|
976
|
-
else {
|
|
977
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
978
|
-
}
|
|
979
|
-
process.exitCode = 1;
|
|
980
|
-
}
|
|
981
|
-
});
|
|
982
|
-
// ── nexus analyze ─────────────────────────────────────────────────────────
|
|
983
|
-
nexus
|
|
984
|
-
.command('analyze [path]')
|
|
985
|
-
.description('Run code intelligence pipeline on a repository directory')
|
|
986
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
987
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected)')
|
|
988
|
-
.option('--incremental', 'Only re-index files that have changed since the last run (faster)')
|
|
989
|
-
.action(async (targetPath, opts) => {
|
|
990
|
-
const startTime = Date.now();
|
|
991
|
-
const jsonOutput = !!opts['json'];
|
|
992
|
-
const projectIdOverride = opts['projectId'];
|
|
993
|
-
const isIncremental = !!opts['incremental'];
|
|
994
|
-
// Resolve target path
|
|
995
|
-
const repoPath = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
996
|
-
if (!jsonOutput) {
|
|
997
|
-
process.stderr.write(`[nexus] Analyzing: ${repoPath}${isIncremental ? ' (incremental)' : ''}\n`);
|
|
998
|
-
}
|
|
999
|
-
try {
|
|
1000
|
-
// Lazy imports to avoid loading heavy dependencies until needed
|
|
1001
|
-
const [{ getNexusDb, nexusSchema }, { runPipeline }, { getProjectRoot }, { eq }] = await Promise.all([
|
|
1002
|
-
import('@cleocode/core/store/nexus-sqlite'),
|
|
1003
|
-
import('@cleocode/nexus/pipeline'),
|
|
1004
|
-
import('@cleocode/core/internal'),
|
|
1005
|
-
import('drizzle-orm'),
|
|
1006
|
-
]);
|
|
1007
|
-
// Determine project ID — use override or derive from path
|
|
1008
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
1009
|
-
// Get DB and table references
|
|
1010
|
-
const db = await getNexusDb();
|
|
1011
|
-
const tables = {
|
|
1012
|
-
nexusNodes: nexusSchema.nexusNodes,
|
|
1013
|
-
nexusRelations: nexusSchema.nexusRelations,
|
|
1014
|
-
};
|
|
1015
|
-
// For full (non-incremental) runs: delete existing index first.
|
|
1016
|
-
// NodeSQLiteDatabase uses sync Drizzle — no await, wrap in try-catch.
|
|
1017
|
-
if (!isIncremental) {
|
|
1018
|
-
if (!jsonOutput) {
|
|
1019
|
-
process.stderr.write('[nexus] Clearing existing index for project...\n');
|
|
1020
|
-
}
|
|
1021
|
-
try {
|
|
1022
|
-
db.delete(nexusSchema.nexusNodes)
|
|
1023
|
-
.where(eq(nexusSchema.nexusNodes.projectId, projectId))
|
|
1024
|
-
.run();
|
|
1025
|
-
}
|
|
1026
|
-
catch {
|
|
1027
|
-
// Table may not have rows — ignore
|
|
1028
|
-
}
|
|
1029
|
-
try {
|
|
1030
|
-
db.delete(nexusSchema.nexusRelations)
|
|
1031
|
-
.where(eq(nexusSchema.nexusRelations.projectId, projectId))
|
|
1032
|
-
.run();
|
|
1033
|
-
}
|
|
1034
|
-
catch {
|
|
1035
|
-
// Table may not have rows — ignore
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
// Run the pipeline (full or incremental)
|
|
1039
|
-
const result = await runPipeline(repoPath, projectId, db, tables, jsonOutput
|
|
1040
|
-
? undefined
|
|
1041
|
-
: (current, total, filePath) => {
|
|
1042
|
-
if (current % 50 === 0 || current === total) {
|
|
1043
|
-
const pct = total > 0 ? Math.round((current / total) * 100) : 100;
|
|
1044
|
-
process.stderr.write(`[nexus] Progress: ${current}/${total} files (${pct}%) — ${filePath}\n`);
|
|
1045
|
-
}
|
|
1046
|
-
}, { incremental: isIncremental });
|
|
1047
|
-
const durationMs = Date.now() - startTime;
|
|
1048
|
-
// Write nexus-bridge.md after a successful pipeline run (best-effort)
|
|
1049
|
-
try {
|
|
1050
|
-
const { refreshNexusBridge } = await import('@cleocode/core/internal');
|
|
1051
|
-
await refreshNexusBridge(repoPath, projectId);
|
|
1052
|
-
if (!jsonOutput) {
|
|
1053
|
-
process.stderr.write(`[nexus] nexus-bridge.md refreshed at ${repoPath}/.cleo/nexus-bridge.md\n`);
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
catch {
|
|
1057
|
-
// Non-fatal — bridge refresh failure should not fail the analyze command
|
|
1058
|
-
}
|
|
1059
|
-
if (jsonOutput) {
|
|
1060
|
-
const envelope = {
|
|
1061
|
-
success: true,
|
|
1062
|
-
data: {
|
|
1063
|
-
projectId,
|
|
1064
|
-
repoPath,
|
|
1065
|
-
incremental: isIncremental,
|
|
1066
|
-
nodeCount: result.nodeCount,
|
|
1067
|
-
relationCount: result.relationCount,
|
|
1068
|
-
fileCount: result.fileCount,
|
|
1069
|
-
durationMs,
|
|
1070
|
-
},
|
|
1071
|
-
meta: {
|
|
1072
|
-
operation: 'nexus.analyze',
|
|
1073
|
-
duration_ms: durationMs,
|
|
1074
|
-
timestamp: new Date().toISOString(),
|
|
1075
|
-
},
|
|
1076
|
-
};
|
|
1077
|
-
process.stdout.write(JSON.stringify(envelope, null, 2) + '\n');
|
|
1078
|
-
}
|
|
1079
|
-
else {
|
|
1080
|
-
process.stdout.write(`[nexus] Analysis complete${isIncremental ? ' (incremental)' : ''}:\n` +
|
|
1081
|
-
` Project ID: ${projectId}\n` +
|
|
1082
|
-
` Files: ${result.fileCount}\n` +
|
|
1083
|
-
` Nodes: ${result.nodeCount}\n` +
|
|
1084
|
-
` Relations: ${result.relationCount}\n` +
|
|
1085
|
-
` Duration: ${durationMs}ms\n`);
|
|
1086
|
-
}
|
|
1087
|
-
void getProjectRoot; // referenced to satisfy import
|
|
1088
|
-
}
|
|
1089
|
-
catch (err) {
|
|
1090
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1091
|
-
if (jsonOutput) {
|
|
1092
|
-
const envelope = {
|
|
1093
|
-
success: false,
|
|
1094
|
-
error: { code: 'E_PIPELINE_FAILED', message: msg },
|
|
1095
|
-
meta: {
|
|
1096
|
-
operation: 'nexus.analyze',
|
|
1097
|
-
duration_ms: Date.now() - startTime,
|
|
1098
|
-
timestamp: new Date().toISOString(),
|
|
1099
|
-
},
|
|
1100
|
-
};
|
|
1101
|
-
process.stdout.write(JSON.stringify(envelope, null, 2) + '\n');
|
|
1102
|
-
}
|
|
1103
|
-
else {
|
|
1104
|
-
process.stderr.write(`[nexus] Error: ${msg}\n`);
|
|
1105
|
-
}
|
|
1106
|
-
process.exitCode = 1;
|
|
1107
|
-
}
|
|
1108
|
-
});
|
|
1109
|
-
// ── nexus refresh-bridge ──────────────────────────────────────────────────
|
|
1110
|
-
nexus
|
|
1111
|
-
.command('refresh-bridge [path]')
|
|
1112
|
-
.description('Regenerate .cleo/nexus-bridge.md from the existing nexus.db index (does not re-index)')
|
|
1113
|
-
.option('--json', 'Output result as JSON (LAFS envelope format)')
|
|
1114
|
-
.option('--project-id <id>', 'Override the project ID (default: auto-detected from path)')
|
|
1115
|
-
.action(async (targetPath, opts) => {
|
|
1116
|
-
const startTime = Date.now();
|
|
1117
|
-
const jsonOutput = !!opts['json'];
|
|
1118
|
-
const projectIdOverride = opts['projectId'];
|
|
1119
|
-
const repoPath = targetPath ? path.resolve(targetPath) : process.cwd();
|
|
1120
|
-
const projectId = projectIdOverride ?? Buffer.from(repoPath).toString('base64url').slice(0, 32);
|
|
1121
|
-
try {
|
|
1122
|
-
const { writeNexusBridge } = await import('@cleocode/core/internal');
|
|
1123
|
-
const result = await writeNexusBridge(repoPath, projectId);
|
|
1124
|
-
const durationMs = Date.now() - startTime;
|
|
1125
|
-
if (jsonOutput) {
|
|
1126
|
-
process.stdout.write(JSON.stringify({
|
|
1127
|
-
success: true,
|
|
1128
|
-
data: { path: result.path, written: result.written, projectId, repoPath },
|
|
1129
|
-
meta: {
|
|
1130
|
-
operation: 'nexus.refresh-bridge',
|
|
1131
|
-
duration_ms: durationMs,
|
|
1132
|
-
timestamp: new Date().toISOString(),
|
|
1133
|
-
},
|
|
1134
|
-
}, null, 2) + '\n');
|
|
1135
|
-
}
|
|
1136
|
-
else if (result.written) {
|
|
1137
|
-
process.stdout.write(`[nexus] nexus-bridge.md refreshed at ${result.path}\n`);
|
|
1138
|
-
}
|
|
1139
|
-
else {
|
|
1140
|
-
process.stdout.write(`[nexus] nexus-bridge.md unchanged at ${result.path}\n`);
|
|
1141
|
-
}
|
|
1142
|
-
}
|
|
1143
|
-
catch (err) {
|
|
1144
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
1145
|
-
if (jsonOutput) {
|
|
1146
|
-
process.stdout.write(JSON.stringify({
|
|
1147
|
-
success: false,
|
|
1148
|
-
error: { code: 'E_BRIDGE_FAILED', message: msg },
|
|
1149
|
-
meta: {
|
|
1150
|
-
operation: 'nexus.refresh-bridge',
|
|
1151
|
-
duration_ms: Date.now() - startTime,
|
|
1152
|
-
timestamp: new Date().toISOString(),
|
|
1153
|
-
},
|
|
1154
|
-
}, null, 2) + '\n');
|
|
1155
|
-
}
|
|
1156
|
-
else {
|
|
1157
|
-
process.stderr.write(`[nexus] Error refreshing bridge: ${msg}\n`);
|
|
1158
|
-
}
|
|
1159
|
-
process.exitCode = 1;
|
|
1160
|
-
}
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
//# sourceMappingURL=nexus.js.map
|