@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,937 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cleo_mutate Gateway - Write Operations
|
|
3
|
+
*
|
|
4
|
+
* Handles all state-modifying operations with strict validation,
|
|
5
|
+
* audit logging, and rollback support.
|
|
6
|
+
*
|
|
7
|
+
* Domains: tasks, session, orchestrate, research, lifecycle, validate, release, system
|
|
8
|
+
* Total operations: 53
|
|
9
|
+
*
|
|
10
|
+
* @task T2929
|
|
11
|
+
*/
|
|
12
|
+
import { logMutation } from '../lib/audit.js';
|
|
13
|
+
/**
|
|
14
|
+
* Mutate operation matrix - all write operations by domain
|
|
15
|
+
* Reference: MCP-SERVER-SPECIFICATION.md Section 2.2.2
|
|
16
|
+
*/
|
|
17
|
+
export const MUTATE_OPERATIONS = {
|
|
18
|
+
tasks: [
|
|
19
|
+
'create', // Create new task
|
|
20
|
+
'update', // Update task fields
|
|
21
|
+
'complete', // Mark task done
|
|
22
|
+
'delete', // Delete task
|
|
23
|
+
'archive', // Archive done tasks
|
|
24
|
+
'unarchive', // Restore from archive
|
|
25
|
+
'reparent', // Change task parent
|
|
26
|
+
'promote', // Promote subtask to task
|
|
27
|
+
'reorder', // Reorder siblings
|
|
28
|
+
'reopen', // Reopen completed task
|
|
29
|
+
],
|
|
30
|
+
session: [
|
|
31
|
+
'start', // Start new session
|
|
32
|
+
'end', // End current session
|
|
33
|
+
'resume', // Resume existing session
|
|
34
|
+
'suspend', // Suspend session
|
|
35
|
+
'focus.set', // Set focused task
|
|
36
|
+
'focus.clear', // Clear focus
|
|
37
|
+
'gc', // Garbage collect sessions
|
|
38
|
+
],
|
|
39
|
+
orchestrate: [
|
|
40
|
+
'startup', // Initialize orchestration
|
|
41
|
+
'spawn', // Generate spawn prompt
|
|
42
|
+
'validate', // Validate spawn readiness
|
|
43
|
+
'parallel.start', // Start parallel wave
|
|
44
|
+
'parallel.end', // End parallel wave
|
|
45
|
+
],
|
|
46
|
+
research: [
|
|
47
|
+
'inject', // Get protocol injection
|
|
48
|
+
'link', // Link research to task
|
|
49
|
+
'manifest.append', // Append manifest entry
|
|
50
|
+
'manifest.archive', // Archive old entries
|
|
51
|
+
],
|
|
52
|
+
lifecycle: [
|
|
53
|
+
'progress', // Record stage completion
|
|
54
|
+
'skip', // Skip optional stage
|
|
55
|
+
'reset', // Reset stage (emergency)
|
|
56
|
+
'gate.pass', // Mark gate as passed
|
|
57
|
+
'gate.fail', // Mark gate as failed
|
|
58
|
+
],
|
|
59
|
+
validate: [
|
|
60
|
+
'compliance.record', // Record compliance check
|
|
61
|
+
'test.run', // Execute test suite
|
|
62
|
+
],
|
|
63
|
+
release: [
|
|
64
|
+
'prepare', // Prepare release
|
|
65
|
+
'changelog', // Generate changelog
|
|
66
|
+
'commit', // Create release commit
|
|
67
|
+
'tag', // Create git tag
|
|
68
|
+
'push', // Push to remote
|
|
69
|
+
'gates.run', // Run release gates
|
|
70
|
+
'rollback', // Rollback release
|
|
71
|
+
],
|
|
72
|
+
system: [
|
|
73
|
+
'init', // Initialize CLEO
|
|
74
|
+
'config.set', // Set config value
|
|
75
|
+
'backup', // Create backup
|
|
76
|
+
'restore', // Restore from backup
|
|
77
|
+
'migrate', // Run migrations
|
|
78
|
+
'sync', // Sync with TodoWrite
|
|
79
|
+
'cleanup', // Cleanup stale data
|
|
80
|
+
'job.cancel', // Cancel background job
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Total operation count check
|
|
85
|
+
*/
|
|
86
|
+
const EXPECTED_MUTATE_COUNT = 48;
|
|
87
|
+
const actualMutateCount = Object.values(MUTATE_OPERATIONS).flat().length;
|
|
88
|
+
if (actualMutateCount !== EXPECTED_MUTATE_COUNT) {
|
|
89
|
+
console.error(`Warning: Mutate operation count mismatch. Expected ${EXPECTED_MUTATE_COUNT}, got ${actualMutateCount}`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Idempotent operations that may return success for already-completed actions
|
|
93
|
+
* These operations use exit codes 100+ to signal "already done" vs "just completed"
|
|
94
|
+
*/
|
|
95
|
+
const IDEMPOTENT_OPERATIONS = {
|
|
96
|
+
tasks: ['complete', 'archive'],
|
|
97
|
+
session: ['end', 'focus.clear', 'gc'],
|
|
98
|
+
lifecycle: ['progress', 'skip', 'gate.pass'],
|
|
99
|
+
validate: ['compliance.record'],
|
|
100
|
+
release: ['tag', 'push'],
|
|
101
|
+
system: ['init', 'migrate', 'cleanup'],
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Operations that require session binding
|
|
105
|
+
*/
|
|
106
|
+
const SESSION_REQUIRED_OPERATIONS = {
|
|
107
|
+
tasks: ['create', 'update', 'complete'],
|
|
108
|
+
session: ['start', 'focus.set'],
|
|
109
|
+
orchestrate: ['startup', 'spawn'],
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Validate mutate request parameters
|
|
113
|
+
*/
|
|
114
|
+
export function validateMutateParams(request) {
|
|
115
|
+
const { domain, operation, params } = request;
|
|
116
|
+
// Check if domain is valid
|
|
117
|
+
if (!MUTATE_OPERATIONS[domain]) {
|
|
118
|
+
return {
|
|
119
|
+
valid: false,
|
|
120
|
+
error: {
|
|
121
|
+
_meta: {
|
|
122
|
+
gateway: 'cleo_mutate',
|
|
123
|
+
domain,
|
|
124
|
+
operation,
|
|
125
|
+
version: '1.0.0',
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
duration_ms: 0,
|
|
128
|
+
},
|
|
129
|
+
success: false,
|
|
130
|
+
error: {
|
|
131
|
+
code: 'E_INVALID_DOMAIN',
|
|
132
|
+
exitCode: 2,
|
|
133
|
+
message: `Unknown mutate domain: ${domain}`,
|
|
134
|
+
fix: `Use one of: ${Object.keys(MUTATE_OPERATIONS).join(', ')}`,
|
|
135
|
+
alternatives: Object.keys(MUTATE_OPERATIONS).map((d) => ({
|
|
136
|
+
action: `List ${d} operations`,
|
|
137
|
+
command: `Available: ${MUTATE_OPERATIONS[d].join(', ')}`,
|
|
138
|
+
})),
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Check if operation is valid for this domain
|
|
144
|
+
const validOps = MUTATE_OPERATIONS[domain];
|
|
145
|
+
if (!validOps.includes(operation)) {
|
|
146
|
+
return {
|
|
147
|
+
valid: false,
|
|
148
|
+
error: {
|
|
149
|
+
_meta: {
|
|
150
|
+
gateway: 'cleo_mutate',
|
|
151
|
+
domain,
|
|
152
|
+
operation,
|
|
153
|
+
version: '1.0.0',
|
|
154
|
+
timestamp: new Date().toISOString(),
|
|
155
|
+
duration_ms: 0,
|
|
156
|
+
},
|
|
157
|
+
success: false,
|
|
158
|
+
error: {
|
|
159
|
+
code: 'E_INVALID_OPERATION',
|
|
160
|
+
exitCode: 2,
|
|
161
|
+
message: `Operation '${operation}' not supported for cleo_mutate in domain '${domain}'`,
|
|
162
|
+
fix: `Use one of: ${validOps.join(', ')}`,
|
|
163
|
+
alternatives: validOps.map((op) => ({
|
|
164
|
+
action: `Use ${op}`,
|
|
165
|
+
command: `cleo_mutate ${domain} ${op}`,
|
|
166
|
+
})),
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Perform operation-specific parameter validation
|
|
172
|
+
const paramValidation = validateOperationParams(domain, operation, params);
|
|
173
|
+
if (!paramValidation.valid) {
|
|
174
|
+
return paramValidation;
|
|
175
|
+
}
|
|
176
|
+
return { valid: true };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Validate operation-specific parameters
|
|
180
|
+
*/
|
|
181
|
+
function validateOperationParams(domain, operation, params) {
|
|
182
|
+
// Domain-specific parameter validation
|
|
183
|
+
switch (domain) {
|
|
184
|
+
case 'tasks':
|
|
185
|
+
return validateTasksParams(operation, params);
|
|
186
|
+
case 'session':
|
|
187
|
+
return validateSessionParams(operation, params);
|
|
188
|
+
case 'orchestrate':
|
|
189
|
+
return validateOrchestrateParams(operation, params);
|
|
190
|
+
case 'research':
|
|
191
|
+
return validateResearchParams(operation, params);
|
|
192
|
+
case 'lifecycle':
|
|
193
|
+
return validateLifecycleParams(operation, params);
|
|
194
|
+
case 'validate':
|
|
195
|
+
return validateValidateParams(operation, params);
|
|
196
|
+
case 'release':
|
|
197
|
+
return validateReleaseParams(operation, params);
|
|
198
|
+
case 'system':
|
|
199
|
+
return validateSystemParams(operation, params);
|
|
200
|
+
default:
|
|
201
|
+
return { valid: true };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Validate tasks domain parameters
|
|
206
|
+
*/
|
|
207
|
+
function validateTasksParams(operation, params) {
|
|
208
|
+
switch (operation) {
|
|
209
|
+
case 'create':
|
|
210
|
+
if (!params?.title || !params?.description) {
|
|
211
|
+
return {
|
|
212
|
+
valid: false,
|
|
213
|
+
error: {
|
|
214
|
+
_meta: {
|
|
215
|
+
gateway: 'cleo_mutate',
|
|
216
|
+
domain: 'tasks',
|
|
217
|
+
operation,
|
|
218
|
+
version: '1.0.0',
|
|
219
|
+
timestamp: new Date().toISOString(),
|
|
220
|
+
duration_ms: 0,
|
|
221
|
+
},
|
|
222
|
+
success: false,
|
|
223
|
+
error: {
|
|
224
|
+
code: 'E_VALIDATION_FAILED',
|
|
225
|
+
exitCode: 6,
|
|
226
|
+
message: 'Missing required parameters: title and description',
|
|
227
|
+
fix: 'Provide both title and description fields',
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (params.title === params.description) {
|
|
233
|
+
return {
|
|
234
|
+
valid: false,
|
|
235
|
+
error: {
|
|
236
|
+
_meta: {
|
|
237
|
+
gateway: 'cleo_mutate',
|
|
238
|
+
domain: 'tasks',
|
|
239
|
+
operation,
|
|
240
|
+
version: '1.0.0',
|
|
241
|
+
timestamp: new Date().toISOString(),
|
|
242
|
+
duration_ms: 0,
|
|
243
|
+
},
|
|
244
|
+
success: false,
|
|
245
|
+
error: {
|
|
246
|
+
code: 'E_VALIDATION_FAILED',
|
|
247
|
+
exitCode: 6,
|
|
248
|
+
message: 'Title and description must be different (anti-hallucination requirement)',
|
|
249
|
+
fix: 'Provide a unique description that differs from the title',
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
case 'update':
|
|
256
|
+
case 'complete':
|
|
257
|
+
case 'delete':
|
|
258
|
+
case 'unarchive':
|
|
259
|
+
case 'reparent':
|
|
260
|
+
case 'promote':
|
|
261
|
+
case 'reorder':
|
|
262
|
+
case 'reopen':
|
|
263
|
+
if (!params?.taskId) {
|
|
264
|
+
return {
|
|
265
|
+
valid: false,
|
|
266
|
+
error: {
|
|
267
|
+
_meta: {
|
|
268
|
+
gateway: 'cleo_mutate',
|
|
269
|
+
domain: 'tasks',
|
|
270
|
+
operation,
|
|
271
|
+
version: '1.0.0',
|
|
272
|
+
timestamp: new Date().toISOString(),
|
|
273
|
+
duration_ms: 0,
|
|
274
|
+
},
|
|
275
|
+
success: false,
|
|
276
|
+
error: {
|
|
277
|
+
code: 'E_VALIDATION_FAILED',
|
|
278
|
+
exitCode: 6,
|
|
279
|
+
message: 'Missing required parameter: taskId',
|
|
280
|
+
fix: 'Provide taskId parameter',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
return { valid: true };
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Validate session domain parameters
|
|
291
|
+
*/
|
|
292
|
+
function validateSessionParams(operation, params) {
|
|
293
|
+
switch (operation) {
|
|
294
|
+
case 'start':
|
|
295
|
+
if (!params?.scope) {
|
|
296
|
+
return {
|
|
297
|
+
valid: false,
|
|
298
|
+
error: {
|
|
299
|
+
_meta: {
|
|
300
|
+
gateway: 'cleo_mutate',
|
|
301
|
+
domain: 'session',
|
|
302
|
+
operation,
|
|
303
|
+
version: '1.0.0',
|
|
304
|
+
timestamp: new Date().toISOString(),
|
|
305
|
+
duration_ms: 0,
|
|
306
|
+
},
|
|
307
|
+
success: false,
|
|
308
|
+
error: {
|
|
309
|
+
code: 'E_VALIDATION_FAILED',
|
|
310
|
+
exitCode: 6,
|
|
311
|
+
message: 'Missing required parameter: scope',
|
|
312
|
+
fix: 'Provide scope parameter (e.g., "epic:T1234")',
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
case 'resume':
|
|
319
|
+
if (!params?.sessionId) {
|
|
320
|
+
return {
|
|
321
|
+
valid: false,
|
|
322
|
+
error: {
|
|
323
|
+
_meta: {
|
|
324
|
+
gateway: 'cleo_mutate',
|
|
325
|
+
domain: 'session',
|
|
326
|
+
operation,
|
|
327
|
+
version: '1.0.0',
|
|
328
|
+
timestamp: new Date().toISOString(),
|
|
329
|
+
duration_ms: 0,
|
|
330
|
+
},
|
|
331
|
+
success: false,
|
|
332
|
+
error: {
|
|
333
|
+
code: 'E_VALIDATION_FAILED',
|
|
334
|
+
exitCode: 6,
|
|
335
|
+
message: 'Missing required parameter: sessionId',
|
|
336
|
+
fix: 'Provide sessionId parameter',
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
break;
|
|
342
|
+
case 'focus.set':
|
|
343
|
+
if (!params?.taskId) {
|
|
344
|
+
return {
|
|
345
|
+
valid: false,
|
|
346
|
+
error: {
|
|
347
|
+
_meta: {
|
|
348
|
+
gateway: 'cleo_mutate',
|
|
349
|
+
domain: 'session',
|
|
350
|
+
operation,
|
|
351
|
+
version: '1.0.0',
|
|
352
|
+
timestamp: new Date().toISOString(),
|
|
353
|
+
duration_ms: 0,
|
|
354
|
+
},
|
|
355
|
+
success: false,
|
|
356
|
+
error: {
|
|
357
|
+
code: 'E_VALIDATION_FAILED',
|
|
358
|
+
exitCode: 6,
|
|
359
|
+
message: 'Missing required parameter: taskId',
|
|
360
|
+
fix: 'Provide taskId parameter',
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
return { valid: true };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Validate orchestrate domain parameters
|
|
371
|
+
*/
|
|
372
|
+
function validateOrchestrateParams(operation, params) {
|
|
373
|
+
switch (operation) {
|
|
374
|
+
case 'startup':
|
|
375
|
+
if (!params?.epicId) {
|
|
376
|
+
return {
|
|
377
|
+
valid: false,
|
|
378
|
+
error: {
|
|
379
|
+
_meta: {
|
|
380
|
+
gateway: 'cleo_mutate',
|
|
381
|
+
domain: 'orchestrate',
|
|
382
|
+
operation,
|
|
383
|
+
version: '1.0.0',
|
|
384
|
+
timestamp: new Date().toISOString(),
|
|
385
|
+
duration_ms: 0,
|
|
386
|
+
},
|
|
387
|
+
success: false,
|
|
388
|
+
error: {
|
|
389
|
+
code: 'E_VALIDATION_FAILED',
|
|
390
|
+
exitCode: 6,
|
|
391
|
+
message: 'Missing required parameter: epicId',
|
|
392
|
+
fix: 'Provide epicId parameter',
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
break;
|
|
398
|
+
case 'spawn':
|
|
399
|
+
case 'validate':
|
|
400
|
+
if (!params?.taskId) {
|
|
401
|
+
return {
|
|
402
|
+
valid: false,
|
|
403
|
+
error: {
|
|
404
|
+
_meta: {
|
|
405
|
+
gateway: 'cleo_mutate',
|
|
406
|
+
domain: 'orchestrate',
|
|
407
|
+
operation,
|
|
408
|
+
version: '1.0.0',
|
|
409
|
+
timestamp: new Date().toISOString(),
|
|
410
|
+
duration_ms: 0,
|
|
411
|
+
},
|
|
412
|
+
success: false,
|
|
413
|
+
error: {
|
|
414
|
+
code: 'E_VALIDATION_FAILED',
|
|
415
|
+
exitCode: 6,
|
|
416
|
+
message: 'Missing required parameter: taskId',
|
|
417
|
+
fix: 'Provide taskId parameter',
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
break;
|
|
423
|
+
case 'parallel.start':
|
|
424
|
+
case 'parallel.end':
|
|
425
|
+
if (!params?.epicId || params?.wave === undefined) {
|
|
426
|
+
return {
|
|
427
|
+
valid: false,
|
|
428
|
+
error: {
|
|
429
|
+
_meta: {
|
|
430
|
+
gateway: 'cleo_mutate',
|
|
431
|
+
domain: 'orchestrate',
|
|
432
|
+
operation,
|
|
433
|
+
version: '1.0.0',
|
|
434
|
+
timestamp: new Date().toISOString(),
|
|
435
|
+
duration_ms: 0,
|
|
436
|
+
},
|
|
437
|
+
success: false,
|
|
438
|
+
error: {
|
|
439
|
+
code: 'E_VALIDATION_FAILED',
|
|
440
|
+
exitCode: 6,
|
|
441
|
+
message: 'Missing required parameters: epicId and wave',
|
|
442
|
+
fix: 'Provide both epicId and wave parameters',
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
return { valid: true };
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Validate research domain parameters
|
|
453
|
+
*/
|
|
454
|
+
function validateResearchParams(operation, params) {
|
|
455
|
+
switch (operation) {
|
|
456
|
+
case 'inject':
|
|
457
|
+
if (!params?.protocolType) {
|
|
458
|
+
return {
|
|
459
|
+
valid: false,
|
|
460
|
+
error: {
|
|
461
|
+
_meta: {
|
|
462
|
+
gateway: 'cleo_mutate',
|
|
463
|
+
domain: 'research',
|
|
464
|
+
operation,
|
|
465
|
+
version: '1.0.0',
|
|
466
|
+
timestamp: new Date().toISOString(),
|
|
467
|
+
duration_ms: 0,
|
|
468
|
+
},
|
|
469
|
+
success: false,
|
|
470
|
+
error: {
|
|
471
|
+
code: 'E_VALIDATION_FAILED',
|
|
472
|
+
exitCode: 6,
|
|
473
|
+
message: 'Missing required parameter: protocolType',
|
|
474
|
+
fix: 'Provide protocolType parameter (e.g., "research", "implementation")',
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
break;
|
|
480
|
+
case 'link':
|
|
481
|
+
if (!params?.researchId || !params?.taskId) {
|
|
482
|
+
return {
|
|
483
|
+
valid: false,
|
|
484
|
+
error: {
|
|
485
|
+
_meta: {
|
|
486
|
+
gateway: 'cleo_mutate',
|
|
487
|
+
domain: 'research',
|
|
488
|
+
operation,
|
|
489
|
+
version: '1.0.0',
|
|
490
|
+
timestamp: new Date().toISOString(),
|
|
491
|
+
duration_ms: 0,
|
|
492
|
+
},
|
|
493
|
+
success: false,
|
|
494
|
+
error: {
|
|
495
|
+
code: 'E_VALIDATION_FAILED',
|
|
496
|
+
exitCode: 6,
|
|
497
|
+
message: 'Missing required parameters: researchId and taskId',
|
|
498
|
+
fix: 'Provide both researchId and taskId parameters',
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
break;
|
|
504
|
+
case 'manifest.append':
|
|
505
|
+
if (!params?.entry) {
|
|
506
|
+
return {
|
|
507
|
+
valid: false,
|
|
508
|
+
error: {
|
|
509
|
+
_meta: {
|
|
510
|
+
gateway: 'cleo_mutate',
|
|
511
|
+
domain: 'research',
|
|
512
|
+
operation,
|
|
513
|
+
version: '1.0.0',
|
|
514
|
+
timestamp: new Date().toISOString(),
|
|
515
|
+
duration_ms: 0,
|
|
516
|
+
},
|
|
517
|
+
success: false,
|
|
518
|
+
error: {
|
|
519
|
+
code: 'E_VALIDATION_FAILED',
|
|
520
|
+
exitCode: 6,
|
|
521
|
+
message: 'Missing required parameter: entry',
|
|
522
|
+
fix: 'Provide entry parameter with manifest entry object',
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
return { valid: true };
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Validate lifecycle domain parameters
|
|
533
|
+
*/
|
|
534
|
+
function validateLifecycleParams(operation, params) {
|
|
535
|
+
switch (operation) {
|
|
536
|
+
case 'progress':
|
|
537
|
+
if (!params?.taskId || !params?.stage || !params?.status) {
|
|
538
|
+
return {
|
|
539
|
+
valid: false,
|
|
540
|
+
error: {
|
|
541
|
+
_meta: {
|
|
542
|
+
gateway: 'cleo_mutate',
|
|
543
|
+
domain: 'lifecycle',
|
|
544
|
+
operation,
|
|
545
|
+
version: '1.0.0',
|
|
546
|
+
timestamp: new Date().toISOString(),
|
|
547
|
+
duration_ms: 0,
|
|
548
|
+
},
|
|
549
|
+
success: false,
|
|
550
|
+
error: {
|
|
551
|
+
code: 'E_VALIDATION_FAILED',
|
|
552
|
+
exitCode: 6,
|
|
553
|
+
message: 'Missing required parameters: taskId, stage, and status',
|
|
554
|
+
fix: 'Provide taskId, stage, and status parameters',
|
|
555
|
+
},
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
break;
|
|
560
|
+
case 'skip':
|
|
561
|
+
case 'reset':
|
|
562
|
+
if (!params?.taskId || !params?.stage || !params?.reason) {
|
|
563
|
+
return {
|
|
564
|
+
valid: false,
|
|
565
|
+
error: {
|
|
566
|
+
_meta: {
|
|
567
|
+
gateway: 'cleo_mutate',
|
|
568
|
+
domain: 'lifecycle',
|
|
569
|
+
operation,
|
|
570
|
+
version: '1.0.0',
|
|
571
|
+
timestamp: new Date().toISOString(),
|
|
572
|
+
duration_ms: 0,
|
|
573
|
+
},
|
|
574
|
+
success: false,
|
|
575
|
+
error: {
|
|
576
|
+
code: 'E_VALIDATION_FAILED',
|
|
577
|
+
exitCode: 6,
|
|
578
|
+
message: 'Missing required parameters: taskId, stage, and reason',
|
|
579
|
+
fix: 'Provide taskId, stage, and reason parameters',
|
|
580
|
+
},
|
|
581
|
+
},
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
break;
|
|
585
|
+
case 'gate.pass':
|
|
586
|
+
case 'gate.fail':
|
|
587
|
+
if (!params?.taskId || !params?.gateName) {
|
|
588
|
+
return {
|
|
589
|
+
valid: false,
|
|
590
|
+
error: {
|
|
591
|
+
_meta: {
|
|
592
|
+
gateway: 'cleo_mutate',
|
|
593
|
+
domain: 'lifecycle',
|
|
594
|
+
operation,
|
|
595
|
+
version: '1.0.0',
|
|
596
|
+
timestamp: new Date().toISOString(),
|
|
597
|
+
duration_ms: 0,
|
|
598
|
+
},
|
|
599
|
+
success: false,
|
|
600
|
+
error: {
|
|
601
|
+
code: 'E_VALIDATION_FAILED',
|
|
602
|
+
exitCode: 6,
|
|
603
|
+
message: 'Missing required parameters: taskId and gateName',
|
|
604
|
+
fix: 'Provide taskId and gateName parameters',
|
|
605
|
+
},
|
|
606
|
+
},
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
break;
|
|
610
|
+
}
|
|
611
|
+
return { valid: true };
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Validate validate domain parameters
|
|
615
|
+
*/
|
|
616
|
+
function validateValidateParams(operation, params) {
|
|
617
|
+
switch (operation) {
|
|
618
|
+
case 'compliance.record':
|
|
619
|
+
if (!params?.taskId || !params?.result) {
|
|
620
|
+
return {
|
|
621
|
+
valid: false,
|
|
622
|
+
error: {
|
|
623
|
+
_meta: {
|
|
624
|
+
gateway: 'cleo_mutate',
|
|
625
|
+
domain: 'validate',
|
|
626
|
+
operation,
|
|
627
|
+
version: '1.0.0',
|
|
628
|
+
timestamp: new Date().toISOString(),
|
|
629
|
+
duration_ms: 0,
|
|
630
|
+
},
|
|
631
|
+
success: false,
|
|
632
|
+
error: {
|
|
633
|
+
code: 'E_VALIDATION_FAILED',
|
|
634
|
+
exitCode: 6,
|
|
635
|
+
message: 'Missing required parameters: taskId and result',
|
|
636
|
+
fix: 'Provide taskId and result parameters',
|
|
637
|
+
},
|
|
638
|
+
},
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
643
|
+
return { valid: true };
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Validate release domain parameters
|
|
647
|
+
*/
|
|
648
|
+
function validateReleaseParams(operation, params) {
|
|
649
|
+
switch (operation) {
|
|
650
|
+
case 'prepare':
|
|
651
|
+
case 'changelog':
|
|
652
|
+
case 'commit':
|
|
653
|
+
case 'tag':
|
|
654
|
+
case 'push':
|
|
655
|
+
case 'rollback':
|
|
656
|
+
if (!params?.version) {
|
|
657
|
+
return {
|
|
658
|
+
valid: false,
|
|
659
|
+
error: {
|
|
660
|
+
_meta: {
|
|
661
|
+
gateway: 'cleo_mutate',
|
|
662
|
+
domain: 'release',
|
|
663
|
+
operation,
|
|
664
|
+
version: '1.0.0',
|
|
665
|
+
timestamp: new Date().toISOString(),
|
|
666
|
+
duration_ms: 0,
|
|
667
|
+
},
|
|
668
|
+
success: false,
|
|
669
|
+
error: {
|
|
670
|
+
code: 'E_VALIDATION_FAILED',
|
|
671
|
+
exitCode: 6,
|
|
672
|
+
message: 'Missing required parameter: version',
|
|
673
|
+
fix: 'Provide version parameter (semver format)',
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
};
|
|
677
|
+
}
|
|
678
|
+
break;
|
|
679
|
+
}
|
|
680
|
+
return { valid: true };
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Validate system domain parameters
|
|
684
|
+
*/
|
|
685
|
+
function validateSystemParams(operation, params) {
|
|
686
|
+
switch (operation) {
|
|
687
|
+
case 'config.set':
|
|
688
|
+
if (!params?.key || params?.value === undefined) {
|
|
689
|
+
return {
|
|
690
|
+
valid: false,
|
|
691
|
+
error: {
|
|
692
|
+
_meta: {
|
|
693
|
+
gateway: 'cleo_mutate',
|
|
694
|
+
domain: 'system',
|
|
695
|
+
operation,
|
|
696
|
+
version: '1.0.0',
|
|
697
|
+
timestamp: new Date().toISOString(),
|
|
698
|
+
duration_ms: 0,
|
|
699
|
+
},
|
|
700
|
+
success: false,
|
|
701
|
+
error: {
|
|
702
|
+
code: 'E_VALIDATION_FAILED',
|
|
703
|
+
exitCode: 6,
|
|
704
|
+
message: 'Missing required parameters: key and value',
|
|
705
|
+
fix: 'Provide key and value parameters',
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
break;
|
|
711
|
+
case 'restore':
|
|
712
|
+
if (!params?.backupId) {
|
|
713
|
+
return {
|
|
714
|
+
valid: false,
|
|
715
|
+
error: {
|
|
716
|
+
_meta: {
|
|
717
|
+
gateway: 'cleo_mutate',
|
|
718
|
+
domain: 'system',
|
|
719
|
+
operation,
|
|
720
|
+
version: '1.0.0',
|
|
721
|
+
timestamp: new Date().toISOString(),
|
|
722
|
+
duration_ms: 0,
|
|
723
|
+
},
|
|
724
|
+
success: false,
|
|
725
|
+
error: {
|
|
726
|
+
code: 'E_VALIDATION_FAILED',
|
|
727
|
+
exitCode: 6,
|
|
728
|
+
message: 'Missing required parameter: backupId',
|
|
729
|
+
fix: 'Provide backupId parameter',
|
|
730
|
+
},
|
|
731
|
+
},
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
break;
|
|
735
|
+
case 'job.cancel':
|
|
736
|
+
if (!params?.jobId) {
|
|
737
|
+
return {
|
|
738
|
+
valid: false,
|
|
739
|
+
error: {
|
|
740
|
+
_meta: {
|
|
741
|
+
gateway: 'cleo_mutate',
|
|
742
|
+
domain: 'system',
|
|
743
|
+
operation,
|
|
744
|
+
version: '1.0.0',
|
|
745
|
+
timestamp: new Date().toISOString(),
|
|
746
|
+
duration_ms: 0,
|
|
747
|
+
},
|
|
748
|
+
success: false,
|
|
749
|
+
error: {
|
|
750
|
+
code: 'E_VALIDATION_FAILED',
|
|
751
|
+
exitCode: 6,
|
|
752
|
+
message: 'Missing required parameter: jobId',
|
|
753
|
+
fix: 'Provide jobId parameter',
|
|
754
|
+
},
|
|
755
|
+
},
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
break;
|
|
759
|
+
case 'cleanup':
|
|
760
|
+
if (!params?.type) {
|
|
761
|
+
return {
|
|
762
|
+
valid: false,
|
|
763
|
+
error: {
|
|
764
|
+
_meta: {
|
|
765
|
+
gateway: 'cleo_mutate',
|
|
766
|
+
domain: 'system',
|
|
767
|
+
operation,
|
|
768
|
+
version: '1.0.0',
|
|
769
|
+
timestamp: new Date().toISOString(),
|
|
770
|
+
duration_ms: 0,
|
|
771
|
+
},
|
|
772
|
+
success: false,
|
|
773
|
+
error: {
|
|
774
|
+
code: 'E_VALIDATION_FAILED',
|
|
775
|
+
exitCode: 6,
|
|
776
|
+
message: 'Missing required parameter: type',
|
|
777
|
+
fix: 'Provide type parameter (e.g., "sessions", "backups")',
|
|
778
|
+
},
|
|
779
|
+
},
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
break;
|
|
783
|
+
}
|
|
784
|
+
return { valid: true };
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* Register cleo_mutate tool with MCP server
|
|
788
|
+
*
|
|
789
|
+
* Returns tool definition for ListToolsRequestSchema handler
|
|
790
|
+
*/
|
|
791
|
+
export function registerMutateTool() {
|
|
792
|
+
return {
|
|
793
|
+
name: 'cleo_mutate',
|
|
794
|
+
description: 'CLEO write operations: create, update, complete tasks; manage sessions; spawn agents; progress lifecycle; execute releases. Modifies state with validation.',
|
|
795
|
+
inputSchema: {
|
|
796
|
+
type: 'object',
|
|
797
|
+
required: ['domain', 'operation'],
|
|
798
|
+
properties: {
|
|
799
|
+
domain: {
|
|
800
|
+
type: 'string',
|
|
801
|
+
enum: Object.keys(MUTATE_OPERATIONS),
|
|
802
|
+
description: 'Functional domain to mutate',
|
|
803
|
+
},
|
|
804
|
+
operation: {
|
|
805
|
+
type: 'string',
|
|
806
|
+
description: 'Domain-specific write operation (see operation matrix)',
|
|
807
|
+
},
|
|
808
|
+
params: {
|
|
809
|
+
type: 'object',
|
|
810
|
+
description: 'Operation-specific parameters',
|
|
811
|
+
additionalProperties: true,
|
|
812
|
+
},
|
|
813
|
+
},
|
|
814
|
+
},
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* Handle cleo_mutate request
|
|
819
|
+
*
|
|
820
|
+
* Validates parameters, logs to audit trail, routes to domain handler,
|
|
821
|
+
* and handles idempotency
|
|
822
|
+
*
|
|
823
|
+
* @param request Mutate request with domain, operation, and params
|
|
824
|
+
* @returns Promise resolving to mutate response
|
|
825
|
+
*/
|
|
826
|
+
export async function handleMutateRequest(request) {
|
|
827
|
+
const startTime = Date.now();
|
|
828
|
+
// Validate request parameters
|
|
829
|
+
const validation = validateMutateParams(request);
|
|
830
|
+
if (!validation.valid) {
|
|
831
|
+
return validation.error;
|
|
832
|
+
}
|
|
833
|
+
// Extract task ID from params if present
|
|
834
|
+
const taskId = typeof request.params?.taskId === 'string' ? request.params.taskId : undefined;
|
|
835
|
+
const sessionId = process.env.CLEO_SESSION_ID || null;
|
|
836
|
+
// Log mutation attempt to audit trail
|
|
837
|
+
const auditEntry = {
|
|
838
|
+
timestamp: new Date().toISOString(),
|
|
839
|
+
sessionId,
|
|
840
|
+
domain: request.domain,
|
|
841
|
+
operation: request.operation,
|
|
842
|
+
params: request.params || {},
|
|
843
|
+
result: {
|
|
844
|
+
success: false,
|
|
845
|
+
exitCode: 0,
|
|
846
|
+
duration: 0,
|
|
847
|
+
},
|
|
848
|
+
metadata: {
|
|
849
|
+
taskId,
|
|
850
|
+
source: 'mcp',
|
|
851
|
+
gateway: 'cleo_mutate',
|
|
852
|
+
},
|
|
853
|
+
};
|
|
854
|
+
try {
|
|
855
|
+
// Build domain request (will be routed by DomainRouter)
|
|
856
|
+
const domainRequest = {
|
|
857
|
+
gateway: 'cleo_mutate',
|
|
858
|
+
domain: request.domain,
|
|
859
|
+
operation: request.operation,
|
|
860
|
+
params: request.params,
|
|
861
|
+
};
|
|
862
|
+
// Create response (this function is called by the router)
|
|
863
|
+
const response = {
|
|
864
|
+
_meta: {
|
|
865
|
+
gateway: 'cleo_mutate',
|
|
866
|
+
domain: request.domain,
|
|
867
|
+
operation: request.operation,
|
|
868
|
+
version: '1.0.0',
|
|
869
|
+
timestamp: new Date().toISOString(),
|
|
870
|
+
duration_ms: Date.now() - startTime,
|
|
871
|
+
},
|
|
872
|
+
success: true,
|
|
873
|
+
data: domainRequest,
|
|
874
|
+
};
|
|
875
|
+
// Update audit entry with success
|
|
876
|
+
auditEntry.result.success = true;
|
|
877
|
+
auditEntry.result.exitCode = 0;
|
|
878
|
+
auditEntry.result.duration = Date.now() - startTime;
|
|
879
|
+
// Log to audit trail (async, non-blocking)
|
|
880
|
+
logMutation(auditEntry).catch((err) => {
|
|
881
|
+
console.error('Failed to log mutation to audit trail:', err);
|
|
882
|
+
});
|
|
883
|
+
return response;
|
|
884
|
+
}
|
|
885
|
+
catch (error) {
|
|
886
|
+
// Update audit entry with failure
|
|
887
|
+
auditEntry.result.success = false;
|
|
888
|
+
auditEntry.result.exitCode = 1; // TODO: Extract actual exit code from CLI response
|
|
889
|
+
auditEntry.result.duration = Date.now() - startTime;
|
|
890
|
+
auditEntry.error = error instanceof Error ? error.message : String(error);
|
|
891
|
+
// Log to audit trail (async, non-blocking)
|
|
892
|
+
logMutation(auditEntry).catch((err) => {
|
|
893
|
+
console.error('Failed to log mutation error to audit trail:', err);
|
|
894
|
+
});
|
|
895
|
+
throw error;
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
/**
|
|
899
|
+
* Check if operation is idempotent
|
|
900
|
+
*/
|
|
901
|
+
export function isIdempotentOperation(domain, operation) {
|
|
902
|
+
return IDEMPOTENT_OPERATIONS[domain]?.includes(operation) || false;
|
|
903
|
+
}
|
|
904
|
+
/**
|
|
905
|
+
* Check if operation requires session binding
|
|
906
|
+
*/
|
|
907
|
+
export function requiresSession(domain, operation) {
|
|
908
|
+
return SESSION_REQUIRED_OPERATIONS[domain]?.includes(operation) || false;
|
|
909
|
+
}
|
|
910
|
+
/**
|
|
911
|
+
* Get mutate operation count for specific domain or all domains
|
|
912
|
+
*/
|
|
913
|
+
export function getMutateOperationCount(domain) {
|
|
914
|
+
if (domain) {
|
|
915
|
+
return MUTATE_OPERATIONS[domain]?.length || 0;
|
|
916
|
+
}
|
|
917
|
+
return actualMutateCount;
|
|
918
|
+
}
|
|
919
|
+
/**
|
|
920
|
+
* Check if operation is write (mutate)
|
|
921
|
+
*/
|
|
922
|
+
export function isMutateOperation(domain, operation) {
|
|
923
|
+
return MUTATE_OPERATIONS[domain]?.includes(operation) || false;
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* Get all mutate domains
|
|
927
|
+
*/
|
|
928
|
+
export function getMutateDomains() {
|
|
929
|
+
return Object.keys(MUTATE_OPERATIONS);
|
|
930
|
+
}
|
|
931
|
+
/**
|
|
932
|
+
* Get operations for specific mutate domain
|
|
933
|
+
*/
|
|
934
|
+
export function getMutateOperations(domain) {
|
|
935
|
+
return MUTATE_OPERATIONS[domain] || [];
|
|
936
|
+
}
|
|
937
|
+
//# sourceMappingURL=mutate.js.map
|