@executioncontrolprotocol/cli 0.5.0 → 0.10.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.
Files changed (307) hide show
  1. package/README.md +67 -47
  2. package/bin/dev.js +4 -5
  3. package/bin/ecp.js +7 -0
  4. package/bin/run.cmd +1 -1
  5. package/bin/run.js +2 -6
  6. package/dist/commands/compile.d.ts +15 -0
  7. package/dist/commands/compile.d.ts.map +1 -0
  8. package/dist/commands/compile.js +44 -0
  9. package/dist/commands/compile.js.map +1 -0
  10. package/dist/commands/config/secrets/add.d.ts +6 -5
  11. package/dist/commands/config/secrets/add.d.ts.map +1 -1
  12. package/dist/commands/config/secrets/add.js +30 -63
  13. package/dist/commands/config/secrets/add.js.map +1 -1
  14. package/dist/commands/config/secrets/get.d.ts +5 -5
  15. package/dist/commands/config/secrets/get.d.ts.map +1 -1
  16. package/dist/commands/config/secrets/get.js +21 -46
  17. package/dist/commands/config/secrets/get.js.map +1 -1
  18. package/dist/commands/config/secrets/list.d.ts +1 -5
  19. package/dist/commands/config/secrets/list.d.ts.map +1 -1
  20. package/dist/commands/config/secrets/list.js +11 -41
  21. package/dist/commands/config/secrets/list.js.map +1 -1
  22. package/dist/commands/config/secrets/remove.d.ts +3 -5
  23. package/dist/commands/config/secrets/remove.d.ts.map +1 -1
  24. package/dist/commands/config/secrets/remove.js +16 -42
  25. package/dist/commands/config/secrets/remove.js.map +1 -1
  26. package/dist/commands/config/secrets.d.ts +1 -0
  27. package/dist/commands/config/secrets.d.ts.map +1 -1
  28. package/dist/commands/config/secrets.js +14 -18
  29. package/dist/commands/config/secrets.js.map +1 -1
  30. package/dist/commands/decode.d.ts +18 -0
  31. package/dist/commands/decode.d.ts.map +1 -0
  32. package/dist/commands/decode.js +66 -0
  33. package/dist/commands/decode.js.map +1 -0
  34. package/dist/commands/describe.d.ts +13 -0
  35. package/dist/commands/describe.d.ts.map +1 -0
  36. package/dist/commands/describe.js +29 -0
  37. package/dist/commands/describe.js.map +1 -0
  38. package/dist/commands/encode.d.ts +18 -0
  39. package/dist/commands/encode.d.ts.map +1 -0
  40. package/dist/commands/encode.js +63 -0
  41. package/dist/commands/encode.js.map +1 -0
  42. package/dist/commands/run.d.ts +11 -17
  43. package/dist/commands/run.d.ts.map +1 -1
  44. package/dist/commands/run.js +39 -349
  45. package/dist/commands/run.js.map +1 -1
  46. package/dist/commands/search.d.ts +12 -0
  47. package/dist/commands/search.d.ts.map +1 -0
  48. package/dist/commands/search.js +26 -0
  49. package/dist/commands/search.js.map +1 -0
  50. package/dist/commands/validate.d.ts +6 -8
  51. package/dist/commands/validate.d.ts.map +1 -1
  52. package/dist/commands/validate.js +19 -86
  53. package/dist/commands/validate.js.map +1 -1
  54. package/dist/lib/command-helpers.d.ts +6 -8
  55. package/dist/lib/command-helpers.d.ts.map +1 -1
  56. package/dist/lib/command-helpers.js +21 -11
  57. package/dist/lib/command-helpers.js.map +1 -1
  58. package/dist/lib/env-module-command.d.ts +37 -0
  59. package/dist/lib/env-module-command.d.ts.map +1 -0
  60. package/dist/lib/env-module-command.js +59 -0
  61. package/dist/lib/env-module-command.js.map +1 -0
  62. package/dist/lib/format-cli.d.ts +13 -0
  63. package/dist/lib/format-cli.d.ts.map +1 -0
  64. package/dist/lib/format-cli.js +25 -0
  65. package/dist/lib/format-cli.js.map +1 -0
  66. package/dist/lib/secrets/store.d.ts +3 -0
  67. package/dist/lib/secrets/store.d.ts.map +1 -0
  68. package/dist/lib/secrets/store.js +6 -0
  69. package/dist/lib/secrets/store.js.map +1 -0
  70. package/package.json +17 -33
  71. package/bin/dev.cmd +0 -3
  72. package/dist/commands/config/endpoints/add.d.ts +0 -14
  73. package/dist/commands/config/endpoints/add.d.ts.map +0 -1
  74. package/dist/commands/config/endpoints/add.js +0 -29
  75. package/dist/commands/config/endpoints/add.js.map +0 -1
  76. package/dist/commands/config/endpoints/get.d.ts +0 -10
  77. package/dist/commands/config/endpoints/get.d.ts.map +0 -1
  78. package/dist/commands/config/endpoints/get.js +0 -35
  79. package/dist/commands/config/endpoints/get.js.map +0 -1
  80. package/dist/commands/config/endpoints/remove.d.ts +0 -13
  81. package/dist/commands/config/endpoints/remove.d.ts.map +0 -1
  82. package/dist/commands/config/endpoints/remove.js +0 -25
  83. package/dist/commands/config/endpoints/remove.js.map +0 -1
  84. package/dist/commands/config/endpoints/update.d.ts +0 -15
  85. package/dist/commands/config/endpoints/update.d.ts.map +0 -1
  86. package/dist/commands/config/endpoints/update.js +0 -36
  87. package/dist/commands/config/endpoints/update.js.map +0 -1
  88. package/dist/commands/config/get.d.ts +0 -11
  89. package/dist/commands/config/get.d.ts.map +0 -1
  90. package/dist/commands/config/get.js +0 -31
  91. package/dist/commands/config/get.js.map +0 -1
  92. package/dist/commands/config/init.d.ts +0 -13
  93. package/dist/commands/config/init.d.ts.map +0 -1
  94. package/dist/commands/config/init.js +0 -49
  95. package/dist/commands/config/init.js.map +0 -1
  96. package/dist/commands/config/loggers/allow/add.d.ts +0 -13
  97. package/dist/commands/config/loggers/allow/add.d.ts.map +0 -1
  98. package/dist/commands/config/loggers/allow/add.js +0 -25
  99. package/dist/commands/config/loggers/allow/add.js.map +0 -1
  100. package/dist/commands/config/loggers/allow/remove.d.ts +0 -13
  101. package/dist/commands/config/loggers/allow/remove.d.ts.map +0 -1
  102. package/dist/commands/config/loggers/allow/remove.js +0 -26
  103. package/dist/commands/config/loggers/allow/remove.js.map +0 -1
  104. package/dist/commands/config/loggers/default/add.d.ts +0 -13
  105. package/dist/commands/config/loggers/default/add.d.ts.map +0 -1
  106. package/dist/commands/config/loggers/default/add.js +0 -28
  107. package/dist/commands/config/loggers/default/add.js.map +0 -1
  108. package/dist/commands/config/loggers/default/remove.d.ts +0 -13
  109. package/dist/commands/config/loggers/default/remove.d.ts.map +0 -1
  110. package/dist/commands/config/loggers/default/remove.js +0 -25
  111. package/dist/commands/config/loggers/default/remove.js.map +0 -1
  112. package/dist/commands/config/loggers/get.d.ts +0 -10
  113. package/dist/commands/config/loggers/get.d.ts.map +0 -1
  114. package/dist/commands/config/loggers/get.js +0 -35
  115. package/dist/commands/config/loggers/get.js.map +0 -1
  116. package/dist/commands/config/loggers/logger/add.d.ts +0 -15
  117. package/dist/commands/config/loggers/logger/add.d.ts.map +0 -1
  118. package/dist/commands/config/loggers/logger/add.js +0 -55
  119. package/dist/commands/config/loggers/logger/add.js.map +0 -1
  120. package/dist/commands/config/loggers/logger/get.d.ts +0 -13
  121. package/dist/commands/config/loggers/logger/get.d.ts.map +0 -1
  122. package/dist/commands/config/loggers/logger/get.js +0 -30
  123. package/dist/commands/config/loggers/logger/get.js.map +0 -1
  124. package/dist/commands/config/loggers/logger/remove.d.ts +0 -13
  125. package/dist/commands/config/loggers/logger/remove.d.ts.map +0 -1
  126. package/dist/commands/config/loggers/logger/remove.js +0 -27
  127. package/dist/commands/config/loggers/logger/remove.js.map +0 -1
  128. package/dist/commands/config/loggers/logger/update.d.ts +0 -15
  129. package/dist/commands/config/loggers/logger/update.d.ts.map +0 -1
  130. package/dist/commands/config/loggers/logger/update.js +0 -55
  131. package/dist/commands/config/loggers/logger/update.js.map +0 -1
  132. package/dist/commands/config/models/allow/add.d.ts +0 -14
  133. package/dist/commands/config/models/allow/add.d.ts.map +0 -1
  134. package/dist/commands/config/models/allow/add.js +0 -36
  135. package/dist/commands/config/models/allow/add.js.map +0 -1
  136. package/dist/commands/config/models/allow/remove.d.ts +0 -14
  137. package/dist/commands/config/models/allow/remove.d.ts.map +0 -1
  138. package/dist/commands/config/models/allow/remove.js +0 -36
  139. package/dist/commands/config/models/allow/remove.js.map +0 -1
  140. package/dist/commands/config/models/default/update.d.ts +0 -14
  141. package/dist/commands/config/models/default/update.d.ts.map +0 -1
  142. package/dist/commands/config/models/default/update.js +0 -35
  143. package/dist/commands/config/models/default/update.js.map +0 -1
  144. package/dist/commands/config/models/get.d.ts +0 -10
  145. package/dist/commands/config/models/get.d.ts.map +0 -1
  146. package/dist/commands/config/models/get.js +0 -39
  147. package/dist/commands/config/models/get.js.map +0 -1
  148. package/dist/commands/config/models/ollama/update.d.ts +0 -13
  149. package/dist/commands/config/models/ollama/update.d.ts.map +0 -1
  150. package/dist/commands/config/models/ollama/update.js +0 -27
  151. package/dist/commands/config/models/ollama/update.js.map +0 -1
  152. package/dist/commands/config/path.d.ts +0 -12
  153. package/dist/commands/config/path.d.ts.map +0 -1
  154. package/dist/commands/config/path.js +0 -32
  155. package/dist/commands/config/path.js.map +0 -1
  156. package/dist/commands/config/plugins/add.d.ts +0 -16
  157. package/dist/commands/config/plugins/add.d.ts.map +0 -1
  158. package/dist/commands/config/plugins/add.js +0 -28
  159. package/dist/commands/config/plugins/add.js.map +0 -1
  160. package/dist/commands/config/plugins/allow/add.d.ts +0 -13
  161. package/dist/commands/config/plugins/allow/add.d.ts.map +0 -1
  162. package/dist/commands/config/plugins/allow/add.js +0 -25
  163. package/dist/commands/config/plugins/allow/add.js.map +0 -1
  164. package/dist/commands/config/plugins/allow/remove.d.ts +0 -13
  165. package/dist/commands/config/plugins/allow/remove.d.ts.map +0 -1
  166. package/dist/commands/config/plugins/allow/remove.js +0 -26
  167. package/dist/commands/config/plugins/allow/remove.js.map +0 -1
  168. package/dist/commands/config/plugins/default/add.d.ts +0 -13
  169. package/dist/commands/config/plugins/default/add.d.ts.map +0 -1
  170. package/dist/commands/config/plugins/default/add.js +0 -28
  171. package/dist/commands/config/plugins/default/add.js.map +0 -1
  172. package/dist/commands/config/plugins/default/remove.d.ts +0 -13
  173. package/dist/commands/config/plugins/default/remove.d.ts.map +0 -1
  174. package/dist/commands/config/plugins/default/remove.js +0 -25
  175. package/dist/commands/config/plugins/default/remove.js.map +0 -1
  176. package/dist/commands/config/plugins/get.d.ts +0 -10
  177. package/dist/commands/config/plugins/get.d.ts.map +0 -1
  178. package/dist/commands/config/plugins/get.js +0 -30
  179. package/dist/commands/config/plugins/get.js.map +0 -1
  180. package/dist/commands/config/plugins/installs/add.d.ts +0 -20
  181. package/dist/commands/config/plugins/installs/add.d.ts.map +0 -1
  182. package/dist/commands/config/plugins/installs/add.js +0 -51
  183. package/dist/commands/config/plugins/installs/add.js.map +0 -1
  184. package/dist/commands/config/plugins/installs/list.d.ts +0 -10
  185. package/dist/commands/config/plugins/installs/list.d.ts.map +0 -1
  186. package/dist/commands/config/plugins/installs/list.js +0 -29
  187. package/dist/commands/config/plugins/installs/list.js.map +0 -1
  188. package/dist/commands/config/plugins/installs/remove.d.ts +0 -13
  189. package/dist/commands/config/plugins/installs/remove.d.ts.map +0 -1
  190. package/dist/commands/config/plugins/installs/remove.js +0 -27
  191. package/dist/commands/config/plugins/installs/remove.js.map +0 -1
  192. package/dist/commands/config/plugins/security/update.d.ts +0 -5
  193. package/dist/commands/config/plugins/security/update.d.ts.map +0 -1
  194. package/dist/commands/config/plugins/security/update.js +0 -5
  195. package/dist/commands/config/plugins/security/update.js.map +0 -1
  196. package/dist/commands/config/secrets/providers/doctor.d.ts +0 -10
  197. package/dist/commands/config/secrets/providers/doctor.d.ts.map +0 -1
  198. package/dist/commands/config/secrets/providers/doctor.js +0 -40
  199. package/dist/commands/config/secrets/providers/doctor.js.map +0 -1
  200. package/dist/commands/config/secrets/providers/list.d.ts +0 -10
  201. package/dist/commands/config/secrets/providers/list.d.ts.map +0 -1
  202. package/dist/commands/config/secrets/providers/list.js +0 -31
  203. package/dist/commands/config/secrets/providers/list.js.map +0 -1
  204. package/dist/commands/config/secrets/providers.d.ts +0 -6
  205. package/dist/commands/config/secrets/providers.d.ts.map +0 -1
  206. package/dist/commands/config/secrets/providers.js +0 -9
  207. package/dist/commands/config/secrets/providers.js.map +0 -1
  208. package/dist/commands/config/secrets/yaml/get.d.ts +0 -11
  209. package/dist/commands/config/secrets/yaml/get.d.ts.map +0 -1
  210. package/dist/commands/config/secrets/yaml/get.js +0 -35
  211. package/dist/commands/config/secrets/yaml/get.js.map +0 -1
  212. package/dist/commands/config/secrets/yaml/set-default-provider.d.ts +0 -13
  213. package/dist/commands/config/secrets/yaml/set-default-provider.d.ts.map +0 -1
  214. package/dist/commands/config/secrets/yaml/set-default-provider.js +0 -24
  215. package/dist/commands/config/secrets/yaml/set-default-provider.js.map +0 -1
  216. package/dist/commands/config/secrets/yaml/set-policy.d.ts +0 -13
  217. package/dist/commands/config/secrets/yaml/set-policy.d.ts.map +0 -1
  218. package/dist/commands/config/secrets/yaml/set-policy.js +0 -29
  219. package/dist/commands/config/secrets/yaml/set-policy.js.map +0 -1
  220. package/dist/commands/config/security/get.d.ts +0 -11
  221. package/dist/commands/config/security/get.d.ts.map +0 -1
  222. package/dist/commands/config/security/get.js +0 -33
  223. package/dist/commands/config/security/get.js.map +0 -1
  224. package/dist/commands/config/security/plugins/update.d.ts +0 -13
  225. package/dist/commands/config/security/plugins/update.d.ts.map +0 -1
  226. package/dist/commands/config/security/plugins/update.js +0 -49
  227. package/dist/commands/config/security/plugins/update.js.map +0 -1
  228. package/dist/commands/config/tools/add.d.ts +0 -16
  229. package/dist/commands/config/tools/add.d.ts.map +0 -1
  230. package/dist/commands/config/tools/add.js +0 -60
  231. package/dist/commands/config/tools/add.js.map +0 -1
  232. package/dist/commands/config/tools/get.d.ts +0 -10
  233. package/dist/commands/config/tools/get.d.ts.map +0 -1
  234. package/dist/commands/config/tools/get.js +0 -29
  235. package/dist/commands/config/tools/get.js.map +0 -1
  236. package/dist/commands/config/tools/remove.d.ts +0 -13
  237. package/dist/commands/config/tools/remove.d.ts.map +0 -1
  238. package/dist/commands/config/tools/remove.js +0 -25
  239. package/dist/commands/config/tools/remove.js.map +0 -1
  240. package/dist/commands/config/tools/update.d.ts +0 -16
  241. package/dist/commands/config/tools/update.d.ts.map +0 -1
  242. package/dist/commands/config/tools/update.js +0 -59
  243. package/dist/commands/config/tools/update.js.map +0 -1
  244. package/dist/commands/config.d.ts +0 -8
  245. package/dist/commands/config.d.ts.map +0 -1
  246. package/dist/commands/config.js +0 -43
  247. package/dist/commands/config.js.map +0 -1
  248. package/dist/commands/graph.d.ts +0 -14
  249. package/dist/commands/graph.d.ts.map +0 -1
  250. package/dist/commands/graph.js +0 -39
  251. package/dist/commands/graph.js.map +0 -1
  252. package/dist/commands/trace/list.d.ts +0 -10
  253. package/dist/commands/trace/list.d.ts.map +0 -1
  254. package/dist/commands/trace/list.js +0 -32
  255. package/dist/commands/trace/list.js.map +0 -1
  256. package/dist/commands/trace.d.ts +0 -14
  257. package/dist/commands/trace.d.ts.map +0 -1
  258. package/dist/commands/trace.js +0 -43
  259. package/dist/commands/trace.js.map +0 -1
  260. package/dist/lib/config-flags.d.ts +0 -6
  261. package/dist/lib/config-flags.d.ts.map +0 -1
  262. package/dist/lib/config-flags.js +0 -14
  263. package/dist/lib/config-flags.js.map +0 -1
  264. package/dist/lib/default-ecp-config.d.ts +0 -5
  265. package/dist/lib/default-ecp-config.d.ts.map +0 -1
  266. package/dist/lib/default-ecp-config.js +0 -47
  267. package/dist/lib/default-ecp-config.js.map +0 -1
  268. package/dist/lib/ecp-environment-command.d.ts +0 -20
  269. package/dist/lib/ecp-environment-command.d.ts.map +0 -1
  270. package/dist/lib/ecp-environment-command.js +0 -33
  271. package/dist/lib/ecp-environment-command.js.map +0 -1
  272. package/dist/lib/ecp-home.d.ts +0 -3
  273. package/dist/lib/ecp-home.d.ts.map +0 -1
  274. package/dist/lib/ecp-home.js +0 -9
  275. package/dist/lib/ecp-home.js.map +0 -1
  276. package/dist/lib/inputs.d.ts +0 -3
  277. package/dist/lib/inputs.d.ts.map +0 -1
  278. package/dist/lib/inputs.js +0 -7
  279. package/dist/lib/inputs.js.map +0 -1
  280. package/dist/lib/parsing.d.ts +0 -12
  281. package/dist/lib/parsing.d.ts.map +0 -1
  282. package/dist/lib/parsing.js +0 -57
  283. package/dist/lib/parsing.js.map +0 -1
  284. package/dist/lib/progress.d.ts +0 -4
  285. package/dist/lib/progress.d.ts.map +0 -1
  286. package/dist/lib/progress.js +0 -111
  287. package/dist/lib/progress.js.map +0 -1
  288. package/dist/lib/secret-provider-ids.d.ts +0 -3
  289. package/dist/lib/secret-provider-ids.d.ts.map +0 -1
  290. package/dist/lib/secret-provider-ids.js +0 -3
  291. package/dist/lib/secret-provider-ids.js.map +0 -1
  292. package/dist/lib/secrets-config.d.ts +0 -15
  293. package/dist/lib/secrets-config.d.ts.map +0 -1
  294. package/dist/lib/secrets-config.js +0 -12
  295. package/dist/lib/secrets-config.js.map +0 -1
  296. package/dist/lib/system-config-cli.d.ts +0 -50
  297. package/dist/lib/system-config-cli.d.ts.map +0 -1
  298. package/dist/lib/system-config-cli.js +0 -108
  299. package/dist/lib/system-config-cli.js.map +0 -1
  300. package/dist/lib/trace-files.d.ts +0 -2
  301. package/dist/lib/trace-files.d.ts.map +0 -1
  302. package/dist/lib/trace-files.js +0 -14
  303. package/dist/lib/trace-files.js.map +0 -1
  304. package/dist/lib/trace-view.d.ts +0 -4
  305. package/dist/lib/trace-view.d.ts.map +0 -1
  306. package/dist/lib/trace-view.js +0 -8
  307. package/dist/lib/trace-view.js.map +0 -1
package/README.md CHANGED
@@ -1,77 +1,97 @@
1
- # `@executioncontrolprotocol/cli`
1
+ # @executioncontrolprotocol/cli
2
2
 
3
- **Execution Control Protocol (ECP)** specifies portable **Context** manifests for agent orchestration: structured inputs and outputs, tool boundaries, per-executor policies, and host-level enforcement via system config—so runs stay least-privilege and auditable.
3
+ ECP command-line interface for running **workflows** (`@executioncontrolprotocol.workflow`) in configured
4
+ **environments** (runtime + extensions + policies).
4
5
 
5
- **Learn more:** [executioncontrolprotocol.io](https://executioncontrolprotocol.io)
6
+ This CLI is how you run ECP deterministically in a Node.js / TypeScript ecosystem:
6
7
 
7
- This package is the **command-line interface** for validating and running Contexts.
8
+ - Compile workflow source modules (`.ts` / `.js`) to portable JSON manifests
9
+ - Validate workflows against an environment’s registered capabilities
10
+ - Describe/search environment capabilities for agent/UI discovery
11
+ - Run workflows and print structured run results
12
+ - Encode/decode workflows using format extensions (TOON, Fluent, JSON)
13
+
14
+ For the architecture and monorepo package boundaries, start with
15
+ [`AGENTS.md`](../../AGENTS.md) and [`ecp-overhaul.md`](../../ecp-overhaul.md).
8
16
 
9
17
  ## Install
10
18
 
11
- ```bash
19
+ From npm (when published):
20
+
21
+ ```sh
12
22
  npm install -g @executioncontrolprotocol/cli
13
23
  ```
14
24
 
25
+ From this monorepo (recommended for development):
26
+
27
+ ```sh
28
+ npm install
29
+ npm run build
30
+ cd packages/cli
31
+ npm link
32
+ ```
33
+
15
34
  ## Usage
16
35
 
17
- ```bash
18
- ecp --help
19
- ecp validate path/to/context.yaml
20
- ecp run path/to/context.yaml -i topic="Hello"
36
+ All operational commands that need an environment accept:
37
+
38
+ - `--env <path>`: a module that exports the environment builder (`default export`)
39
+
40
+ ### Run
41
+
42
+ ```sh
43
+ ecp run examples/01-echo/workflow.ts --env examples/01-echo/environment.ts
21
44
  ```
22
45
 
23
- ### System config (`ecp.config.yaml` / `~/.ecp/config.yaml`)
24
-
25
- **v0.5 layout:** use top-level **`security`** for allow-lists and defaults (mirrors `models`, `tools`, `loggers`, …). Wiring lives under **`models.providers`**, **`tools.servers`**, **`loggers.config`**, **`agents.endpoints`**, **`plugins.installs`**, **`secrets`**. Set **`version: "0.5"`**.
26
-
27
- ```bash
28
- ecp config --help
29
- ecp config init # best-practices starter in current directory
30
- ecp config init --global # ~/.ecp/config.yaml
31
- ecp config path # resolved file path (use --for-write for mutation target)
32
- ecp config get --format json
33
- ecp config security get
34
- ecp config plugins get # plugins.installs + security.plugins summary
35
- ecp config models get
36
- ecp config tools get
37
- ecp config loggers get
38
- ecp config secrets yaml get
46
+ Provide workflow input (JSON file):
47
+
48
+ ```sh
49
+ ecp run workflow.json --env environment.ts --input input.json
39
50
  ```
40
51
 
41
- `ecp run` accepts `--logger` / `-l` (e.g. `file`) to enable logger **plugins** (`kind: logger`); defaults and allow-lists are under **`security.loggers`**, per-logger options under **`loggers.config`**.
52
+ Dry run (validate + plan without invoking capabilities):
42
53
 
43
- YAML and JSON are supported; defaults are searched in order: `./ecp.config.yaml`, `./ecp.config.json`, then `~/.ecp/`.
54
+ ```sh
55
+ ecp run workflow.ts --env environment.ts --dry-run
56
+ ```
44
57
 
45
- ## Secrets and environment files
58
+ ### Validate
46
59
 
47
- ECP separates **where** a secret is loaded from using **provider ids** in `tools.servers.<name>.credentials.bindings[].source`:
60
+ ```sh
61
+ ecp validate examples/01-echo/workflow.ts --env examples/01-echo/environment.ts
62
+ ```
48
63
 
49
- | Provider id | Meaning |
50
- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
51
- | `process.env` | Read from the current process environment (`process.env[<key>]`). |
52
- | `dot.env` | Read from a `.env`-style file on disk (path from config or `--environment`). |
53
- | `os.secrets` | Read from the OS credential manager / keychain; stored under an `ecp://<key>` target (same as default `SecretRef.id`; provider is only in `source.provider`, e.g. `os.secrets.MY_KEY` as shorthand in docs). |
64
+ ### Compile (portable JSON)
54
65
 
55
- Bindings use **plain keys** (e.g. `GITHUB_PAT`, `server/fetch.token`) in `source.key`. Values are never stored in Context YAML—only references.
66
+ ```sh
67
+ ecp compile examples/01-echo/workflow.ts -o dist/workflow.json
68
+ ```
56
69
 
57
- ### `ecp config secrets`
70
+ ### Describe / search environment capabilities
58
71
 
59
- Use **`os.secrets`** for durable storage (e.g. `ecp config secrets add --provider os.secrets --key myapp/token --prompt`). The `ecp config` commands do **not** support `--environment`; they resolve `dot.env` only from `ecp.config.*` (`secrets.providers.dot.env.path`).
72
+ ```sh
73
+ ecp describe --env examples/01-echo/environment.ts
74
+ ecp search "echo" --env examples/01-echo/environment.ts
75
+ ```
60
76
 
61
- ### `--environment` (runtime commands only)
77
+ ### Encode / decode formats
62
78
 
63
- On **`ecp run`**, **`ecp validate`**, **`ecp trace`**, **`ecp trace list`**, and **`ecp graph`**, you can pass:
79
+ Encoding and decoding uses **format extensions** bound in your environment.
64
80
 
65
- ```bash
66
- ecp run context.yaml --environment ./.env.local
81
+ ```sh
82
+ ecp encode workflow.json --format toon --env environment.ts -o workflow.toon
83
+ ecp encode workflow.json --format fluent --env environment.ts -o workflow.generated.ts
84
+ ecp decode workflow.toon --format toon --env environment.ts -o workflow.json
67
85
  ```
68
86
 
69
- This sets the **file** used by the **`dot.env`** provider for that process. It **does not** merge variables into `process.env`; use `source.provider: process.env` only for variables already in the shell/CI environment, and `source.provider: dot.env` for file-backed values.
87
+ Notes:
70
88
 
71
- If both `--environment` and `secrets.providers.dot.env.path` are set, **`--environment` wins** for that command. If the path does not exist, the CLI exits with an error.
89
+ - Fluent **decode** is not supported. Use `ecp compile` for TypeScript/Fluent source manifest.
90
+ - JSON is the canonical manifest format; other formats are optional extensions.
72
91
 
73
- ## Links
92
+ ## Related packages
74
93
 
75
- - **Docs**: [executioncontrolprotocol.io](https://executioncontrolprotocol.io)
76
- - **Repo**: `https://github.com/executioncontrolprotocol/executioncontrolprotocol`
77
- - **Issues**: `https://github.com/executioncontrolprotocol/executioncontrolprotocol/issues`
94
+ - [`@executioncontrolprotocol/core`](../core/README.md): runtime-agnostic core + fluent API
95
+ - [`@executioncontrolprotocol/node`](../runtimes/node/README.md): Node runtime host used by CLI examples
96
+ - [`@executioncontrolprotocol/types`](../types/README.md): protocol types + generated JSON Schemas
97
+ - [`@executioncontrolprotocol/mcp`](../mcp/): MCP server adapter exposing an environment to agents
package/bin/dev.js CHANGED
@@ -1,8 +1,7 @@
1
- #!/usr/bin/env -S node --loader ts-node/esm --disable-warning=ExperimentalWarning
1
+ #!/usr/bin/env node
2
2
 
3
- import {execute} from '@oclif/core'
3
+ import { execute } from "@oclif/core"
4
4
 
5
- // Suppress Node deprecation warnings (e.g. punycode -> DEP0040) so CLI output stays clean.
6
- process.noDeprecation = true;
5
+ process.noDeprecation = true
7
6
 
8
- await execute({development: true, dir: import.meta.url})
7
+ await execute({ development: true, dir: import.meta.url })
package/bin/ecp.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from "@oclif/core"
4
+
5
+ process.noDeprecation = true
6
+
7
+ await execute({ dir: import.meta.url })
package/bin/run.cmd CHANGED
@@ -1,3 +1,3 @@
1
1
  @echo off
2
2
 
3
- node "%~dp0\run" %*
3
+ node "%~dp0\ecp.js" %*
package/bin/run.js CHANGED
@@ -1,8 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import {execute} from '@oclif/core'
4
-
5
- // Suppress Node deprecation warnings (e.g. punycode -> DEP0040) so CLI output stays clean.
6
- process.noDeprecation = true;
7
-
8
- await execute({dir: import.meta.url})
3
+ /** @deprecated Use `ecp.js`; kept for tests and `run.cmd`. */
4
+ import "./ecp.js"
@@ -0,0 +1,15 @@
1
+ import { Command } from "@oclif/core";
2
+ /** Compile a workflow source file to a portable JSON manifest. */
3
+ export default class Compile extends Command {
4
+ static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {
8
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ };
10
+ static args: {
11
+ "workflow-path": import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAKlD,kEAAkE;AAClE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,OAAO,SAA+B;IAE7C,MAAM,CAAC,WAAW,SACoF;IAEtG,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,KAAK;;MAMX;IAED,MAAM,CAAC,IAAI;;MAKV;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAe3B"}
@@ -0,0 +1,44 @@
1
+ import { Args, Command, Flags } from "@oclif/core";
2
+ import { compileWorkflowSource } from "@executioncontrolprotocol/core/compile";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { runWithCommandError } from "../lib/command-helpers.js";
5
+ /** Compile a workflow source file to a portable JSON manifest. */
6
+ export default class Compile extends Command {
7
+ static summary = "Compile a workflow to JSON";
8
+ static description = "Bundle and evaluate a workflow module (.ts or .js), or load .json, and emit the workflow manifest.";
9
+ static examples = [
10
+ "<%= config.bin %> <%= command.id %> examples/01-echo/workflow.ts",
11
+ "<%= config.bin %> <%= command.id %> examples/01-echo/workflow.ts -o dist/workflow.json",
12
+ ];
13
+ static flags = {
14
+ ...Command.baseFlags,
15
+ output: Flags.string({
16
+ char: "o",
17
+ description: "Write manifest JSON to this file (stdout if omitted)",
18
+ }),
19
+ };
20
+ static args = {
21
+ "workflow-path": Args.string({
22
+ required: true,
23
+ description: "Workflow file (.ts, .js, or .json)",
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(Compile);
28
+ await runWithCommandError(this, async () => {
29
+ const input = args["workflow-path"];
30
+ const source = await readFile(input, "utf8");
31
+ const result = await compileWorkflowSource({ source, filename: input });
32
+ if (!result.ok) {
33
+ this.log(JSON.stringify(result, null, 2));
34
+ this.exit(1);
35
+ }
36
+ const json = JSON.stringify(result.manifest, null, 2);
37
+ if (flags.output)
38
+ await writeFile(flags.output, json, "utf8");
39
+ else
40
+ this.log(json);
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,kEAAkE;AAClE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,OAAO,GAAG,4BAA4B,CAAA;IAE7C,MAAM,CAAC,WAAW,GAChB,oGAAoG,CAAA;IAEtG,MAAM,CAAC,QAAQ,GAAG;QAChB,kEAAkE;QAClE,wFAAwF;KACzF,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,OAAO,CAAC,SAAS;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sDAAsD;SACpE,CAAC;KACH,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC;YAC3B,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,oCAAoC;SAClD,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACjD,MAAM,mBAAmB,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA;YACnC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC5C,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACvE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;gBACzC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACd,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YACrD,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;;gBACxD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC"}
@@ -1,13 +1,14 @@
1
1
  import { Command } from "@oclif/core";
2
+ /** Store an OS keychain secret. */
2
3
  export default class ConfigSecretsAdd extends Command {
3
4
  static summary: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ key: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
4
10
  static flags: {
5
- provider: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
- key: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
11
  value: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- prompt: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
- config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
12
  };
12
13
  run(): Promise<void>;
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAgB7C,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,SAAoE;IAElF,MAAM,CAAC,KAAK;;;;;;;MAoBV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuD3B"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAUlD,mCAAmC;AACnC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,SAA+C;IAE7D,MAAM,CAAC,WAAW,SACsF;IAExG,MAAM,CAAC,QAAQ,WAGd;IAED,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;MAKX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA0B3B"}
@@ -1,84 +1,51 @@
1
- import { Command, Flags } from "@oclif/core";
1
+ import { Args, Command, Flags } from "@oclif/core";
2
2
  import { createInterface } from "node:readline/promises";
3
3
  import { stdin as input, stdout as output } from "node:process";
4
- import { configScopeFlags } from "../../../lib/config-flags.js";
5
- import { OS_PROVIDER_ID } from "../../../lib/secret-provider-ids.js";
6
- import { resolveDotenvPathFromConfig, resolveSecretPolicyFromConfig } from "../../../lib/secrets-config.js";
7
- import { loadConfigForDisplay } from "../../../lib/system-config-cli.js";
8
- import { canonicalSecretKeyForBinding, createDefaultSecretBroker, ECP_SECRET_REF_PROTOCOL_PREFIX, secretRefIdFromLogicalKey, } from "@executioncontrolprotocol/runtime";
4
+ import { canonicalSecretKey, ECP_SECRET_REF_PROTOCOL_PREFIX, secretRefIdFromLogicalKey, } from "@executioncontrolprotocol/secrets";
5
+ import { getCliSecretsStore } from "../../../lib/secrets/store.js";
6
+ /** Store an OS keychain secret. */
9
7
  export default class ConfigSecretsAdd extends Command {
10
- static summary = `Add or replace a secret in a provider (e.g. ${OS_PROVIDER_ID})`;
11
- static flags = {
12
- ...configScopeFlags,
13
- provider: Flags.string({
14
- char: "p",
15
- description: `Provider id (e.g. ${OS_PROVIDER_ID})`,
16
- required: true,
17
- }),
18
- key: Flags.string({
19
- char: "k",
20
- description: `Secret lookup key (e.g. GITHUB_API_KEY or server/fetch.token; ref id is ${ECP_SECRET_REF_PROTOCOL_PREFIX}<key>)`,
8
+ static summary = "Add or replace a secret in the OS keychain";
9
+ static description = "Prompts interactively for the secret value by default. Use --value for non-interactive inline input.";
10
+ static examples = [
11
+ "<%= config.bin %> <%= command.id %> server/fetch.token",
12
+ "<%= config.bin %> <%= command.id %> GITHUB_API_KEY --value ghp_xxx",
13
+ ];
14
+ static args = {
15
+ key: Args.string({
21
16
  required: true,
17
+ description: `Secret lookup key (ref id is ${ECP_SECRET_REF_PROTOCOL_PREFIX}<key>)`,
22
18
  }),
19
+ };
20
+ static flags = {
23
21
  value: Flags.string({
24
22
  char: "v",
25
- description: "Secret value (avoid in shell history; prefer --prompt)",
26
- }),
27
- prompt: Flags.boolean({
28
- description: "Read secret from stdin interactively (masked input not supported on all terminals)",
23
+ description: "Secret value inline (non-interactive; avoid in shell history)",
29
24
  }),
30
25
  };
31
26
  async run() {
32
- const { flags } = await this.parse(ConfigSecretsAdd);
33
- if (flags.value && flags.prompt) {
34
- this.error("Use only one of --value or --prompt.", { exit: 1 });
35
- }
36
- if (!flags.value && !flags.prompt) {
37
- this.error("Provide --value or --prompt.", { exit: 1 });
38
- }
39
- const cwd = process.cwd();
40
- const { config } = loadConfigForDisplay({
41
- global: flags.global,
42
- cwd,
43
- explicit: flags.config,
44
- });
45
- const dotenvPath = resolveDotenvPathFromConfig(cwd, config);
46
- const { registry } = createDefaultSecretBroker({
47
- policy: resolveSecretPolicyFromConfig(config),
48
- dotenvPath,
49
- cwd,
50
- });
51
- const provider = registry.get(flags.provider);
52
- if (!provider) {
53
- this.error(`Unknown provider "${flags.provider}".`, { exit: 1 });
54
- }
55
- if (!provider.store) {
56
- this.error(`Provider "${flags.provider}" does not support store (read-only).`, { exit: 1 });
57
- }
58
- const available = await provider.isAvailable();
27
+ const { args, flags } = await this.parse(ConfigSecretsAdd);
28
+ const store = getCliSecretsStore();
29
+ const available = await store.isAvailable();
59
30
  if (!available) {
60
- this.error(`Provider "${flags.provider}" is not available on this system.`, { exit: 1 });
31
+ this.error("OS keychain is not available on this system.", { exit: 1 });
61
32
  }
62
- let value = flags.value ?? "";
63
- if (flags.prompt) {
33
+ let value = flags.value;
34
+ if (value === undefined) {
64
35
  const rl = createInterface({ input, output });
65
36
  try {
66
- value = (await rl.question("Secret value: ")).trim();
37
+ value = (await rl.question("Paste secret value: ")).trim();
67
38
  }
68
39
  finally {
69
- await rl.close();
40
+ rl.close();
41
+ }
42
+ if (!value) {
43
+ this.error("Secret value cannot be empty.", { exit: 1 });
70
44
  }
71
45
  }
72
- if (!value) {
73
- this.error("Empty secret.", { exit: 1 });
74
- }
75
- const ref = {
76
- id: secretRefIdFromLogicalKey(flags.key),
77
- provider: flags.provider,
78
- key: canonicalSecretKeyForBinding(flags.key),
79
- };
80
- await provider.store({ ref, value });
81
- this.log(`Stored secret for provider "${flags.provider}" key "${flags.key}".`);
46
+ const key = canonicalSecretKey(args.key);
47
+ await store.set(key, value);
48
+ this.log(`Stored secret "${key}" (${secretRefIdFromLogicalKey(key)}).`);
82
49
  }
83
50
  }
84
51
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/config/secrets/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/commands/config/secrets/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,mCAAmC;AACnC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,GAAG,4CAA4C,CAAA;IAE7D,MAAM,CAAC,WAAW,GAChB,sGAAsG,CAAA;IAExG,MAAM,CAAC,QAAQ,GAAG;QAChB,wDAAwD;QACxD,oEAAoE;KACrE,CAAA;IAED,MAAM,CAAC,IAAI,GAAG;QACZ,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,gCAAgC,8BAA8B,QAAQ;SACpF,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,+DAA+D;SAC7E,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAE1D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAA;QAClC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;QAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,8CAA8C,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YAC7C,IAAI,CAAC;gBACH,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC5D,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAA;YACZ,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3B,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,MAAM,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzE,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { Command } from "@oclif/core";
2
+ /** Read an OS keychain secret. */
2
3
  export default class ConfigSecretsGet extends Command {
3
4
  static summary: string;
5
+ static args: {
6
+ key: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
4
8
  static flags: {
5
- provider: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
- key: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
- show: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
- config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ reveal: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
10
  };
11
11
  run(): Promise<void>;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAY7C,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,SAAyC;IAEvD,MAAM,CAAC,KAAK;;;;;;MAeV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwC3B"}
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAS,MAAM,aAAa,CAAA;AAQlD,kCAAkC;AAClC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,SAAwC;IAEtD,MAAM,CAAC,IAAI;;MAKV;IAED,MAAM,CAAC,KAAK;;MAIX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB3B"}
@@ -1,63 +1,38 @@
1
- import { Command, Flags } from "@oclif/core";
2
- import { configScopeFlags } from "../../../lib/config-flags.js";
3
- import { resolveDotenvPathFromConfig, resolveSecretPolicyFromConfig } from "../../../lib/secrets-config.js";
4
- import { loadConfigForDisplay } from "../../../lib/system-config-cli.js";
5
- import { canonicalSecretKeyForBinding, createDefaultSecretBroker, ECP_SECRET_REF_PROTOCOL_PREFIX, secretRefIdFromLogicalKey, } from "@executioncontrolprotocol/runtime";
1
+ import { Args, Command, Flags } from "@oclif/core";
2
+ import { canonicalSecretKey, ECP_SECRET_REF_PROTOCOL_PREFIX, redactSecret, } from "@executioncontrolprotocol/secrets";
3
+ import { getCliSecretsStore } from "../../../lib/secrets/store.js";
4
+ /** Read an OS keychain secret. */
6
5
  export default class ConfigSecretsGet extends Command {
7
6
  static summary = "Read a secret (redacted by default)";
8
- static flags = {
9
- ...configScopeFlags,
10
- provider: Flags.string({
11
- char: "p",
12
- description: "Provider id",
13
- required: true,
14
- }),
15
- key: Flags.string({
16
- char: "k",
17
- description: `Lookup key (same form as add; ref id is ${ECP_SECRET_REF_PROTOCOL_PREFIX}<key>)`,
7
+ static args = {
8
+ key: Args.string({
18
9
  required: true,
10
+ description: `Lookup key (ref id is ${ECP_SECRET_REF_PROTOCOL_PREFIX}<key>)`,
19
11
  }),
20
- show: Flags.boolean({
12
+ };
13
+ static flags = {
14
+ reveal: Flags.boolean({
21
15
  description: "Print full value (writes to stdout — avoid logs)",
22
16
  }),
23
17
  };
24
18
  async run() {
25
- const { flags } = await this.parse(ConfigSecretsGet);
26
- const cwd = process.cwd();
27
- const { config } = loadConfigForDisplay({
28
- global: flags.global,
29
- cwd,
30
- explicit: flags.config,
31
- });
32
- const dotenvPath = resolveDotenvPathFromConfig(cwd, config);
33
- const { registry } = createDefaultSecretBroker({
34
- policy: resolveSecretPolicyFromConfig(config),
35
- dotenvPath,
36
- cwd,
37
- });
38
- const provider = registry.get(flags.provider);
39
- if (!provider) {
40
- this.error(`Unknown provider "${flags.provider}".`, { exit: 1 });
41
- }
42
- const available = await provider.isAvailable();
19
+ const { args, flags } = await this.parse(ConfigSecretsGet);
20
+ const store = getCliSecretsStore();
21
+ const available = await store.isAvailable();
43
22
  if (!available) {
44
- this.error(`Provider "${flags.provider}" is not available.`, { exit: 1 });
23
+ this.error("OS keychain is not available on this system.", { exit: 1 });
45
24
  }
46
- const ref = {
47
- id: secretRefIdFromLogicalKey(flags.key),
48
- provider: flags.provider,
49
- key: canonicalSecretKeyForBinding(flags.key),
50
- };
51
- const result = await provider.load(ref);
52
- if (!result) {
53
- this.error(`No secret for key "${flags.key}".`, { exit: 1 });
25
+ const key = canonicalSecretKey(args.key);
26
+ const value = await store.get(key);
27
+ if (value == null) {
28
+ this.error(`No secret for key "${key}".`, { exit: 1 });
54
29
  }
55
- if (flags.show) {
30
+ if (flags.reveal) {
56
31
  this.warn("Printing full secret to stdout — ensure this is not logged or captured.");
57
- this.log(result.value);
32
+ this.log(value);
58
33
  }
59
34
  else {
60
- this.log(result.redactedPreview);
35
+ this.log(redactSecret(value));
61
36
  }
62
37
  }
63
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/config/secrets/get.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/config/secrets/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,YAAY,GACb,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,kCAAkC;AAClC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,GAAG,qCAAqC,CAAA;IAEtD,MAAM,CAAC,IAAI,GAAG;QACZ,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,yBAAyB,8BAA8B,QAAQ;SAC7E,CAAC;KACH,CAAA;IAED,MAAM,CAAC,KAAK,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;YACpB,WAAW,EAAE,kDAAkD;SAChE,CAAC;KACH,CAAA;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAA;QAClC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAA;QAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,8CAA8C,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACzE,CAAC;QAED,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;YACpF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC"}
@@ -1,11 +1,7 @@
1
1
  import { Command } from "@oclif/core";
2
+ /** List OS keychain secret keys. */
2
3
  export default class ConfigSecretsList extends Command {
3
4
  static summary: string;
4
- static flags: {
5
- provider: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
- global: import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
- config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- };
9
5
  run(): Promise<void>;
10
6
  }
11
7
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,MAAM,CAAC,OAAO,SAAsD;IAEpE,MAAM,CAAC,KAAK;;;;MAOV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC3B"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/secrets/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAGrC,oCAAoC;AACpC,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,MAAM,CAAC,OAAO,SAAwC;IAEhD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB3B"}
@@ -1,51 +1,21 @@
1
- import { Command, Flags } from "@oclif/core";
2
- import { configScopeFlags } from "../../../lib/config-flags.js";
3
- import { OS_PROVIDER_ID } from "../../../lib/secret-provider-ids.js";
4
- import { resolveDotenvPathFromConfig, resolveSecretPolicyFromConfig } from "../../../lib/secrets-config.js";
5
- import { loadConfigForDisplay } from "../../../lib/system-config-cli.js";
6
- import { createDefaultSecretBroker } from "@executioncontrolprotocol/runtime";
1
+ import { Command } from "@oclif/core";
2
+ import { getCliSecretsStore } from "../../../lib/secrets/store.js";
3
+ /** List OS keychain secret keys. */
7
4
  export default class ConfigSecretsList extends Command {
8
- static summary = "List secret keys for a provider (when supported)";
9
- static flags = {
10
- ...configScopeFlags,
11
- provider: Flags.string({
12
- char: "p",
13
- description: `Provider id (e.g. ${OS_PROVIDER_ID})`,
14
- required: true,
15
- }),
16
- };
5
+ static summary = "List secret keys in the OS keychain";
17
6
  async run() {
18
- const { flags } = await this.parse(ConfigSecretsList);
19
- const cwd = process.cwd();
20
- const { config } = loadConfigForDisplay({
21
- global: flags.global,
22
- cwd,
23
- explicit: flags.config,
24
- });
25
- const dotenvPath = resolveDotenvPathFromConfig(cwd, config);
26
- const { registry } = createDefaultSecretBroker({
27
- policy: resolveSecretPolicyFromConfig(config),
28
- dotenvPath,
29
- cwd,
30
- });
31
- const provider = registry.get(flags.provider);
32
- if (!provider) {
33
- this.error(`Unknown provider "${flags.provider}".`, { exit: 1 });
34
- }
35
- if (!provider.list) {
36
- this.error(`Provider "${flags.provider}" does not support list.`, { exit: 1 });
37
- }
38
- const available = await provider.isAvailable();
7
+ const store = getCliSecretsStore();
8
+ const available = await store.isAvailable();
39
9
  if (!available) {
40
- this.error(`Provider "${flags.provider}" is not available.`, { exit: 1 });
10
+ this.error("OS keychain is not available on this system.", { exit: 1 });
41
11
  }
42
- const refs = await provider.list();
43
- if (refs.length === 0) {
12
+ const keys = await store.list();
13
+ if (keys.length === 0) {
44
14
  this.log("(no entries)");
45
15
  return;
46
16
  }
47
- for (const r of refs) {
48
- this.log(` ${r.key}`);
17
+ for (const key of keys) {
18
+ this.log(` ${key}`);
49
19
  }
50
20
  }
51
21
  }