@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
@@ -0,0 +1,252 @@
1
+ // RFC 0035 D7: an advisory, client-side pre-flight for a dharta.toml [harness]
2
+ // version declaration. Release acceptance on the control plane is authoritative;
3
+ // this check is stale-able (the catalog is CDN-cached) and bypassable (the API
4
+ // and old CLIs exist), so a green pre-flight is not a guarantee. Its only job is
5
+ // fast LOCAL feedback before a deploy round-trips:
6
+ //
7
+ // - block a version pin the platform can't honour (exit non-zero, like the
8
+ // server would, but instantly and with the supported list), and
9
+ // - surface a local-vs-cloud version gap so the developer deploys knowingly.
10
+ //
11
+ // Resolution rule A (locked): a range like "2" resolves to the LATEST matching
12
+ // supported version for everyone and for CI - deterministic, the same on every
13
+ // machine. The locally-installed build never changes what deploys; it only
14
+ // *guides* an optional parity pin. So this pre-flight warns on a gap and offers
15
+ // the closest version to pin, but the deploy target itself stays deterministic.
16
+ //
17
+ // It must never block a deploy on its own failure: any error reaching the
18
+ // catalog, parsing, or probing the local binary degrades to "proceed" and lets
19
+ // the authoritative server have the final word. The two deliberate aborts are an
20
+ // unsatisfiable pin and a developer answering "no" to the gap prompt.
21
+ import { existsSync } from "node:fs";
22
+ import { readFile } from "node:fs/promises";
23
+ import { join } from "node:path";
24
+ import { spawn } from "node:child_process";
25
+ import * as readline from "node:readline";
26
+ import TOML from "@iarna/toml";
27
+ import { sniffHarnessType } from "./harnesses.js";
28
+ import { whichAll } from "./runtime.js";
29
+ // The binary whose `--version` reports the locally-installed harness build. Only
30
+ // types we can probe are listed; an unlisted type yields a null local version
31
+ // (the pin is still validated against the catalog, just no gap warning).
32
+ const LOCAL_BIN = {
33
+ "claude-code": "claude",
34
+ opencode: "opencode",
35
+ };
36
+ // Read [harness] from dir/dharta.toml. Returns null when there's no manifest, no
37
+ // [harness] table, or the file can't be parsed - all "nothing to check" cases.
38
+ async function readHarnessTable(dir) {
39
+ const path = join(dir, "dharta.toml");
40
+ if (!existsSync(path))
41
+ return null;
42
+ let parsed;
43
+ try {
44
+ parsed = TOML.parse(await readFile(path, "utf8"));
45
+ }
46
+ catch {
47
+ return null; // a malformed manifest fails loudly at the server; not our job
48
+ }
49
+ const table = parsed.harness;
50
+ if (table === null || typeof table !== "object")
51
+ return null;
52
+ const t = table;
53
+ return {
54
+ type: typeof t.type === "string" && t.type.trim() ? t.type.trim() : undefined,
55
+ version: typeof t.version === "string" && t.version.trim() ? t.version.trim() : undefined,
56
+ };
57
+ }
58
+ // Back-compat type sniff, mirroring the data plane's sniff_harness_type: a tree
59
+ // is claude-code only when it carries Claude config and NOT OpenCode config;
60
+ // anything else (incl. a bare folder) is the opencode default. Used only when
61
+ // [harness] declares a version but omits the type.
62
+ export function sniffType(dir) {
63
+ return sniffHarnessType(dir);
64
+ }
65
+ // Compare two dotted numeric versions; positive when a > b. Pads the shorter
66
+ // with zeros and compares segment-by-segment (Gem::Version-style, the server's
67
+ // ordering). Non-numeric segments compare as 0 - claude-code/opencode versions
68
+ // are plain numerics, and a malformed entry shouldn't crash the advisory path.
69
+ export function compareVersions(a, b) {
70
+ const pa = a.split(".");
71
+ const pb = b.split(".");
72
+ const n = Math.max(pa.length, pb.length);
73
+ for (let i = 0; i < n; i++) {
74
+ const da = Number.parseInt(pa[i] ?? "0", 10) || 0;
75
+ const db = Number.parseInt(pb[i] ?? "0", 10) || 0;
76
+ if (da !== db)
77
+ return da - db;
78
+ }
79
+ return 0;
80
+ }
81
+ // True when `version`'s dot segments start with all of `prefix`'s segments
82
+ // ("2" matches 2.x.x; "2.1" matches 2.1.x; an exact string also matches). Mirrors
83
+ // HarnessVersion.version_has_prefix? - a plain string prefix would wrongly match
84
+ // "20.x" for "2"; segment compare won't.
85
+ export function versionHasPrefix(version, prefix) {
86
+ const v = version.split(".");
87
+ const p = prefix.split(".");
88
+ if (p.length === 0 || p.length > v.length)
89
+ return false;
90
+ return p.every((seg, i) => v[i] === seg);
91
+ }
92
+ // Advisory mirror of Harness#resolve_version (rule A): blank -> the default (if
93
+ // supported), exact -> that version, prefix -> the LATEST matching. Returns null
94
+ // when nothing matches, exactly when the server would fail acceptance.
95
+ export function resolvePreview(constraint, supported, defaultVersion) {
96
+ if (!constraint) {
97
+ return defaultVersion && supported.includes(defaultVersion) ? defaultVersion : null;
98
+ }
99
+ if (supported.includes(constraint))
100
+ return constraint;
101
+ const matching = supported.filter((v) => versionHasPrefix(v, constraint));
102
+ if (matching.length === 0)
103
+ return null;
104
+ return matching.slice().sort((a, b) => compareVersions(b, a))[0];
105
+ }
106
+ // The supported version closest to the local build, to offer as a parity pin:
107
+ // the longest shared leading-segment prefix with `local` (stay in the same
108
+ // major.minor line), tie-broken by the latest within that line. Null when
109
+ // there's no local build or no supported versions.
110
+ export function closestForParity(local, supported) {
111
+ if (!local || supported.length === 0)
112
+ return null;
113
+ const lp = local.split(".");
114
+ const shared = (v) => {
115
+ const vp = v.split(".");
116
+ let n = 0;
117
+ while (n < lp.length && n < vp.length && lp[n] === vp[n])
118
+ n++;
119
+ return n;
120
+ };
121
+ const maxShared = Math.max(...supported.map(shared));
122
+ return supported
123
+ .filter((v) => shared(v) === maxShared)
124
+ .sort((a, b) => compareVersions(b, a))[0];
125
+ }
126
+ // Fetch the public harness catalog (GET /harnesses.json). Returns null on any
127
+ // failure - the pre-flight then proceeds and the server decides.
128
+ async function fetchCatalog(baseUrl, fetchImpl) {
129
+ try {
130
+ const res = await fetchImpl(`${baseUrl.replace(/\/$/, "")}/harnesses.json`);
131
+ if (!res.ok)
132
+ return null;
133
+ const body = (await res.json());
134
+ return Array.isArray(body.harnesses) ? body.harnesses : null;
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ // Probe the locally-installed harness build via `<bin> --version`, returning the
141
+ // first dotted-numeric token (e.g. "2.1.190" from "2.1.190 (Claude Code)") or
142
+ // null when the binary isn't on PATH or doesn't answer. Best-effort: any failure
143
+ // is a null, never a throw.
144
+ async function detectLocalVersionDefault(type) {
145
+ const bin = LOCAL_BIN[type];
146
+ if (!bin)
147
+ return null;
148
+ if ((await whichAll(bin)).length === 0)
149
+ return null;
150
+ const out = await runVersion(bin);
151
+ const match = out?.match(/\d+(?:\.\d+)+/);
152
+ return match ? match[0] : null;
153
+ }
154
+ function runVersion(bin) {
155
+ return new Promise((resolve) => {
156
+ let settled = false;
157
+ const done = (v) => {
158
+ if (!settled) {
159
+ settled = true;
160
+ resolve(v);
161
+ }
162
+ };
163
+ try {
164
+ const proc = spawn(bin, ["--version"], { stdio: ["ignore", "pipe", "ignore"] });
165
+ const out = [];
166
+ proc.stdout?.on("data", (c) => out.push(c));
167
+ proc.on("error", () => done(null));
168
+ proc.on("close", () => done(Buffer.concat(out).toString().trim() || null));
169
+ // A hung binary must not hang the deploy.
170
+ const timer = setTimeout(() => {
171
+ proc.kill();
172
+ done(null);
173
+ }, 4000);
174
+ timer.unref?.();
175
+ }
176
+ catch {
177
+ done(null);
178
+ }
179
+ });
180
+ }
181
+ // TTY-aware [Y/n] confirm, default yes. Non-interactive (no TTY, or piped stdin
182
+ // in CI) auto-confirms so a deploy pipeline never hangs waiting on input - the
183
+ // gap was already printed, so it's surfaced either way.
184
+ function confirmTTYDefault(question) {
185
+ if (!process.stdin.isTTY)
186
+ return Promise.resolve(true);
187
+ const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
188
+ return new Promise((resolve) => {
189
+ rl.question(question, (answer) => {
190
+ rl.close();
191
+ const a = answer.trim().toLowerCase();
192
+ resolve(a === "" || a === "y" || a === "yes");
193
+ });
194
+ });
195
+ }
196
+ // Right-pad a label so the values line up in the printed table.
197
+ function row(label, value) {
198
+ return ` ${label.padEnd(24)}${value}`;
199
+ }
200
+ // Run the pre-flight. Resolves normally to let the deploy proceed; throws to
201
+ // abort it (an unsatisfiable pin, or a declined gap prompt). Activates only when
202
+ // [harness] declares a version - an omitted version is always the curated
203
+ // default, so there's nothing to validate and the post-deploy echo shows what
204
+ // was frozen.
205
+ export async function harnessPreflight(deps) {
206
+ const table = await readHarnessTable(deps.dir);
207
+ if (!table?.version)
208
+ return; // no declared constraint -> nothing to check
209
+ const type = table.type ?? sniffType(deps.dir);
210
+ const fetchImpl = deps.fetchImpl ?? fetch;
211
+ const catalog = await fetchCatalog(deps.baseUrl, fetchImpl);
212
+ if (!catalog)
213
+ return; // catalog unreachable -> defer to the authoritative server
214
+ const harness = catalog.find((h) => h.id === type);
215
+ if (!harness)
216
+ return; // unknown to the advisory catalog -> let the server judge
217
+ const supported = harness.versions.filter((v) => v.status === "supported").map((v) => v.version);
218
+ const detect = deps.detectLocalVersion ?? detectLocalVersionDefault;
219
+ const local = await detect(type).catch(() => null);
220
+ const localLabel = local ?? "not detected";
221
+ const resolved = resolvePreview(table.version, supported, harness.default_version);
222
+ if (resolved === null) {
223
+ // The pin matches no supported version. Block - the platform can't run a
224
+ // version it doesn't have - with the supported list so the fix is obvious.
225
+ const supportedLabel = supported.length ? supported.join(", ") : "(none published)";
226
+ throw new Error(`Harness version pre-flight failed.\n` +
227
+ row(`Local ${type}:`, localLabel) + "\n" +
228
+ row("dharta.toml version:", table.version) + "\n" +
229
+ row("Supported on Dharta:", supportedLabel) + "\n\n" +
230
+ ` No Dharta-supported ${type} version matches "${table.version}". ` +
231
+ `Update or clear the version in [harness] in dharta.toml, then re-deploy.`);
232
+ }
233
+ if (local && local !== resolved) {
234
+ // The deploy target is deterministic (rule A: latest matching); the local
235
+ // build just differs. Surface the gap and the closest version to pin for
236
+ // parity, then let the developer decide.
237
+ const closest = closestForParity(local, supported);
238
+ deps.log(`⚠ Your local ${type} build differs from the deploy target.`);
239
+ deps.log(row(`Local ${type}:`, local));
240
+ deps.log(row("dharta.toml version:", `${table.version} (deploys as ${resolved})`));
241
+ if (closest && closest !== resolved) {
242
+ deps.log(row("Closest to your local:", `${closest} (pin it in [harness] for parity)`));
243
+ }
244
+ const confirm = deps.confirm ?? confirmTTYDefault;
245
+ const proceed = await confirm(` Deploy on ${type} ${resolved} anyway? [Y/n] `);
246
+ if (!proceed) {
247
+ throw new Error(`Deploy cancelled - local ${type} ${local} differs from the deploy target ${resolved}. ` +
248
+ `Pin a version in [harness] in dharta.toml, or re-run to accept the difference.`);
249
+ }
250
+ }
251
+ }
252
+ //# sourceMappingURL=harness-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-preflight.js","sourceRoot":"","sources":["../src/harness-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const HARNESS_TYPES: readonly ["claude-code", "opencode", "deepagents", "goose", "codex-cli"];
2
+ export type HarnessType = (typeof HARNESS_TYPES)[number];
3
+ export declare const DEFAULT_CREATE_HARNESS: HarnessType;
4
+ export declare const AGENT_MARKERS: readonly ["dharta.toml", "CLAUDE.md", ".claude", ".opencode", ".deepagents", ".goose", ".codex"];
5
+ export declare function parseHarnessType(value: string | undefined, label?: string): HarnessType | undefined;
6
+ export declare function nativeInstructionFile(harness: HarnessType): "CLAUDE.md" | "AGENTS.md";
7
+ export declare function translateTemplateFilesForHarness(files: Record<string, string>, harness: HarnessType): Record<string, string>;
8
+ export declare function hasAgentMarker(dir: string): boolean;
9
+ export declare function markerFolderRel(filePath: string): string | null;
10
+ export declare function sniffHarnessType(dir: string): HarnessType;
11
+ export declare function readDeclaredHarnessType(manifestText: string): HarnessType | undefined;
@@ -0,0 +1,112 @@
1
+ import { existsSync } from "node:fs";
2
+ import * as path from "node:path";
3
+ import TOML from "@iarna/toml";
4
+ import { closestChoice, normalizeNonBlank } from "./validators.js";
5
+ export const HARNESS_TYPES = ["claude-code", "opencode", "deepagents", "goose", "codex-cli"];
6
+ export const DEFAULT_CREATE_HARNESS = "claude-code";
7
+ const HARNESS_MARKERS = {
8
+ "claude-code": [".claude", "CLAUDE.md"],
9
+ opencode: [".opencode/opencode.jsonc", ".opencode/agents"],
10
+ deepagents: [".deepagents", ".deepagents/agents"],
11
+ goose: [".goose", ".goose/agents"],
12
+ "codex-cli": [".codex/config.toml", ".codex/agents"],
13
+ };
14
+ const NATIVE_TEMPLATE_MARKER = {
15
+ opencode: { path: ".opencode/opencode.jsonc", content: "{}\n" },
16
+ deepagents: { path: ".deepagents/dharta.jsonc", content: "{}\n" },
17
+ goose: { path: ".goose/dharta.jsonc", content: "{}\n" },
18
+ "codex-cli": { path: ".codex/config.toml", content: "# Codex project config for this Dharta agent.\n" },
19
+ };
20
+ export const AGENT_MARKERS = [
21
+ "dharta.toml",
22
+ "CLAUDE.md",
23
+ ".claude",
24
+ ".opencode",
25
+ ".deepagents",
26
+ ".goose",
27
+ ".codex",
28
+ ];
29
+ export function parseHarnessType(value, label = "--harness") {
30
+ if (value === undefined)
31
+ return undefined;
32
+ const normalized = normalizeNonBlank(value, label);
33
+ if (HARNESS_TYPES.includes(normalized))
34
+ return normalized;
35
+ const suggestion = closestChoice(normalized, HARNESS_TYPES);
36
+ throw new Error(`${label} must be one of ${HARNESS_TYPES.join(", ")}.` +
37
+ (suggestion ? ` Did you mean ${suggestion}?` : ""));
38
+ }
39
+ export function nativeInstructionFile(harness) {
40
+ return harness === "claude-code" ? "CLAUDE.md" : "AGENTS.md";
41
+ }
42
+ export function translateTemplateFilesForHarness(files, harness) {
43
+ if (harness === "claude-code")
44
+ return { ...files };
45
+ const translated = {};
46
+ for (const [rel, content] of Object.entries(files)) {
47
+ if (rel !== "CLAUDE.md")
48
+ translated[rel] = content;
49
+ }
50
+ if (translated["AGENTS.md"] === undefined && files["CLAUDE.md"] !== undefined) {
51
+ translated["AGENTS.md"] = files["CLAUDE.md"];
52
+ }
53
+ const marker = NATIVE_TEMPLATE_MARKER[harness];
54
+ if (marker && translated[marker.path] === undefined) {
55
+ translated[marker.path] = marker.content;
56
+ }
57
+ return translated;
58
+ }
59
+ export function hasAgentMarker(dir) {
60
+ return AGENT_MARKERS.some((marker) => existsSync(path.join(dir, marker)));
61
+ }
62
+ export function markerFolderRel(filePath) {
63
+ const parts = filePath.split(/[\\/]+/).filter(Boolean);
64
+ if (parts.includes("node_modules"))
65
+ return null;
66
+ const last = parts.at(-1);
67
+ if (last === "dharta.toml" || last === "CLAUDE.md") {
68
+ return parts.slice(0, -1).join(path.sep) || ".";
69
+ }
70
+ for (const marker of [".claude", ".opencode", ".deepagents", ".goose", ".codex"]) {
71
+ const index = parts.indexOf(marker);
72
+ if (index >= 0)
73
+ return parts.slice(0, index).join(path.sep) || ".";
74
+ }
75
+ return null;
76
+ }
77
+ export function sniffHarnessType(dir) {
78
+ if (presentIn(dir, "opencode"))
79
+ return "opencode";
80
+ if (presentIn(dir, "deepagents"))
81
+ return "deepagents";
82
+ if (presentIn(dir, "goose"))
83
+ return "goose";
84
+ if (presentIn(dir, "claude-code"))
85
+ return "claude-code";
86
+ if (presentIn(dir, "codex-cli"))
87
+ return "codex-cli";
88
+ return "opencode";
89
+ }
90
+ export function readDeclaredHarnessType(manifestText) {
91
+ let parsed;
92
+ try {
93
+ parsed = TOML.parse(manifestText);
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ const table = parsed.harness;
99
+ if (table === null || typeof table !== "object")
100
+ return undefined;
101
+ const type = table.type;
102
+ try {
103
+ return typeof type === "string" ? parseHarnessType(type, "[harness] type") : undefined;
104
+ }
105
+ catch {
106
+ return undefined;
107
+ }
108
+ }
109
+ function presentIn(dir, harness) {
110
+ return HARNESS_MARKERS[harness].some((marker) => existsSync(path.join(dir, marker)));
111
+ }
112
+ //# sourceMappingURL=harnesses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { main } from "./cli.js";
2
+ export { buildContext } from "./context.js";
3
+ export type { CliContext, CtxOverrides } from "./context.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { main } from "./cli.js";
2
+ export { buildContext } from "./context.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface OfferLoginOptions {
2
+ force?: boolean;
3
+ ask?: (q: string) => Promise<string>;
4
+ log: (line: string) => void;
5
+ isLoggedIn?: () => Promise<boolean>;
6
+ runLogin?: () => Promise<void>;
7
+ }
8
+ export type OfferLoginOutcome = "logged-in" | "skipped" | "completed";
9
+ export declare function offerLogin(opts: OfferLoginOptions): Promise<OfferLoginOutcome>;
@@ -0,0 +1,36 @@
1
+ // RFC 0024 DEP-9 / D5: `dharta setup` is fully functional logged-out - it
2
+ // writes local config only and reads no logged-in state. If you are not
3
+ // logged in, it offers login ONCE at the end as the bridge to `dharta deploy`
4
+ // (which does need auth). --login forces it; otherwise we only prompt an
5
+ // interactive terminal. It never blocks setup.
6
+ import { activeProfile } from "./config.js";
7
+ import { login } from "./commands/login.js";
8
+ export async function offerLogin(opts) {
9
+ // Non-interactive and not forced: stay silent (don't even read the config).
10
+ if (!opts.force && !opts.ask)
11
+ return "skipped";
12
+ const loggedIn = opts.isLoggedIn ?? defaultIsLoggedIn;
13
+ if (await loggedIn())
14
+ return "logged-in";
15
+ let go = opts.force ?? false;
16
+ if (!go && opts.ask) {
17
+ const a = (await opts.ask("You are not logged into Dharta. Log in now? (optional) [y/N] ")).trim().toLowerCase();
18
+ go = a === "y" || a === "yes";
19
+ }
20
+ if (!go) {
21
+ opts.log("Setup is complete. You're not logged in - run `dharta login`, then `dharta deploy`.");
22
+ return "skipped";
23
+ }
24
+ await (opts.runLogin ?? (() => login({ log: opts.log }).then(() => undefined)))();
25
+ return "completed";
26
+ }
27
+ async function defaultIsLoggedIn() {
28
+ try {
29
+ await activeProfile();
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ //# sourceMappingURL=login-offer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-offer.js","sourceRoot":"","sources":["../src/login-offer.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wEAAwE;AACxE,8EAA8E;AAC9E,yEAAyE;AACzE,+CAA+C;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAa5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,4EAA4E;IAC5E,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC;IACtD,IAAI,MAAM,QAAQ,EAAE;QAAE,OAAO,WAAW,CAAC;IAEzC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAC7B,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClH,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;IAChC,CAAC;IACD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type HarnessType } from "./harnesses.js";
2
+ export type DeployMethod = "git" | "folder";
3
+ export declare function renderManifest(o: {
4
+ name: string;
5
+ deploy: boolean;
6
+ deployMethod?: DeployMethod;
7
+ harness?: HarnessType;
8
+ harnessVersion?: string;
9
+ }): string;
10
+ export declare function patchScalar(src: string, key: string, literal: string): string;
11
+ export declare function patchManifest(src: string, o: {
12
+ name?: string;
13
+ deploy?: boolean;
14
+ deployMethod?: DeployMethod;
15
+ }): string;
@@ -0,0 +1,142 @@
1
+ import TOML from "@iarna/toml";
2
+ import { DEFAULT_CREATE_HARNESS } from "./harnesses.js";
3
+ const DEPLOY_METHOD_PLACEHOLDER = '# deploy_method = "git" # set by `dharta setup`';
4
+ // The scaffolded dharta.toml is self-documenting (RFC 0024 DEP-1/DEP-4):
5
+ // every field is commented with its purpose and its alternatives, which
6
+ // is the whole DX fix. TOML.stringify drops comments, so a fresh manifest
7
+ // is written from this string template, and an edit to an existing one is
8
+ // a surgical top-level-scalar patch that leaves the comments and [tables]
9
+ // intact.
10
+ export function renderManifest(o) {
11
+ const harness = o.harness ?? DEFAULT_CREATE_HARNESS;
12
+ const versionExample = harnessVersionExample(harness);
13
+ const versionLine = o.harnessVersion
14
+ ? `version = ${JSON.stringify(o.harnessVersion)}`
15
+ : `# version = ${JSON.stringify(versionExample)}`;
16
+ return [
17
+ "# --- Identity -------------------------------------------------------------",
18
+ "# Display name (1-100 characters). Dharta derives the deploy slug from this",
19
+ "# name (for example, Support Bot -> support-bot); that slug must be unique",
20
+ "# within your org. Changing the name so its slug changes targets a different agent.",
21
+ "# Each deploy creates a new immutable release; earlier releases remain available.",
22
+ `name = ${JSON.stringify(o.name)}`,
23
+ "",
24
+ "# Deploy gate. Only agents with deploy = true ship on `dharta deploy` /",
25
+ "# `git push dharta`. Absent or false = configured but not deployed.",
26
+ `deploy = ${o.deploy}`,
27
+ "",
28
+ "# How this agent is deployed. `git` pushes the containing repo while",
29
+ "# selecting this folder; `folder` uploads this folder directly.",
30
+ o.deployMethod
31
+ ? `deploy_method = ${JSON.stringify(o.deployMethod)}`
32
+ : DEPLOY_METHOD_PLACEHOLDER,
33
+ "",
34
+ "# --- Build ----------------------------------------------------------------",
35
+ "# OMIT this whole section for a harness-only agent (for example CLAUDE.md,",
36
+ "# AGENTS.md + .opencode/, .deepagents/, .goose/, or .codex/) - Dharta serves it as-is,",
37
+ "# no build step.",
38
+ '# "python" - Python project; Dharta builds it (set entry_point below)',
39
+ '# "node" - Node project; Dharta builds it',
40
+ '# buildpack = "python"',
41
+ "",
42
+ '# Import path "module:attribute" to your app object. Required ONLY when',
43
+ "# buildpack is set; omit for harness-only agents.",
44
+ '# entry_point = "app:app"',
45
+ "",
46
+ "# --- Harness ---------------------------------------------------------------",
47
+ "# The agent runtime this agent runs on. `type` is fixed for the life of the",
48
+ "# agent (switching harness = a new agent). Supported types today:",
49
+ "# claude-code, opencode, deepagents, goose, codex-cli.",
50
+ "# `version` is optional: a range resolves to the latest matching version Dharta",
51
+ "# supports at deploy time; omit it for the curated default; pin an exact",
52
+ "# version only when you need determinism (`dharta deploy` checks it).",
53
+ "[harness]",
54
+ `type = ${JSON.stringify(harness)}`,
55
+ versionLine,
56
+ "",
57
+ "# --- Environment (declare-or-bind) -----------------------------------------",
58
+ "# Names this agent needs. Bind locally in .env, in prod via `dharta env set`.",
59
+ "# A required var with no prod binding fails the build.",
60
+ "[env]",
61
+ '# SUPPORT_DB_URL = { required = false, description = "Support database DSN" }',
62
+ "",
63
+ "# --- Environment setup -----------------------------------------------------",
64
+ "# A Bash setup script run once per cold start, before the agent, to install",
65
+ "# what the base image lacks. Use user-space installs: `pip install` and",
66
+ "# `npm i -g` are auto-configured (pip --user) to persist under ~/.local, so",
67
+ "# no --user flag is needed. apt/system packages are NOT available",
68
+ "# here (they need a custom image - a higher tier). The script is validated at",
69
+ "# deploy (`bash -n`); a syntax error fails the deploy, not your users.",
70
+ "# network: none | trusted | full (default) | custom. Only `full` is enforced",
71
+ "# today (every agent has open egress); the others arrive with a later phase.",
72
+ "# [environment]",
73
+ '# setup = "scripts/setup.sh"',
74
+ '# network = "full"',
75
+ "",
76
+ ].join("\n");
77
+ }
78
+ function harnessVersionExample(harness) {
79
+ switch (harness) {
80
+ case "claude-code":
81
+ return "2";
82
+ case "opencode":
83
+ return "1";
84
+ case "deepagents":
85
+ return "0.1.28";
86
+ case "goose":
87
+ return "1.39.0";
88
+ case "codex-cli":
89
+ return "0.133.0";
90
+ }
91
+ }
92
+ // Flip or insert a top-level scalar WITHOUT disturbing comments or
93
+ // [tables]: replace it in place if present (anchored to a line, so a
94
+ // commented `# name = ...` is never matched), else insert before the
95
+ // first table so it stays a top-level key rather than nesting under a
96
+ // section. `key` is always a literal we control
97
+ // ("name"/"deploy"/"deploy_method").
98
+ export function patchScalar(src, key, literal) {
99
+ const re = new RegExp(`^(\\s*${key}\\s*=).*$`, "m");
100
+ const tbl = src.search(/^\s*\[/m);
101
+ const top = tbl >= 0 ? src.slice(0, tbl) : src;
102
+ const rest = tbl >= 0 ? src.slice(tbl) : "";
103
+ if (re.test(top))
104
+ return top.replace(re, `$1 ${literal}`) + rest;
105
+ const line = `${key} = ${literal}\n`;
106
+ if (tbl >= 0)
107
+ return src.slice(0, tbl) + line + src.slice(tbl);
108
+ return (src.endsWith("\n") ? src : src + "\n") + line;
109
+ }
110
+ function hasTopLevelScalar(src, key) {
111
+ const tbl = src.search(/^\s*\[/m);
112
+ const top = tbl >= 0 ? src.slice(0, tbl) : src;
113
+ return new RegExp(`^\\s*${key}\\s*=`, "m").test(top);
114
+ }
115
+ // Set identity/deploy configuration on an existing manifest, preserving its
116
+ // comments and tables, then round-trip through the parser so a broken edit
117
+ // fails loud instead of writing an invalid manifest.
118
+ export function patchManifest(src, o) {
119
+ let out = src;
120
+ if (o.name !== undefined)
121
+ out = patchScalar(out, "name", JSON.stringify(o.name));
122
+ if (o.deploy !== undefined)
123
+ out = patchScalar(out, "deploy", String(o.deploy));
124
+ if (o.deployMethod !== undefined) {
125
+ const literal = JSON.stringify(o.deployMethod);
126
+ // `dharta create` leaves this decision visibly unset for setup. Activate
127
+ // that generated placeholder in place so the field stays next to its
128
+ // explanation; arbitrary user comments remain untouched.
129
+ if (hasTopLevelScalar(out, "deploy_method")) {
130
+ out = patchScalar(out, "deploy_method", literal);
131
+ }
132
+ else if (out.includes(DEPLOY_METHOD_PLACEHOLDER)) {
133
+ out = out.replace(DEPLOY_METHOD_PLACEHOLDER, `deploy_method = ${literal}`);
134
+ }
135
+ else {
136
+ out = patchScalar(out, "deploy_method", literal);
137
+ }
138
+ }
139
+ TOML.parse(out); // throws on an invalid result
140
+ return out;
141
+ }
142
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function parseDollarAmountToCents(value: string, flag: string): number;