@dharta/cli 0.6.77

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -0
  3. package/dist/agent.d.ts +17 -0
  4. package/dist/agent.js +134 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/api-error.d.ts +3 -0
  7. package/dist/api-error.js +80 -0
  8. package/dist/api-error.js.map +1 -0
  9. package/dist/browser.d.ts +1 -0
  10. package/dist/browser.js +19 -0
  11. package/dist/browser.js.map +1 -0
  12. package/dist/cli.d.ts +5 -0
  13. package/dist/cli.js +1978 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/agents.d.ts +131 -0
  16. package/dist/commands/agents.js +439 -0
  17. package/dist/commands/agents.js.map +1 -0
  18. package/dist/commands/analytics.d.ts +25 -0
  19. package/dist/commands/analytics.js +166 -0
  20. package/dist/commands/analytics.js.map +1 -0
  21. package/dist/commands/api.d.ts +19 -0
  22. package/dist/commands/api.js +278 -0
  23. package/dist/commands/api.js.map +1 -0
  24. package/dist/commands/appearance.d.ts +19 -0
  25. package/dist/commands/appearance.js +63 -0
  26. package/dist/commands/appearance.js.map +1 -0
  27. package/dist/commands/artifact.d.ts +33 -0
  28. package/dist/commands/artifact.js +235 -0
  29. package/dist/commands/artifact.js.map +1 -0
  30. package/dist/commands/audit-log.d.ts +32 -0
  31. package/dist/commands/audit-log.js +102 -0
  32. package/dist/commands/audit-log.js.map +1 -0
  33. package/dist/commands/auth.d.ts +47 -0
  34. package/dist/commands/auth.js +117 -0
  35. package/dist/commands/auth.js.map +1 -0
  36. package/dist/commands/caps.d.ts +82 -0
  37. package/dist/commands/caps.js +213 -0
  38. package/dist/commands/caps.js.map +1 -0
  39. package/dist/commands/create.d.ts +22 -0
  40. package/dist/commands/create.js +76 -0
  41. package/dist/commands/create.js.map +1 -0
  42. package/dist/commands/deploy.d.ts +45 -0
  43. package/dist/commands/deploy.js +892 -0
  44. package/dist/commands/deploy.js.map +1 -0
  45. package/dist/commands/dev.d.ts +33 -0
  46. package/dist/commands/dev.js +655 -0
  47. package/dist/commands/dev.js.map +1 -0
  48. package/dist/commands/directories.d.ts +60 -0
  49. package/dist/commands/directories.js +83 -0
  50. package/dist/commands/directories.js.map +1 -0
  51. package/dist/commands/doctor.d.ts +13 -0
  52. package/dist/commands/doctor.js +123 -0
  53. package/dist/commands/doctor.js.map +1 -0
  54. package/dist/commands/embed-keys.d.ts +61 -0
  55. package/dist/commands/embed-keys.js +165 -0
  56. package/dist/commands/embed-keys.js.map +1 -0
  57. package/dist/commands/env.d.ts +59 -0
  58. package/dist/commands/env.js +300 -0
  59. package/dist/commands/env.js.map +1 -0
  60. package/dist/commands/files.d.ts +14 -0
  61. package/dist/commands/files.js +84 -0
  62. package/dist/commands/files.js.map +1 -0
  63. package/dist/commands/git-credential.d.ts +1 -0
  64. package/dist/commands/git-credential.js +70 -0
  65. package/dist/commands/git-credential.js.map +1 -0
  66. package/dist/commands/kartas.d.ts +101 -0
  67. package/dist/commands/kartas.js +289 -0
  68. package/dist/commands/kartas.js.map +1 -0
  69. package/dist/commands/keys.d.ts +33 -0
  70. package/dist/commands/keys.js +141 -0
  71. package/dist/commands/keys.js.map +1 -0
  72. package/dist/commands/login.d.ts +22 -0
  73. package/dist/commands/login.js +78 -0
  74. package/dist/commands/login.js.map +1 -0
  75. package/dist/commands/logs.d.ts +14 -0
  76. package/dist/commands/logs.js +89 -0
  77. package/dist/commands/logs.js.map +1 -0
  78. package/dist/commands/members.d.ts +32 -0
  79. package/dist/commands/members.js +77 -0
  80. package/dist/commands/members.js.map +1 -0
  81. package/dist/commands/model-keys.d.ts +22 -0
  82. package/dist/commands/model-keys.js +222 -0
  83. package/dist/commands/model-keys.js.map +1 -0
  84. package/dist/commands/open.d.ts +29 -0
  85. package/dist/commands/open.js +119 -0
  86. package/dist/commands/open.js.map +1 -0
  87. package/dist/commands/parity.d.ts +15 -0
  88. package/dist/commands/parity.js +73 -0
  89. package/dist/commands/parity.js.map +1 -0
  90. package/dist/commands/rollback.d.ts +21 -0
  91. package/dist/commands/rollback.js +26 -0
  92. package/dist/commands/rollback.js.map +1 -0
  93. package/dist/commands/schedules.d.ts +52 -0
  94. package/dist/commands/schedules.js +231 -0
  95. package/dist/commands/schedules.js.map +1 -0
  96. package/dist/commands/scopes.d.ts +3 -0
  97. package/dist/commands/scopes.js +21 -0
  98. package/dist/commands/scopes.js.map +1 -0
  99. package/dist/commands/sessions.d.ts +53 -0
  100. package/dist/commands/sessions.js +142 -0
  101. package/dist/commands/sessions.js.map +1 -0
  102. package/dist/commands/setup.d.ts +28 -0
  103. package/dist/commands/setup.js +949 -0
  104. package/dist/commands/setup.js.map +1 -0
  105. package/dist/commands/status.d.ts +19 -0
  106. package/dist/commands/status.js +63 -0
  107. package/dist/commands/status.js.map +1 -0
  108. package/dist/commands/update.d.ts +14 -0
  109. package/dist/commands/update.js +120 -0
  110. package/dist/commands/update.js.map +1 -0
  111. package/dist/commands/usage.d.ts +3 -0
  112. package/dist/commands/usage.js +37 -0
  113. package/dist/commands/usage.js.map +1 -0
  114. package/dist/commands/webhooks.d.ts +47 -0
  115. package/dist/commands/webhooks.js +156 -0
  116. package/dist/commands/webhooks.js.map +1 -0
  117. package/dist/commands/whoami.d.ts +7 -0
  118. package/dist/commands/whoami.js +17 -0
  119. package/dist/commands/whoami.js.map +1 -0
  120. package/dist/completions.d.ts +13 -0
  121. package/dist/completions.js +120 -0
  122. package/dist/completions.js.map +1 -0
  123. package/dist/config.d.ts +20 -0
  124. package/dist/config.js +98 -0
  125. package/dist/config.js.map +1 -0
  126. package/dist/context.d.ts +14 -0
  127. package/dist/context.js +38 -0
  128. package/dist/context.js.map +1 -0
  129. package/dist/device-flow.d.ts +9 -0
  130. package/dist/device-flow.js +127 -0
  131. package/dist/device-flow.js.map +1 -0
  132. package/dist/harness-preflight.d.ts +24 -0
  133. package/dist/harness-preflight.js +252 -0
  134. package/dist/harness-preflight.js.map +1 -0
  135. package/dist/harnesses.d.ts +11 -0
  136. package/dist/harnesses.js +112 -0
  137. package/dist/harnesses.js.map +1 -0
  138. package/dist/index.d.ts +3 -0
  139. package/dist/index.js +3 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/login-offer.d.ts +9 -0
  142. package/dist/login-offer.js +36 -0
  143. package/dist/login-offer.js.map +1 -0
  144. package/dist/manifest.d.ts +15 -0
  145. package/dist/manifest.js +142 -0
  146. package/dist/manifest.js.map +1 -0
  147. package/dist/money.d.ts +1 -0
  148. package/dist/money.js +16 -0
  149. package/dist/money.js.map +1 -0
  150. package/dist/output.d.ts +2 -0
  151. package/dist/output.js +20 -0
  152. package/dist/output.js.map +1 -0
  153. package/dist/runtime.d.ts +19 -0
  154. package/dist/runtime.js +95 -0
  155. package/dist/runtime.js.map +1 -0
  156. package/dist/scaffold.d.ts +16 -0
  157. package/dist/scaffold.js +74 -0
  158. package/dist/scaffold.js.map +1 -0
  159. package/dist/setup-scan.d.ts +21 -0
  160. package/dist/setup-scan.js +127 -0
  161. package/dist/setup-scan.js.map +1 -0
  162. package/dist/templates.d.ts +14 -0
  163. package/dist/templates.js +65 -0
  164. package/dist/templates.js.map +1 -0
  165. package/dist/validators.d.ts +10 -0
  166. package/dist/validators.js +116 -0
  167. package/dist/validators.js.map +1 -0
  168. package/dist/version-check.d.ts +25 -0
  169. package/dist/version-check.js +68 -0
  170. package/dist/version-check.js.map +1 -0
  171. package/node_modules/@dharta/sdk/LICENSE +21 -0
  172. package/node_modules/@dharta/sdk/README.md +87 -0
  173. package/node_modules/@dharta/sdk/dist/errors.d.ts +20 -0
  174. package/node_modules/@dharta/sdk/dist/errors.d.ts.map +1 -0
  175. package/node_modules/@dharta/sdk/dist/errors.js +51 -0
  176. package/node_modules/@dharta/sdk/dist/errors.js.map +1 -0
  177. package/node_modules/@dharta/sdk/dist/http.d.ts +26 -0
  178. package/node_modules/@dharta/sdk/dist/http.d.ts.map +1 -0
  179. package/node_modules/@dharta/sdk/dist/http.js +136 -0
  180. package/node_modules/@dharta/sdk/dist/http.js.map +1 -0
  181. package/node_modules/@dharta/sdk/dist/index.d.ts +15 -0
  182. package/node_modules/@dharta/sdk/dist/index.d.ts.map +1 -0
  183. package/node_modules/@dharta/sdk/dist/index.js +21 -0
  184. package/node_modules/@dharta/sdk/dist/index.js.map +1 -0
  185. package/node_modules/@dharta/sdk/dist/resources.d.ts +48 -0
  186. package/node_modules/@dharta/sdk/dist/resources.d.ts.map +1 -0
  187. package/node_modules/@dharta/sdk/dist/resources.js +150 -0
  188. package/node_modules/@dharta/sdk/dist/resources.js.map +1 -0
  189. package/node_modules/@dharta/sdk/dist/types.d.ts +94 -0
  190. package/node_modules/@dharta/sdk/dist/types.d.ts.map +1 -0
  191. package/node_modules/@dharta/sdk/dist/types.js +59 -0
  192. package/node_modules/@dharta/sdk/dist/types.js.map +1 -0
  193. package/node_modules/@dharta/sdk/package.json +32 -0
  194. package/node_modules/@dharta/sdk/src/errors.ts +58 -0
  195. package/node_modules/@dharta/sdk/src/http.ts +166 -0
  196. package/node_modules/@dharta/sdk/src/index.ts +36 -0
  197. package/node_modules/@dharta/sdk/src/resources.ts +197 -0
  198. package/node_modules/@dharta/sdk/src/types.ts +179 -0
  199. package/package.json +38 -0
  200. package/src/agent.ts +147 -0
  201. package/src/api-error.ts +88 -0
  202. package/src/browser.ts +20 -0
  203. package/src/cli.ts +2339 -0
  204. package/src/commands/agents.ts +635 -0
  205. package/src/commands/analytics.ts +181 -0
  206. package/src/commands/api.ts +297 -0
  207. package/src/commands/appearance.ts +79 -0
  208. package/src/commands/artifact.ts +331 -0
  209. package/src/commands/audit-log.ts +125 -0
  210. package/src/commands/auth.ts +186 -0
  211. package/src/commands/caps.ts +302 -0
  212. package/src/commands/create.ts +114 -0
  213. package/src/commands/deploy.ts +1122 -0
  214. package/src/commands/dev.ts +792 -0
  215. package/src/commands/directories.ts +136 -0
  216. package/src/commands/doctor.ts +138 -0
  217. package/src/commands/embed-keys.ts +237 -0
  218. package/src/commands/env.ts +369 -0
  219. package/src/commands/files.ts +124 -0
  220. package/src/commands/git-credential.ts +78 -0
  221. package/src/commands/kartas.ts +439 -0
  222. package/src/commands/keys.ts +206 -0
  223. package/src/commands/login.ts +115 -0
  224. package/src/commands/logs.ts +111 -0
  225. package/src/commands/members.ts +109 -0
  226. package/src/commands/model-keys.ts +278 -0
  227. package/src/commands/open.ts +173 -0
  228. package/src/commands/parity.ts +96 -0
  229. package/src/commands/rollback.ts +45 -0
  230. package/src/commands/schedules.ts +290 -0
  231. package/src/commands/scopes.ts +22 -0
  232. package/src/commands/sessions.ts +225 -0
  233. package/src/commands/setup.ts +1176 -0
  234. package/src/commands/status.ts +94 -0
  235. package/src/commands/update.ts +157 -0
  236. package/src/commands/usage.ts +41 -0
  237. package/src/commands/webhooks.ts +200 -0
  238. package/src/commands/whoami.ts +24 -0
  239. package/src/completions.ts +168 -0
  240. package/src/config.ts +143 -0
  241. package/src/context.ts +59 -0
  242. package/src/device-flow.ts +174 -0
  243. package/src/harness-preflight.ts +293 -0
  244. package/src/harnesses.ts +117 -0
  245. package/src/index.ts +3 -0
  246. package/src/login-offer.ts +49 -0
  247. package/src/manifest.ts +153 -0
  248. package/src/money.ts +15 -0
  249. package/src/output.ts +22 -0
  250. package/src/runtime.ts +127 -0
  251. package/src/scaffold.ts +102 -0
  252. package/src/setup-scan.ts +154 -0
  253. package/src/templates.ts +85 -0
  254. package/src/validators.ts +124 -0
  255. package/src/version-check.ts +75 -0
  256. package/templates/blank/CLAUDE.md +21 -0
  257. package/templates/blank/dharta.toml +11 -0
  258. package/templates/faq-agent/CLAUDE.md +51 -0
  259. package/templates/faq-agent/dharta.toml +11 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 LifeSage LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,167 @@
1
+ # @dharta/cli
2
+
3
+ The unified `dharta` CLI ([RFC 0013](../../docs/rfcs/0013-unified-cli.md)):
4
+ one tool from `setup` to `open`. Wraps the [`@dharta/sdk`](../typescript)
5
+ TypeScript SDK for its API calls; `dharta dev` bootstraps the Python
6
+ `dharta-runtime` package (the harness-adapter engine, pinned per CLI release)
7
+ via uv.
8
+
9
+ ## Install
10
+
11
+ ```sh
12
+ npm install -g @dharta/cli
13
+ ```
14
+
15
+ That is the only install channel today (brew/curl installers are Phase 2).
16
+ From a checkout:
17
+
18
+ ```sh
19
+ cd sdks/typescript && npm install && npm run build
20
+ cd ../typescript-cli && npm install && npm run build
21
+ node dist/cli.js --help # or `npm link` to get `dharta` on PATH
22
+ ```
23
+
24
+ ## The golden path
25
+
26
+ ```sh
27
+ dharta login # device flow, browser approve
28
+ dharta create support-bot --harness claude-code # scaffold a starter agent
29
+ cd support-bot
30
+ dharta setup --enable --method git # persist this agent's delivery method
31
+ dharta dev # chat locally, hot reload
32
+ dharta deploy # deploy this agent folder only
33
+ dharta open
34
+ ```
35
+
36
+ For git deploys, a fresh clone, worktree, or GitHub Actions checkout without a
37
+ `dharta` remote reuses source identity from its canonical remote and any
38
+ already-bound sibling agent. The local checkout directory name is only a
39
+ fallback. Each agent folder is a self-contained release boundary: materialize
40
+ shared runtime inputs inside it before deploying.
41
+
42
+ ## Commands
43
+
44
+ | Command | Description |
45
+ | --- | --- |
46
+ | `dharta login` | Device flow: prints a one-time code, you approve it in the browser (signed-in dashboard session), and the CLI receives a named, revocable credential visible on the dashboard keys page. Also installs the git credential helper for `git push dharta`. |
47
+ | `dharta login --with-token` | Read an API key from piped stdin instead (CI, air-gapped): `echo $DHARTA_API_KEY \| dharta login --with-token`. |
48
+ | `dharta auth status` | Show who you are, per profile (includes the `DHARTA_API_KEY` env credential when set). |
49
+ | `dharta auth token` | Print the active token, for piping. |
50
+ | `dharta auth logout [--profile <name>]` | Remove the stored credential (the key stays revocable on the dashboard). |
51
+ | `dharta whoami` | Show the authenticated principal. |
52
+ | `dharta create [path] [--name <n>] [--template <key>] [--harness <type>] [--harness-version <version>]` | Scaffold a brand-new starter agent in a supported harness format (`claude-code`, `opencode`, `deepagents`, `goose`, or `codex-cli`): native template files plus a default `dharta.toml` (deploy off). Omit `--harness` for Claude Code. Local only. |
53
+ | `dharta setup [path] [--name <n>] [--enable\|--disable] [--method git\|folder] [--ci github] [--login]` | Configure exactly one existing agent folder and persist its deploy method. `name` is a 1-100 character display name; Dharta derives the org-unique deploy slug from it, and changing that slug targets a different agent. At an ambiguous repo root, interactive setup asks for one agent; rerun setup for each sibling. GitHub is optional per-agent automation pinned to the selected method, not a third transport; rerun setup and rotate that agent's CI secret when changing methods. Local only. |
54
+ | `dharta dev [path] [-m <msg>] [--user <id>] [--port <port>]` | Run the agent locally behind the consumer session API: chat REPL, hot reload, approval prompts, and a printed local URL a widget can target. `[path]` (or cwd) selects the agent; in a multi-agent repo it picks the sole one or asks. Spawns `dharta-runtime dev-serve` via uv (see Runtime below). |
55
+ | `dharta dev --release vN [--env remote [--include-secrets]]` | Parity axes: run the exact built tree prod serves, and/or bind prod env vars instead of `.env` (`--include-secrets` needs `env:secrets:read`; audited). |
56
+ | `dharta deploy [slug] [--mode git\|folder] [--dir <path>] [--reconcile-source]` | Create and activate a new immutable release from exactly one agent folder. Its checked-in `deploy_method` selects committed git or working-tree upload; `--mode` is a one-run override. Git uses a per-agent deploy ref, so sibling agents never fan out implicitly. After inspecting intentionally divergent hosted history, `--reconcile-source` aligns only Dharta's hosted branch. |
57
+ | `dharta status` | Every agent in this repo (resolved from the git root, like `git status`) joined to its live release/version on the active profile - the "what's here" view. Works before the first deploy. |
58
+ | `dharta rollback [slug] --to vN` | Flip the agent's current release to a previous version (`releases:write`); slug is inferred from this folder when omitted. |
59
+ | `dharta logs [slug] [--tail] [--since <iso>]` | Stream agent logs via SSE (`--tail`) or poll with `--since`; slug is inferred from this folder when omitted. |
60
+ | `dharta open [target]` | Open the hosted chat page, `console`, or handoff targets: `billing`, `security`, `api-keys`, `model-keys`, `webhooks`, `connected-accounts`. Per-agent commands resolve the agent from `dharta.toml`: explicit `--agent`/`[path]`, the repo's sole agent, then the legacy `DHARTA_PROJECT` alias. |
61
+ | `dharta env list\|set NAME=value [--secret]\|unset NAME` | Manage the agent's prod env bindings (declare-or-bind; secret values are never shown). |
62
+ | `dharta env pull [--force] [--include-secrets]` | Hydrate `.env` from prod values (audited; secrets excluded unless `--include-secrets` uses `env:secrets:read`). |
63
+ | `dharta env diff` | Report drift between `.env`, prod bindings, and the `dharta.toml` `[env]` declarations. |
64
+ | `dharta sessions [show\|view <id>]` | List transcript sessions from the deployed agent host; `show`/`view` renders a transcript (requires the org's transcript-access setting). |
65
+ | `dharta session <id>` | Direct alias for viewing one deployed session transcript. |
66
+ | `dharta ps` | Sessions active right now: count, age, model, tokens. |
67
+ | `dharta files ls <agent> <karta>` | List a karta's durable workspace files (path and size) via the owner read channel (requires a `workspace:read` key + the agent's `owners.api` grant). |
68
+ | `dharta files get <agent> <karta> <path> [-o <file>]` | Fetch one workspace file; writes bytes to `--out`, or streams them to stdout. |
69
+ | `dharta artifact put\|list\|remove` | Designate, inspect, or remove durable workspace work product through the release-declared artifact schema. This delegates to the pinned `dharta-runtime` helper and never publishes or shares an artifact. |
70
+ | `dharta send "<message>"` (alias `run`) | Send a one-shot message to the DEPLOYED agent and print its reply (prod smoke test; tool approvals auto-denied). |
71
+ | `dharta agent list\|show [slug]` | List all agents in your org, or show one + its recent releases (the agent in this folder if no slug). |
72
+ | `dharta agent sessions [slug]\|sessions show\|view <id> [slug]\|session <id> [slug]` | List transcript sessions for an agent, or view one transcript without leaving the `agent` namespace. |
73
+ | `dharta agent releases [slug]\|activate <version> [slug]` | List release history or activate an existing production release. |
74
+ | `dharta agent serving\|dashboard-edits\|workspace-inspectable on\|off [slug]` | Toggle serving, browser-console edits, and read-only workspace inspection. |
75
+ | `dharta agent workspace-access show\|set <path>=<on\|off> [slug]` | Show or set the workspace access grant matrix. Paths: `owners.git`, `owners.api`, `users.widget`, `users.agent_definition`. |
76
+ | `dharta agent model [slug] --source inherit\|platform [--model <id>]` | Clear the model override or pin the platform connector. |
77
+ | `dharta agent model [slug] --connector-id <id> [--model <id>]` | Pin a BYOK connector from `dharta model-keys list`; omit `--source`. |
78
+ | `dharta agent delete [slug]` | Archive an agent. |
79
+ | `dharta schedules list\|create [--run-now]\|pause\|resume\|run\|delete\|rm` | Manage recurring runs for an agent. `--run-now` queues a test run immediately after creation. |
80
+ | `dharta keys list\|create <name> [--scope ...]\|rename <id> <name>\|revoke <id>` | Manage API keys (plaintext shown exactly once on create). |
81
+ | `dharta usage` | Current-period totals and budget. |
82
+ | `dharta doctor` | Diagnose PATH shadowing (a stale pip-installed `dharta`), the uv/runtime bootstrap, and login state. Exits non-zero when unhealthy. |
83
+ | `dharta update` | Self-update on the standalone channel; npm installs get the `npm install -g @dharta/cli@latest` pointer. |
84
+ | `dharta completion <bash\|zsh>` | Print a shell completion script generated from the command tree. |
85
+
86
+ Additional command groups:
87
+
88
+ | Command | Description |
89
+ | --- | --- |
90
+ | `dharta audit-log` | Export audit events as a table, JSON, or CSV. |
91
+ | `dharta analytics agents\|users\|instances\|sessions\|models\|cost` | Usage and cost rollups with bounded ranges and JSON output. |
92
+ | `dharta api [METHOD] /path` | Authenticated passthrough for documented public API reads and curated scoped writes. |
93
+ | `dharta model-keys list\|create\|revoke` | Manage encrypted BYOK provider credentials. |
94
+ | `dharta members list\|invite\|set-role\|remove` | Manage organization members and invitations. |
95
+ | `dharta kartas list\|show\|configure\|grant\|set-role\|revoke` | Manage durable Dharta names, agent-scoped vanity URLs, access audience, and per-Karta member ACLs. |
96
+ | `dharta embed-keys list\|create\|rotate\|enable\|disable\|revoke\|enable-identity\|disable-identity` | Manage publishable widget embed keys and their verified-identity secret for an agent. |
97
+ | `dharta caps budget [set]\|set\|instance\|instance-set\|end-user\|end-user-set\|seat\|seat-set` | Inspect and update monthly budget, durable dharta caps, verified-user caps, and per-seat caps. |
98
+ | `dharta appearance get\|set` | Read or merge an agent's appearance JSON. |
99
+ | `dharta directories instances\|end-users\|users\|sessions` | Read agent-scoped durable kartas, verified users, and sessions. |
100
+ | `dharta webhooks list\|create\|update\|enable\|delete\|rm` | Manage webhook endpoints and one-time signing secrets. |
101
+
102
+ Every command that prints a result payload also takes `--json` for
103
+ machine-readable output (RFC 0013 §3). Stream-shaped commands (`dev`, `logs`,
104
+ `deploy` (git mode), `completion`) reject the flag instead of silently ignoring
105
+ it. `dharta open --json` prints the URL object without opening a browser, and
106
+ `dharta send --json` buffers the reply into one `{agent, session_id, reply}`
107
+ payload.
108
+
109
+ `dharta git-credential` is a hidden subcommand: the credential-helper protocol
110
+ endpoint that `dharta login` wires into git config.
111
+
112
+ ## Configuration
113
+
114
+ `dharta login` writes `~/.dharta/config.toml` with mode `0600`:
115
+
116
+ ```toml
117
+ default_profile = "default"
118
+
119
+ [profiles.default]
120
+ api_key = "dh_live_…"
121
+ base_url = "https://dharta.ai"
122
+ git_base_url = "https://git.dharta.ai"
123
+ ```
124
+
125
+ - `--profile <name>` selects a non-default profile.
126
+ - `--base-url` / `--git-base-url` (on `login`) override the production hosts
127
+ for staging / self-hosted deployments.
128
+ - `DHARTA_API_KEY` overrides the stored credential everywhere (the CI path;
129
+ `DHARTA_BASE_URL` pairs with it).
130
+
131
+ ## Runtime (`dharta dev`)
132
+
133
+ The harness adapters live in the Python `dharta-runtime` package,
134
+ single-sourced with production. On first `dharta dev`, the CLI resolves the
135
+ pinned version through uv (`uvx --from dharta-runtime==<pin>`); the pin ships
136
+ inside each CLI release. `DHARTA_RUNTIME` is the escape hatch - point it at a
137
+ checkout (runs `uv run --project`) or an executable. `dharta doctor` diagnoses
138
+ the bootstrap.
139
+
140
+ ## Auth and scopes
141
+
142
+ Every authenticated command sends `Authorization: Bearer dh_live_…`. The
143
+ server validates the bearer by prefix lookup + constant-time bcrypt comparison
144
+ (see `Api::BaseController` in the Rails app).
145
+
146
+ Required scopes:
147
+ - `dharta login` - grants routine operation scopes
148
+ for non-admin CLI workflows: analytics/usage, agent settings, releases,
149
+ schedules, webhooks, embed keys, appearance, directories, caps,
150
+ Dharta identity/ACLs, model connector/member listing, env list/set/unset, deploy, status, logs,
151
+ and open. Member listing still requires the key to have been created by a
152
+ current owner or admin.
153
+ - separately scoped keys - sensitive or tenant-admin commands such as
154
+ `audit-log`, `members invite|set-role|remove`, `model-keys create|revoke`,
155
+ `keys create|rename|revoke`, `agent workspace-inspectable`,
156
+ `agent workspace-access set`, `agent delete`, and `env pull --include-secrets`.
157
+ - `setup` is local-only and needs no auth.
158
+
159
+ ## Tests
160
+
161
+ ```sh
162
+ npm test # vitest + msw, covers each command's happy path
163
+ ```
164
+
165
+ The Rails-side controllers are tested under
166
+ `apps/dharta-web/test/controllers/api/` (e.g. `publishes_controller_test.rb`,
167
+ `rollbacks_controller_test.rb`).
@@ -0,0 +1,17 @@
1
+ import { type AgentFolder } from "./setup-scan.js";
2
+ export interface AgentInferOptions {
3
+ agent?: string;
4
+ project?: string;
5
+ path?: string;
6
+ dir?: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ scan?: (root: string, opts: {
9
+ isGitRepo: boolean;
10
+ }) => Promise<AgentFolder[]>;
11
+ }
12
+ export declare function inferAgentSlug(opts?: AgentInferOptions): Promise<string>;
13
+ export declare function validateAgentSelectorOptions(opts?: Pick<AgentInferOptions, "agent" | "project" | "dir">): void;
14
+ export declare function slugFromRemote(url: string): string | null;
15
+ export declare function deriveSlug(name: string): string;
16
+ export declare function validateAgentSlug(value: string, label: string): string;
17
+ export declare function validateAgentName(value: string, label?: string): string;
package/dist/agent.js ADDED
@@ -0,0 +1,134 @@
1
+ // Agent identity inference, shared by every per-agent command (RFC 0024 + the
2
+ // CLI surface spec). The agent a command targets comes from its dharta.toml -
3
+ // NOT the `dharta` git remote, which now points at the SOURCE REPO (one repo,
4
+ // many agents), so remote-slug inference would resolve the wrong thing.
5
+ import * as path from "node:path";
6
+ import { existsSync, statSync } from "node:fs";
7
+ import { findGitRoot, scanAgentFolders, describeFolder } from "./setup-scan.js";
8
+ import { normalizeNonBlank } from "./validators.js";
9
+ const AGENT_SLUG_FORMAT = /^[a-z0-9][a-z0-9-]{0,62}$/;
10
+ const MAX_AGENT_NAME_CHARACTERS = 100;
11
+ // Resolve the agent slug a per-agent command operates on. Order (explicit
12
+ // beats inferred): --agent/-p, an explicit [path], the nearest containing
13
+ // agent folder, the repo's sole agent, then DHARTA_PROJECT (CI). A multi-agent
14
+ // repo root with no selector is a loud error rather than a wrong guess.
15
+ // Identity for a scanned agent folder: an explicit dharta.toml `slug` wins
16
+ // (pinned identity, free-form display name); otherwise derive from the name.
17
+ function slugForFolder(folder) {
18
+ if (folder.slug)
19
+ return validateAgentSlug(folder.slug, "dharta.toml slug");
20
+ return deriveSlug(folder.name);
21
+ }
22
+ export async function inferAgentSlug(opts = {}) {
23
+ validateAgentSelectorOptions(opts);
24
+ if (opts.agent !== undefined)
25
+ return normalizeAgentSlug(opts.agent, "--agent");
26
+ if (opts.project !== undefined)
27
+ return normalizeAgentSlug(opts.project, "--project");
28
+ const cwd = path.resolve(opts.dir ?? process.cwd());
29
+ if (opts.path) {
30
+ const dir = path.resolve(cwd, opts.path);
31
+ const folder = await describeFolder(dir, path.basename(dir));
32
+ if (folder.name)
33
+ return slugForFolder(folder);
34
+ throw new Error(`No agent at ${opts.path} - it has no dharta.toml with a name.`);
35
+ }
36
+ const gitRoot = findGitRoot(cwd);
37
+ let localDir = cwd;
38
+ for (;;) {
39
+ if (existsSync(path.join(localDir, "dharta.toml"))) {
40
+ const local = await describeFolder(localDir, path.basename(localDir));
41
+ if (local.name)
42
+ return slugForFolder(local);
43
+ throw new Error(`${path.join(localDir, "dharta.toml")} must declare an agent name.`);
44
+ }
45
+ if (gitRoot && localDir === path.resolve(gitRoot))
46
+ break;
47
+ const parent = path.dirname(localDir);
48
+ if (parent === localDir)
49
+ break;
50
+ localDir = parent;
51
+ }
52
+ const scan = opts.scan ?? scanAgentFolders;
53
+ const agents = (await scan(gitRoot ?? cwd, { isGitRepo: !!gitRoot })).filter((f) => f.name);
54
+ const containing = agents
55
+ .filter((folder) => cwd === path.resolve(folder.dir) || cwd.startsWith(`${path.resolve(folder.dir)}${path.sep}`))
56
+ .sort((a, b) => path.resolve(b.dir).length - path.resolve(a.dir).length);
57
+ if (containing.length > 0)
58
+ return slugForFolder(containing[0]);
59
+ if (agents.length === 1)
60
+ return slugForFolder(agents[0]);
61
+ // The sole local agent wins over the env (local context beats CI); the env
62
+ // is the fallback when the local context is empty or ambiguous (a monorepo
63
+ // CI job names its target with DHARTA_PROJECT).
64
+ const envAgent = (opts.env ?? process.env).DHARTA_PROJECT;
65
+ if (envAgent !== undefined)
66
+ return normalizeAgentSlug(envAgent, "DHARTA_PROJECT");
67
+ if (agents.length === 0) {
68
+ throw new Error("No agent here. Run inside an agent folder (one with a dharta.toml), or pass --agent <slug>.");
69
+ }
70
+ const list = agents.map((f) => f.rel).join(", ");
71
+ throw new Error(`Multiple agents here (${list}). Pass --agent <slug> or a [path] to pick one.`);
72
+ }
73
+ export function validateAgentSelectorOptions(opts = {}) {
74
+ if (opts.agent !== undefined)
75
+ validateAgentSlug(opts.agent, "--agent");
76
+ if (opts.project !== undefined)
77
+ validateAgentSlug(opts.project, "--project");
78
+ if (opts.dir === undefined)
79
+ return;
80
+ const dir = path.resolve(normalizeNonBlank(opts.dir, "--dir"));
81
+ try {
82
+ if (!statSync(dir).isDirectory()) {
83
+ throw new Error(`Cannot use --dir ${dir}: expected a directory.`);
84
+ }
85
+ }
86
+ catch (error) {
87
+ if (error.code === "ENOENT") {
88
+ throw new Error(`Cannot use --dir ${dir}: directory does not exist.`);
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ // https://git.dharta.ai/{org}/{slug}.git -> slug. Still used by `deploy` to read
94
+ // the wired `dharta` remote (a source-repo slug there, which is what deploy wants).
95
+ export function slugFromRemote(url) {
96
+ const match = url.match(/\/([^/]+)\/([^/]+?)(\.git)?$/);
97
+ return match ? match[2] : null;
98
+ }
99
+ // Port of the server's Agent.derive_slug: lowercase, underscores/spaces
100
+ // -> hyphens, drop disallowed chars, truncate to 63, strip edge hyphens, fall
101
+ // back to "agent". Shared by setup (default name), the agent resolver above,
102
+ // and the live preview JS.
103
+ export function deriveSlug(name) {
104
+ let base = name.toLowerCase().replace(/[_\s]+/g, "-").replace(/[^a-z0-9-]/g, "");
105
+ base = base.slice(0, 63).replace(/^-+|-+$/g, "");
106
+ return base || "agent";
107
+ }
108
+ export function validateAgentSlug(value, label) {
109
+ const normalized = normalizeNonBlank(value, label);
110
+ if (!AGENT_SLUG_FORMAT.test(normalized)) {
111
+ const suggestion = slugSuggestion(normalized);
112
+ throw new Error(`${label} must be a valid agent slug: lowercase letters, digits, hyphens; max 63.` +
113
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
114
+ }
115
+ return normalized;
116
+ }
117
+ // Mirrors Agent's public display-name contract. Count Unicode code points,
118
+ // rather than UTF-16 code units, so client-side validation agrees with Ruby's
119
+ // String#length for non-ASCII names.
120
+ export function validateAgentName(value, label = "agent name") {
121
+ const normalized = normalizeNonBlank(value, label);
122
+ if ([...normalized].length > MAX_AGENT_NAME_CHARACTERS) {
123
+ throw new Error(`${label} must be 1-${MAX_AGENT_NAME_CHARACTERS} characters.`);
124
+ }
125
+ return normalized;
126
+ }
127
+ const normalizeAgentSlug = validateAgentSlug;
128
+ function slugSuggestion(value) {
129
+ if (!/^[A-Za-z0-9 _-]+$/.test(value))
130
+ return null;
131
+ const suggestion = deriveSlug(value);
132
+ return suggestion !== value && AGENT_SLUG_FORMAT.test(suggestion) ? suggestion : null;
133
+ }
134
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function cliFormatError(status: number, parsed: unknown): Error;
2
+ export declare function cliFormatNetworkError(url: string, error: unknown): Error;
3
+ export declare function cliFormatRawError(res: Response): Promise<Error>;
@@ -0,0 +1,80 @@
1
+ // Error formatting for the CLI's control-plane calls. Passed to the SDK
2
+ // HttpClient as `formatError` so CLI errors keep their human message + the
3
+ // `err.status`/`err.body` shape (instead of the SDK's typed errorFor()
4
+ // hierarchy, which the CLI doesn't surface).
5
+ import { SENSITIVE_API_KEY_SCOPES } from "./commands/scopes.js";
6
+ export function cliFormatError(status, parsed) {
7
+ // Server messages already name fixes (e.g. the transcript-access 403 points
8
+ // at the settings page) - keep them verbatim. Rails sends `message`; the
9
+ // agent host (FastAPI) sends `detail`; some raw upload endpoints send
10
+ // `error`.
11
+ const body = parsed && typeof parsed === "object" ? parsed : {};
12
+ const serverMessage = typeof body.message === "string"
13
+ ? body.message
14
+ : typeof body.detail === "string"
15
+ ? body.detail
16
+ : typeof body.error === "string" && !looksLikeMachineCode(body.error)
17
+ ? body.error
18
+ : null;
19
+ let message = serverMessage ?? `Dharta API error ${status}`;
20
+ if (status === 401) {
21
+ message += `${message.endsWith(".") ? "" : "."} Run \`dharta login\` to re-authenticate (or check DHARTA_API_KEY).`;
22
+ }
23
+ else if (status === 403 && /scope/i.test(message)) {
24
+ message += `${message.endsWith(".") ? "" : "."} Run \`dharta auth status\` to inspect the active key, or \`dharta open api-keys\` to manage key scopes.`;
25
+ const sensitiveScopes = missingSensitiveScopes(message);
26
+ if (sensitiveScopes.length > 0) {
27
+ message += ` Sensitive scopes (${sensitiveScopes.join(", ")}) require a bounded key with --expires-at within 90 days.`;
28
+ }
29
+ }
30
+ else if (status === 404 && (!serverMessage || isGenericNotFound(serverMessage))) {
31
+ message +=
32
+ `${message.endsWith(".") ? "" : "."} ` +
33
+ "Check the id or agent slug; for agent commands, run `dharta agent list`. " +
34
+ "Run `dharta auth status` to confirm the active host; DHARTA_BASE_URL must point at the Dharta control API.";
35
+ }
36
+ const err = new Error(message);
37
+ err.status = status;
38
+ err.body = parsed;
39
+ return err;
40
+ }
41
+ export function cliFormatNetworkError(url, error) {
42
+ const origin = new URL(url).origin;
43
+ return new Error(`Could not reach Dharta at ${origin} (${formatCause(error)}). ` +
44
+ "Check your network and DHARTA_BASE_URL, then try again.");
45
+ }
46
+ export async function cliFormatRawError(res) {
47
+ const text = await res.text();
48
+ let parsed = null;
49
+ if (text.length > 0) {
50
+ try {
51
+ parsed = JSON.parse(text);
52
+ }
53
+ catch {
54
+ parsed = text;
55
+ }
56
+ }
57
+ return cliFormatError(res.status, parsed);
58
+ }
59
+ function missingSensitiveScopes(message) {
60
+ const mentioned = new Set(mentionedScopes(message));
61
+ if (/one of required scopes/i.test(message) && Array.from(mentioned).some((scope) => !SENSITIVE_API_KEY_SCOPES.has(scope))) {
62
+ return [];
63
+ }
64
+ return Array.from(SENSITIVE_API_KEY_SCOPES).filter((scope) => mentioned.has(scope));
65
+ }
66
+ function mentionedScopes(message) {
67
+ const required = message.match(/required scopes?:\s*([a-z0-9_:,\s-]+)/i)?.[1];
68
+ const source = required ?? message;
69
+ return source.match(/[a-z][a-z0-9_]*(?::[a-z][a-z0-9_]*)?/g) ?? [];
70
+ }
71
+ function formatCause(error) {
72
+ return error instanceof Error && error.message ? error.message : String(error);
73
+ }
74
+ function looksLikeMachineCode(value) {
75
+ return /^[a-z][a-z0-9_:-]*$/.test(value);
76
+ }
77
+ function isGenericNotFound(value) {
78
+ return /^resource not found\.?$/i.test(value.trim()) || /^not found\.?$/i.test(value.trim());
79
+ }
80
+ //# sourceMappingURL=api-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.js","sourceRoot":"","sources":["../src/api-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function openBrowser(url: string): Promise<boolean>;
@@ -0,0 +1,19 @@
1
+ import { spawn } from "node:child_process";
2
+ // Best-effort browser launch; callers always print the URL too, so a
3
+ // headless box still works.
4
+ export function openBrowser(url) {
5
+ const cmd = process.platform === "darwin"
6
+ ? "open"
7
+ : process.platform === "win32"
8
+ ? "explorer"
9
+ : "xdg-open";
10
+ return new Promise((resolve) => {
11
+ const proc = spawn(cmd, [url], { stdio: "ignore", detached: true });
12
+ proc.on("error", () => resolve(false));
13
+ proc.on("spawn", () => {
14
+ proc.unref();
15
+ resolve(true);
16
+ });
17
+ });
18
+ }
19
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,qEAAqE;AACrE,4BAA4B;AAC5B,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,UAAU,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ export declare function buildProgram(): Command;
4
+ export declare function main(argv: string[]): Promise<void>;
5
+ export declare function readStdin(): Promise<string>;