@apexops/cli 0.10.0-next.2 → 0.10.0-next.4

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.
@@ -44,11 +44,13 @@
44
44
  "apex/projectList",
45
45
  "apex/projectUse",
46
46
  "apex/projectDelete",
47
+ "apex/gateDecide",
47
48
  "apex/stageArtifact",
48
49
  "apex/stageFile",
49
50
  "apex/generateIac",
50
51
  "apex/validateTask",
51
52
  "apex/completeTask",
53
+ "apex/planComplete",
52
54
  "apex/preview",
53
55
  "apex/reconcile",
54
56
  "apex/inventory",
@@ -72,11 +74,13 @@
72
74
  "projectList",
73
75
  "projectUse",
74
76
  "projectDelete",
77
+ "gateDecide",
75
78
  "stageArtifact",
76
79
  "stageFile",
77
80
  "generateIac",
78
81
  "validateTask",
79
82
  "completeTask",
83
+ "planComplete",
80
84
  "preview",
81
85
  "reconcile",
82
86
  "inventory",
@@ -13,6 +13,7 @@ tools:
13
13
  - apex/taskContext
14
14
  - apex/stageArtifact
15
15
  - apex/completeTask
16
+ - apex/planComplete
16
17
  - azure-resource-manager-mcp/get_retail_prices
17
18
  - azure-resource-manager-mcp/query_costs
18
19
  - azure-resource-manager-mcp/query_aks_costs
@@ -45,9 +46,9 @@ Gate 3.
45
46
  secret reference must include `kind`, `provider`, and `reference`.
46
47
  4. Explain logical resources, dependencies, controls, implementation bindings, environment inputs, and rollback or
47
48
  validation risks. Ask targeted follow-ups only for unresolved user-owned choices; never infer secret values.
48
- 5. Stage `implementation-intent` first. Use its returned hash as `iac-binding.intentHash`, then stage the binding and
49
- environment inputs. Complete the plan once through `apex/completeTask` with all three artifacts in `outputs`; do
50
- not submit a single-output completion.
49
+ 5. Complete plans through `apex/planComplete` with the implementation intent, binding without `intentHash`, and
50
+ environment inputs. The kernel derives the canonical intent hash and atomically validates all three outputs. Do not
51
+ call `apex/completeTask` with a partial plan bundle or a placeholder `intentHash`.
51
52
  6. APEX materializes a read-only Gate 3 package at `agent-output/<project>/<run>/plan/`. Report
52
53
  `implementation-plan.md`, `iac-binding.md`, `environment-inputs.md`, and `challenger-findings.md` for human review.
53
54
  7. When the kernel issues `plan-review`, delegate the exact task to `APEX Reviewer`. Present findings and use targeted
@@ -58,10 +58,14 @@ candidate Azure services without deciding architecture, and produces a human-rev
58
58
  rationale for Architecture.
59
59
  7. Stage and submit the typed requirements artifact. APEX materializes read-only review projections at
60
60
  `agent-output/<project>/<run>/`; report those paths and their artifact hash, but do not edit the generated files.
61
- 8. When the kernel issues `requirements-review`, delegate the exact task to `APEX Reviewer`. Present every returned
62
- completeness or contradiction finding, then use targeted follow-up questions only for findings the user chooses to
63
- resolve. Findings must be remediated, accepted with rationale, or explicitly deferred before Gate 1 can open.
64
- 9. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
61
+ 8. Immediately call `apex/nextTask` after submitting requirements. In VS Code, when it returns the
62
+ `requirements-review` task, invoke `APEX Reviewer` through the `agent` tool with exactly that task context; do not
63
+ wait for the user to request the challenge. In a client without the Reviewer worker, report the exact pending review
64
+ task and do not claim the challenge ran.
65
+ 9. Present every returned completeness or contradiction finding, then use targeted follow-up questions only for
66
+ findings the user chooses to resolve. Findings must be remediated, accepted with rationale, or explicitly deferred
67
+ before Gate 1 can open.
68
+ 10. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
65
69
  `sku-preferences.md`, and `challenger-findings.md`. Gate 1 remains a human terminal ceremony; never approve it.
66
70
 
67
71
  Do not read repository files to discover artifact schemas; `apex/taskContext` is the complete output contract for this
@@ -13,6 +13,7 @@ tools:
13
13
  - apex/projectList
14
14
  - apex/projectUse
15
15
  - apex/projectDelete
16
+ - apex/gateDecide
16
17
  - azure-resource-manager-mcp/get_retail_prices
17
18
  - azure-resource-manager-mcp/query_costs
18
19
  - azure-resource-manager-mcp/query_aks_costs
@@ -69,6 +70,9 @@ Coordinate APEX without authoring project artifacts or inferring workflow state.
69
70
  `apex gate decide --gate <N> --decision <approved|rejected> --actor <USER_ID> --json`. At Gate 4, also require
70
71
  review of the exact preview, target, expiry, and approval recipient before directing
71
72
  `apex gate decide --gate 4 --decision <approved|rejected> --actor <USER_ID> --recipient <RECIPIENT_ID> --json`.
73
+ 9. When the user explicitly says `approve Gate 1`, `approve Gate 2`, `approve Gate 3`, or the equivalent rejection,
74
+ call `apex/gateDecide` with that gate, decision, and `confirm: true`. The operation derives the actor from the local
75
+ OS username. Do not use it for Gate 4, and do not infer confirmation from an ambiguous message.
72
76
 
73
77
  Use the active client projection's question mechanism only for project creation or kernel-owned routing choices. Read
74
78
  `.github/skills/apex-workflow/SKILL.md` only when status, resume, or project selection needs more guidance.
@@ -16,11 +16,13 @@
16
16
  "projectList",
17
17
  "projectUse",
18
18
  "projectDelete",
19
+ "gateDecide",
19
20
  "stageArtifact",
20
21
  "stageFile",
21
22
  "generateIac",
22
23
  "validateTask",
23
24
  "completeTask",
25
+ "planComplete",
24
26
  "preview",
25
27
  "reconcile",
26
28
  "inventory",
@@ -13,6 +13,7 @@ tools:
13
13
  - apex/taskContext
14
14
  - apex/stageArtifact
15
15
  - apex/completeTask
16
+ - apex/planComplete
16
17
  - azure-resource-manager-mcp/get_retail_prices
17
18
  - azure-resource-manager-mcp/query_costs
18
19
  - azure-resource-manager-mcp/query_aks_costs
@@ -55,9 +56,9 @@ Gate 3.
55
56
  secret reference must include `kind`, `provider`, and `reference`.
56
57
  4. Explain logical resources, dependencies, controls, implementation bindings, environment inputs, and rollback or
57
58
  validation risks. Ask targeted follow-ups only for unresolved user-owned choices; never infer secret values.
58
- 5. Stage `implementation-intent` first. Use its returned hash as `iac-binding.intentHash`, then stage the binding and
59
- environment inputs. Complete the plan once through `apex/completeTask` with all three artifacts in `outputs`; do
60
- not submit a single-output completion.
59
+ 5. Complete plans through `apex/planComplete` with the implementation intent, binding without `intentHash`, and
60
+ environment inputs. The kernel derives the canonical intent hash and atomically validates all three outputs. Do not
61
+ call `apex/completeTask` with a partial plan bundle or a placeholder `intentHash`.
61
62
  6. APEX materializes a read-only Gate 3 package at `agent-output/<project>/<run>/plan/`. Report
62
63
  `implementation-plan.md`, `iac-binding.md`, `environment-inputs.md`, and `challenger-findings.md` for human review.
63
64
  7. When the kernel issues `plan-review`, delegate the exact task to `APEX Reviewer`. Present findings and use targeted
@@ -67,10 +67,14 @@ candidate Azure services without deciding architecture, and produces a human-rev
67
67
  rationale for Architecture.
68
68
  7. Stage and submit the typed requirements artifact. APEX materializes read-only review projections at
69
69
  `agent-output/<project>/<run>/`; report those paths and their artifact hash, but do not edit the generated files.
70
- 8. When the kernel issues `requirements-review`, delegate the exact task to `APEX Reviewer`. Present every returned
71
- completeness or contradiction finding, then use targeted follow-up questions only for findings the user chooses to
72
- resolve. Findings must be remediated, accepted with rationale, or explicitly deferred before Gate 1 can open.
73
- 9. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
70
+ 8. Immediately call `apex/nextTask` after submitting requirements. In VS Code, when it returns the
71
+ `requirements-review` task, invoke `APEX Reviewer` through the `agent` tool with exactly that task context; do not
72
+ wait for the user to request the challenge. In a client without the Reviewer worker, report the exact pending review
73
+ task and do not claim the challenge ran.
74
+ 9. Present every returned completeness or contradiction finding, then use targeted follow-up questions only for
75
+ findings the user chooses to resolve. Findings must be remediated, accepted with rationale, or explicitly deferred
76
+ before Gate 1 can open.
77
+ 10. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
74
78
  `sku-preferences.md`, and `challenger-findings.md`. Gate 1 remains a human terminal ceremony; never approve it.
75
79
 
76
80
  Do not read repository files to discover artifact schemas; `apex/taskContext` is the complete output contract for this
@@ -14,6 +14,7 @@ tools:
14
14
  - apex/projectList
15
15
  - apex/projectUse
16
16
  - apex/projectDelete
17
+ - apex/gateDecide
17
18
  - azure-resource-manager-mcp/get_retail_prices
18
19
  - azure-resource-manager-mcp/query_costs
19
20
  - azure-resource-manager-mcp/query_aks_costs
@@ -88,6 +89,9 @@ Coordinate APEX without authoring project artifacts or inferring workflow state.
88
89
  `apex gate decide --gate <N> --decision <approved|rejected> --actor <USER_ID> --json`. At Gate 4, also require
89
90
  review of the exact preview, target, expiry, and approval recipient before directing
90
91
  `apex gate decide --gate 4 --decision <approved|rejected> --actor <USER_ID> --recipient <RECIPIENT_ID> --json`.
92
+ 9. When the user explicitly says `approve Gate 1`, `approve Gate 2`, `approve Gate 3`, or the equivalent rejection,
93
+ call `apex/gateDecide` with that gate, decision, and `confirm: true`. The operation derives the actor from the local
94
+ OS username. Do not use it for Gate 4, and do not infer confirmation from an ambiguous message.
91
95
 
92
96
  Use the active client projection's question mechanism only for project creation or kernel-owned routing choices. Read
93
97
  `.github/skills/apex-workflow/SKILL.md` only when status, resume, or project selection needs more guidance.
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "bundleVersion": "0.10.0-next.2",
3
+ "bundleVersion": "0.10.0-next.4",
4
4
  "capabilityProtocolVersion": "1.0.0",
5
5
  "components": {
6
6
  "cli": {
7
7
  "source": "local",
8
- "version": "0.10.0-next.2"
8
+ "version": "0.10.0-next.4"
9
9
  },
10
10
  "contracts": {
11
11
  "source": "local",
12
- "version": "0.10.0-next.2"
12
+ "version": "0.10.0-next.4"
13
13
  },
14
14
  "kernel": {
15
15
  "source": "local",
16
- "version": "0.10.0-next.2"
16
+ "version": "0.10.0-next.4"
17
17
  },
18
18
  "capabilities": {
19
19
  "source": "local",
20
- "version": "0.10.0-next.2"
20
+ "version": "0.10.0-next.4"
21
21
  },
22
22
  "renderers": {
23
23
  "source": "local",
24
- "version": "0.10.0-next.2"
24
+ "version": "0.10.0-next.4"
25
25
  },
26
26
  "customizationBundle": {
27
27
  "source": "local",
28
- "version": "0.10.0-next.2",
28
+ "version": "0.10.0-next.4",
29
29
  "manifest": "@apexops/cli/assets/customizations/manifest.json",
30
30
  "assetManifest": "@apexops/cli/assets/manifest.json",
31
31
  "compositionId": "apex-managed-workspace"
@@ -12,6 +12,7 @@ tools:
12
12
  - apex/taskContext
13
13
  - apex/stageArtifact
14
14
  - apex/completeTask
15
+ - apex/planComplete
15
16
  - azure-resource-manager-mcp/get_retail_prices
16
17
  - azure-resource-manager-mcp/query_costs
17
18
  - azure-resource-manager-mcp/query_aks_costs
@@ -48,9 +49,9 @@ Gate 3.
48
49
  secret reference must include `kind`, `provider`, and `reference`.
49
50
  4. Explain logical resources, dependencies, controls, implementation bindings, environment inputs, and rollback or
50
51
  validation risks. Ask targeted follow-ups only for unresolved user-owned choices; never infer secret values.
51
- 5. Stage `implementation-intent` first. Use its returned hash as `iac-binding.intentHash`, then stage the binding and
52
- environment inputs. Complete the plan once through `apex/completeTask` with all three artifacts in `outputs`; do
53
- not submit a single-output completion.
52
+ 5. Complete plans through `apex/planComplete` with the implementation intent, binding without `intentHash`, and
53
+ environment inputs. The kernel derives the canonical intent hash and atomically validates all three outputs. Do not
54
+ call `apex/completeTask` with a partial plan bundle or a placeholder `intentHash`.
54
55
  6. APEX materializes a read-only Gate 3 package at `agent-output/<project>/<run>/plan/`. Report
55
56
  `implementation-plan.md`, `iac-binding.md`, `environment-inputs.md`, and `challenger-findings.md` for human review.
56
57
  7. When the kernel issues `plan-review`, delegate the exact task to `APEX Reviewer`. Present findings and use targeted
@@ -60,10 +60,14 @@ candidate Azure services without deciding architecture, and produces a human-rev
60
60
  rationale for Architecture.
61
61
  7. Stage and submit the typed requirements artifact. APEX materializes read-only review projections at
62
62
  `agent-output/<project>/<run>/`; report those paths and their artifact hash, but do not edit the generated files.
63
- 8. When the kernel issues `requirements-review`, delegate the exact task to `APEX Reviewer`. Present every returned
64
- completeness or contradiction finding, then use targeted follow-up questions only for findings the user chooses to
65
- resolve. Findings must be remediated, accepted with rationale, or explicitly deferred before Gate 1 can open.
66
- 9. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
63
+ 8. Immediately call `apex/nextTask` after submitting requirements. In VS Code, when it returns the
64
+ `requirements-review` task, invoke `APEX Reviewer` through the `agent` tool with exactly that task context; do not
65
+ wait for the user to request the challenge. In a client without the Reviewer worker, report the exact pending review
66
+ task and do not claim the challenge ran.
67
+ 9. Present every returned completeness or contradiction finding, then use targeted follow-up questions only for
68
+ findings the user chooses to resolve. Findings must be remediated, accepted with rationale, or explicitly deferred
69
+ before Gate 1 can open.
70
+ 10. When review completes, direct the user to review `01-requirements.md`, `README.md`, `service-recommendations.md`,
67
71
  `sku-preferences.md`, and `challenger-findings.md`. Gate 1 remains a human terminal ceremony; never approve it.
68
72
 
69
73
  Do not read repository files to discover artifact schemas; `apex/taskContext` is the complete output contract for this
@@ -13,6 +13,7 @@ tools:
13
13
  - apex/projectList
14
14
  - apex/projectUse
15
15
  - apex/projectDelete
16
+ - apex/gateDecide
16
17
  - azure-resource-manager-mcp/get_retail_prices
17
18
  - azure-resource-manager-mcp/query_costs
18
19
  - azure-resource-manager-mcp/query_aks_costs
@@ -81,6 +82,9 @@ Coordinate APEX without authoring project artifacts or inferring workflow state.
81
82
  `apex gate decide --gate <N> --decision <approved|rejected> --actor <USER_ID> --json`. At Gate 4, also require
82
83
  review of the exact preview, target, expiry, and approval recipient before directing
83
84
  `apex gate decide --gate 4 --decision <approved|rejected> --actor <USER_ID> --recipient <RECIPIENT_ID> --json`.
85
+ 9. When the user explicitly says `approve Gate 1`, `approve Gate 2`, `approve Gate 3`, or the equivalent rejection,
86
+ call `apex/gateDecide` with that gate, decision, and `confirm: true`. The operation derives the actor from the local
87
+ OS username. Do not use it for Gate 4, and do not infer confirmation from an ambiguous message.
84
88
 
85
89
  Use the active client projection's question mechanism only for project creation or kernel-owned routing choices. Read
86
90
  `.github/skills/apex-workflow/SKILL.md` only when status, resume, or project selection needs more guidance.
@@ -16,11 +16,13 @@
16
16
  "projectList",
17
17
  "projectUse",
18
18
  "projectDelete",
19
+ "gateDecide",
19
20
  "stageArtifact",
20
21
  "stageFile",
21
22
  "generateIac",
22
23
  "validateTask",
23
24
  "completeTask",
25
+ "planComplete",
24
26
  "preview",
25
27
  "reconcile",
26
28
  "inventory",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.10.0-next.2",
2
+ "version": "0.10.0-next.4",
3
3
  "bundle": {
4
4
  "id": "apex-managed-workspace",
5
5
  "authority": "npm:@apexops/cli",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 1,
3
3
  "sources": {
4
- "customizations": "0.10.0-next.2",
4
+ "customizations": "0.10.0-next.4",
5
5
  "config": "1.0.0"
6
6
  },
7
7
  "composition": {
@@ -190,7 +190,7 @@
190
190
  "client-projections/github-copilot-cli/.github/skills/apex-terraform-test/references/test-design.md",
191
191
  "client-projections/github-copilot-cli/.github/skills/apex-workflow/SKILL.md"
192
192
  ],
193
- "digest": "5e312275847b3433ec55ce0d35d0b7c55025247a958a5b239af806c2f5621498"
193
+ "digest": "f0890a928676c476f4de0e3260b65ab95cf89c34e45c5a8b66ff394ed88fdb09"
194
194
  },
195
195
  {
196
196
  "id": "github-copilot-vscode",
@@ -338,7 +338,7 @@
338
338
  "client-projections/github-copilot-vscode/.github/skills/apex-workflow/SKILL.md",
339
339
  "client-projections/github-copilot-vscode/.vscode/mcp.json"
340
340
  ],
341
- "digest": "e879f9c46bbf2f8de5eb76449d41a11af533714148331441f2f0cb6f5660c160"
341
+ "digest": "2fc2af31e4f004f6ec5803f88c8d440896f960b45bed8af535d8e5b655a44e22"
342
342
  }
343
343
  ],
344
344
  "files": [
@@ -378,8 +378,8 @@
378
378
  "path": "tools/registry/copilot-cli-agent-tools.json",
379
379
  "mapping": "copilot-cli-tool-inventory"
380
380
  },
381
- "sha256": "eaa67e61da99a42fca622f5e0c75f2778bf19d78016f176e0ac0a4620f6e1dca",
382
- "bytes": 3008
381
+ "sha256": "a6278e6ab4784d81f84b3b036a360e517e72844478b1ba74718b18903a268fdc",
382
+ "bytes": 3094
383
383
  },
384
384
  {
385
385
  "path": "client-projections/github-copilot-cli/.github/agents/apex-architect.agent.md",
@@ -418,13 +418,13 @@
418
418
  "composition": "client-projections",
419
419
  "roleId": "planning",
420
420
  "sourcePath": ".github/agents/apex-planner.agent.md",
421
- "sourceHash": "15934864666d9b4f3936f526942d1f56c1a5e8fc608b5ce2047db139eab9d2fa",
421
+ "sourceHash": "9a6bb99cd4784f7afc84f49168933ff8ae0f234386a55ad962382272cb5083ec",
422
422
  "clientId": "github-copilot-cli",
423
423
  "target": ".github/agents/apex-planner.agent.md",
424
424
  "adapterVersion": "1.1.0"
425
425
  },
426
- "sha256": "039d8f4d5ca4b5b6920a6bce4e052acb6a81d20844668bc5d6da61a1ed6a211b",
427
- "bytes": 4661
426
+ "sha256": "92a748d52adf590387cd819f565172cd4a023390afb17337a571e6feb784de17",
427
+ "bytes": 4724
428
428
  },
429
429
  {
430
430
  "path": "client-projections/github-copilot-cli/.github/agents/apex-requirements.agent.md",
@@ -433,13 +433,13 @@
433
433
  "composition": "client-projections",
434
434
  "roleId": "requirements",
435
435
  "sourcePath": ".github/agents/apex-requirements.agent.md",
436
- "sourceHash": "1e7c8d6d7992fc5d59499f662f00a20fe9814c80fb5a321cb063ec5067ebf04f",
436
+ "sourceHash": "87ac351f363c7b782ebbdeda40f15d6e8a7faabc2f400ffadcb0bca4ce66b2f3",
437
437
  "clientId": "github-copilot-cli",
438
438
  "target": ".github/agents/apex-requirements.agent.md",
439
439
  "adapterVersion": "1.1.0"
440
440
  },
441
- "sha256": "00a54b4a8f43b47184ec72f62f730e0dbe1ad3319ea0c09300b9cecf28cae8db",
442
- "bytes": 5143
441
+ "sha256": "6843fcf9f5ff5f7a764eb9bc8253ab2baa06195ea20f1febcf38f366839639a9",
442
+ "bytes": 5432
443
443
  },
444
444
  {
445
445
  "path": "client-projections/github-copilot-cli/.github/agents/apex.agent.md",
@@ -448,13 +448,13 @@
448
448
  "composition": "client-projections",
449
449
  "roleId": "coordinator",
450
450
  "sourcePath": ".github/agents/apex.agent.md",
451
- "sourceHash": "a9a64bb9f743ba73f0ea2237f0e2702a1881dee7f90ca83f9cf588de37bbed45",
451
+ "sourceHash": "a7440e67b68177d9877a9d5b2201917d1bdf56fda9431ef106ffa1cb7a30298c",
452
452
  "clientId": "github-copilot-cli",
453
453
  "target": ".github/agents/apex.agent.md",
454
454
  "adapterVersion": "1.1.0"
455
455
  },
456
- "sha256": "73f6d4fb101c4b7eff22472eca46c931c6b7e96a72810c0f10136e6568d39aea",
457
- "bytes": 4908
456
+ "sha256": "65da2837858c0251432818f2819f21877253152d5626fd4715c79ce47ff0fc4f",
457
+ "bytes": 5261
458
458
  },
459
459
  {
460
460
  "path": "client-projections/github-copilot-cli/.github/copilot-instructions.md",
@@ -773,10 +773,10 @@
773
773
  "target": ".github/mcp.json",
774
774
  "adapterVersion": "1.1.0",
775
775
  "sourcePath": ".github/mcp.json",
776
- "sourceHash": "dd39613c4d01b6f7146afe6c09548d6153fbfad550dba6bfcdbecf8188cb2209"
776
+ "sourceHash": "dda22ba7b91f17796dc5bc723bdcd66a1ba5f9b971bddb080b21d68062d19a8c"
777
777
  },
778
- "sha256": "dd39613c4d01b6f7146afe6c09548d6153fbfad550dba6bfcdbecf8188cb2209",
779
- "bytes": 1350
778
+ "sha256": "dda22ba7b91f17796dc5bc723bdcd66a1ba5f9b971bddb080b21d68062d19a8c",
779
+ "bytes": 1396
780
780
  },
781
781
  {
782
782
  "path": "client-projections/github-copilot-cli/.github/skills/apex-architecture/SKILL.md",
@@ -2384,13 +2384,13 @@
2384
2384
  "composition": "client-projections",
2385
2385
  "roleId": "planning",
2386
2386
  "sourcePath": ".github/agents/apex-planner.agent.md",
2387
- "sourceHash": "15934864666d9b4f3936f526942d1f56c1a5e8fc608b5ce2047db139eab9d2fa",
2387
+ "sourceHash": "9a6bb99cd4784f7afc84f49168933ff8ae0f234386a55ad962382272cb5083ec",
2388
2388
  "clientId": "github-copilot-vscode",
2389
2389
  "target": ".github/agents/apex-planner.agent.md",
2390
2390
  "adapterVersion": "1.1.0"
2391
2391
  },
2392
- "sha256": "1423df4a00c325f3c07eb7906da4a72990f6a221c7f271333fb22e31ae99ffcd",
2393
- "bytes": 4969
2392
+ "sha256": "d62130949707e65501d62452a3cec09918781abed2bd266d64383d9e6717478e",
2393
+ "bytes": 5032
2394
2394
  },
2395
2395
  {
2396
2396
  "path": "client-projections/github-copilot-vscode/.github/agents/apex-requirements.agent.md",
@@ -2399,13 +2399,13 @@
2399
2399
  "composition": "client-projections",
2400
2400
  "roleId": "requirements",
2401
2401
  "sourcePath": ".github/agents/apex-requirements.agent.md",
2402
- "sourceHash": "1e7c8d6d7992fc5d59499f662f00a20fe9814c80fb5a321cb063ec5067ebf04f",
2402
+ "sourceHash": "87ac351f363c7b782ebbdeda40f15d6e8a7faabc2f400ffadcb0bca4ce66b2f3",
2403
2403
  "clientId": "github-copilot-vscode",
2404
2404
  "target": ".github/agents/apex-requirements.agent.md",
2405
2405
  "adapterVersion": "1.1.0"
2406
2406
  },
2407
- "sha256": "d053deeb51609ad24e36192f14bc7407b84c425bc87d6f607cba50ac7d295989",
2408
- "bytes": 5447
2407
+ "sha256": "e69cce296049d7f9ac411889e8c094cb4278957fb4d35520e9ebb4b24a036e61",
2408
+ "bytes": 5736
2409
2409
  },
2410
2410
  {
2411
2411
  "path": "client-projections/github-copilot-vscode/.github/agents/apex-reviewer.agent.md",
@@ -2444,13 +2444,13 @@
2444
2444
  "composition": "client-projections",
2445
2445
  "roleId": "coordinator",
2446
2446
  "sourcePath": ".github/agents/apex.agent.md",
2447
- "sourceHash": "a9a64bb9f743ba73f0ea2237f0e2702a1881dee7f90ca83f9cf588de37bbed45",
2447
+ "sourceHash": "a7440e67b68177d9877a9d5b2201917d1bdf56fda9431ef106ffa1cb7a30298c",
2448
2448
  "clientId": "github-copilot-vscode",
2449
2449
  "target": ".github/agents/apex.agent.md",
2450
2450
  "adapterVersion": "1.1.0"
2451
2451
  },
2452
- "sha256": "cb0aea4d710e8974d137475db3edbc772a51a76696c4d6f738364ec940ae9c5a",
2453
- "bytes": 5726
2452
+ "sha256": "1ebb9da1303aff993228efdc1bb29dde70c6ce9c3cb1b61306659ae2a7ecc6f2",
2453
+ "bytes": 6079
2454
2454
  },
2455
2455
  {
2456
2456
  "path": "client-projections/github-copilot-vscode/.github/copilot-instructions.md",
@@ -4385,7 +4385,7 @@
4385
4385
  "path": "config/runtime-bundle.v1.json",
4386
4386
  "mapping": "config"
4387
4387
  },
4388
- "sha256": "3ebcdc4b89eda7eb5d1ed8d624096bc2240bc23db65d3266673d11e19e89e41c",
4388
+ "sha256": "50c39bd12f0ac738fb2ac7b2dc63a761ccd4392dfc7cff57c991b43629473674",
4389
4389
  "bytes": 2039
4390
4390
  },
4391
4391
  {
@@ -4445,8 +4445,8 @@
4445
4445
  "path": "customizations/.github/agents/apex-planner.agent.md",
4446
4446
  "mapping": "customizations"
4447
4447
  },
4448
- "sha256": "15934864666d9b4f3936f526942d1f56c1a5e8fc608b5ce2047db139eab9d2fa",
4449
- "bytes": 4785
4448
+ "sha256": "9a6bb99cd4784f7afc84f49168933ff8ae0f234386a55ad962382272cb5083ec",
4449
+ "bytes": 4848
4450
4450
  },
4451
4451
  {
4452
4452
  "path": "customizations/.github/agents/apex-requirements.agent.md",
@@ -4455,8 +4455,8 @@
4455
4455
  "path": "customizations/.github/agents/apex-requirements.agent.md",
4456
4456
  "mapping": "customizations"
4457
4457
  },
4458
- "sha256": "1e7c8d6d7992fc5d59499f662f00a20fe9814c80fb5a321cb063ec5067ebf04f",
4459
- "bytes": 5263
4458
+ "sha256": "87ac351f363c7b782ebbdeda40f15d6e8a7faabc2f400ffadcb0bca4ce66b2f3",
4459
+ "bytes": 5552
4460
4460
  },
4461
4461
  {
4462
4462
  "path": "customizations/.github/agents/apex-reviewer.agent.md",
@@ -4485,8 +4485,8 @@
4485
4485
  "path": "customizations/.github/agents/apex.agent.md",
4486
4486
  "mapping": "customizations"
4487
4487
  },
4488
- "sha256": "a9a64bb9f743ba73f0ea2237f0e2702a1881dee7f90ca83f9cf588de37bbed45",
4489
- "bytes": 5542
4488
+ "sha256": "a7440e67b68177d9877a9d5b2201917d1bdf56fda9431ef106ffa1cb7a30298c",
4489
+ "bytes": 5895
4490
4490
  },
4491
4491
  {
4492
4492
  "path": "customizations/.github/copilot-instructions.md",
@@ -4715,8 +4715,8 @@
4715
4715
  "path": "customizations/.github/mcp.json",
4716
4716
  "mapping": "customizations"
4717
4717
  },
4718
- "sha256": "dd39613c4d01b6f7146afe6c09548d6153fbfad550dba6bfcdbecf8188cb2209",
4719
- "bytes": 1350
4718
+ "sha256": "dda22ba7b91f17796dc5bc723bdcd66a1ba5f9b971bddb080b21d68062d19a8c",
4719
+ "bytes": 1396
4720
4720
  },
4721
4721
  {
4722
4722
  "path": "customizations/.github/skills/apex-architecture/SKILL.md",
@@ -5855,13 +5855,13 @@
5855
5855
  "path": "customizations/manifest.json",
5856
5856
  "mapping": "customizations"
5857
5857
  },
5858
- "sha256": "bf106e629655739726869d8b4ac816f6fb7e498fb2dcac98fafb9372360caff7",
5858
+ "sha256": "f1a21469470732feaf9cfda73e6e6b74ba573555548cf08eb23a5f3e0a415ae7",
5859
5859
  "bytes": 14078
5860
5860
  }
5861
5861
  ],
5862
5862
  "lock": {
5863
5863
  "algorithm": "sha256",
5864
5864
  "canonicalization": "apex-bundled-assets-v1",
5865
- "digest": "9e8f576c48d190ecac4d0d713fa073a7236958994bed9d026a3717a9a5d22ac0"
5865
+ "digest": "20492f37396ff14048903cf57ebb86fe1177f22aca509d51d37b45a8afa1be93"
5866
5866
  }
5867
5867
  }
package/dist/mcp.js CHANGED
@@ -65,6 +65,29 @@ const projectCreateInput = z
65
65
  const projectIdInput = z.object({ projectId: z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/) }).strict();
66
66
  const projectUseInput = projectIdInput.extend({ runId: z.string().min(1).optional() });
67
67
  const projectDeleteInput = projectIdInput.extend({ confirm: z.literal(true) });
68
+ const planCompletionInput = z
69
+ .object({
70
+ taskId: z.string().min(1),
71
+ implementationIntent: z.unknown(),
72
+ iacBinding: z
73
+ .object({
74
+ schemaVersion: z.literal("1.0.0"),
75
+ projectId: z.string().min(1),
76
+ runId: z.string().min(1),
77
+ track: z.enum(["bicep", "terraform"]),
78
+ resourceBindings: z.record(z.string().min(1), z.unknown()),
79
+ })
80
+ .strict(),
81
+ environmentInputs: z.unknown(),
82
+ })
83
+ .strict();
84
+ const gateDecisionInput = z
85
+ .object({
86
+ gate: z.union([z.literal(1), z.literal(2), z.literal(3)]),
87
+ decision: z.enum(["approved", "rejected"]),
88
+ confirm: z.literal(true),
89
+ })
90
+ .strict();
68
91
  const normalizeOutputs = (outputs) => outputs.map(({ kind, value, summary }) => ({
69
92
  kind,
70
93
  value,
@@ -97,6 +120,10 @@ export function createMcpServer(service) {
97
120
  description: "Delete a project and all of its run-bound state after explicit confirmation",
98
121
  inputSchema: projectDeleteInput,
99
122
  }, async ({ projectId, confirm }) => result(await service.deleteProject(projectId, confirm)));
123
+ server.registerTool("gateDecide", {
124
+ description: "Record an explicitly confirmed human decision for Gate 1, 2, or 3 using the local OS username as actor. Gate 4 remains CLI-only.",
125
+ inputSchema: gateDecisionInput,
126
+ }, async ({ gate, decision }) => result(await service.decideInteractiveGate(gate, decision)));
100
127
  server.registerTool("stageArtifact", {
101
128
  inputSchema: {
102
129
  taskId: z.string(),
@@ -170,6 +197,10 @@ export function createMcpServer(service) {
170
197
  }
171
198
  return result(await service.completeTask(taskId, { kind, value, ...(summary === undefined ? {} : { summary }) }));
172
199
  });
200
+ server.registerTool("planComplete", {
201
+ description: "Atomically complete a plan. Derives the canonical implementation intent hash for the binding; do not supply intentHash.",
202
+ inputSchema: planCompletionInput,
203
+ }, async ({ taskId, implementationIntent, iacBinding, environmentInputs }) => result(await service.completePlan(taskId, implementationIntent, iacBinding, environmentInputs)));
173
204
  server.registerTool("preview", { description: "Read the current operator-created deployment preview" }, async () => result(await service.currentPreview()));
174
205
  server.registerTool("reconcile", {}, async () => result(await service.reconcile()));
175
206
  server.registerTool("inventory", {}, async () => result(await service.inventory()));
package/dist/service.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ApprovalEvidenceV1, type ArchitectureAvailabilityV1, type DeploymentPreviewV1, type InputRequestV1, type InputValueV1, type InputSubmissionV1, type ImprovementCategory, type ImprovementDecisionV1, type ImprovementObservationV1, type ImprovementPolicyV1, type ImprovementProposalV1, type ImprovementSource, type Operation, type ProjectId, type ResourceInventoryV1, type RunConfigV1, type RunId, type TaskEnvelopeV1 } from "@apexops/contracts";
1
+ import { type ApprovalEvidenceV1, type ArchitectureAvailabilityV1, type DeploymentPreviewV1, type EnvironmentInputsV1, type IacBindingV1, type InputRequestV1, type InputValueV1, type InputSubmissionV1, type ImprovementCategory, type ImprovementDecisionV1, type ImprovementObservationV1, type ImprovementPolicyV1, type ImprovementProposalV1, type ImprovementSource, type ImplementationIntentV1, type Operation, type ProjectId, type ResourceInventoryV1, type RunConfigV1, type RunId, type TaskEnvelopeV1 } from "@apexops/contracts";
2
2
  import { type CapabilityPackInstallOptions, type IacProvider, type ProcessRunnerLike } from "@apexops/capabilities";
3
3
  import { type JsonValue } from "@apexops/kernel";
4
4
  import { type BundledClientProjection } from "./assets.js";
@@ -658,6 +658,10 @@ export declare class ApexService {
658
658
  outputHashes: Partial<Record<ArtifactKind, string>>;
659
659
  summary: string;
660
660
  }>;
661
+ completePlan(taskId: string, intent: ImplementationIntentV1, binding: Omit<IacBindingV1, "intentHash">, environmentInputs: EnvironmentInputsV1): Promise<{
662
+ outputHashes: Partial<Record<ArtifactKind, string>>;
663
+ summary: string;
664
+ }>;
661
665
  private acceptTaskOutputs;
662
666
  private renderRequirementsDocument;
663
667
  private requirementsReviewDirectory;
@@ -678,6 +682,7 @@ export declare class ApexService {
678
682
  resolveReview(resolution: ReviewResolution): Promise<void>;
679
683
  private assertReviewResolution;
680
684
  decideGateNumber(gateNumber: number, decision: "approved" | "rejected", actor: string, options?: GateDecisionOptions): Promise<ApprovalEvidenceV1>;
685
+ decideInteractiveGate(gateNumber: 1 | 2 | 3, decision: "approved" | "rejected"): Promise<ApprovalEvidenceV1>;
681
686
  preview(options: PreviewOptions): Promise<DeploymentPreviewV1>;
682
687
  private operationsReviewDirectory;
683
688
  private materializeOperationsPreviewPackage;
package/dist/service.js CHANGED
@@ -5,7 +5,7 @@ import { ContentCache, EvidencePolicy, EvidenceStore, EventJournal, ImprovementS
5
5
  import { DOCUMENT_REGISTRY, renderApprovalEvidence, renderDeploymentPreview, renderRequirementsDocument, renderResourceInventory, renderRunStatus, } from "@apexops/renderers";
6
6
  import { constants } from "node:fs";
7
7
  import { access, cp, lstat, mkdir, readFile, readdir, realpath, rename, rm, stat } from "node:fs/promises";
8
- import { homedir } from "node:os";
8
+ import { homedir, userInfo } from "node:os";
9
9
  import { basename, delimiter, isAbsolute, join, relative, resolve, sep } from "node:path";
10
10
  import { resolveBundledAssets } from "./assets.js";
11
11
  import { dependencyRevision as calculateDependencyRevision } from "./dependency-revision.js";
@@ -161,8 +161,7 @@ const REQUIREMENTS_INTAKE = [
161
161
  {
162
162
  round: "service-preferences",
163
163
  questions: [
164
- { id: "retained-services", prompt: "List Azure services or integrations that must be retained, or 'none'." },
165
- { id: "prohibited-services", prompt: "List prohibited services or use 'none'." },
164
+ { id: "prohibited-services", prompt: "List prohibited services, or explicitly defer the constraint." },
166
165
  {
167
166
  id: "service-preferences",
168
167
  prompt: "Select preferred Azure services. Select all that apply; architecture chooses the exact combination.",
@@ -222,10 +221,22 @@ const REQUIREMENTS_INTAKE = [
222
221
  prompt: "Choose the Azure region, or explicitly defer the decision.",
223
222
  options: ["swedencentral", "westeurope", "germanywestcentral"],
224
223
  },
225
- { id: "availability-recovery", prompt: "State availability, RTO, RPO, backup, and recovery requirements." },
224
+ {
225
+ id: "availability-recovery",
226
+ prompt: "Select required availability, backup, and disaster-recovery capabilities.",
227
+ options: [
228
+ "single-region-availability",
229
+ "availability-zones",
230
+ "automated-backups",
231
+ "point-in-time-restore",
232
+ "immutable-backups",
233
+ "cross-region-disaster-recovery",
234
+ ],
235
+ multiSelect: true,
236
+ },
226
237
  {
227
238
  id: "recovery",
228
- prompt: "Provide RTO and RPO in whole minutes or explicitly defer them.",
239
+ prompt: "Set exact recovery targets: provide RTO and RPO in whole minutes, or explicitly defer them.",
229
240
  valueType: "recovery",
230
241
  },
231
242
  {
@@ -1005,6 +1016,13 @@ export class ApexService {
1005
1016
  async completeTaskOutputs(taskId, outputs) {
1006
1017
  return this.acceptTaskOutputs(taskId, outputs, false);
1007
1018
  }
1019
+ async completePlan(taskId, intent, binding, environmentInputs) {
1020
+ return this.completeTaskOutputs(taskId, [
1021
+ { kind: "implementation-intent", value: intent },
1022
+ { kind: "iac-binding", value: { ...binding, intentHash: sha256Json(intent) } },
1023
+ { kind: "environment-inputs", value: environmentInputs },
1024
+ ]);
1025
+ }
1008
1026
  async acceptTaskOutputs(taskId, outputs, legacy) {
1009
1027
  const run = await this.currentRun();
1010
1028
  const task = await this.readTask(run, taskId);
@@ -1478,6 +1496,16 @@ export class ApexService {
1478
1496
  await this.materializeOperationsApprovalPackage(run, approval, approvalHash);
1479
1497
  return approval;
1480
1498
  }
1499
+ async decideInteractiveGate(gateNumber, decision) {
1500
+ let actor = "local-user";
1501
+ try {
1502
+ actor = userInfo().username.trim() || actor;
1503
+ }
1504
+ catch {
1505
+ // Some minimal container identities do not have an OS user entry.
1506
+ }
1507
+ return this.decideGateNumber(gateNumber, decision, actor);
1508
+ }
1481
1509
  async preview(options) {
1482
1510
  const run = await this.currentRun();
1483
1511
  await this.assertCurrentWriterAuthority(run, new WriterTransferStore(this.projects.runDirectory(run.projectId, run.runId), this.clock));
@@ -2461,6 +2489,15 @@ export class ApexService {
2461
2489
  return this.inputRequest(event, run.ownerEpoch);
2462
2490
  }
2463
2491
  requirementsIntakeQuestions(round, events) {
2492
+ if (round.round === "service-preferences") {
2493
+ const scenario = this.recordedRequirementsInput(events)?.["delivery-scenario"];
2494
+ if (scenario !== "migration" && scenario !== "modernization" && scenario !== "extension")
2495
+ return round.questions;
2496
+ return [
2497
+ { id: "retained-services", prompt: "List Azure services or integrations that must be retained." },
2498
+ ...round.questions,
2499
+ ];
2500
+ }
2464
2501
  if (round.round !== "workload-pattern")
2465
2502
  return round.questions;
2466
2503
  const scenario = this.recordedRequirementsInput(events)?.["delivery-scenario"];
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const APEX_VERSION: "0.10.0-next.2";
1
+ export declare const APEX_VERSION: "0.10.0-next.4";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const APEX_VERSION = "0.10.0-next.2";
1
+ export const APEX_VERSION = "0.10.0-next.4";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apexops/cli",
3
- "version": "0.10.0-next.2",
3
+ "version": "0.10.0-next.4",
4
4
  "description": "Portable no-shell CLI and MCP facade for APEX",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -32,10 +32,10 @@
32
32
  "assets"
33
33
  ],
34
34
  "dependencies": {
35
- "@apexops/capabilities": "0.10.0-next.2",
36
- "@apexops/contracts": "0.10.0-next.2",
37
- "@apexops/kernel": "0.10.0-next.2",
38
- "@apexops/renderers": "0.10.0-next.2",
35
+ "@apexops/capabilities": "0.10.0-next.4",
36
+ "@apexops/contracts": "0.10.0-next.4",
37
+ "@apexops/kernel": "0.10.0-next.4",
38
+ "@apexops/renderers": "0.10.0-next.4",
39
39
  "@azure/mcp": "3.0.0-beta.37",
40
40
  "@hono/node-server": "2.0.11",
41
41
  "@modelcontextprotocol/sdk": "1.29.0",