@cleocode/mcp-server 0.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/domains/index.d.ts +16 -0
- package/dist/domains/index.d.ts.map +1 -0
- package/dist/domains/index.js +16 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/domains/lifecycle.d.ts +147 -0
- package/dist/domains/lifecycle.d.ts.map +1 -0
- package/dist/domains/lifecycle.js +452 -0
- package/dist/domains/lifecycle.js.map +1 -0
- package/dist/domains/orchestrate.d.ts +133 -0
- package/dist/domains/orchestrate.d.ts.map +1 -0
- package/dist/domains/orchestrate.js +465 -0
- package/dist/domains/orchestrate.js.map +1 -0
- package/dist/domains/release.d.ts +109 -0
- package/dist/domains/release.d.ts.map +1 -0
- package/dist/domains/release.js +400 -0
- package/dist/domains/release.js.map +1 -0
- package/dist/domains/research.d.ts +139 -0
- package/dist/domains/research.d.ts.map +1 -0
- package/dist/domains/research.js +606 -0
- package/dist/domains/research.js.map +1 -0
- package/dist/domains/session.d.ts +129 -0
- package/dist/domains/session.d.ts.map +1 -0
- package/dist/domains/session.js +433 -0
- package/dist/domains/session.js.map +1 -0
- package/dist/domains/system.d.ts +92 -0
- package/dist/domains/system.d.ts.map +1 -0
- package/dist/domains/system.js +473 -0
- package/dist/domains/system.js.map +1 -0
- package/dist/domains/tasks.d.ts +180 -0
- package/dist/domains/tasks.d.ts.map +1 -0
- package/dist/domains/tasks.js +704 -0
- package/dist/domains/tasks.js.map +1 -0
- package/dist/domains/validate.d.ts +150 -0
- package/dist/domains/validate.d.ts.map +1 -0
- package/dist/domains/validate.js +568 -0
- package/dist/domains/validate.js.map +1 -0
- package/dist/gateways/mutate.d.ts +100 -0
- package/dist/gateways/mutate.d.ts.map +1 -0
- package/dist/gateways/mutate.js +937 -0
- package/dist/gateways/mutate.js.map +1 -0
- package/dist/gateways/query.d.ts +91 -0
- package/dist/gateways/query.d.ts.map +1 -0
- package/dist/gateways/query.js +245 -0
- package/dist/gateways/query.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +299 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/audit.d.ts +118 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +311 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/background-jobs.d.ts +86 -0
- package/dist/lib/background-jobs.d.ts.map +1 -0
- package/dist/lib/background-jobs.js +183 -0
- package/dist/lib/background-jobs.js.map +1 -0
- package/dist/lib/cache.d.ts +78 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +204 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/command-builder.d.ts +52 -0
- package/dist/lib/command-builder.d.ts.map +1 -0
- package/dist/lib/command-builder.js +280 -0
- package/dist/lib/command-builder.js.map +1 -0
- package/dist/lib/config.d.ts +42 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +248 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/defaults.d.ts +115 -0
- package/dist/lib/defaults.d.ts.map +1 -0
- package/dist/lib/defaults.js +61 -0
- package/dist/lib/defaults.js.map +1 -0
- package/dist/lib/error-handler.d.ts +101 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +277 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/executor.d.ts +110 -0
- package/dist/lib/executor.d.ts.map +1 -0
- package/dist/lib/executor.js +362 -0
- package/dist/lib/executor.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +190 -0
- package/dist/lib/exit-codes.d.ts.map +1 -0
- package/dist/lib/exit-codes.js +1027 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/formatter.d.ts +196 -0
- package/dist/lib/formatter.d.ts.map +1 -0
- package/dist/lib/formatter.js +260 -0
- package/dist/lib/formatter.js.map +1 -0
- package/dist/lib/gate-validators.d.ts +103 -0
- package/dist/lib/gate-validators.d.ts.map +1 -0
- package/dist/lib/gate-validators.js +689 -0
- package/dist/lib/gate-validators.js.map +1 -0
- package/dist/lib/manifest-parser.d.ts +61 -0
- package/dist/lib/manifest-parser.d.ts.map +1 -0
- package/dist/lib/manifest-parser.js +338 -0
- package/dist/lib/manifest-parser.js.map +1 -0
- package/dist/lib/manifest.d.ts +177 -0
- package/dist/lib/manifest.d.ts.map +1 -0
- package/dist/lib/manifest.js +301 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/protocol-enforcement.d.ts +105 -0
- package/dist/lib/protocol-enforcement.d.ts.map +1 -0
- package/dist/lib/protocol-enforcement.js +331 -0
- package/dist/lib/protocol-enforcement.js.map +1 -0
- package/dist/lib/protocol-rules.d.ts +55 -0
- package/dist/lib/protocol-rules.d.ts.map +1 -0
- package/dist/lib/protocol-rules.js +760 -0
- package/dist/lib/protocol-rules.js.map +1 -0
- package/dist/lib/rate-limiter.d.ts +110 -0
- package/dist/lib/rate-limiter.d.ts.map +1 -0
- package/dist/lib/rate-limiter.js +208 -0
- package/dist/lib/rate-limiter.js.map +1 -0
- package/dist/lib/router.d.ts +126 -0
- package/dist/lib/router.d.ts.map +1 -0
- package/dist/lib/router.js +276 -0
- package/dist/lib/router.js.map +1 -0
- package/dist/lib/schema.d.ts +55 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +70 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/security.d.ts +156 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +347 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/verification-gates.d.ts +287 -0
- package/dist/lib/verification-gates.d.ts.map +1 -0
- package/dist/lib/verification-gates.js +548 -0
- package/dist/lib/verification-gates.js.map +1 -0
- package/dist/types/domain.d.ts +29 -0
- package/dist/types/domain.d.ts.map +1 -0
- package/dist/types/domain.js +7 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/error.d.ts +101 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +61 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/gateway.d.ts +78 -0
- package/dist/types/gateway.d.ts.map +1 -0
- package/dist/types/gateway.js +7 -0
- package/dist/types/gateway.js.map +1 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/operations/lifecycle.d.ts +140 -0
- package/dist/types/operations/lifecycle.d.ts.map +1 -0
- package/dist/types/operations/lifecycle.js +8 -0
- package/dist/types/operations/lifecycle.js.map +1 -0
- package/dist/types/operations/orchestrate.d.ts +140 -0
- package/dist/types/operations/orchestrate.d.ts.map +1 -0
- package/dist/types/operations/orchestrate.js +8 -0
- package/dist/types/operations/orchestrate.js.map +1 -0
- package/dist/types/operations/release.d.ts +97 -0
- package/dist/types/operations/release.d.ts.map +1 -0
- package/dist/types/operations/release.js +7 -0
- package/dist/types/operations/release.js.map +1 -0
- package/dist/types/operations/research.d.ts +122 -0
- package/dist/types/operations/research.d.ts.map +1 -0
- package/dist/types/operations/research.js +8 -0
- package/dist/types/operations/research.js.map +1 -0
- package/dist/types/operations/session.d.ts +108 -0
- package/dist/types/operations/session.d.ts.map +1 -0
- package/dist/types/operations/session.js +8 -0
- package/dist/types/operations/session.js.map +1 -0
- package/dist/types/operations/system.d.ts +147 -0
- package/dist/types/operations/system.d.ts.map +1 -0
- package/dist/types/operations/system.js +8 -0
- package/dist/types/operations/system.js.map +1 -0
- package/dist/types/operations/tasks.d.ts +186 -0
- package/dist/types/operations/tasks.d.ts.map +1 -0
- package/dist/types/operations/tasks.js +8 -0
- package/dist/types/operations/tasks.js.map +1 -0
- package/dist/types/operations/validate.d.ts +170 -0
- package/dist/types/operations/validate.d.ts.map +1 -0
- package/dist/types/operations/validate.js +8 -0
- package/dist/types/operations/validate.js.map +1 -0
- package/package.json +67 -0
- package/schemas/IMPLEMENTATION-SUMMARY.md +250 -0
- package/schemas/README.md +284 -0
- package/schemas/common/error.schema.json +54 -0
- package/schemas/common/meta.schema.json +39 -0
- package/schemas/common/pagination.schema.json +32 -0
- package/schemas/index.json +159 -0
- package/schemas/requests/lifecycle/check.schema.json +20 -0
- package/schemas/requests/lifecycle/gate.fail.schema.json +25 -0
- package/schemas/requests/lifecycle/gate.pass.schema.json +28 -0
- package/schemas/requests/lifecycle/gates.schema.json +15 -0
- package/schemas/requests/lifecycle/history.schema.json +15 -0
- package/schemas/requests/lifecycle/prerequisites.schema.json +15 -0
- package/schemas/requests/lifecycle/progress.schema.json +29 -0
- package/schemas/requests/lifecycle/reset.schema.json +25 -0
- package/schemas/requests/lifecycle/skip.schema.json +25 -0
- package/schemas/requests/lifecycle/status.schema.json +23 -0
- package/schemas/requests/orchestrate/analyze.schema.json +15 -0
- package/schemas/requests/orchestrate/context.schema.json +13 -0
- package/schemas/requests/orchestrate/next.schema.json +15 -0
- package/schemas/requests/orchestrate/parallel.end.schema.json +20 -0
- package/schemas/requests/orchestrate/parallel.start.schema.json +20 -0
- package/schemas/requests/orchestrate/ready.schema.json +15 -0
- package/schemas/requests/orchestrate/skill.list.schema.json +13 -0
- package/schemas/requests/orchestrate/spawn.schema.json +25 -0
- package/schemas/requests/orchestrate/startup.schema.json +15 -0
- package/schemas/requests/orchestrate/status.schema.json +15 -0
- package/schemas/requests/orchestrate/validate.schema.json +15 -0
- package/schemas/requests/orchestrate/waves.schema.json +15 -0
- package/schemas/requests/release/changelog.schema.json +23 -0
- package/schemas/requests/release/commit.schema.json +22 -0
- package/schemas/requests/release/gates.run.schema.json +17 -0
- package/schemas/requests/release/prepare.schema.json +20 -0
- package/schemas/requests/release/push.schema.json +20 -0
- package/schemas/requests/release/rollback.schema.json +20 -0
- package/schemas/requests/release/tag.schema.json +19 -0
- package/schemas/requests/research/inject.schema.json +24 -0
- package/schemas/requests/research/link.schema.json +25 -0
- package/schemas/requests/research/list.schema.json +19 -0
- package/schemas/requests/research/manifest.append.schema.json +20 -0
- package/schemas/requests/research/manifest.archive.schema.json +19 -0
- package/schemas/requests/research/manifest.read.schema.json +21 -0
- package/schemas/requests/research/pending.schema.json +14 -0
- package/schemas/requests/research/query.schema.json +21 -0
- package/schemas/requests/research/show.schema.json +14 -0
- package/schemas/requests/research/stats.schema.json +14 -0
- package/schemas/requests/session/end.schema.json +13 -0
- package/schemas/requests/session/focus.clear.schema.json +7 -0
- package/schemas/requests/session/focus.get.schema.json +7 -0
- package/schemas/requests/session/focus.set.schema.json +15 -0
- package/schemas/requests/session/gc.schema.json +14 -0
- package/schemas/requests/session/history.schema.json +16 -0
- package/schemas/requests/session/list.schema.json +13 -0
- package/schemas/requests/session/resume.schema.json +14 -0
- package/schemas/requests/session/show.schema.json +14 -0
- package/schemas/requests/session/start.schema.json +23 -0
- package/schemas/requests/session/status.schema.json +7 -0
- package/schemas/requests/session/suspend.schema.json +13 -0
- package/schemas/requests/system/backup.schema.json +19 -0
- package/schemas/requests/system/cleanup.schema.json +20 -0
- package/schemas/requests/system/config.get.schema.json +14 -0
- package/schemas/requests/system/config.set.schema.json +24 -0
- package/schemas/requests/system/context.schema.json +7 -0
- package/schemas/requests/system/doctor.schema.json +7 -0
- package/schemas/requests/system/init.schema.json +18 -0
- package/schemas/requests/system/migrate.schema.json +19 -0
- package/schemas/requests/system/restore.schema.json +14 -0
- package/schemas/requests/system/stats.schema.json +7 -0
- package/schemas/requests/system/sync.schema.json +15 -0
- package/schemas/requests/system/version.schema.json +7 -0
- package/schemas/requests/tasks/analyze.schema.json +14 -0
- package/schemas/requests/tasks/archive.schema.json +19 -0
- package/schemas/requests/tasks/blockers.schema.json +15 -0
- package/schemas/requests/tasks/complete.schema.json +24 -0
- package/schemas/requests/tasks/create.schema.json +48 -0
- package/schemas/requests/tasks/delete.schema.json +20 -0
- package/schemas/requests/tasks/deps.schema.json +21 -0
- package/schemas/requests/tasks/exists.schema.json +15 -0
- package/schemas/requests/tasks/find.schema.json +22 -0
- package/schemas/requests/tasks/get.schema.json +15 -0
- package/schemas/requests/tasks/list.schema.json +26 -0
- package/schemas/requests/tasks/next.schema.json +21 -0
- package/schemas/requests/tasks/promote.schema.json +15 -0
- package/schemas/requests/tasks/reopen.schema.json +15 -0
- package/schemas/requests/tasks/reorder.schema.json +20 -0
- package/schemas/requests/tasks/reparent.schema.json +20 -0
- package/schemas/requests/tasks/tree.schema.json +21 -0
- package/schemas/requests/tasks/unarchive.schema.json +15 -0
- package/schemas/requests/tasks/update.schema.json +41 -0
- package/schemas/requests/validate/compliance.record.schema.json +20 -0
- package/schemas/requests/validate/compliance.summary.schema.json +18 -0
- package/schemas/requests/validate/compliance.violations.schema.json +19 -0
- package/schemas/requests/validate/manifest.schema.json +23 -0
- package/schemas/requests/validate/output.schema.json +19 -0
- package/schemas/requests/validate/protocol.schema.json +20 -0
- package/schemas/requests/validate/schema.schema.json +19 -0
- package/schemas/requests/validate/task.schema.json +21 -0
- package/schemas/requests/validate/test.coverage.schema.json +14 -0
- package/schemas/requests/validate/test.run.schema.json +22 -0
- package/schemas/requests/validate/test.status.schema.json +14 -0
- package/schemas/responses/common-error.schema.json +20 -0
- package/schemas/responses/common-success.schema.json +21 -0
- package/schemas/responses/lifecycle/check.schema.json +18 -0
- package/schemas/responses/lifecycle/gate.fail.schema.json +18 -0
- package/schemas/responses/lifecycle/gate.pass.schema.json +18 -0
- package/schemas/responses/lifecycle/gates.schema.json +18 -0
- package/schemas/responses/lifecycle/history.schema.json +18 -0
- package/schemas/responses/lifecycle/prerequisites.schema.json +18 -0
- package/schemas/responses/lifecycle/progress.schema.json +18 -0
- package/schemas/responses/lifecycle/reset.schema.json +18 -0
- package/schemas/responses/lifecycle/skip.schema.json +18 -0
- package/schemas/responses/lifecycle/status.schema.json +18 -0
- package/schemas/responses/orchestrate/analyze.schema.json +18 -0
- package/schemas/responses/orchestrate/context.schema.json +18 -0
- package/schemas/responses/orchestrate/next.schema.json +18 -0
- package/schemas/responses/orchestrate/parallel.end.schema.json +18 -0
- package/schemas/responses/orchestrate/parallel.start.schema.json +18 -0
- package/schemas/responses/orchestrate/ready.schema.json +18 -0
- package/schemas/responses/orchestrate/skill.list.schema.json +18 -0
- package/schemas/responses/orchestrate/spawn.schema.json +18 -0
- package/schemas/responses/orchestrate/startup.schema.json +18 -0
- package/schemas/responses/orchestrate/status.schema.json +18 -0
- package/schemas/responses/orchestrate/validate.schema.json +18 -0
- package/schemas/responses/orchestrate/waves.schema.json +18 -0
- package/schemas/responses/release/changelog.schema.json +18 -0
- package/schemas/responses/release/commit.schema.json +18 -0
- package/schemas/responses/release/gates.run.schema.json +18 -0
- package/schemas/responses/release/prepare.schema.json +18 -0
- package/schemas/responses/release/push.schema.json +18 -0
- package/schemas/responses/release/rollback.schema.json +18 -0
- package/schemas/responses/release/tag.schema.json +18 -0
- package/schemas/responses/research/inject.schema.json +18 -0
- package/schemas/responses/research/link.schema.json +18 -0
- package/schemas/responses/research/list.schema.json +18 -0
- package/schemas/responses/research/manifest.append.schema.json +18 -0
- package/schemas/responses/research/manifest.archive.schema.json +18 -0
- package/schemas/responses/research/manifest.read.schema.json +18 -0
- package/schemas/responses/research/pending.schema.json +18 -0
- package/schemas/responses/research/query.schema.json +18 -0
- package/schemas/responses/research/show.schema.json +18 -0
- package/schemas/responses/research/stats.schema.json +18 -0
- package/schemas/responses/session/end.schema.json +18 -0
- package/schemas/responses/session/focus.clear.schema.json +18 -0
- package/schemas/responses/session/focus.get.schema.json +18 -0
- package/schemas/responses/session/focus.set.schema.json +18 -0
- package/schemas/responses/session/gc.schema.json +18 -0
- package/schemas/responses/session/history.schema.json +18 -0
- package/schemas/responses/session/list.schema.json +18 -0
- package/schemas/responses/session/resume.schema.json +18 -0
- package/schemas/responses/session/show.schema.json +18 -0
- package/schemas/responses/session/start.schema.json +18 -0
- package/schemas/responses/session/status.schema.json +18 -0
- package/schemas/responses/session/suspend.schema.json +18 -0
- package/schemas/responses/system/backup.schema.json +18 -0
- package/schemas/responses/system/cleanup.schema.json +18 -0
- package/schemas/responses/system/config.get.schema.json +18 -0
- package/schemas/responses/system/config.set.schema.json +18 -0
- package/schemas/responses/system/context.schema.json +18 -0
- package/schemas/responses/system/doctor.schema.json +18 -0
- package/schemas/responses/system/init.schema.json +18 -0
- package/schemas/responses/system/migrate.schema.json +18 -0
- package/schemas/responses/system/restore.schema.json +18 -0
- package/schemas/responses/system/stats.schema.json +18 -0
- package/schemas/responses/system/sync.schema.json +18 -0
- package/schemas/responses/system/version.schema.json +18 -0
- package/schemas/responses/tasks/analyze.schema.json +18 -0
- package/schemas/responses/tasks/archive.schema.json +18 -0
- package/schemas/responses/tasks/blockers.schema.json +18 -0
- package/schemas/responses/tasks/complete.schema.json +18 -0
- package/schemas/responses/tasks/create.schema.json +18 -0
- package/schemas/responses/tasks/delete.schema.json +18 -0
- package/schemas/responses/tasks/deps.schema.json +18 -0
- package/schemas/responses/tasks/exists.schema.json +18 -0
- package/schemas/responses/tasks/find.schema.json +18 -0
- package/schemas/responses/tasks/get.schema.json +87 -0
- package/schemas/responses/tasks/list.schema.json +18 -0
- package/schemas/responses/tasks/next.schema.json +18 -0
- package/schemas/responses/tasks/promote.schema.json +18 -0
- package/schemas/responses/tasks/reopen.schema.json +18 -0
- package/schemas/responses/tasks/reorder.schema.json +18 -0
- package/schemas/responses/tasks/reparent.schema.json +18 -0
- package/schemas/responses/tasks/tree.schema.json +18 -0
- package/schemas/responses/tasks/unarchive.schema.json +18 -0
- package/schemas/responses/tasks/update.schema.json +18 -0
- package/schemas/responses/validate/compliance.record.schema.json +18 -0
- package/schemas/responses/validate/compliance.summary.schema.json +18 -0
- package/schemas/responses/validate/compliance.violations.schema.json +18 -0
- package/schemas/responses/validate/manifest.schema.json +18 -0
- package/schemas/responses/validate/output.schema.json +18 -0
- package/schemas/responses/validate/protocol.schema.json +18 -0
- package/schemas/responses/validate/schema.schema.json +18 -0
- package/schemas/responses/validate/task.schema.json +18 -0
- package/schemas/responses/validate/test.coverage.schema.json +18 -0
- package/schemas/responses/validate/test.run.schema.json +18 -0
- package/schemas/responses/validate/test.status.schema.json +18 -0
- package/server.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,KAAK,CAMX;IACF,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAA+C;gBAEvD,KAAK,GAAE,MAAc,EAAE,OAAO,GAAE,OAAc;IAc1D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAOrF;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS;IA0BpG;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAyBhH;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAmBxC;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,YAAY,IAAI,MAAM;IAoBtB;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,CAAC,MAAM;CASf"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory query cache for CLEO MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Caches cleo_query responses with configurable TTL.
|
|
5
|
+
* Cache key = domain + operation + hash(params).
|
|
6
|
+
* Invalidated on any cleo_mutate operation for the relevant domain.
|
|
7
|
+
*
|
|
8
|
+
* @task T3145
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
/**
|
|
12
|
+
* Query cache with per-domain invalidation
|
|
13
|
+
*/
|
|
14
|
+
export class QueryCache {
|
|
15
|
+
store = new Map();
|
|
16
|
+
domainKeys = new Map();
|
|
17
|
+
stats = {
|
|
18
|
+
hits: 0,
|
|
19
|
+
misses: 0,
|
|
20
|
+
evictions: 0,
|
|
21
|
+
size: 0,
|
|
22
|
+
domains: {},
|
|
23
|
+
};
|
|
24
|
+
ttl;
|
|
25
|
+
enabled;
|
|
26
|
+
cleanupTimer = null;
|
|
27
|
+
constructor(ttlMs = 30000, enabled = true) {
|
|
28
|
+
this.ttl = ttlMs;
|
|
29
|
+
this.enabled = enabled;
|
|
30
|
+
// Periodic cleanup of expired entries every TTL interval
|
|
31
|
+
if (enabled && ttlMs > 0) {
|
|
32
|
+
this.cleanupTimer = setInterval(() => this.evictExpired(), ttlMs);
|
|
33
|
+
// Allow Node to exit even if timer is running
|
|
34
|
+
if (this.cleanupTimer.unref) {
|
|
35
|
+
this.cleanupTimer.unref();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build cache key from domain, operation, and params
|
|
41
|
+
*/
|
|
42
|
+
buildKey(domain, operation, params) {
|
|
43
|
+
const paramsHash = params
|
|
44
|
+
? createHash('md5').update(JSON.stringify(sortObject(params))).digest('hex').slice(0, 12)
|
|
45
|
+
: 'no-params';
|
|
46
|
+
return `${domain}:${operation}:${paramsHash}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get cached value, or undefined if not found/expired
|
|
50
|
+
*/
|
|
51
|
+
get(domain, operation, params) {
|
|
52
|
+
if (!this.enabled) {
|
|
53
|
+
this.stats.misses++;
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const key = this.buildKey(domain, operation, params);
|
|
57
|
+
const entry = this.store.get(key);
|
|
58
|
+
if (!entry) {
|
|
59
|
+
this.stats.misses++;
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
// Check TTL expiration
|
|
63
|
+
if (Date.now() > entry.expiresAt) {
|
|
64
|
+
this.delete(key, domain);
|
|
65
|
+
this.stats.misses++;
|
|
66
|
+
this.stats.evictions++;
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
this.stats.hits++;
|
|
70
|
+
return entry.value;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Store a value in the cache
|
|
74
|
+
*/
|
|
75
|
+
set(domain, operation, params, value) {
|
|
76
|
+
if (!this.enabled || this.ttl <= 0) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const key = this.buildKey(domain, operation, params);
|
|
80
|
+
const now = Date.now();
|
|
81
|
+
this.store.set(key, {
|
|
82
|
+
value,
|
|
83
|
+
expiresAt: now + this.ttl,
|
|
84
|
+
createdAt: now,
|
|
85
|
+
});
|
|
86
|
+
// Track key under its domain for bulk invalidation
|
|
87
|
+
if (!this.domainKeys.has(domain)) {
|
|
88
|
+
this.domainKeys.set(domain, new Set());
|
|
89
|
+
}
|
|
90
|
+
this.domainKeys.get(domain).add(key);
|
|
91
|
+
// Update stats
|
|
92
|
+
this.stats.size = this.store.size;
|
|
93
|
+
this.stats.domains[domain] = this.domainKeys.get(domain).size;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Invalidate all cached entries for a domain
|
|
97
|
+
*
|
|
98
|
+
* Called on any cleo_mutate operation to ensure consistency.
|
|
99
|
+
*/
|
|
100
|
+
invalidateDomain(domain) {
|
|
101
|
+
const keys = this.domainKeys.get(domain);
|
|
102
|
+
if (!keys || keys.size === 0) {
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
const count = keys.size;
|
|
106
|
+
for (const key of keys) {
|
|
107
|
+
this.store.delete(key);
|
|
108
|
+
}
|
|
109
|
+
keys.clear();
|
|
110
|
+
this.stats.evictions += count;
|
|
111
|
+
this.stats.size = this.store.size;
|
|
112
|
+
this.stats.domains[domain] = 0;
|
|
113
|
+
return count;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Clear entire cache
|
|
117
|
+
*/
|
|
118
|
+
clear() {
|
|
119
|
+
const count = this.store.size;
|
|
120
|
+
this.store.clear();
|
|
121
|
+
this.domainKeys.clear();
|
|
122
|
+
this.stats.evictions += count;
|
|
123
|
+
this.stats.size = 0;
|
|
124
|
+
this.stats.domains = {};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get cache statistics
|
|
128
|
+
*/
|
|
129
|
+
getStats() {
|
|
130
|
+
return { ...this.stats, size: this.store.size };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Reset statistics counters
|
|
134
|
+
*/
|
|
135
|
+
resetStats() {
|
|
136
|
+
this.stats.hits = 0;
|
|
137
|
+
this.stats.misses = 0;
|
|
138
|
+
this.stats.evictions = 0;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Evict all expired entries
|
|
142
|
+
*/
|
|
143
|
+
evictExpired() {
|
|
144
|
+
const now = Date.now();
|
|
145
|
+
let count = 0;
|
|
146
|
+
for (const [key, entry] of this.store) {
|
|
147
|
+
if (now > entry.expiresAt) {
|
|
148
|
+
// Find the domain for this key
|
|
149
|
+
const domain = key.split(':')[0];
|
|
150
|
+
this.delete(key, domain);
|
|
151
|
+
count++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (count > 0) {
|
|
155
|
+
this.stats.evictions += count;
|
|
156
|
+
}
|
|
157
|
+
return count;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Stop the cleanup timer (call on shutdown)
|
|
161
|
+
*/
|
|
162
|
+
destroy() {
|
|
163
|
+
if (this.cleanupTimer) {
|
|
164
|
+
clearInterval(this.cleanupTimer);
|
|
165
|
+
this.cleanupTimer = null;
|
|
166
|
+
}
|
|
167
|
+
this.clear();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if cache is enabled
|
|
171
|
+
*/
|
|
172
|
+
isEnabled() {
|
|
173
|
+
return this.enabled;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Delete a single key and update domain tracking
|
|
177
|
+
*/
|
|
178
|
+
delete(key, domain) {
|
|
179
|
+
this.store.delete(key);
|
|
180
|
+
const keys = this.domainKeys.get(domain);
|
|
181
|
+
if (keys) {
|
|
182
|
+
keys.delete(key);
|
|
183
|
+
this.stats.domains[domain] = keys.size;
|
|
184
|
+
}
|
|
185
|
+
this.stats.size = this.store.size;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Sort object keys recursively for deterministic hashing
|
|
190
|
+
*/
|
|
191
|
+
function sortObject(obj) {
|
|
192
|
+
const sorted = {};
|
|
193
|
+
for (const key of Object.keys(obj).sort()) {
|
|
194
|
+
const val = obj[key];
|
|
195
|
+
if (val !== null && typeof val === 'object' && !Array.isArray(val)) {
|
|
196
|
+
sorted[key] = sortObject(val);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
sorted[key] = val;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return sorted;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command Builder
|
|
3
|
+
*
|
|
4
|
+
* Constructs safe CLI commands with proper argument escaping and flag formatting.
|
|
5
|
+
* Prevents shell injection attacks by properly escaping all arguments.
|
|
6
|
+
*
|
|
7
|
+
* @task T2914
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escape shell argument to prevent injection
|
|
11
|
+
*
|
|
12
|
+
* Wraps argument in single quotes and escapes any embedded single quotes.
|
|
13
|
+
* This is safe for all shell interpreters (bash, sh, zsh).
|
|
14
|
+
*/
|
|
15
|
+
export declare function escapeArg(arg: string | number | boolean): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format CLI flags from key-value object
|
|
18
|
+
*
|
|
19
|
+
* Converts {json: true, parent: "T001"} to ["--json", "--parent", "T001"]
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatFlags(flags: Record<string, unknown>): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Map domain+operation to CLI command
|
|
24
|
+
*
|
|
25
|
+
* Maps MCP domain/operation pairs to the actual CLI command structure.
|
|
26
|
+
* For example: domain='tasks', operation='add' -> command='add', addOperationAsSubcommand=false
|
|
27
|
+
*/
|
|
28
|
+
export declare function mapDomainToCommand(domain: string, operation: string): {
|
|
29
|
+
command: string;
|
|
30
|
+
addOperationAsSubcommand: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Build complete CLI command
|
|
34
|
+
*
|
|
35
|
+
* @param cliPath - Path to CLEO CLI executable
|
|
36
|
+
* @param domain - Domain name (e.g., 'tasks', 'session') OR direct command (e.g., 'show', 'add')
|
|
37
|
+
* @param operation - Operation name (e.g., 'show', 'list') OR first argument
|
|
38
|
+
* @param args - Positional arguments
|
|
39
|
+
* @param flags - Named flags/options
|
|
40
|
+
* @returns Complete command string ready for execution
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* buildCLICommand('cleo', 'tasks', 'show', ['T2914'], {json: true})
|
|
45
|
+
* // Returns: "cleo show 'T2914' --json"
|
|
46
|
+
*
|
|
47
|
+
* buildCLICommand('cleo', 'show', 'T2914', [], {json: true})
|
|
48
|
+
* // Returns: "cleo show 'T2914' --json"
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildCLICommand(cliPath: string, domain: string, operation: string, args?: Array<string | number>, flags?: Record<string, unknown>): string;
|
|
52
|
+
//# sourceMappingURL=command-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-builder.d.ts","sourceRoot":"","sources":["../../src/lib/command-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAUhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAqCpE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,OAAO,CAAA;CAAE,CA2J5H;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAM,EACjC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,MAAM,CA+CR"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Command Builder
|
|
3
|
+
*
|
|
4
|
+
* Constructs safe CLI commands with proper argument escaping and flag formatting.
|
|
5
|
+
* Prevents shell injection attacks by properly escaping all arguments.
|
|
6
|
+
*
|
|
7
|
+
* @task T2914
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escape shell argument to prevent injection
|
|
11
|
+
*
|
|
12
|
+
* Wraps argument in single quotes and escapes any embedded single quotes.
|
|
13
|
+
* This is safe for all shell interpreters (bash, sh, zsh).
|
|
14
|
+
*/
|
|
15
|
+
export function escapeArg(arg) {
|
|
16
|
+
// Convert to string
|
|
17
|
+
const str = String(arg);
|
|
18
|
+
// Escape single quotes by replacing ' with '\''
|
|
19
|
+
// This closes the quote, adds an escaped quote, and reopens the quote
|
|
20
|
+
const escaped = str.replace(/'/g, "'\\''");
|
|
21
|
+
// Wrap in single quotes
|
|
22
|
+
return `'${escaped}'`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Format CLI flags from key-value object
|
|
26
|
+
*
|
|
27
|
+
* Converts {json: true, parent: "T001"} to ["--json", "--parent", "T001"]
|
|
28
|
+
*/
|
|
29
|
+
export function formatFlags(flags) {
|
|
30
|
+
const result = [];
|
|
31
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
32
|
+
// Skip undefined/null values
|
|
33
|
+
if (value === undefined || value === null) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// Boolean flags
|
|
37
|
+
if (typeof value === 'boolean') {
|
|
38
|
+
if (value === true) {
|
|
39
|
+
result.push(`--${key}`);
|
|
40
|
+
}
|
|
41
|
+
// Skip false boolean flags (don't add anything)
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Array flags (multiple values)
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
for (const item of value) {
|
|
47
|
+
result.push(`--${key}`, escapeArg(item));
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Object flags (JSON stringify)
|
|
52
|
+
if (typeof value === 'object') {
|
|
53
|
+
result.push(`--${key}`, escapeArg(JSON.stringify(value)));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Regular flags (string/number)
|
|
57
|
+
result.push(`--${key}`, escapeArg(value));
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Map domain+operation to CLI command
|
|
63
|
+
*
|
|
64
|
+
* Maps MCP domain/operation pairs to the actual CLI command structure.
|
|
65
|
+
* For example: domain='tasks', operation='add' -> command='add', addOperationAsSubcommand=false
|
|
66
|
+
*/
|
|
67
|
+
export function mapDomainToCommand(domain, operation) {
|
|
68
|
+
// For tasks domain, the operation IS the command
|
|
69
|
+
// For session/lifecycle domains, we need both (e.g., 'session start')
|
|
70
|
+
const domainOperationMap = {
|
|
71
|
+
tasks: {
|
|
72
|
+
show: { command: 'show', addOperationAsSubcommand: false },
|
|
73
|
+
list: { command: 'list', addOperationAsSubcommand: false },
|
|
74
|
+
find: { command: 'find', addOperationAsSubcommand: false },
|
|
75
|
+
add: { command: 'add', addOperationAsSubcommand: false },
|
|
76
|
+
update: { command: 'update', addOperationAsSubcommand: false },
|
|
77
|
+
complete: { command: 'complete', addOperationAsSubcommand: false },
|
|
78
|
+
delete: { command: 'delete', addOperationAsSubcommand: false },
|
|
79
|
+
archive: { command: 'archive', addOperationAsSubcommand: false },
|
|
80
|
+
unarchive: { command: 'unarchive', addOperationAsSubcommand: false },
|
|
81
|
+
restore: { command: 'restore', addOperationAsSubcommand: false },
|
|
82
|
+
reopen: { command: 'reopen', addOperationAsSubcommand: false },
|
|
83
|
+
exists: { command: 'exists', addOperationAsSubcommand: false },
|
|
84
|
+
next: { command: 'next', addOperationAsSubcommand: false },
|
|
85
|
+
deps: { command: 'deps', addOperationAsSubcommand: false },
|
|
86
|
+
blockers: { command: 'blockers', addOperationAsSubcommand: false },
|
|
87
|
+
tree: { command: 'tree', addOperationAsSubcommand: false },
|
|
88
|
+
analyze: { command: 'analyze', addOperationAsSubcommand: false },
|
|
89
|
+
},
|
|
90
|
+
session: {
|
|
91
|
+
start: { command: 'session', addOperationAsSubcommand: true },
|
|
92
|
+
end: { command: 'session', addOperationAsSubcommand: true },
|
|
93
|
+
status: { command: 'session', addOperationAsSubcommand: true },
|
|
94
|
+
list: { command: 'session', addOperationAsSubcommand: true },
|
|
95
|
+
show: { command: 'session', addOperationAsSubcommand: true },
|
|
96
|
+
focus: { command: 'focus', addOperationAsSubcommand: false },
|
|
97
|
+
suspend: { command: 'session', addOperationAsSubcommand: true },
|
|
98
|
+
resume: { command: 'session', addOperationAsSubcommand: true },
|
|
99
|
+
history: { command: 'session', addOperationAsSubcommand: true },
|
|
100
|
+
archive: { command: 'session', addOperationAsSubcommand: true },
|
|
101
|
+
cleanup: { command: 'session', addOperationAsSubcommand: true },
|
|
102
|
+
doctor: { command: 'session', addOperationAsSubcommand: true },
|
|
103
|
+
switch: { command: 'session', addOperationAsSubcommand: true },
|
|
104
|
+
// Compound focus operations from MCP (session.focus.set → cleo focus set)
|
|
105
|
+
'focus.set': { command: 'focus set', addOperationAsSubcommand: false },
|
|
106
|
+
'focus.clear': { command: 'focus clear', addOperationAsSubcommand: false },
|
|
107
|
+
'focus.get': { command: 'focus show', addOperationAsSubcommand: false },
|
|
108
|
+
'focus.show': { command: 'focus show', addOperationAsSubcommand: false },
|
|
109
|
+
'focus.note': { command: 'focus note', addOperationAsSubcommand: false },
|
|
110
|
+
'focus.next': { command: 'focus next', addOperationAsSubcommand: false },
|
|
111
|
+
},
|
|
112
|
+
// Focus operations mapped to 'cleo focus <subcommand>'
|
|
113
|
+
// These handle 'focus.set' / 'focus.clear' / 'focus.get' operations
|
|
114
|
+
// from the session domain in MCP
|
|
115
|
+
focus: {
|
|
116
|
+
set: { command: 'focus', addOperationAsSubcommand: true },
|
|
117
|
+
clear: { command: 'focus', addOperationAsSubcommand: true },
|
|
118
|
+
show: { command: 'focus', addOperationAsSubcommand: true },
|
|
119
|
+
get: { command: 'focus show', addOperationAsSubcommand: false },
|
|
120
|
+
note: { command: 'focus', addOperationAsSubcommand: true },
|
|
121
|
+
next: { command: 'focus', addOperationAsSubcommand: true },
|
|
122
|
+
},
|
|
123
|
+
lifecycle: {
|
|
124
|
+
status: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
125
|
+
stages: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
126
|
+
validate: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
127
|
+
record: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
128
|
+
enforce: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
129
|
+
skip: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
130
|
+
unskip: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
131
|
+
report: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
132
|
+
export: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
133
|
+
import: { command: 'lifecycle', addOperationAsSubcommand: true },
|
|
134
|
+
// Map MCP operation aliases to CLI equivalents
|
|
135
|
+
progress: { command: 'lifecycle record', addOperationAsSubcommand: false },
|
|
136
|
+
check: { command: 'lifecycle validate', addOperationAsSubcommand: false },
|
|
137
|
+
gate: { command: 'lifecycle enforce', addOperationAsSubcommand: false },
|
|
138
|
+
gates: { command: 'lifecycle stages', addOperationAsSubcommand: false },
|
|
139
|
+
prerequisites: { command: 'lifecycle stages', addOperationAsSubcommand: false },
|
|
140
|
+
history: { command: 'lifecycle export', addOperationAsSubcommand: false },
|
|
141
|
+
reset: { command: 'lifecycle record', addOperationAsSubcommand: false },
|
|
142
|
+
'gate.pass': { command: 'lifecycle enforce', addOperationAsSubcommand: false },
|
|
143
|
+
'gate.fail': { command: 'lifecycle enforce', addOperationAsSubcommand: false },
|
|
144
|
+
},
|
|
145
|
+
// Orchestrate domain maps to 'cleo orchestrator <subcommand>'
|
|
146
|
+
orchestrate: {
|
|
147
|
+
analyze: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
148
|
+
start: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
149
|
+
startup: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
150
|
+
status: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
151
|
+
next: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
152
|
+
ready: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
153
|
+
spawn: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
154
|
+
waves: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
155
|
+
parallel: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
156
|
+
check: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
157
|
+
validate: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
158
|
+
context: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
159
|
+
skill: { command: 'orchestrator', addOperationAsSubcommand: true },
|
|
160
|
+
},
|
|
161
|
+
// Research domain maps to 'cleo research <subcommand>'
|
|
162
|
+
research: {
|
|
163
|
+
link: { command: 'research', addOperationAsSubcommand: true },
|
|
164
|
+
links: { command: 'research', addOperationAsSubcommand: true },
|
|
165
|
+
unlink: { command: 'research', addOperationAsSubcommand: true },
|
|
166
|
+
list: { command: 'research', addOperationAsSubcommand: true },
|
|
167
|
+
show: { command: 'research', addOperationAsSubcommand: true },
|
|
168
|
+
get: { command: 'research', addOperationAsSubcommand: true },
|
|
169
|
+
add: { command: 'research', addOperationAsSubcommand: true },
|
|
170
|
+
query: { command: 'research', addOperationAsSubcommand: false },
|
|
171
|
+
stats: { command: 'research', addOperationAsSubcommand: true },
|
|
172
|
+
pending: { command: 'research', addOperationAsSubcommand: true },
|
|
173
|
+
inject: { command: 'research', addOperationAsSubcommand: true },
|
|
174
|
+
archive: { command: 'research', addOperationAsSubcommand: true },
|
|
175
|
+
'archive-list': { command: 'research', addOperationAsSubcommand: true },
|
|
176
|
+
status: { command: 'research', addOperationAsSubcommand: true },
|
|
177
|
+
compact: { command: 'research', addOperationAsSubcommand: true },
|
|
178
|
+
validate: { command: 'research', addOperationAsSubcommand: true },
|
|
179
|
+
// Manifest sub-operations map to actual CLI subcommands
|
|
180
|
+
'manifest.append': { command: 'research add', addOperationAsSubcommand: false },
|
|
181
|
+
'manifest.read': { command: 'research list', addOperationAsSubcommand: false },
|
|
182
|
+
'manifest.archive': { command: 'research archive', addOperationAsSubcommand: false },
|
|
183
|
+
},
|
|
184
|
+
system: {
|
|
185
|
+
version: { command: 'version', addOperationAsSubcommand: false },
|
|
186
|
+
config: { command: 'config', addOperationAsSubcommand: false },
|
|
187
|
+
backup: { command: 'backup', addOperationAsSubcommand: false },
|
|
188
|
+
cleanup: { command: 'cleanup', addOperationAsSubcommand: false },
|
|
189
|
+
doctor: { command: 'doctor', addOperationAsSubcommand: false },
|
|
190
|
+
stats: { command: 'stats', addOperationAsSubcommand: false },
|
|
191
|
+
context: { command: 'context', addOperationAsSubcommand: false },
|
|
192
|
+
},
|
|
193
|
+
validate: {
|
|
194
|
+
schema: { command: 'validate', addOperationAsSubcommand: false },
|
|
195
|
+
task: { command: 'validate', addOperationAsSubcommand: false },
|
|
196
|
+
compliance: { command: 'compliance', addOperationAsSubcommand: false },
|
|
197
|
+
test: { command: 'test', addOperationAsSubcommand: false },
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
const mapping = domainOperationMap[domain]?.[operation];
|
|
201
|
+
if (mapping) {
|
|
202
|
+
return mapping;
|
|
203
|
+
}
|
|
204
|
+
// Handle compound operations (e.g., 'focus.set' in 'session' domain)
|
|
205
|
+
// Split on first dot and try to resolve via a sub-domain
|
|
206
|
+
if (operation.includes('.')) {
|
|
207
|
+
const dotIndex = operation.indexOf('.');
|
|
208
|
+
const subDomain = operation.substring(0, dotIndex);
|
|
209
|
+
const subOp = operation.substring(dotIndex + 1);
|
|
210
|
+
// Check if there's a dedicated domain for the sub-operation
|
|
211
|
+
const subMapping = domainOperationMap[subDomain]?.[subOp];
|
|
212
|
+
if (subMapping) {
|
|
213
|
+
return subMapping;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Default: use domain as command, operation as subcommand
|
|
217
|
+
return { command: domain, addOperationAsSubcommand: true };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Build complete CLI command
|
|
221
|
+
*
|
|
222
|
+
* @param cliPath - Path to CLEO CLI executable
|
|
223
|
+
* @param domain - Domain name (e.g., 'tasks', 'session') OR direct command (e.g., 'show', 'add')
|
|
224
|
+
* @param operation - Operation name (e.g., 'show', 'list') OR first argument
|
|
225
|
+
* @param args - Positional arguments
|
|
226
|
+
* @param flags - Named flags/options
|
|
227
|
+
* @returns Complete command string ready for execution
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* buildCLICommand('cleo', 'tasks', 'show', ['T2914'], {json: true})
|
|
232
|
+
* // Returns: "cleo show 'T2914' --json"
|
|
233
|
+
*
|
|
234
|
+
* buildCLICommand('cleo', 'show', 'T2914', [], {json: true})
|
|
235
|
+
* // Returns: "cleo show 'T2914' --json"
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
export function buildCLICommand(cliPath, domain, operation, args = [], flags = {}) {
|
|
239
|
+
const parts = [cliPath];
|
|
240
|
+
// Check if we need to map domain+operation to CLI command
|
|
241
|
+
// This handles E2E tests that use domain='tasks', operation='add'
|
|
242
|
+
// versus domain handlers that use domain='add', operation=title
|
|
243
|
+
// Valid CLI commands that can be used directly as the first command word.
|
|
244
|
+
// These are commands where domain IS the command itself (e.g., domain='add', operation='My Task Title').
|
|
245
|
+
// Do NOT include domain names that need mapDomainToCommand lookup (like 'session', 'lifecycle',
|
|
246
|
+
// 'orchestrate', 'research', 'tasks', 'focus', 'system', 'validate').
|
|
247
|
+
const validCliCommands = [
|
|
248
|
+
'add', 'list', 'show', 'find', 'update', 'complete', 'delete', 'archive',
|
|
249
|
+
'restore', 'exists', 'next', 'version', 'dash', 'analyze', 'config',
|
|
250
|
+
'backup', 'init', 'blockers', 'deps', 'tree',
|
|
251
|
+
];
|
|
252
|
+
if (!validCliCommands.includes(domain)) {
|
|
253
|
+
// This looks like domain='tasks', operation='add' pattern from E2E tests
|
|
254
|
+
// Map it to the proper CLI command
|
|
255
|
+
const mapping = mapDomainToCommand(domain, operation);
|
|
256
|
+
parts.push(mapping.command);
|
|
257
|
+
// For commands that need the operation as a subcommand (session, lifecycle)
|
|
258
|
+
if (mapping.addOperationAsSubcommand) {
|
|
259
|
+
parts.push(escapeArg(operation));
|
|
260
|
+
}
|
|
261
|
+
// For tasks domain, the operation IS already the command, so don't add it again
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
// This is already a direct CLI command (domain='add', operation=title)
|
|
265
|
+
parts.push(domain);
|
|
266
|
+
// Add operation (may be user-controlled, e.g., task title, so escape it)
|
|
267
|
+
if (operation) {
|
|
268
|
+
parts.push(escapeArg(operation));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Add positional arguments (escaped)
|
|
272
|
+
for (const arg of args) {
|
|
273
|
+
parts.push(escapeArg(arg));
|
|
274
|
+
}
|
|
275
|
+
// Add flags (escaped)
|
|
276
|
+
const flagParts = formatFlags(flags);
|
|
277
|
+
parts.push(...flagParts);
|
|
278
|
+
return parts.join(' ');
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=command-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-builder.js","sourceRoot":"","sources":["../../src/lib/command-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for CLEO MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration from:
|
|
5
|
+
* 1. Environment variables (CLEO_MCP_*)
|
|
6
|
+
* 2. Config file (.cleo/config.json)
|
|
7
|
+
* 3. Defaults (fallback values)
|
|
8
|
+
*
|
|
9
|
+
* @task T2928
|
|
10
|
+
*/
|
|
11
|
+
import { MCPConfig } from './defaults.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration validation error
|
|
14
|
+
*/
|
|
15
|
+
export declare class ConfigValidationError extends Error {
|
|
16
|
+
field: string;
|
|
17
|
+
value: unknown;
|
|
18
|
+
constraint: string;
|
|
19
|
+
constructor(field: string, value: unknown, constraint: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validate complete configuration
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateConfig(config: MCPConfig): void;
|
|
25
|
+
/**
|
|
26
|
+
* Load configuration from all sources
|
|
27
|
+
*
|
|
28
|
+
* Priority order:
|
|
29
|
+
* 1. Environment variables (CLEO_MCP_*)
|
|
30
|
+
* 2. Config file (.cleo/config.json)
|
|
31
|
+
* 3. Defaults
|
|
32
|
+
*/
|
|
33
|
+
export declare function loadConfig(projectRoot?: string): MCPConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Get global configuration (singleton)
|
|
36
|
+
*/
|
|
37
|
+
export declare function getConfig(): MCPConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Reset global configuration (for testing)
|
|
40
|
+
*/
|
|
41
|
+
export declare function resetConfig(): void;
|
|
42
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,SAAS,EASV,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAErC,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,MAAM;gBAFlB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,UAAU,EAAE,MAAM;CAK5B;AAuJD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAatD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAuD1D;AAQD;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|