primitive-admin 1.1.0-alpha.4 → 1.1.0-alpha.41
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/README.md +325 -31
- package/assets/skill/skills/primitive-platform/SKILL.md +281 -0
- package/dist/bin/primitive.d.ts +2 -0
- package/dist/bin/primitive.js +268 -16
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.d.ts +2 -0
- package/dist/src/commands/admins.js +123 -18
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.d.ts +2 -0
- package/dist/src/commands/analytics.js +464 -55
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.d.ts +2 -0
- package/dist/src/commands/apps.js +55 -13
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +177 -7
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.d.ts +2 -0
- package/dist/src/commands/blob-buckets.js +422 -0
- package/dist/src/commands/blob-buckets.js.map +1 -0
- package/dist/src/commands/catalog.d.ts +2 -0
- package/dist/src/commands/catalog.js +34 -35
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.d.ts +2 -0
- package/dist/src/commands/collection-type-configs.js +178 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.d.ts +2 -0
- package/dist/src/commands/collections.js +515 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/comparisons.d.ts +2 -0
- package/dist/src/commands/comparisons.js +6 -6
- package/dist/src/commands/comparisons.js.map +1 -1
- package/dist/src/commands/cron-triggers.d.ts +2 -0
- package/dist/src/commands/cron-triggers.js +357 -0
- package/dist/src/commands/cron-triggers.js.map +1 -0
- package/dist/src/commands/database-types.d.ts +2 -0
- package/dist/src/commands/database-types.js +471 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.d.ts +2 -0
- package/dist/src/commands/databases.js +1462 -83
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +2 -0
- package/dist/src/commands/documents.js +518 -11
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.d.ts +2 -0
- package/dist/src/commands/email-templates.js +281 -0
- package/dist/src/commands/email-templates.js.map +1 -0
- package/dist/src/commands/env.d.ts +12 -0
- package/dist/src/commands/env.js +260 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/group-type-configs.d.ts +2 -0
- package/dist/src/commands/group-type-configs.js +181 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.d.ts +2 -0
- package/dist/src/commands/groups.js +48 -45
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.d.ts +159 -0
- package/dist/src/commands/guides.js +449 -35
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/init.d.ts +17 -0
- package/dist/src/commands/init.js +811 -201
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.d.ts +2 -0
- package/dist/src/commands/integrations.js +533 -46
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/llm.d.ts +2 -0
- package/dist/src/commands/llm.js +4 -2
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/metadata.d.ts +2 -0
- package/dist/src/commands/metadata.js +194 -0
- package/dist/src/commands/metadata.js.map +1 -0
- package/dist/src/commands/prompts.d.ts +2 -0
- package/dist/src/commands/prompts.js +50 -52
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +3 -0
- package/dist/src/commands/rule-sets.js +388 -0
- package/dist/src/commands/rule-sets.js.map +1 -0
- package/dist/src/commands/scripts.d.ts +2 -0
- package/dist/src/commands/scripts.js +667 -0
- package/dist/src/commands/scripts.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +2 -0
- package/dist/src/commands/secrets.js +108 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/skill.d.ts +2 -0
- package/dist/src/commands/skill.js +29 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/commands/sync.d.ts +175 -0
- package/dist/src/commands/sync.js +4412 -233
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.d.ts +2 -0
- package/dist/src/commands/tokens.js +122 -19
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.d.ts +2 -0
- package/dist/src/commands/users.js +440 -22
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/waitlist.d.ts +2 -0
- package/dist/src/commands/waitlist.js +10 -10
- package/dist/src/commands/waitlist.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +2 -0
- package/dist/src/commands/webhooks.js +391 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/workflows.d.ts +49 -0
- package/dist/src/commands/workflows.js +1009 -123
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/api-client.d.ts +1283 -0
- package/dist/src/lib/api-client.js +1129 -83
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/auth-flow.d.ts +8 -0
- package/dist/src/lib/block-layout.d.ts +160 -0
- package/dist/src/lib/block-layout.js +451 -0
- package/dist/src/lib/block-layout.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +60 -0
- package/dist/src/lib/cli-manifest.js +70 -0
- package/dist/src/lib/cli-manifest.js.map +1 -0
- package/dist/src/lib/config.d.ts +53 -0
- package/dist/src/lib/config.js +92 -53
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/confirm-prompt.d.ts +83 -0
- package/dist/src/lib/confirm-prompt.js +110 -0
- package/dist/src/lib/confirm-prompt.js.map +1 -0
- package/dist/src/lib/constants.d.ts +2 -0
- package/dist/src/lib/constants.js +3 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/crash-handlers.d.ts +20 -0
- package/dist/src/lib/crash-handlers.js +49 -0
- package/dist/src/lib/crash-handlers.js.map +1 -0
- package/dist/src/lib/credentials-store.d.ts +79 -0
- package/dist/src/lib/credentials-store.js +307 -0
- package/dist/src/lib/credentials-store.js.map +1 -0
- package/dist/src/lib/csv.d.ts +48 -0
- package/dist/src/lib/csv.js +177 -0
- package/dist/src/lib/csv.js.map +1 -0
- package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
- package/dist/src/lib/db-codegen/dbGenerator.d.ts +111 -0
- package/dist/src/lib/db-codegen/dbGenerator.js +371 -0
- package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/db-codegen/dbNaming.d.ts +45 -0
- package/dist/src/lib/db-codegen/dbNaming.js +104 -0
- package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTemplates.d.ts +97 -0
- package/dist/src/lib/db-codegen/dbTemplates.js +159 -0
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTsTypes.d.ts +78 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js +112 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
- package/dist/src/lib/env-resolver.d.ts +62 -0
- package/dist/src/lib/env-resolver.js +121 -0
- package/dist/src/lib/env-resolver.js.map +1 -0
- package/dist/src/lib/fetch.d.ts +5 -0
- package/dist/src/lib/generated-allowlist.d.ts +28 -0
- package/dist/src/lib/generated-allowlist.js +220 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +59 -0
- package/dist/src/lib/init-config.js +113 -0
- package/dist/src/lib/init-config.js.map +1 -0
- package/dist/src/lib/migration-nag.d.ts +49 -0
- package/dist/src/lib/migration-nag.js +163 -0
- package/dist/src/lib/migration-nag.js.map +1 -0
- package/dist/src/lib/output.d.ts +86 -0
- package/dist/src/lib/output.js +150 -8
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/paginate.d.ts +33 -0
- package/dist/src/lib/paginate.js +42 -0
- package/dist/src/lib/paginate.js.map +1 -0
- package/dist/src/lib/project-config.d.ts +97 -0
- package/dist/src/lib/project-config.js +209 -0
- package/dist/src/lib/project-config.js.map +1 -0
- package/dist/src/lib/query-operators.d.ts +43 -0
- package/dist/src/lib/query-operators.js +80 -0
- package/dist/src/lib/query-operators.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
- package/dist/src/lib/refresh-admin-credentials.js +103 -0
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
- package/dist/src/lib/resolve-platform.d.ts +45 -0
- package/dist/src/lib/resolve-platform.js +43 -0
- package/dist/src/lib/resolve-platform.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +23 -0
- package/dist/src/lib/skill-installer.js +135 -0
- package/dist/src/lib/skill-installer.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +99 -0
- package/dist/src/lib/snapshots.js +357 -0
- package/dist/src/lib/snapshots.js.map +1 -0
- package/dist/src/lib/sync-paths.d.ts +72 -0
- package/dist/src/lib/sync-paths.js +130 -0
- package/dist/src/lib/sync-paths.js.map +1 -0
- package/dist/src/lib/template.d.ts +97 -0
- package/dist/src/lib/template.js +336 -62
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/token-inject.d.ts +56 -0
- package/dist/src/lib/token-inject.js +204 -0
- package/dist/src/lib/token-inject.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +152 -0
- package/dist/src/lib/toml-database-config.js +600 -0
- package/dist/src/lib/toml-database-config.js.map +1 -0
- package/dist/src/lib/toml-metadata-config.d.ts +139 -0
- package/dist/src/lib/toml-metadata-config.js +427 -0
- package/dist/src/lib/toml-metadata-config.js.map +1 -0
- package/dist/src/lib/toml-params-validator.d.ts +129 -0
- package/dist/src/lib/toml-params-validator.js +298 -0
- package/dist/src/lib/toml-params-validator.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +10 -0
- package/dist/src/lib/version-check.js +172 -0
- package/dist/src/lib/version-check.js.map +1 -0
- package/dist/src/lib/workflow-apply.d.ts +66 -0
- package/dist/src/lib/workflow-apply.js +117 -0
- package/dist/src/lib/workflow-apply.js.map +1 -0
- package/dist/src/lib/workflow-fragments.d.ts +41 -0
- package/dist/src/lib/workflow-fragments.js +121 -0
- package/dist/src/lib/workflow-fragments.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.d.ts +95 -0
- package/dist/src/lib/workflow-toml-validator.js +323 -0
- package/dist/src/lib/workflow-toml-validator.js.map +1 -0
- package/dist/src/types/index.d.ts +520 -0
- package/dist/src/validators.d.ts +64 -0
- package/dist/src/validators.js +63 -0
- package/dist/src/validators.js.map +1 -0
- package/package.json +18 -4
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { ApiClient, ApiError } from "../lib/api-client.js";
|
|
3
|
+
import { resolveAppId } from "../lib/config.js";
|
|
4
|
+
import { success, error, info, warn, keyValue, result as printResult, formatTable, formatDate, formatStatus, json, divider, } from "../lib/output.js";
|
|
5
|
+
import { confirmPrompt } from "../lib/confirm-prompt.js";
|
|
6
|
+
export function registerEmailTemplatesCommands(program) {
|
|
7
|
+
const emailTemplates = program
|
|
8
|
+
.command("email-templates")
|
|
9
|
+
.description("Manage email template overrides for an app")
|
|
10
|
+
.addHelpText("after", `
|
|
11
|
+
Examples:
|
|
12
|
+
$ primitive email-templates list
|
|
13
|
+
$ primitive email-templates get magic-link
|
|
14
|
+
$ primitive email-templates set magic-link --subject "Sign in" --html-file ./magic-link.html --text-file ./magic-link.txt
|
|
15
|
+
$ primitive email-templates delete magic-link
|
|
16
|
+
$ primitive email-templates test magic-link
|
|
17
|
+
$ primitive email-templates variables magic-link
|
|
18
|
+
|
|
19
|
+
Custom templates:
|
|
20
|
+
$ primitive email-templates set order-confirmation --subject "Order {{orderId}}" --html-file ./order.html --text-file ./order.txt
|
|
21
|
+
$ primitive email-templates get order-confirmation
|
|
22
|
+
$ primitive email-templates delete order-confirmation
|
|
23
|
+
`);
|
|
24
|
+
// List
|
|
25
|
+
emailTemplates
|
|
26
|
+
.command("list")
|
|
27
|
+
.description("List all email types and their override status")
|
|
28
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
29
|
+
.option("--app <app-id>", "App ID")
|
|
30
|
+
.option("--json", "Output as JSON")
|
|
31
|
+
.action(async (appId, options) => {
|
|
32
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
33
|
+
const client = new ApiClient();
|
|
34
|
+
try {
|
|
35
|
+
const result = await client.listEmailTemplates(resolvedAppId);
|
|
36
|
+
const templates = result.templates || [];
|
|
37
|
+
if (options.json) {
|
|
38
|
+
json(templates);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const rows = templates.map((t) => ({
|
|
42
|
+
type: t.emailType,
|
|
43
|
+
label: t.label || t.emailType,
|
|
44
|
+
status: t.hasOverride ? "Customized" : "Default",
|
|
45
|
+
modifiedAt: t.modifiedAt || null,
|
|
46
|
+
}));
|
|
47
|
+
console.log(formatTable(rows, [
|
|
48
|
+
{ header: "TYPE", key: "type" },
|
|
49
|
+
{ header: "LABEL", key: "label" },
|
|
50
|
+
{ header: "STATUS", key: "status", format: (v) => v === "Customized" ? formatStatus("active") : formatStatus("default") },
|
|
51
|
+
{ header: "MODIFIED", key: "modifiedAt", format: (v) => v ? formatDate(v) : "-" },
|
|
52
|
+
]));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
error(err.message);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Get
|
|
60
|
+
emailTemplates
|
|
61
|
+
.command("get")
|
|
62
|
+
.description("Show template details for an email type")
|
|
63
|
+
.argument("<type>", "Email type (e.g. magic-link, otp)")
|
|
64
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
65
|
+
.option("--app <app-id>", "App ID")
|
|
66
|
+
.option("--json", "Output as JSON")
|
|
67
|
+
.action(async (type, appId, options) => {
|
|
68
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
69
|
+
const client = new ApiClient();
|
|
70
|
+
try {
|
|
71
|
+
const template = await client.getEmailTemplate(resolvedAppId, type);
|
|
72
|
+
if (options.json) {
|
|
73
|
+
json(template);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
printResult("Email Type", template.emailType || type);
|
|
77
|
+
printResult("Label", template.label || type);
|
|
78
|
+
printResult("Source", template.hasOverride ? "Custom Override" : "Default");
|
|
79
|
+
if (template.hasOverride && template.override?.modifiedAt) {
|
|
80
|
+
printResult("Modified At", formatDate(template.override.modifiedAt));
|
|
81
|
+
}
|
|
82
|
+
divider();
|
|
83
|
+
// Show active template (override or default)
|
|
84
|
+
const active = template.hasOverride && template.override ? template.override : template.default;
|
|
85
|
+
printResult("Subject", active?.subject || "(not set)");
|
|
86
|
+
divider();
|
|
87
|
+
if (active?.htmlBody) {
|
|
88
|
+
info("HTML Body:");
|
|
89
|
+
console.log(active.htmlBody);
|
|
90
|
+
divider();
|
|
91
|
+
}
|
|
92
|
+
if (active?.textBody) {
|
|
93
|
+
info("Text Body:");
|
|
94
|
+
console.log(active.textBody);
|
|
95
|
+
divider();
|
|
96
|
+
}
|
|
97
|
+
if (template.variables && template.variables.length > 0) {
|
|
98
|
+
info("Available Variables:");
|
|
99
|
+
for (const v of template.variables) {
|
|
100
|
+
console.log(` {{${v.name}}} ${v.description || ""}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
error(err.message);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// Set
|
|
110
|
+
emailTemplates
|
|
111
|
+
.command("set")
|
|
112
|
+
.description("Create or update an email template override")
|
|
113
|
+
.argument("<type>", "Email type (e.g. magic-link, otp)")
|
|
114
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
115
|
+
.option("--app <app-id>", "App ID")
|
|
116
|
+
.option("--subject <subject>", "Email subject line")
|
|
117
|
+
.option("--html-file <path>", "Path to HTML body file")
|
|
118
|
+
.option("--text-file <path>", "Path to text body file")
|
|
119
|
+
.option("--json", "Output as JSON")
|
|
120
|
+
.action(async (type, appId, options) => {
|
|
121
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
122
|
+
const client = new ApiClient();
|
|
123
|
+
if (!options.subject && !options.htmlFile && !options.textFile) {
|
|
124
|
+
error("At least one of --subject, --html-file, or --text-file is required.");
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
// Read file contents
|
|
129
|
+
let htmlBody = "";
|
|
130
|
+
let textBody = "";
|
|
131
|
+
if (options.htmlFile) {
|
|
132
|
+
htmlBody = readFileSync(options.htmlFile, "utf-8");
|
|
133
|
+
}
|
|
134
|
+
if (options.textFile) {
|
|
135
|
+
textBody = readFileSync(options.textFile, "utf-8");
|
|
136
|
+
}
|
|
137
|
+
// If only partial fields provided, fetch existing to merge
|
|
138
|
+
if (!options.subject || !options.htmlFile || !options.textFile) {
|
|
139
|
+
try {
|
|
140
|
+
const existing = await client.getEmailTemplate(resolvedAppId, type);
|
|
141
|
+
const active = existing.hasOverride && existing.override ? existing.override : existing.default;
|
|
142
|
+
if (!options.subject && active?.subject) {
|
|
143
|
+
options.subject = active.subject;
|
|
144
|
+
}
|
|
145
|
+
if (!options.htmlFile && active?.htmlBody) {
|
|
146
|
+
htmlBody = active.htmlBody;
|
|
147
|
+
}
|
|
148
|
+
if (!options.textFile && active?.textBody) {
|
|
149
|
+
textBody = active.textBody;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (fetchErr) {
|
|
153
|
+
// Only swallow 404 (template doesn't exist yet — fine for new
|
|
154
|
+
// custom types as long as all three fields are provided in this
|
|
155
|
+
// call). Auth failures, 5xx, network errors, etc. must surface.
|
|
156
|
+
const is404 = fetchErr instanceof ApiError && fetchErr.statusCode === 404;
|
|
157
|
+
if (!is404) {
|
|
158
|
+
throw fetchErr;
|
|
159
|
+
}
|
|
160
|
+
if (!options.subject || !options.htmlFile || !options.textFile) {
|
|
161
|
+
error(`Template "${type}" not found. When providing partial fields, the existing template must be accessible. For new custom types, provide all three: --subject, --html-file, and --text-file.`);
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const payload = {
|
|
167
|
+
subject: options.subject || "",
|
|
168
|
+
htmlBody,
|
|
169
|
+
textBody,
|
|
170
|
+
};
|
|
171
|
+
const result = await client.upsertEmailTemplate(resolvedAppId, type, payload);
|
|
172
|
+
if (options.json) {
|
|
173
|
+
json(result);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
success(`Email template override saved for "${type}".`);
|
|
177
|
+
if (result.warnings && result.warnings.length > 0) {
|
|
178
|
+
for (const w of result.warnings) {
|
|
179
|
+
warn(w);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
error(err.message);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// Delete
|
|
189
|
+
emailTemplates
|
|
190
|
+
.command("delete")
|
|
191
|
+
.description("Remove email template override (revert to default)")
|
|
192
|
+
.argument("<type>", "Email type (e.g. magic-link, otp)")
|
|
193
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
194
|
+
.option("--app <app-id>", "App ID")
|
|
195
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
196
|
+
.action(async (type, appId, options) => {
|
|
197
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
198
|
+
const client = new ApiClient();
|
|
199
|
+
if (!options.yes) {
|
|
200
|
+
let confirm;
|
|
201
|
+
try {
|
|
202
|
+
confirm = await confirmPrompt(`Delete template for "${type}"? For built-in types this reverts to the default; for custom types this removes the template entirely.`);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
error(err.message);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
if (!confirm) {
|
|
209
|
+
info("Cancelled.");
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
await client.deleteEmailTemplate(resolvedAppId, type);
|
|
215
|
+
success(`Template for "${type}" deleted.`);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
error(err.message);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
// Test
|
|
223
|
+
emailTemplates
|
|
224
|
+
.command("test")
|
|
225
|
+
.description("Send a test email using the current template")
|
|
226
|
+
.argument("<type>", "Email type (e.g. magic-link, otp)")
|
|
227
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
228
|
+
.option("--app <app-id>", "App ID")
|
|
229
|
+
.option("--json", "Output as JSON")
|
|
230
|
+
.action(async (type, appId, options) => {
|
|
231
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
232
|
+
const client = new ApiClient();
|
|
233
|
+
try {
|
|
234
|
+
info(`Sending test email for "${type}"...`);
|
|
235
|
+
const result = await client.testEmailTemplate(resolvedAppId, type);
|
|
236
|
+
if (options.json) {
|
|
237
|
+
json(result);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
success(`Test email sent for "${type}".`);
|
|
241
|
+
if (result.sentTo) {
|
|
242
|
+
keyValue("Sent To", result.sentTo);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
error(err.message);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
// Variables
|
|
251
|
+
emailTemplates
|
|
252
|
+
.command("variables")
|
|
253
|
+
.description("Show available template variables for an email type")
|
|
254
|
+
.argument("<type>", "Email type (e.g. magic-link, otp)")
|
|
255
|
+
.argument("[app-id]", "App ID (uses current app if not specified)")
|
|
256
|
+
.option("--app <app-id>", "App ID")
|
|
257
|
+
.option("--json", "Output as JSON")
|
|
258
|
+
.action(async (type, appId, options) => {
|
|
259
|
+
const resolvedAppId = resolveAppId(appId, options);
|
|
260
|
+
const client = new ApiClient();
|
|
261
|
+
try {
|
|
262
|
+
const template = await client.getEmailTemplate(resolvedAppId, type);
|
|
263
|
+
const variables = template.variables || [];
|
|
264
|
+
if (options.json) {
|
|
265
|
+
json({ emailType: type, variables });
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const label = template.label || type;
|
|
269
|
+
info(`Available variables for "${label}" (${type}):`);
|
|
270
|
+
console.log();
|
|
271
|
+
for (const v of variables) {
|
|
272
|
+
console.log(` {{${v.name}}} ${v.description || ""}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
error(err.message);
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=email-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-templates.js","sourceRoot":"","sources":["../../../src/commands/email-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `primitive env` commands — manage named environments in .primitive/config.json.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* env list — show all environments
|
|
6
|
+
* env add <name> — add a new environment
|
|
7
|
+
* env remove <name> — delete an environment
|
|
8
|
+
* env use <name> — set defaultEnvironment
|
|
9
|
+
* env show [name] — show details for an environment (default: current)
|
|
10
|
+
*/
|
|
11
|
+
import { Command } from "commander";
|
|
12
|
+
export declare function registerEnvCommands(program: Command): void;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `primitive env` commands — manage named environments in .primitive/config.json.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* env list — show all environments
|
|
6
|
+
* env add <name> — add a new environment
|
|
7
|
+
* env remove <name> — delete an environment
|
|
8
|
+
* env use <name> — set defaultEnvironment
|
|
9
|
+
* env show [name] — show details for an environment (default: current)
|
|
10
|
+
*/
|
|
11
|
+
import { join, dirname } from "path";
|
|
12
|
+
import { CURRENT_CONFIG_VERSION, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILENAME, PROJECT_CONFIG_DISPLAY_NAME, ProjectConfigError, findProjectConfigPath, loadProjectConfig, saveProjectConfig, } from "../lib/project-config.js";
|
|
13
|
+
import { getCurrentEnvNameSafe as getResolvedEnvName, resetEnvResolver, } from "../lib/env-resolver.js";
|
|
14
|
+
import { clearCredentialsForEnvInProject } from "../lib/credentials-store.js";
|
|
15
|
+
import { error, info, keyValue, result as printResult, success, warn, json, formatTable, divider, } from "../lib/output.js";
|
|
16
|
+
function requireProjectConfig() {
|
|
17
|
+
const path = findProjectConfigPath();
|
|
18
|
+
if (!path) {
|
|
19
|
+
error(`No ${PROJECT_CONFIG_DISPLAY_NAME} found in this directory or any parent. Run 'primitive init' to create one.`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const config = loadProjectConfig();
|
|
24
|
+
return { path, config };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
if (err instanceof ProjectConfigError) {
|
|
28
|
+
error(err.message);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
error(err.message || String(err));
|
|
32
|
+
}
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function writeProjectConfig(path, config) {
|
|
37
|
+
saveProjectConfig(path, config);
|
|
38
|
+
resetEnvResolver();
|
|
39
|
+
}
|
|
40
|
+
function validateEnvName(name) {
|
|
41
|
+
if (!name.match(/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/)) {
|
|
42
|
+
return `Invalid environment name "${name}". Use alphanumeric characters, dashes, or underscores.`;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
export function registerEnvCommands(program) {
|
|
47
|
+
const env = program
|
|
48
|
+
.command("env")
|
|
49
|
+
.description("Manage named environments in .primitive/config.json")
|
|
50
|
+
.addHelpText("after", `
|
|
51
|
+
Examples:
|
|
52
|
+
$ primitive env list # list environments
|
|
53
|
+
$ primitive env add prod --api-url https://... # add an environment
|
|
54
|
+
$ primitive env use prod # set default
|
|
55
|
+
$ primitive env show dev # show env details
|
|
56
|
+
$ primitive env remove staging # remove an environment
|
|
57
|
+
`);
|
|
58
|
+
// env list
|
|
59
|
+
env
|
|
60
|
+
.command("list")
|
|
61
|
+
.description("List all environments")
|
|
62
|
+
.option("--json", "Output as JSON")
|
|
63
|
+
.action((options) => {
|
|
64
|
+
const { config } = requireProjectConfig();
|
|
65
|
+
const rows = Object.entries(config.environments).map(([name, e]) => ({
|
|
66
|
+
name,
|
|
67
|
+
apiUrl: e.apiUrl,
|
|
68
|
+
appId: e.appId || "(unset)",
|
|
69
|
+
default: name === config.defaultEnvironment ? "*" : "",
|
|
70
|
+
}));
|
|
71
|
+
if (options.json) {
|
|
72
|
+
json({
|
|
73
|
+
defaultEnvironment: config.defaultEnvironment || null,
|
|
74
|
+
environments: config.environments,
|
|
75
|
+
});
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (rows.length === 0) {
|
|
79
|
+
info(`No environments defined. Run 'primitive env add <name>' to add one.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(formatTable(rows, [
|
|
83
|
+
{ key: "default", header: "" },
|
|
84
|
+
{ key: "name", header: "Name" },
|
|
85
|
+
{ key: "apiUrl", header: "API URL" },
|
|
86
|
+
{ key: "appId", header: "App ID" },
|
|
87
|
+
]));
|
|
88
|
+
});
|
|
89
|
+
// env add
|
|
90
|
+
env
|
|
91
|
+
.command("add")
|
|
92
|
+
.description("Add a new environment")
|
|
93
|
+
.argument("<name>", "Environment name (e.g. dev, prod, staging)")
|
|
94
|
+
.requiredOption("--api-url <url>", "API base URL for this environment")
|
|
95
|
+
.option("--app-id <id>", "Optional app ID bound to this environment")
|
|
96
|
+
.option("--app-name <name>", "Optional app name (display only)")
|
|
97
|
+
.option("--description <text>", "Optional description")
|
|
98
|
+
.option("--default", "Set this environment as the new default")
|
|
99
|
+
.action((name, options) => {
|
|
100
|
+
const validationError = validateEnvName(name);
|
|
101
|
+
if (validationError) {
|
|
102
|
+
error(validationError);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
// Validate URL before touching disk.
|
|
106
|
+
try {
|
|
107
|
+
new URL(options.apiUrl);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
error(`Invalid --api-url: ${options.apiUrl}`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
let { path, config, created } = findOrCreateConfig();
|
|
114
|
+
if (config.environments[name]) {
|
|
115
|
+
error(`Environment "${name}" already exists. Use 'primitive env remove ${name}' first or edit ${PROJECT_CONFIG_DISPLAY_NAME} directly.`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
config.environments[name] = {
|
|
119
|
+
apiUrl: options.apiUrl.replace(/\/$/, ""),
|
|
120
|
+
appId: options.appId,
|
|
121
|
+
appName: options.appName,
|
|
122
|
+
description: options.description,
|
|
123
|
+
};
|
|
124
|
+
// Auto-default if this is the first env, or if --default was passed.
|
|
125
|
+
if (options.default || !config.defaultEnvironment) {
|
|
126
|
+
config.defaultEnvironment = name;
|
|
127
|
+
}
|
|
128
|
+
writeProjectConfig(path, config);
|
|
129
|
+
if (created) {
|
|
130
|
+
info(`Created ${PROJECT_CONFIG_DISPLAY_NAME} in ${dirname(dirname(path))}`);
|
|
131
|
+
}
|
|
132
|
+
success(`Added environment "${name}".`);
|
|
133
|
+
keyValue("API URL", config.environments[name].apiUrl);
|
|
134
|
+
if (options.appId)
|
|
135
|
+
keyValue("App ID", options.appId);
|
|
136
|
+
if (config.defaultEnvironment === name) {
|
|
137
|
+
info(`"${name}" is now the default environment.`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
info(`Run 'primitive env use ${name}' to make it the default.`);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// env remove
|
|
144
|
+
env
|
|
145
|
+
.command("remove")
|
|
146
|
+
.alias("rm")
|
|
147
|
+
.description("Remove an environment")
|
|
148
|
+
.argument("<name>", "Environment name")
|
|
149
|
+
.action((name) => {
|
|
150
|
+
const { path, config } = requireProjectConfig();
|
|
151
|
+
if (!config.environments[name]) {
|
|
152
|
+
error(`Environment "${name}" does not exist.`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
delete config.environments[name];
|
|
156
|
+
if (config.defaultEnvironment === name) {
|
|
157
|
+
delete config.defaultEnvironment;
|
|
158
|
+
warn(`"${name}" was the default environment. Set a new default with 'primitive env use <name>'.`);
|
|
159
|
+
}
|
|
160
|
+
writeProjectConfig(path, config);
|
|
161
|
+
// Also drop the credentials slot for this env so a subsequent `env add`
|
|
162
|
+
// with the same name can't silently re-use stale tokens from the old
|
|
163
|
+
// instance. The project root is two levels up from .primitive/config.json.
|
|
164
|
+
clearCredentialsForEnvInProject(dirname(dirname(path)), name);
|
|
165
|
+
success(`Removed environment "${name}".`);
|
|
166
|
+
});
|
|
167
|
+
// env use
|
|
168
|
+
env
|
|
169
|
+
.command("use")
|
|
170
|
+
.description("Set the default environment")
|
|
171
|
+
.argument("<name>", "Environment name")
|
|
172
|
+
.action((name) => {
|
|
173
|
+
const { path, config } = requireProjectConfig();
|
|
174
|
+
if (!config.environments[name]) {
|
|
175
|
+
error(`Environment "${name}" does not exist. Run 'primitive env list' to see available environments.`);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
config.defaultEnvironment = name;
|
|
179
|
+
writeProjectConfig(path, config);
|
|
180
|
+
success(`Default environment is now "${name}".`);
|
|
181
|
+
});
|
|
182
|
+
// env show
|
|
183
|
+
env
|
|
184
|
+
.command("show")
|
|
185
|
+
.description("Show details for an environment")
|
|
186
|
+
.argument("[name]", "Environment name (defaults to current)")
|
|
187
|
+
.option("--json", "Output as JSON")
|
|
188
|
+
.action((name, options) => {
|
|
189
|
+
const { config } = requireProjectConfig();
|
|
190
|
+
// "Current" means the resolved env (honoring --env / PRIMITIVE_ENV /
|
|
191
|
+
// defaultEnvironment). We intentionally read this AFTER
|
|
192
|
+
// requireProjectConfig() so errors surface in a consistent order.
|
|
193
|
+
const resolvedName = (() => {
|
|
194
|
+
try {
|
|
195
|
+
return getResolvedEnvName();
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
})();
|
|
201
|
+
const envName = name || resolvedName || config.defaultEnvironment;
|
|
202
|
+
if (!envName) {
|
|
203
|
+
error(`No environment specified and no defaultEnvironment set. Usage: primitive env show <name>`);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
const e = config.environments[envName];
|
|
207
|
+
if (!e) {
|
|
208
|
+
error(`Environment "${envName}" does not exist.`);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
if (options.json) {
|
|
212
|
+
json({ name: envName, ...e });
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
divider();
|
|
216
|
+
printResult("Name", envName);
|
|
217
|
+
printResult("API URL", e.apiUrl);
|
|
218
|
+
if (e.appId)
|
|
219
|
+
printResult("App ID", e.appId);
|
|
220
|
+
if (e.appName)
|
|
221
|
+
printResult("App Name", e.appName);
|
|
222
|
+
if (e.description)
|
|
223
|
+
printResult("Description", e.description);
|
|
224
|
+
if (config.defaultEnvironment === envName) {
|
|
225
|
+
info("(default environment)");
|
|
226
|
+
}
|
|
227
|
+
divider();
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Finds an existing .primitive/config.json (searching upward) or creates a
|
|
232
|
+
* fresh one in the current working directory. Used by `env add` so users can
|
|
233
|
+
* add an environment before running `primitive init` — this is nice
|
|
234
|
+
* ergonomics for people who want to add envs to an existing project.
|
|
235
|
+
*/
|
|
236
|
+
function findOrCreateConfig() {
|
|
237
|
+
const existingPath = findProjectConfigPath();
|
|
238
|
+
if (existingPath) {
|
|
239
|
+
try {
|
|
240
|
+
const config = loadProjectConfig();
|
|
241
|
+
return { path: existingPath, config };
|
|
242
|
+
}
|
|
243
|
+
catch (err) {
|
|
244
|
+
if (err instanceof ProjectConfigError) {
|
|
245
|
+
error(err.message);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
error(err.message || String(err));
|
|
249
|
+
}
|
|
250
|
+
process.exit(1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const newPath = join(process.cwd(), PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILENAME);
|
|
254
|
+
const config = {
|
|
255
|
+
version: CURRENT_CONFIG_VERSION,
|
|
256
|
+
environments: {},
|
|
257
|
+
};
|
|
258
|
+
return { path: newPath, config, created: true };
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"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"}
|