primitive-admin 1.0.44 → 1.0.46

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 (81) hide show
  1. package/README.md +43 -0
  2. package/assets/skill/skills/primitive-platform/SKILL.md +85 -26
  3. package/dist/bin/primitive.js +6 -0
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/analytics.js +16 -16
  6. package/dist/src/commands/analytics.js.map +1 -1
  7. package/dist/src/commands/apps.js +14 -14
  8. package/dist/src/commands/apps.js.map +1 -1
  9. package/dist/src/commands/auth.js +70 -20
  10. package/dist/src/commands/auth.js.map +1 -1
  11. package/dist/src/commands/blob-buckets.js +11 -11
  12. package/dist/src/commands/blob-buckets.js.map +1 -1
  13. package/dist/src/commands/catalog.js +17 -17
  14. package/dist/src/commands/catalog.js.map +1 -1
  15. package/dist/src/commands/collection-type-configs.js +5 -5
  16. package/dist/src/commands/collection-type-configs.js.map +1 -1
  17. package/dist/src/commands/collections.js +6 -6
  18. package/dist/src/commands/collections.js.map +1 -1
  19. package/dist/src/commands/comparisons.js +6 -6
  20. package/dist/src/commands/comparisons.js.map +1 -1
  21. package/dist/src/commands/cron-triggers.js +17 -17
  22. package/dist/src/commands/cron-triggers.js.map +1 -1
  23. package/dist/src/commands/database-types.js +13 -13
  24. package/dist/src/commands/database-types.js.map +1 -1
  25. package/dist/src/commands/databases.js +266 -8
  26. package/dist/src/commands/databases.js.map +1 -1
  27. package/dist/src/commands/email-templates.js +6 -6
  28. package/dist/src/commands/email-templates.js.map +1 -1
  29. package/dist/src/commands/env.js +6 -6
  30. package/dist/src/commands/env.js.map +1 -1
  31. package/dist/src/commands/group-type-configs.js +6 -6
  32. package/dist/src/commands/group-type-configs.js.map +1 -1
  33. package/dist/src/commands/groups.js +7 -7
  34. package/dist/src/commands/groups.js.map +1 -1
  35. package/dist/src/commands/init.js +175 -144
  36. package/dist/src/commands/init.js.map +1 -1
  37. package/dist/src/commands/integrations.js +31 -21
  38. package/dist/src/commands/integrations.js.map +1 -1
  39. package/dist/src/commands/prompts.js +17 -16
  40. package/dist/src/commands/prompts.js.map +1 -1
  41. package/dist/src/commands/rule-sets.js +8 -8
  42. package/dist/src/commands/rule-sets.js.map +1 -1
  43. package/dist/src/commands/sync.js +1054 -284
  44. package/dist/src/commands/sync.js.map +1 -1
  45. package/dist/src/commands/tokens.js +9 -9
  46. package/dist/src/commands/tokens.js.map +1 -1
  47. package/dist/src/commands/users.js +44 -3
  48. package/dist/src/commands/users.js.map +1 -1
  49. package/dist/src/commands/webhooks.js +18 -18
  50. package/dist/src/commands/webhooks.js.map +1 -1
  51. package/dist/src/commands/workflows.js +285 -63
  52. package/dist/src/commands/workflows.js.map +1 -1
  53. package/dist/src/lib/api-client.js +273 -72
  54. package/dist/src/lib/api-client.js.map +1 -1
  55. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  56. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  57. package/dist/src/lib/db-codegen/dbGenerator.js +255 -0
  58. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  59. package/dist/src/lib/db-codegen/dbNaming.js +104 -0
  60. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  61. package/dist/src/lib/db-codegen/dbTemplates.js +138 -0
  62. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  63. package/dist/src/lib/db-codegen/dbTsTypes.js +61 -0
  64. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  65. package/dist/src/lib/migration-nag.js +163 -0
  66. package/dist/src/lib/migration-nag.js.map +1 -0
  67. package/dist/src/lib/output.js +58 -6
  68. package/dist/src/lib/output.js.map +1 -1
  69. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  70. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  71. package/dist/src/lib/template.js +80 -1
  72. package/dist/src/lib/template.js.map +1 -1
  73. package/dist/src/lib/toml-database-config.js +565 -0
  74. package/dist/src/lib/toml-database-config.js.map +1 -0
  75. package/dist/src/lib/toml-params-validator.js +183 -0
  76. package/dist/src/lib/toml-params-validator.js.map +1 -0
  77. package/dist/src/lib/workflow-fragments.js +121 -0
  78. package/dist/src/lib/workflow-fragments.js.map +1 -0
  79. package/dist/src/lib/workflow-toml-validator.js +343 -0
  80. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  81. package/package.json +2 -1
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Identifier-naming helpers for the `databases codegen` generator (issue #814).
3
+ *
4
+ * Record interfaces mirror codegen-v2's class-name resolution
5
+ * (`packages/js-bao/src/cli/v2/pluralization.ts`): honor a `class_name`
6
+ * override, else singularize a snake_case plural to PascalCase. The
7
+ * singularization algorithm below is a faithful copy of codegen-v2's
8
+ * `singularizeToPascalCase`; it is inlined rather than imported because the
9
+ * CLI builds standalone (`tsc -p cli/tsconfig.json`, `rootDir: "."`) and
10
+ * cannot reach into the vendored `packages/js-bao/src` tree.
11
+ *
12
+ * It DIVERGES in the fallback: codegen-v2 THROWS when a model name doesn't
13
+ * look like a recognizable plural (ORM models are expected to be plural).
14
+ * Database-type model names are author-curated and frequently already
15
+ * singular / PascalCase (e.g. `[models.User]`), so we PascalCase the name
16
+ * verbatim rather than failing the whole run.
17
+ *
18
+ * Op interfaces/aliases derive from the operation name (PascalCase) +
19
+ * `Params` / `Result` suffix (e.g. `saveAccount` → `SaveAccountParams`,
20
+ * `SaveAccountResult`).
21
+ */
22
+ /**
23
+ * Resolve the record-interface name for a model. Honors a `class_name`
24
+ * override, then tries plural→singular Pascal, then falls back to a verbatim
25
+ * PascalCase of the model name (no throw).
26
+ */
27
+ export function resolveRecordInterfaceName(modelName, classNameOverride) {
28
+ if (classNameOverride && classNameOverride.length > 0) {
29
+ return classNameOverride;
30
+ }
31
+ const singular = singularizeToPascalCase(modelName);
32
+ if (singular !== null)
33
+ return singular;
34
+ // Fallback: PascalCase the model name as-is (handles already-singular and
35
+ // already-PascalCase names like `User`, `Account`).
36
+ return pascalCase(modelName);
37
+ }
38
+ /** `saveAccount` → `SaveAccountParams`. */
39
+ export function opParamsInterfaceName(opName) {
40
+ return `${pascalCase(opName)}Params`;
41
+ }
42
+ /** `saveAccount` → `SaveAccountResult`. */
43
+ export function opResultAliasName(opName) {
44
+ return `${pascalCase(opName)}Result`;
45
+ }
46
+ /**
47
+ * Convert a snake_case plural model name (`user_prefs`, `categories`) into a
48
+ * PascalCase singular interface name (`UserPref`, `Category`). Returns null
49
+ * if no suffix rule matches the input. Faithful copy of codegen-v2's
50
+ * `singularizeToPascalCase`.
51
+ */
52
+ export function singularizeToPascalCase(snakePlural) {
53
+ if (!snakePlural || snakePlural.length === 0)
54
+ return null;
55
+ const parts = snakePlural.split("_");
56
+ if (parts.some((p) => p.length === 0))
57
+ return null;
58
+ const last = parts[parts.length - 1];
59
+ const singularizedLast = singularizeWord(last);
60
+ if (singularizedLast === null)
61
+ return null;
62
+ parts[parts.length - 1] = singularizedLast;
63
+ return parts.map(pascalSegment).join("");
64
+ }
65
+ /** Singularize a single plural word via simple suffix rules; null if none. */
66
+ function singularizeWord(word) {
67
+ if (!word)
68
+ return null;
69
+ if (!word.endsWith("s"))
70
+ return null;
71
+ if (word.endsWith("ies") && word.length > 3)
72
+ return word.slice(0, -3) + "y";
73
+ if (word.endsWith("xes") && word.length > 3)
74
+ return word.slice(0, -2);
75
+ if (word.endsWith("ses") && word.length > 3)
76
+ return word.slice(0, -2);
77
+ if (word.endsWith("shes") && word.length > 4)
78
+ return word.slice(0, -2);
79
+ if (word.endsWith("ches") && word.length > 4)
80
+ return word.slice(0, -2);
81
+ if (word.endsWith("s") && word.length > 1)
82
+ return word.slice(0, -1);
83
+ return null;
84
+ }
85
+ function pascalSegment(segment) {
86
+ if (!segment)
87
+ return segment;
88
+ return segment.charAt(0).toUpperCase() + segment.slice(1);
89
+ }
90
+ /**
91
+ * PascalCase an identifier: splits on non-alphanumeric separators
92
+ * (`_`, `-`, spaces) and capitalizes each segment, preserving any existing
93
+ * internal casing (`saveAccount` → `SaveAccount`, `save_account` →
94
+ * `SaveAccount`).
95
+ */
96
+ export function pascalCase(name) {
97
+ const segments = name.split(/[^A-Za-z0-9]+/).filter((s) => s.length > 0);
98
+ if (segments.length === 0)
99
+ return name;
100
+ return segments
101
+ .map((seg) => seg.charAt(0).toUpperCase() + seg.slice(1))
102
+ .join("");
103
+ }
104
+ //# sourceMappingURL=dbNaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbNaming.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbNaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Pure string templates for the `databases codegen` generator (issue #814).
3
+ *
4
+ * Mirrors the codegen-v2 template style
5
+ * (`packages/js-bao/src/cli/v2/templates.ts`): total functions (no I/O, no
6
+ * hidden state), an auto-generated banner + fingerprint header, and
7
+ * deterministic ordering so `--check` can compare byte-for-byte.
8
+ *
9
+ * Diverges from codegen-v2 in two ways:
10
+ * 1. Database-DO records are schemaless documents, NOT `BaseModel` ORM
11
+ * classes — so we emit plain `export interface` types with no class
12
+ * shell, no barrel registration, and `import type` only.
13
+ * 2. We add an OPERATIONS half codegen-v2 has no analog for: per-op
14
+ * input-params interfaces + per-op result aliases keyed off `op.type`.
15
+ */
16
+ import { tsTypeForDbFieldType, tsTypeForDbParamType } from "./dbTsTypes.js";
17
+ const HEADER_BANNER = "// AUTO-GENERATED FROM database-types TOML — DO NOT EDIT.";
18
+ const REGEN_INSTRUCTION = "// Run `primitive databases codegen <database-type>` to regenerate.";
19
+ /** The shared generic result aliases, keyed off `op.type`. */
20
+ export const RESULT_ALIASES_BLOCK = `// Generic per-op result shapes, keyed off the operation type. The op
21
+ // return contract is NOT stored in the TOML — these mirror the runtime
22
+ // result shapes produced by the database-operations controller.
23
+
24
+ /** \`query\` ops return a page of records. */
25
+ export interface QueryResult<T = Record<string, any>> {
26
+ data: T[];
27
+ hasMore?: boolean;
28
+ nextCursor?: string;
29
+ }
30
+
31
+ /** \`mutation\` ops return per-step results. */
32
+ export interface MutationResult {
33
+ results: any[];
34
+ }
35
+
36
+ /** \`count\` ops return a single count. */
37
+ export interface CountResult {
38
+ count: number;
39
+ }
40
+
41
+ /** \`aggregate\` ops return a single result object. */
42
+ export interface AggregateResult {
43
+ result: Record<string, any>;
44
+ }
45
+
46
+ /** \`applyToQuery\` ops return match/affect/fail counts. */
47
+ export interface ApplyToQueryResult {
48
+ matched: number;
49
+ affected: number;
50
+ failed: number;
51
+ sample?: any[];
52
+ }
53
+
54
+ /** \`pipeline\` ops return per-step results keyed by step name. */
55
+ export interface PipelineResult {
56
+ steps: Record<string, any>;
57
+ }
58
+ `;
59
+ /**
60
+ * Render the header (banner + regen hint + fingerprint).
61
+ */
62
+ export function renderHeader(fingerprint) {
63
+ return [
64
+ HEADER_BANNER,
65
+ REGEN_INSTRUCTION,
66
+ `// fingerprint: ${fingerprint}`,
67
+ ].join("\n");
68
+ }
69
+ /**
70
+ * Render a single record interface (read shape). Stamped fields
71
+ * (`createdAt`, `modifiedAt`, `ownerId`, …) are appended as OPTIONAL props
72
+ * if not already present in `fields`.
73
+ */
74
+ export function renderRecordInterface(input) {
75
+ const { interfaceName, fields, stampedFields } = input;
76
+ const lines = [];
77
+ lines.push(`export interface ${interfaceName} {`);
78
+ const declared = new Set();
79
+ for (const f of fields) {
80
+ declared.add(f.name);
81
+ const optional = f.required ? "" : "?";
82
+ lines.push(` ${f.name}${optional}: ${tsTypeForDbFieldType(f.type)};`);
83
+ }
84
+ // Server-stamped fields appear on the read interface as optional —
85
+ // the runtime populates them, but a freshly-built object may not have
86
+ // them yet, so claiming them as required would be a type lie.
87
+ for (const stamped of stampedFields) {
88
+ if (declared.has(stamped))
89
+ continue;
90
+ declared.add(stamped);
91
+ lines.push(` ${stamped}?: string;`);
92
+ }
93
+ lines.push(`}`);
94
+ return lines.join("\n");
95
+ }
96
+ /**
97
+ * Render a single op-input-params interface (write shape). `required: true`
98
+ * params are non-optional; others are optional. `object` params render as
99
+ * `Record<string, any>`.
100
+ */
101
+ export function renderOpParamsInterface(input) {
102
+ const { interfaceName, params } = input;
103
+ const lines = [];
104
+ lines.push(`export interface ${interfaceName} {`);
105
+ for (const p of params) {
106
+ const optional = p.required ? "" : "?";
107
+ lines.push(` ${p.name}${optional}: ${tsTypeForDbParamType(p.type)};`);
108
+ }
109
+ lines.push(`}`);
110
+ return lines.join("\n");
111
+ }
112
+ /**
113
+ * Render a per-op result alias keyed off `op.type`.
114
+ */
115
+ export function renderOpResultAlias(input) {
116
+ const { aliasName, opType, recordInterfaceName } = input;
117
+ switch (opType) {
118
+ case "query": {
119
+ const generic = recordInterfaceName ?? "Record<string, any>";
120
+ return `export type ${aliasName} = QueryResult<${generic}>;`;
121
+ }
122
+ case "mutation":
123
+ return `export type ${aliasName} = MutationResult;`;
124
+ case "count":
125
+ return `export type ${aliasName} = CountResult;`;
126
+ case "aggregate":
127
+ return `export type ${aliasName} = AggregateResult;`;
128
+ case "applyToQuery":
129
+ return `export type ${aliasName} = ApplyToQueryResult;`;
130
+ case "pipeline":
131
+ return `export type ${aliasName} = PipelineResult;`;
132
+ default:
133
+ // Unknown op type — emit a permissive alias rather than throwing,
134
+ // so one stray op doesn't block codegen for the whole file.
135
+ return `export type ${aliasName} = unknown;`;
136
+ }
137
+ }
138
+ //# sourceMappingURL=dbTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbTemplates.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTemplates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Map database-type TOML field/param types → TypeScript types for the
3
+ * `databases codegen` generator (issue #814).
4
+ *
5
+ * The record-interface half reuses the SAME `FieldType` vocabulary that
6
+ * powers the document-model codegen-v2 generator
7
+ * (`packages/js-bao/src/cli/v2/tsTypes.ts`): the database-type
8
+ * `[models.<m>.fields.<f>]` blocks round-trip through the same
9
+ * `loadSchemaFromTomlString` loader, so the field→TS mapping is identical
10
+ * (`string|id|date → string`, `number → number`, `boolean → boolean`,
11
+ * `stringset → StringSet`).
12
+ *
13
+ * The op-params half maps the operation `params.{type}` vocabulary
14
+ * (`string|number|boolean|object`, validated server-side in
15
+ * `database-type-operations-controller.ts`). `object` has no field-type
16
+ * analog and carries no nested schema, so it renders as `Record<string, any>`.
17
+ */
18
+ /**
19
+ * Returns the TS type expression for a record field type. Unknown types
20
+ * fall back to `unknown` rather than throwing: the database-type TOML is
21
+ * author-curated and may legitimately carry a field type the CLI's vendored
22
+ * vocabulary predates, and a hard throw would block codegen for the whole
23
+ * file over one unrecognized field.
24
+ */
25
+ export function tsTypeForDbFieldType(fieldType) {
26
+ switch (fieldType) {
27
+ case "string":
28
+ case "id":
29
+ case "date":
30
+ return "string";
31
+ case "number":
32
+ return "number";
33
+ case "boolean":
34
+ return "boolean";
35
+ case "stringset":
36
+ // StringSet serializes to a string array on the wire.
37
+ return "string[]";
38
+ default:
39
+ return "unknown";
40
+ }
41
+ }
42
+ /**
43
+ * Returns the TS type expression for an op param type. `object` has no
44
+ * declared nested shape, so it renders as `Record<string, any>`. Unknown
45
+ * types fall back to `unknown`.
46
+ */
47
+ export function tsTypeForDbParamType(paramType) {
48
+ switch (paramType) {
49
+ case "string":
50
+ return "string";
51
+ case "number":
52
+ return "number";
53
+ case "boolean":
54
+ return "boolean";
55
+ case "object":
56
+ return "Record<string, any>";
57
+ default:
58
+ return "unknown";
59
+ }
60
+ }
61
+ //# sourceMappingURL=dbTsTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbTsTypes.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbTsTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoBH;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW;YACd,sDAAsD;YACtD,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,qBAAqB,CAAC;QAC/B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Legacy-mode migration nag.
3
+ *
4
+ * Prints a one-time, opt-out, rate-limited startup warning that points
5
+ * users still on the legacy `~/.primitive/credentials.json` config at the
6
+ * project-scoped `primitive env add` migration path. The warning is purely
7
+ * informational — it never mutates anything other than the small
8
+ * `~/.primitive/migration-nag.json` cache used for the 24h rate-limit.
9
+ *
10
+ * Detection signal (warn iff ALL of):
11
+ * 1. `peekLegacyCredentials()` is non-null (legacy creds file present).
12
+ * 2. `findProjectConfigPath()` is null (no project config in scope).
13
+ * 3. `./config/.primitive-sync.json` exists in CWD (strong signal the
14
+ * user has actually run `primitive sync` here — the population at
15
+ * risk from #548).
16
+ *
17
+ * Suppression (skip if ANY of):
18
+ * - `PRIMITIVE_NO_MIGRATE_NAG=1`
19
+ * - `CI` env var set (non-empty)
20
+ * - `!process.stdout.isTTY`
21
+ * - argv contains `--help` / `-h` / `--version` / `-V` / `--json`
22
+ * - Subcommand is `env *`, `init`, `login`, `logout`, or `token`
23
+ * - `now - lastWarnedAt < 24h`
24
+ *
25
+ * Modeled on `cli/src/lib/version-check.ts`: the whole body is wrapped
26
+ * in try/catch that swallows every error so a corrupt cache file or any
27
+ * other unexpected failure can never break the CLI.
28
+ *
29
+ * TODO(#auto-migration): When we ship an interactive auto-migration flow
30
+ * (separate issue from #552), it should either delete this nag cache or
31
+ * bump `lastWarnedAt` far into the future so freshly-migrated users
32
+ * don't see the nag again. The cache lives at `${PRIMITIVE_CONFIG_DIR ||
33
+ * ~/.primitive}/migration-nag.json`.
34
+ */
35
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
36
+ import { homedir } from "os";
37
+ import { join } from "path";
38
+ import { warn } from "./output.js";
39
+ import { peekLegacyCredentials } from "./credentials-store.js";
40
+ import { findProjectConfigPath } from "./project-config.js";
41
+ const NAG_INTERVAL_MS = 24 * 60 * 60 * 1000;
42
+ /** Resolved per-call so tests can override PRIMITIVE_CONFIG_DIR at runtime. */
43
+ function getConfigDir() {
44
+ return process.env.PRIMITIVE_CONFIG_DIR || join(homedir(), ".primitive");
45
+ }
46
+ function getNagCacheFile() {
47
+ return join(getConfigDir(), "migration-nag.json");
48
+ }
49
+ function ensureConfigDir() {
50
+ const dir = getConfigDir();
51
+ if (!existsSync(dir)) {
52
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
53
+ }
54
+ }
55
+ function loadNagCache() {
56
+ try {
57
+ const file = getNagCacheFile();
58
+ if (!existsSync(file))
59
+ return null;
60
+ const raw = JSON.parse(readFileSync(file, "utf-8"));
61
+ if (!raw || typeof raw !== "object")
62
+ return null;
63
+ if (typeof raw.lastWarnedAt !== "number")
64
+ return null;
65
+ return { lastWarnedAt: raw.lastWarnedAt };
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ function saveNagCache(cache) {
72
+ try {
73
+ ensureConfigDir();
74
+ writeFileSync(getNagCacheFile(), JSON.stringify(cache, null, 2));
75
+ }
76
+ catch {
77
+ // Swallow — at worst the user gets re-nagged next invocation.
78
+ }
79
+ }
80
+ /**
81
+ * Returns true if `argv` indicates the warning should be skipped:
82
+ * - any of `--help` / `-h` / `--version` / `-V` / `--json` present, OR
83
+ * - the subcommand is on the migration path (`env *`, `init`, `login`,
84
+ * `logout`), OR
85
+ * - the subcommand is `token`. The `token` command is contractually
86
+ * stdout-only (callers pipe its output to `--access-token` or paste it
87
+ * into env vars), so any extra warning lines would corrupt that output.
88
+ *
89
+ * `argv` is expected to be the same shape as `process.argv` (i.e. the
90
+ * subcommand sits at index 2, after `node` and the script path). Defensive
91
+ * about short or unusual argv shapes.
92
+ */
93
+ function shouldSuppressByArgv(argv) {
94
+ for (const a of argv) {
95
+ if (a === "--help" || a === "-h" || a === "--version" || a === "-V" || a === "--json") {
96
+ return true;
97
+ }
98
+ }
99
+ const subcommand = argv[2];
100
+ if (subcommand === "env" ||
101
+ subcommand === "init" ||
102
+ subcommand === "login" ||
103
+ subcommand === "logout" ||
104
+ subcommand === "token") {
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ /**
110
+ * Returns true when `cwd` looks like a project that has actually been
111
+ * used with `primitive sync` — specifically, when
112
+ * `<cwd>/config/.primitive-sync.json` exists. Per F4 of the approved
113
+ * plan, this is the only project-shape signal we use; we deliberately
114
+ * do not fall back to `package.json` or `.git` to avoid nagging users
115
+ * who run the CLI for read-only commands from incidental project
116
+ * directories.
117
+ */
118
+ function isProjectShaped(cwd) {
119
+ try {
120
+ return existsSync(join(cwd, "config", ".primitive-sync.json"));
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ /**
127
+ * Print the legacy-mode migration nag if the detection signal matches
128
+ * and no suppression condition applies. Never throws.
129
+ */
130
+ export function maybeWarnLegacyMigration(options) {
131
+ try {
132
+ // --- Fast suppression checks (no disk I/O) ---------------------------
133
+ if (process.env.PRIMITIVE_NO_MIGRATE_NAG === "1")
134
+ return;
135
+ if (process.env.CI)
136
+ return;
137
+ if (!process.stdout.isTTY)
138
+ return;
139
+ if (shouldSuppressByArgv(options.argv))
140
+ return;
141
+ const cwd = options.cwd ?? process.cwd();
142
+ // --- Detection signal -------------------------------------------------
143
+ if (!isProjectShaped(cwd))
144
+ return;
145
+ if (findProjectConfigPath(cwd) !== null)
146
+ return;
147
+ if (peekLegacyCredentials() === null)
148
+ return;
149
+ // --- Rate-limit -------------------------------------------------------
150
+ const cache = loadNagCache();
151
+ const now = Date.now();
152
+ if (cache && now - cache.lastWarnedAt < NAG_INTERVAL_MS)
153
+ return;
154
+ // --- Print --------------------------------------------------------------
155
+ warn("Legacy CLI config detected at ~/.primitive/credentials.json.");
156
+ warn("Run `primitive env add <name> --api-url <url> --app-id <appId>` to upgrade to project-scoped config (see issue #548 for why). Set PRIMITIVE_NO_MIGRATE_NAG=1 to silence.");
157
+ saveNagCache({ lastWarnedAt: now });
158
+ }
159
+ catch {
160
+ // Never let nag errors affect CLI operation — mirrors version-check.ts.
161
+ }
162
+ }
163
+ //# sourceMappingURL=migration-nag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-nag.js","sourceRoot":"","sources":["../../../src/lib/migration-nag.ts"],"names":[],"mappings":"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"}
@@ -47,23 +47,46 @@ function stripAnsi(str) {
47
47
  // Simple ANSI escape code stripper
48
48
  return str.replace(/\x1b\[[0-9;]*m/g, "");
49
49
  }
50
+ // Stream-routing convention (see issue #695):
51
+ // - data → stdout (`json`, `result`, plus the formatter helpers below
52
+ // that just return strings for callers to print themselves).
53
+ // - diagnostics → stderr (`success`, `warn`, `info`, `dim`, `heading`,
54
+ // `keyValue`, `divider`, `error`).
55
+ //
56
+ // This mirrors `git`/`kubectl`/`aws`/`gh` so that any command with a `--json`
57
+ // flag emits a single parseable JSON document on stdout, regardless of
58
+ // status, warning, or progress text the same command may print. Callers
59
+ // running interactively still see diagnostics by default because terminals
60
+ // display stderr; users redirecting `2>/dev/null` get a quiet pipe; users
61
+ // running `2>&1` get everything mixed.
62
+ //
63
+ // `result()` vs. `keyValue()` (data vs. diagnostic split):
64
+ // `keyValue()` is a *diagnostic* helper — use it for the `key: value`
65
+ // summary lines printed *after* a side-effecting command like `apps create`,
66
+ // `workflows update`, or `secrets set` (those summaries are nice context but
67
+ // are not what the caller asked the command to produce). `result()` is the
68
+ // *data* counterpart — use it for the primary fields a `get` / `show` /
69
+ // `describe` command emits, where the caller ran the command specifically
70
+ // to read those fields. Keeping the two on different streams means
71
+ // `primitive integrations get foo > out.txt` produces a non-empty `out.txt`
72
+ // even though the same command's status diagnostics still go to stderr.
50
73
  export function success(message) {
51
- console.log(chalk.green("✓") + " " + message);
74
+ console.error(chalk.green("✓") + " " + message);
52
75
  }
53
76
  export function error(message) {
54
77
  console.error(chalk.red("✗") + " " + message);
55
78
  }
56
79
  export function warn(message) {
57
- console.log(chalk.yellow("!") + " " + message);
80
+ console.error(chalk.yellow("!") + " " + message);
58
81
  }
59
82
  export function info(message) {
60
- console.log(chalk.blue("i") + " " + message);
83
+ console.error(chalk.blue("i") + " " + message);
61
84
  }
62
85
  export function dim(message) {
63
- console.log(chalk.dim(message));
86
+ console.error(chalk.dim(message));
64
87
  }
65
88
  export function heading(message) {
66
- console.log(chalk.bold.underline(message));
89
+ console.error(chalk.bold.underline(message));
67
90
  }
68
91
  export function json(data) {
69
92
  console.log(JSON.stringify(data, null, 2));
@@ -130,6 +153,23 @@ export function formatPercent(value) {
130
153
  return `${(value * 100).toFixed(1)}%`;
131
154
  }
132
155
  export function keyValue(label, value) {
156
+ const formattedValue = value === null || value === undefined
157
+ ? chalk.dim("-")
158
+ : typeof value === "boolean"
159
+ ? formatBoolean(value)
160
+ : String(value);
161
+ console.error(`${chalk.dim(label + ":")} ${formattedValue}`);
162
+ }
163
+ /**
164
+ * Print a `label: value` line on **stdout** as part of a command's primary
165
+ * data output (e.g., `primitive integrations get <id>`,
166
+ * `primitive workflows get <id>`). Same visual rendering as `keyValue()`,
167
+ * but on the data stream so the value survives `> out.txt` redirection.
168
+ *
169
+ * Use `keyValue()` (stderr) for post-action diagnostic summaries; use
170
+ * `result()` (stdout) for fields the caller specifically requested.
171
+ */
172
+ export function result(label, value) {
133
173
  const formattedValue = value === null || value === undefined
134
174
  ? chalk.dim("-")
135
175
  : typeof value === "boolean"
@@ -138,6 +178,18 @@ export function keyValue(label, value) {
138
178
  console.log(`${chalk.dim(label + ":")} ${formattedValue}`);
139
179
  }
140
180
  export function divider() {
141
- console.log(chalk.dim("-".repeat(60)));
181
+ console.error(chalk.dim("-".repeat(60)));
182
+ }
183
+ /**
184
+ * In-place progress indicator for long-running commands (e.g. polling a
185
+ * batch run). Writes to stderr so it can't corrupt JSON on stdout under
186
+ * `--json`. Callers should follow the final progress line with `progressEnd()`
187
+ * to print a trailing newline.
188
+ */
189
+ export function progress(message) {
190
+ process.stderr.write(`\r${message}`);
191
+ }
192
+ export function progressEnd() {
193
+ process.stderr.write("\n");
142
194
  }
143
195
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,MAAM,UAAU,WAAW,CACzB,IAA2B,EAC3B,OAAsB;IAEtB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxC,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACjC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAClB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACjF,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,CACH,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;QACxB,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IACzD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,mBAAmB;IACnB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,cAAc;IACd,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,OAAO;SACJ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACd,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa,EAAE,KAAkC;IAC/E,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;IACnC,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC;QAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,mCAAmC;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAS;IAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAsC;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiC;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,WAAW;YACd,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,gCAAgC;IAChC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiC;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAgC;IAC3D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAA6B;IAC1D,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,IAAI,EAAE,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD,OAAO,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAgC;IAC5D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAmD;IACzF,MAAM,cAAc,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAC1D,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAChB,CAAC,CAAC,OAAO,KAAK,KAAK,SAAS;YAC1B,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;YACtB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/lib/output.ts"],"names":[],"mappings":"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"}