@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.
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/agent.d.ts +17 -0
- package/dist/agent.js +134 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-error.d.ts +3 -0
- package/dist/api-error.js +80 -0
- package/dist/api-error.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +19 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +1978 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agents.d.ts +131 -0
- package/dist/commands/agents.js +439 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/analytics.d.ts +25 -0
- package/dist/commands/analytics.js +166 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/api.d.ts +19 -0
- package/dist/commands/api.js +278 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/appearance.d.ts +19 -0
- package/dist/commands/appearance.js +63 -0
- package/dist/commands/appearance.js.map +1 -0
- package/dist/commands/artifact.d.ts +33 -0
- package/dist/commands/artifact.js +235 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/audit-log.d.ts +32 -0
- package/dist/commands/audit-log.js +102 -0
- package/dist/commands/audit-log.js.map +1 -0
- package/dist/commands/auth.d.ts +47 -0
- package/dist/commands/auth.js +117 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/caps.d.ts +82 -0
- package/dist/commands/caps.js +213 -0
- package/dist/commands/caps.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.js +76 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +45 -0
- package/dist/commands/deploy.js +892 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +33 -0
- package/dist/commands/dev.js +655 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/directories.d.ts +60 -0
- package/dist/commands/directories.js +83 -0
- package/dist/commands/directories.js.map +1 -0
- package/dist/commands/doctor.d.ts +13 -0
- package/dist/commands/doctor.js +123 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/embed-keys.d.ts +61 -0
- package/dist/commands/embed-keys.js +165 -0
- package/dist/commands/embed-keys.js.map +1 -0
- package/dist/commands/env.d.ts +59 -0
- package/dist/commands/env.js +300 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/files.d.ts +14 -0
- package/dist/commands/files.js +84 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/git-credential.d.ts +1 -0
- package/dist/commands/git-credential.js +70 -0
- package/dist/commands/git-credential.js.map +1 -0
- package/dist/commands/kartas.d.ts +101 -0
- package/dist/commands/kartas.js +289 -0
- package/dist/commands/kartas.js.map +1 -0
- package/dist/commands/keys.d.ts +33 -0
- package/dist/commands/keys.js +141 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/login.d.ts +22 -0
- package/dist/commands/login.js +78 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +14 -0
- package/dist/commands/logs.js +89 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/members.d.ts +32 -0
- package/dist/commands/members.js +77 -0
- package/dist/commands/members.js.map +1 -0
- package/dist/commands/model-keys.d.ts +22 -0
- package/dist/commands/model-keys.js +222 -0
- package/dist/commands/model-keys.js.map +1 -0
- package/dist/commands/open.d.ts +29 -0
- package/dist/commands/open.js +119 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/parity.d.ts +15 -0
- package/dist/commands/parity.js +73 -0
- package/dist/commands/parity.js.map +1 -0
- package/dist/commands/rollback.d.ts +21 -0
- package/dist/commands/rollback.js +26 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/schedules.d.ts +52 -0
- package/dist/commands/schedules.js +231 -0
- package/dist/commands/schedules.js.map +1 -0
- package/dist/commands/scopes.d.ts +3 -0
- package/dist/commands/scopes.js +21 -0
- package/dist/commands/scopes.js.map +1 -0
- package/dist/commands/sessions.d.ts +53 -0
- package/dist/commands/sessions.js +142 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/setup.d.ts +28 -0
- package/dist/commands/setup.js +949 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +19 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.js +120 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.d.ts +3 -0
- package/dist/commands/usage.js +37 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/webhooks.d.ts +47 -0
- package/dist/commands/webhooks.js +156 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/commands/whoami.d.ts +7 -0
- package/dist/commands/whoami.js +17 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/completions.d.ts +13 -0
- package/dist/completions.js +120 -0
- package/dist/completions.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +14 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/device-flow.d.ts +9 -0
- package/dist/device-flow.js +127 -0
- package/dist/device-flow.js.map +1 -0
- package/dist/harness-preflight.d.ts +24 -0
- package/dist/harness-preflight.js +252 -0
- package/dist/harness-preflight.js.map +1 -0
- package/dist/harnesses.d.ts +11 -0
- package/dist/harnesses.js +112 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/login-offer.d.ts +9 -0
- package/dist/login-offer.js +36 -0
- package/dist/login-offer.js.map +1 -0
- package/dist/manifest.d.ts +15 -0
- package/dist/manifest.js +142 -0
- package/dist/manifest.js.map +1 -0
- package/dist/money.d.ts +1 -0
- package/dist/money.js +16 -0
- package/dist/money.js.map +1 -0
- package/dist/output.d.ts +2 -0
- package/dist/output.js +20 -0
- package/dist/output.js.map +1 -0
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.js +95 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scaffold.d.ts +16 -0
- package/dist/scaffold.js +74 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/setup-scan.d.ts +21 -0
- package/dist/setup-scan.js +127 -0
- package/dist/setup-scan.js.map +1 -0
- package/dist/templates.d.ts +14 -0
- package/dist/templates.js +65 -0
- package/dist/templates.js.map +1 -0
- package/dist/validators.d.ts +10 -0
- package/dist/validators.js +116 -0
- package/dist/validators.js.map +1 -0
- package/dist/version-check.d.ts +25 -0
- package/dist/version-check.js +68 -0
- package/dist/version-check.js.map +1 -0
- package/node_modules/@dharta/sdk/LICENSE +21 -0
- package/node_modules/@dharta/sdk/README.md +87 -0
- package/node_modules/@dharta/sdk/dist/errors.d.ts +20 -0
- package/node_modules/@dharta/sdk/dist/errors.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/errors.js +51 -0
- package/node_modules/@dharta/sdk/dist/errors.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/http.d.ts +26 -0
- package/node_modules/@dharta/sdk/dist/http.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/http.js +136 -0
- package/node_modules/@dharta/sdk/dist/http.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/index.d.ts +15 -0
- package/node_modules/@dharta/sdk/dist/index.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/index.js +21 -0
- package/node_modules/@dharta/sdk/dist/index.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/resources.d.ts +48 -0
- package/node_modules/@dharta/sdk/dist/resources.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/resources.js +150 -0
- package/node_modules/@dharta/sdk/dist/resources.js.map +1 -0
- package/node_modules/@dharta/sdk/dist/types.d.ts +94 -0
- package/node_modules/@dharta/sdk/dist/types.d.ts.map +1 -0
- package/node_modules/@dharta/sdk/dist/types.js +59 -0
- package/node_modules/@dharta/sdk/dist/types.js.map +1 -0
- package/node_modules/@dharta/sdk/package.json +32 -0
- package/node_modules/@dharta/sdk/src/errors.ts +58 -0
- package/node_modules/@dharta/sdk/src/http.ts +166 -0
- package/node_modules/@dharta/sdk/src/index.ts +36 -0
- package/node_modules/@dharta/sdk/src/resources.ts +197 -0
- package/node_modules/@dharta/sdk/src/types.ts +179 -0
- package/package.json +38 -0
- package/src/agent.ts +147 -0
- package/src/api-error.ts +88 -0
- package/src/browser.ts +20 -0
- package/src/cli.ts +2339 -0
- package/src/commands/agents.ts +635 -0
- package/src/commands/analytics.ts +181 -0
- package/src/commands/api.ts +297 -0
- package/src/commands/appearance.ts +79 -0
- package/src/commands/artifact.ts +331 -0
- package/src/commands/audit-log.ts +125 -0
- package/src/commands/auth.ts +186 -0
- package/src/commands/caps.ts +302 -0
- package/src/commands/create.ts +114 -0
- package/src/commands/deploy.ts +1122 -0
- package/src/commands/dev.ts +792 -0
- package/src/commands/directories.ts +136 -0
- package/src/commands/doctor.ts +138 -0
- package/src/commands/embed-keys.ts +237 -0
- package/src/commands/env.ts +369 -0
- package/src/commands/files.ts +124 -0
- package/src/commands/git-credential.ts +78 -0
- package/src/commands/kartas.ts +439 -0
- package/src/commands/keys.ts +206 -0
- package/src/commands/login.ts +115 -0
- package/src/commands/logs.ts +111 -0
- package/src/commands/members.ts +109 -0
- package/src/commands/model-keys.ts +278 -0
- package/src/commands/open.ts +173 -0
- package/src/commands/parity.ts +96 -0
- package/src/commands/rollback.ts +45 -0
- package/src/commands/schedules.ts +290 -0
- package/src/commands/scopes.ts +22 -0
- package/src/commands/sessions.ts +225 -0
- package/src/commands/setup.ts +1176 -0
- package/src/commands/status.ts +94 -0
- package/src/commands/update.ts +157 -0
- package/src/commands/usage.ts +41 -0
- package/src/commands/webhooks.ts +200 -0
- package/src/commands/whoami.ts +24 -0
- package/src/completions.ts +168 -0
- package/src/config.ts +143 -0
- package/src/context.ts +59 -0
- package/src/device-flow.ts +174 -0
- package/src/harness-preflight.ts +293 -0
- package/src/harnesses.ts +117 -0
- package/src/index.ts +3 -0
- package/src/login-offer.ts +49 -0
- package/src/manifest.ts +153 -0
- package/src/money.ts +15 -0
- package/src/output.ts +22 -0
- package/src/runtime.ts +127 -0
- package/src/scaffold.ts +102 -0
- package/src/setup-scan.ts +154 -0
- package/src/templates.ts +85 -0
- package/src/validators.ts +124 -0
- package/src/version-check.ts +75 -0
- package/templates/blank/CLAUDE.md +21 -0
- package/templates/blank/dharta.toml +11 -0
- package/templates/faq-agent/CLAUDE.md +51 -0
- package/templates/faq-agent/dharta.toml +11 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { parseDollarAmountToCents } from "../money.js";
|
|
3
|
+
export async function capsBudgetData(ctx) {
|
|
4
|
+
return ctx.http.request({ path: "/api/limits/budget" });
|
|
5
|
+
}
|
|
6
|
+
export async function capsBudget(ctx) {
|
|
7
|
+
const { budget, usage } = await capsBudgetData(ctx);
|
|
8
|
+
const hasBudget = budget.max_cost_cents !== null;
|
|
9
|
+
return [
|
|
10
|
+
`Monthly budget: ${formatMoney(budget.max_cost_cents)}`,
|
|
11
|
+
`Usage this period: ${formatMoney(usage.period_cost_cents)}`,
|
|
12
|
+
`Hard stop: ${hasBudget ? (budget.stop_usage ? "enabled" : "disabled") : "not active (no monthly budget)"}`,
|
|
13
|
+
`Alerts: ${hasBudget ? (budget.alerts_enabled ? `enabled at ${budget.alert_threshold_pct}%` : "disabled") : "not active (no monthly budget)"}`,
|
|
14
|
+
].join("\n");
|
|
15
|
+
}
|
|
16
|
+
export async function capsBudgetSetData(ctx, opts) {
|
|
17
|
+
validateBudgetSetOptions(opts);
|
|
18
|
+
const body = {
|
|
19
|
+
max_cost_cents: dollarsToCents(opts.amount),
|
|
20
|
+
};
|
|
21
|
+
const stopUsage = stopUsageOption(opts);
|
|
22
|
+
if (stopUsage !== undefined)
|
|
23
|
+
body.stop_usage = stopUsage;
|
|
24
|
+
const alertsEnabled = alertsOption(opts);
|
|
25
|
+
if (alertsEnabled !== undefined)
|
|
26
|
+
body.alerts_enabled = alertsEnabled;
|
|
27
|
+
if (opts.alertThreshold !== undefined) {
|
|
28
|
+
body.alert_threshold_pct = parseWholeNumberInRange(opts.alertThreshold, "--alert-threshold", 0, 100);
|
|
29
|
+
}
|
|
30
|
+
if (opts.recipientUserId?.length) {
|
|
31
|
+
body.additional_recipient_user_ids = opts.recipientUserId.map((id) => parsePositiveWholeNumber(id, "--recipient-user-id"));
|
|
32
|
+
}
|
|
33
|
+
return ctx.http.request({
|
|
34
|
+
method: "PATCH",
|
|
35
|
+
path: "/api/limits/budget",
|
|
36
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
37
|
+
body,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export async function capsBudgetSet(ctx, opts) {
|
|
41
|
+
const { budget } = await capsBudgetSetData(ctx, opts);
|
|
42
|
+
return `Monthly budget set to ${formatMoney(budget.max_cost_cents)}${budget.stop_usage ? " (usage stops at the limit)" : ""}.`;
|
|
43
|
+
}
|
|
44
|
+
export async function capsInstanceData(ctx, instance) {
|
|
45
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
46
|
+
return ctx.http.request({ path: `/api/limits/instances/${encodeURIComponent(normalizedInstance)}/cap` });
|
|
47
|
+
}
|
|
48
|
+
export async function capsInstance(ctx, instance) {
|
|
49
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
50
|
+
return formatEntityCap(await capsInstanceData(ctx, normalizedInstance), `Instance ${normalizedInstance}`);
|
|
51
|
+
}
|
|
52
|
+
export async function capsInstanceSetData(ctx, instance, opts) {
|
|
53
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
54
|
+
validateCapSetOptions(opts);
|
|
55
|
+
return ctx.http.request({
|
|
56
|
+
method: "PATCH",
|
|
57
|
+
path: `/api/limits/instances/${encodeURIComponent(normalizedInstance)}/cap`,
|
|
58
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
59
|
+
body: capBody(opts),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export async function capsInstanceSet(ctx, instance, opts) {
|
|
63
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
64
|
+
const result = await capsInstanceSetData(ctx, normalizedInstance, opts);
|
|
65
|
+
return capSetMessage(`Instance ${normalizedInstance}`, result.cap, result.changed);
|
|
66
|
+
}
|
|
67
|
+
export async function capsEndUserData(ctx, endUserId) {
|
|
68
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
69
|
+
return ctx.http.request({ path: `/api/limits/end_users/${encodeURIComponent(normalizedEndUserId)}/cap` });
|
|
70
|
+
}
|
|
71
|
+
export async function capsEndUser(ctx, endUserId) {
|
|
72
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
73
|
+
return formatEntityCap(await capsEndUserData(ctx, normalizedEndUserId), `End-user ${normalizedEndUserId}`);
|
|
74
|
+
}
|
|
75
|
+
export async function capsEndUserSetData(ctx, endUserId, opts) {
|
|
76
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
77
|
+
validateCapSetOptions(opts);
|
|
78
|
+
return ctx.http.request({
|
|
79
|
+
method: "PATCH",
|
|
80
|
+
path: `/api/limits/end_users/${encodeURIComponent(normalizedEndUserId)}/cap`,
|
|
81
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
82
|
+
body: capBody(opts),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export async function capsEndUserSet(ctx, endUserId, opts) {
|
|
86
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
87
|
+
const result = await capsEndUserSetData(ctx, normalizedEndUserId, opts);
|
|
88
|
+
return capSetMessage(`End-user ${normalizedEndUserId}`, result.cap, result.changed);
|
|
89
|
+
}
|
|
90
|
+
export async function capsSeatData(ctx, instance, endUserId) {
|
|
91
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
92
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
93
|
+
return ctx.http.request({
|
|
94
|
+
path: `/api/limits/instances/${encodeURIComponent(normalizedInstance)}/seat_cap?end_user_id=${encodeURIComponent(normalizedEndUserId)}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
export async function capsSeat(ctx, instance, endUserId) {
|
|
98
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
99
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
100
|
+
return formatEntityCap(await capsSeatData(ctx, normalizedInstance, normalizedEndUserId), `Seat ${normalizedEndUserId} on ${normalizedInstance}`);
|
|
101
|
+
}
|
|
102
|
+
export async function capsSeatSetData(ctx, instance, endUserId, opts) {
|
|
103
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
104
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
105
|
+
validateCapSetOptions(opts);
|
|
106
|
+
return ctx.http.request({
|
|
107
|
+
method: "PATCH",
|
|
108
|
+
path: `/api/limits/instances/${encodeURIComponent(normalizedInstance)}/seat_cap`,
|
|
109
|
+
headers: { "Idempotency-Key": randomUUID() },
|
|
110
|
+
body: { ...capBody(opts), end_user_id: normalizedEndUserId },
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export async function capsSeatSet(ctx, instance, endUserId, opts) {
|
|
114
|
+
const normalizedInstance = normalizeRequired(instance, "instance id");
|
|
115
|
+
const normalizedEndUserId = normalizeRequired(endUserId, "end-user id");
|
|
116
|
+
const result = await capsSeatSetData(ctx, normalizedInstance, normalizedEndUserId, opts);
|
|
117
|
+
return capSetMessage(`Seat ${normalizedEndUserId} on ${normalizedInstance}`, result.cap, result.changed);
|
|
118
|
+
}
|
|
119
|
+
function dollarsToCents(value) {
|
|
120
|
+
if (value === undefined) {
|
|
121
|
+
throw new Error("Pass --amount <dollars>. Usage: dharta caps budget set --amount 250");
|
|
122
|
+
}
|
|
123
|
+
return parseDollarAmountToCents(value, "--amount");
|
|
124
|
+
}
|
|
125
|
+
export function validateBudgetSetOptions(opts) {
|
|
126
|
+
dollarsToCents(opts.amount);
|
|
127
|
+
stopUsageOption(opts);
|
|
128
|
+
alertsOption(opts);
|
|
129
|
+
if (opts.alertThreshold !== undefined) {
|
|
130
|
+
parseWholeNumberInRange(opts.alertThreshold, "--alert-threshold", 0, 100);
|
|
131
|
+
}
|
|
132
|
+
for (const id of opts.recipientUserId ?? []) {
|
|
133
|
+
parsePositiveWholeNumber(id, "--recipient-user-id");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function validateCapSetOptions(opts) {
|
|
137
|
+
capBody(opts);
|
|
138
|
+
}
|
|
139
|
+
function capBody(opts) {
|
|
140
|
+
if (opts.clear && opts.amount)
|
|
141
|
+
throw new Error("Use either --amount or --clear, not both.");
|
|
142
|
+
if (opts.clear)
|
|
143
|
+
return { clear: true };
|
|
144
|
+
if (!opts.amount)
|
|
145
|
+
throw new Error("Pass --amount <dollars> or --clear.");
|
|
146
|
+
return { cap_cents: dollarsToCents(opts.amount) };
|
|
147
|
+
}
|
|
148
|
+
function parseWholeNumberInRange(value, flag, min, max) {
|
|
149
|
+
const normalized = value.trim();
|
|
150
|
+
if (!/^\d+$/.test(normalized))
|
|
151
|
+
throw new Error(`${flag} must be a whole number.`);
|
|
152
|
+
const parsed = Number(normalized);
|
|
153
|
+
if (!Number.isSafeInteger(parsed) || parsed < min || parsed > max) {
|
|
154
|
+
throw new Error(`${flag} must be a whole number from ${min} to ${max}.`);
|
|
155
|
+
}
|
|
156
|
+
return parsed;
|
|
157
|
+
}
|
|
158
|
+
function parsePositiveWholeNumber(value, flag) {
|
|
159
|
+
const normalized = value.trim();
|
|
160
|
+
if (!/^\d+$/.test(normalized))
|
|
161
|
+
throw new Error(`${flag} must be a whole number.`);
|
|
162
|
+
const parsed = Number(normalized);
|
|
163
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) {
|
|
164
|
+
throw new Error(`${flag} must be a positive whole number.`);
|
|
165
|
+
}
|
|
166
|
+
return parsed;
|
|
167
|
+
}
|
|
168
|
+
function stopUsageOption(opts) {
|
|
169
|
+
if (opts.hardStop && opts.soft)
|
|
170
|
+
throw new Error("Use either --hard-stop or --soft, not both.");
|
|
171
|
+
if (opts.hardStop)
|
|
172
|
+
return true;
|
|
173
|
+
if (opts.soft)
|
|
174
|
+
return false;
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
function alertsOption(opts) {
|
|
178
|
+
if (opts.enableAlerts && opts.disableAlerts) {
|
|
179
|
+
throw new Error("Use either --enable-alerts or --disable-alerts, not both.");
|
|
180
|
+
}
|
|
181
|
+
if (opts.enableAlerts)
|
|
182
|
+
return true;
|
|
183
|
+
if (opts.disableAlerts)
|
|
184
|
+
return false;
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
function formatMoney(cents) {
|
|
188
|
+
if (cents === null)
|
|
189
|
+
return "unlimited";
|
|
190
|
+
return `$${(cents / 100).toFixed(2)}`;
|
|
191
|
+
}
|
|
192
|
+
function formatMicros(micros) {
|
|
193
|
+
return `$${(micros / 100_000_000).toFixed(4)}`;
|
|
194
|
+
}
|
|
195
|
+
function formatEntityCap(result, label) {
|
|
196
|
+
return [
|
|
197
|
+
`${label}`,
|
|
198
|
+
`Spend this period: ${formatMicros(result.spend_micros)}`,
|
|
199
|
+
`Cap: ${result.cap ? formatMoney(result.cap.cap_cents) : "none"}`,
|
|
200
|
+
].join("\n");
|
|
201
|
+
}
|
|
202
|
+
function capSetMessage(label, cap, changed) {
|
|
203
|
+
const state = cap ? formatMoney(cap.cap_cents) : "cleared";
|
|
204
|
+
return `${label} cap ${state}${changed === false ? " (unchanged)" : ""}.`;
|
|
205
|
+
}
|
|
206
|
+
function normalizeRequired(value, label) {
|
|
207
|
+
const normalized = value.trim();
|
|
208
|
+
if (!normalized) {
|
|
209
|
+
throw new Error(`${label} cannot be blank.`);
|
|
210
|
+
}
|
|
211
|
+
return normalized;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=caps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caps.js","sourceRoot":"","sources":["../../src/commands/caps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AA0EvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAe;IAClD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAiB,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe;IAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,KAAK,IAAI,CAAC;IACjD,OAAO;QACL,mBAAmB,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;QACvD,sBAAsB,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE;QAC5D,cAAc,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gCAAgC,EAAE;QAC3G,WAAW,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gCAAgC,EAAE;KAC/I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAe,EAAE,IAAsB;IAC7E,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAA4B;QACpC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;KAC5C,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IACzD,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,aAAa,KAAK,SAAS;QAAE,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACrE,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC7H,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAiB;QACtC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE;QAC5C,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,IAAsB;IACzE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,yBAAyB,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACjI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAe,EAAE,QAAgB;IACtE,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAsB,EAAE,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;AAChI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAe,EAAE,QAAgB;IAClE,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,OAAO,eAAe,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,YAAY,kBAAkB,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAe,EAAE,QAAgB,EAAE,IAAmB;IAC9F,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAsB;QAC3C,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,kBAAkB,CAAC,MAAM;QAC3E,OAAO,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAe,EAAE,QAAgB,EAAE,IAAmB;IAC1F,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACxE,OAAO,aAAa,CAAC,YAAY,kBAAkB,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAe,EAAE,SAAiB;IACtE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAqB,EAAE,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AAChI,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAe,EAAE,SAAiB;IAClE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,OAAO,eAAe,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,YAAY,mBAAmB,EAAE,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAe,EAAE,SAAiB,EAAE,IAAmB;IAC9F,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAqB;QAC1C,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,mBAAmB,CAAC,MAAM;QAC5E,OAAO,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAe,EAAE,SAAiB,EAAE,IAAmB;IAC1F,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACxE,OAAO,aAAa,CAAC,YAAY,mBAAmB,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAe,EAAE,QAAgB,EAAE,SAAiB;IACrF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAkB;QACvC,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,kBAAkB,CAAC,yBAAyB,kBAAkB,CAAC,mBAAmB,CAAC,EAAE;KACxI,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAe,EAAE,QAAgB,EAAE,SAAiB;IACjF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,OAAO,eAAe,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,EAAE,QAAQ,mBAAmB,OAAO,kBAAkB,EAAE,CAAC,CAAC;AACnJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAe,EAAE,QAAgB,EAAE,SAAiB,EAAE,IAAmB;IAC7G,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAkB;QACvC,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,yBAAyB,kBAAkB,CAAC,kBAAkB,CAAC,WAAW;QAChF,OAAO,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,EAAE;QAC5C,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAe,EAAE,QAAgB,EAAE,SAAiB,EAAE,IAAmB;IACzG,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACzF,OAAO,aAAa,CAAC,QAAQ,mBAAmB,OAAO,kBAAkB,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAsB;IAC7D,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,YAAY,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,uBAAuB,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QAC5C,wBAAwB,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAmB;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,OAAO,CAAC,IAAmB;IAClC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC5F,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzE,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW,EAAE,GAAW;IACpF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,gCAAgC,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa,EAAE,IAAY;IAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mCAAmC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAsB;IAC7C,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC/F,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,WAAW,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,eAAe,CAAC,MAAuD,EAAE,KAAa;IAC7F,OAAO;QACL,GAAG,KAAK,EAAE;QACV,sBAAsB,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;QACzD,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,GAAqB,EAAE,OAA4B;IACvF,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,OAAO,GAAG,KAAK,QAAQ,KAAK,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AAC5E,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type HarnessType } from "../harnesses.js";
|
|
2
|
+
export interface CreateOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
template?: string;
|
|
6
|
+
harness?: string;
|
|
7
|
+
harnessVersion?: string;
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
fetchImpl?: typeof fetch;
|
|
10
|
+
log?: (line: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateResult {
|
|
13
|
+
folder: string;
|
|
14
|
+
name: string;
|
|
15
|
+
template: string;
|
|
16
|
+
harness: HarnessType;
|
|
17
|
+
harnessVersion?: string;
|
|
18
|
+
instructionFile: "CLAUDE.md" | "AGENTS.md";
|
|
19
|
+
manifestPath: string;
|
|
20
|
+
files: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function create(pathArg: string | undefined, opts: CreateOptions): Promise<CreateResult>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { renderManifest } from "../manifest.js";
|
|
4
|
+
import { scaffoldTemplate } from "../scaffold.js";
|
|
5
|
+
import { deriveSlug } from "../agent.js";
|
|
6
|
+
import { normalizeNonBlank } from "../validators.js";
|
|
7
|
+
import { DEFAULT_CREATE_HARNESS, hasAgentMarker, parseHarnessType } from "../harnesses.js";
|
|
8
|
+
export async function create(pathArg, opts) {
|
|
9
|
+
const cwd = path.resolve(opts.cwd ?? ".");
|
|
10
|
+
const log = opts.log ?? ((line) => console.error(line));
|
|
11
|
+
const pathInput = pathArg === undefined ? undefined : normalizeNonBlank(pathArg, "path");
|
|
12
|
+
const targetDir = path.resolve(cwd, pathInput ?? ".");
|
|
13
|
+
const rel = path.relative(cwd, targetDir) || ".";
|
|
14
|
+
const name = opts.name === undefined ? deriveSlug(path.basename(targetDir)) : normalizeNonBlank(opts.name, "--name");
|
|
15
|
+
const template = opts.template === undefined ? undefined : normalizeNonBlank(opts.template, "--template");
|
|
16
|
+
const harness = parseHarnessType(opts.harness, "--harness") ?? DEFAULT_CREATE_HARNESS;
|
|
17
|
+
const harnessVersion = opts.harnessVersion === undefined
|
|
18
|
+
? undefined
|
|
19
|
+
: normalizeNonBlank(opts.harnessVersion, "--harness-version");
|
|
20
|
+
// Echo what the user typed (a clean `lifecoach`) in messages rather than the
|
|
21
|
+
// resolved ../../ path when they pass an absolute or distant target.
|
|
22
|
+
const shown = pathInput && pathInput !== "." ? pathInput : null;
|
|
23
|
+
const here = shown ?? "this folder";
|
|
24
|
+
const at = shown ? ` ${shown}` : "";
|
|
25
|
+
await validateTargetDirectory(targetDir, here);
|
|
26
|
+
// One agent per folder: a marker means an agent already lives here - that's
|
|
27
|
+
// setup's job, not create's. Refuse rather than scaffold over it.
|
|
28
|
+
if (hasAgentMarker(targetDir)) {
|
|
29
|
+
throw new Error(`An agent already exists in ${here}. Configure it with \`dharta setup${at}\` instead.`);
|
|
30
|
+
}
|
|
31
|
+
// Scaffold the template (CLAUDE.md / .claude / .gitignore - never dharta.toml,
|
|
32
|
+
// which we own below).
|
|
33
|
+
const scaffold = await scaffoldTemplate(targetDir, {
|
|
34
|
+
template,
|
|
35
|
+
harness,
|
|
36
|
+
baseUrl: opts.baseUrl,
|
|
37
|
+
fetchImpl: opts.fetchImpl,
|
|
38
|
+
log,
|
|
39
|
+
});
|
|
40
|
+
// Write the self-documenting manifest. A brand-new agent is deploy = false
|
|
41
|
+
// (the D6 fail-safe); `dharta setup --enable` flips the gate when you're ready.
|
|
42
|
+
const manifestPath = path.join(targetDir, "dharta.toml");
|
|
43
|
+
await fs.writeFile(manifestPath, renderManifest({ name, deploy: false, harness, harnessVersion }));
|
|
44
|
+
const files = [...scaffold.files, "dharta.toml"];
|
|
45
|
+
log(`Created ${harness} agent '${name}' in ${here} from the '${scaffold.template}' template ` +
|
|
46
|
+
`(${files.join(", ")}).`);
|
|
47
|
+
log(`Next: edit ${scaffold.instructionFile}, chat locally with \`dharta dev${at}\`, then \`dharta setup${at}\` to set the deploy gate + delivery method.`);
|
|
48
|
+
return {
|
|
49
|
+
folder: rel,
|
|
50
|
+
name,
|
|
51
|
+
template: scaffold.template,
|
|
52
|
+
harness,
|
|
53
|
+
harnessVersion,
|
|
54
|
+
instructionFile: scaffold.instructionFile,
|
|
55
|
+
manifestPath,
|
|
56
|
+
files,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function validateTargetDirectory(targetDir, label) {
|
|
60
|
+
try {
|
|
61
|
+
const stat = await fs.stat(targetDir);
|
|
62
|
+
if (!stat.isDirectory()) {
|
|
63
|
+
throw new Error(`Cannot create agent in ${label}: expected a directory, got a file.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
const code = error.code;
|
|
68
|
+
if (code === "ENOENT")
|
|
69
|
+
return;
|
|
70
|
+
if (code === "ENOTDIR") {
|
|
71
|
+
throw new Error(`Cannot create agent in ${label}: a parent path is not a directory.`);
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CliContext } from "../context.js";
|
|
2
|
+
export interface GitResult {
|
|
3
|
+
code: number;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
}
|
|
7
|
+
export type GitRunner = (args: string[], opts?: {
|
|
8
|
+
env?: Record<string, string>;
|
|
9
|
+
stream?: boolean;
|
|
10
|
+
}) => Promise<GitResult>;
|
|
11
|
+
export declare const INLINE_CREDENTIAL_HELPER = "!f() { echo username=karta; echo \"password=$DHARTA_GIT_PASSWORD\"; }; f";
|
|
12
|
+
export interface DeployOptions {
|
|
13
|
+
dir?: string;
|
|
14
|
+
mode?: "git" | "folder";
|
|
15
|
+
reconcileSource?: boolean;
|
|
16
|
+
gitRunner?: GitRunner;
|
|
17
|
+
log?: (line: string) => void;
|
|
18
|
+
fetchImpl?: typeof fetch;
|
|
19
|
+
detectLocalVersion?: (type: string) => Promise<string | null>;
|
|
20
|
+
confirm?: (question: string) => Promise<boolean>;
|
|
21
|
+
requestId?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface DeployFolderResult {
|
|
24
|
+
accepted: true;
|
|
25
|
+
phase?: "publication";
|
|
26
|
+
state?: "pending";
|
|
27
|
+
agent: {
|
|
28
|
+
id: number;
|
|
29
|
+
slug: string;
|
|
30
|
+
name: string;
|
|
31
|
+
};
|
|
32
|
+
release: {
|
|
33
|
+
version: number;
|
|
34
|
+
status: string;
|
|
35
|
+
harness_slug: string | null;
|
|
36
|
+
harness_version: string | null;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export declare function deploy(ctx: CliContext, slug?: string, opts?: DeployOptions): Promise<DeployFolderResult | undefined>;
|
|
40
|
+
export declare function inferMode(dir: string, git?: GitRunner): Promise<"git" | "folder">;
|
|
41
|
+
export declare function rejectOverlappingAgentRoots(agentDir: string, git: GitRunner): Promise<void>;
|
|
42
|
+
export declare function validateDeployDir(dir: string): void;
|
|
43
|
+
export declare function repositoryHintFromRemote(url: string): string | undefined;
|
|
44
|
+
export declare function isAppleMetadata(relPath: string): boolean;
|
|
45
|
+
export declare const defaultGitRunner: GitRunner;
|