@devbie/newbie-cli 0.1.0-stage.0

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 (139) hide show
  1. package/dist/assemble/assets.d.ts +9 -0
  2. package/dist/assemble/assets.js +49 -0
  3. package/dist/assemble/assets.js.map +1 -0
  4. package/dist/assemble/dependencies.d.ts +10 -0
  5. package/dist/assemble/dependencies.js +36 -0
  6. package/dist/assemble/dependencies.js.map +1 -0
  7. package/dist/assemble/env.d.ts +15 -0
  8. package/dist/assemble/env.js +79 -0
  9. package/dist/assemble/env.js.map +1 -0
  10. package/dist/assemble/modules-copy.d.ts +13 -0
  11. package/dist/assemble/modules-copy.js +36 -0
  12. package/dist/assemble/modules-copy.js.map +1 -0
  13. package/dist/assemble/modules.d.ts +8 -0
  14. package/dist/assemble/modules.js +86 -0
  15. package/dist/assemble/modules.js.map +1 -0
  16. package/dist/assemble/pipeline.d.ts +17 -0
  17. package/dist/assemble/pipeline.js +143 -0
  18. package/dist/assemble/pipeline.js.map +1 -0
  19. package/dist/assemble/schema.d.ts +10 -0
  20. package/dist/assemble/schema.js +64 -0
  21. package/dist/assemble/schema.js.map +1 -0
  22. package/dist/assemble/types.d.ts +18 -0
  23. package/dist/assemble/types.js +3 -0
  24. package/dist/assemble/types.js.map +1 -0
  25. package/dist/commands/agent.d.ts +1 -0
  26. package/dist/commands/agent.js +16 -0
  27. package/dist/commands/agent.js.map +1 -0
  28. package/dist/commands/apply.d.ts +6 -0
  29. package/dist/commands/apply.js +52 -0
  30. package/dist/commands/apply.js.map +1 -0
  31. package/dist/commands/check.d.ts +2 -0
  32. package/dist/commands/check.js +37 -0
  33. package/dist/commands/check.js.map +1 -0
  34. package/dist/commands/config.d.ts +7 -0
  35. package/dist/commands/config.js +82 -0
  36. package/dist/commands/config.js.map +1 -0
  37. package/dist/commands/create.d.ts +16 -0
  38. package/dist/commands/create.js +89 -0
  39. package/dist/commands/create.js.map +1 -0
  40. package/dist/commands/default.d.ts +2 -0
  41. package/dist/commands/default.js +69 -0
  42. package/dist/commands/default.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +2 -0
  44. package/dist/commands/doctor.js +145 -0
  45. package/dist/commands/doctor.js.map +1 -0
  46. package/dist/commands/env.d.ts +7 -0
  47. package/dist/commands/env.js +324 -0
  48. package/dist/commands/env.js.map +1 -0
  49. package/dist/commands/install.d.ts +4 -0
  50. package/dist/commands/install.js +45 -0
  51. package/dist/commands/install.js.map +1 -0
  52. package/dist/commands/shared.d.ts +19 -0
  53. package/dist/commands/shared.js +54 -0
  54. package/dist/commands/shared.js.map +1 -0
  55. package/dist/commands/status.d.ts +4 -0
  56. package/dist/commands/status.js +62 -0
  57. package/dist/commands/status.js.map +1 -0
  58. package/dist/commands/update-template.d.ts +6 -0
  59. package/dist/commands/update-template.js +83 -0
  60. package/dist/commands/update-template.js.map +1 -0
  61. package/dist/commands/update.d.ts +6 -0
  62. package/dist/commands/update.js +129 -0
  63. package/dist/commands/update.js.map +1 -0
  64. package/dist/constants/paths.d.ts +12 -0
  65. package/dist/constants/paths.js +19 -0
  66. package/dist/constants/paths.js.map +1 -0
  67. package/dist/core/assets.d.ts +8 -0
  68. package/dist/core/assets.js +30 -0
  69. package/dist/core/assets.js.map +1 -0
  70. package/dist/core/dependency-plan.d.ts +12 -0
  71. package/dist/core/dependency-plan.js +42 -0
  72. package/dist/core/dependency-plan.js.map +1 -0
  73. package/dist/core/drift.d.ts +9 -0
  74. package/dist/core/drift.js +34 -0
  75. package/dist/core/drift.js.map +1 -0
  76. package/dist/core/env-file.d.ts +19 -0
  77. package/dist/core/env-file.js +184 -0
  78. package/dist/core/env-file.js.map +1 -0
  79. package/dist/core/module-manifest.d.ts +19 -0
  80. package/dist/core/module-manifest.js +48 -0
  81. package/dist/core/module-manifest.js.map +1 -0
  82. package/dist/core/modules-state.d.ts +24 -0
  83. package/dist/core/modules-state.js +81 -0
  84. package/dist/core/modules-state.js.map +1 -0
  85. package/dist/core/prisma-schema.d.ts +3 -0
  86. package/dist/core/prisma-schema.js +38 -0
  87. package/dist/core/prisma-schema.js.map +1 -0
  88. package/dist/core/semver.d.ts +9 -0
  89. package/dist/core/semver.js +32 -0
  90. package/dist/core/semver.js.map +1 -0
  91. package/dist/core/template-sync.d.ts +19 -0
  92. package/dist/core/template-sync.js +97 -0
  93. package/dist/core/template-sync.js.map +1 -0
  94. package/dist/core/unified-diff.d.ts +1 -0
  95. package/dist/core/unified-diff.js +103 -0
  96. package/dist/core/unified-diff.js.map +1 -0
  97. package/dist/index.d.ts +2 -0
  98. package/dist/index.js +202 -0
  99. package/dist/index.js.map +1 -0
  100. package/dist/lib/check.d.ts +1 -0
  101. package/dist/lib/check.js +31 -0
  102. package/dist/lib/check.js.map +1 -0
  103. package/dist/lib/drift.d.ts +5 -0
  104. package/dist/lib/drift.js +142 -0
  105. package/dist/lib/drift.js.map +1 -0
  106. package/dist/lib/env-tool-config.d.ts +17 -0
  107. package/dist/lib/env-tool-config.js +32 -0
  108. package/dist/lib/env-tool-config.js.map +1 -0
  109. package/dist/lib/errors.d.ts +5 -0
  110. package/dist/lib/errors.js +20 -0
  111. package/dist/lib/errors.js.map +1 -0
  112. package/dist/lib/exec.d.ts +13 -0
  113. package/dist/lib/exec.js +40 -0
  114. package/dist/lib/exec.js.map +1 -0
  115. package/dist/lib/fs-util.d.ts +1 -0
  116. package/dist/lib/fs-util.js +18 -0
  117. package/dist/lib/fs-util.js.map +1 -0
  118. package/dist/lib/issues.d.ts +8 -0
  119. package/dist/lib/issues.js +31 -0
  120. package/dist/lib/issues.js.map +1 -0
  121. package/dist/lib/loading.d.ts +1 -0
  122. package/dist/lib/loading.js +31 -0
  123. package/dist/lib/loading.js.map +1 -0
  124. package/dist/lib/module-install.d.ts +5 -0
  125. package/dist/lib/module-install.js +54 -0
  126. package/dist/lib/module-install.js.map +1 -0
  127. package/dist/lib/modules-state.d.ts +6 -0
  128. package/dist/lib/modules-state.js +51 -0
  129. package/dist/lib/modules-state.js.map +1 -0
  130. package/dist/lib/registry.d.ts +23 -0
  131. package/dist/lib/registry.js +182 -0
  132. package/dist/lib/registry.js.map +1 -0
  133. package/dist/lib/sink.d.ts +10 -0
  134. package/dist/lib/sink.js +56 -0
  135. package/dist/lib/sink.js.map +1 -0
  136. package/dist/lib/version.d.ts +1 -0
  137. package/dist/lib/version.js +19 -0
  138. package/dist/lib/version.js.map +1 -0
  139. package/package.json +39 -0
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runEnvPull = runEnvPull;
7
+ exports.runEnvPush = runEnvPush;
8
+ const promises_1 = __importDefault(require("node:fs/promises"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const prompts_1 = require("@inquirer/prompts");
11
+ const colorette_1 = require("colorette");
12
+ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
13
+ const env_file_1 = require("../core/env-file");
14
+ const paths_1 = require("../constants/paths");
15
+ const errors_1 = require("../lib/errors");
16
+ const issues_1 = require("../lib/issues");
17
+ const env_tool_config_1 = require("../lib/env-tool-config");
18
+ const PLACEHOLDER = "<PLEASE_SET_THIS_VALUE>";
19
+ function createAwsClient(region) {
20
+ return new client_secrets_manager_1.SecretsManagerClient({
21
+ region,
22
+ credentials: process.env.AWS_ACCESS_KEY_ID
23
+ ? {
24
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
25
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? "",
26
+ }
27
+ : undefined,
28
+ });
29
+ }
30
+ function printCredentialHint() {
31
+ if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_SECRET_ACCESS_KEY)
32
+ return;
33
+ if (process.env.AWS_PROFILE) {
34
+ console.info((0, colorette_1.cyan)(`ℹ️ Using AWS Profile: ${(0, colorette_1.bold)(process.env.AWS_PROFILE)}\n`));
35
+ }
36
+ else {
37
+ console.info((0, colorette_1.cyan)("ℹ️ No AWS credentials in env; falling back to SSO/login, ~/.aws/credentials or IAM role.\n"));
38
+ }
39
+ }
40
+ async function pickEnvironment(config, preselected) {
41
+ const names = Object.keys(config.environments);
42
+ if (preselected) {
43
+ if (!names.includes(preselected)) {
44
+ throw new errors_1.CliError(`Unknown environment '${preselected}'. Available: ${names.join(", ")}`);
45
+ }
46
+ return preselected;
47
+ }
48
+ return (0, prompts_1.select)({
49
+ message: "Select env set:",
50
+ choices: names.map((name) => ({ name, value: name })),
51
+ });
52
+ }
53
+ function setEntry(lines, key, value) {
54
+ for (const line of lines) {
55
+ if (line.kind === "entry" && line.key === key) {
56
+ line.value = value;
57
+ return;
58
+ }
59
+ }
60
+ lines.push({ kind: "entry", key, value });
61
+ }
62
+ function parseSecret(secret, secretConfig) {
63
+ const envVars = {};
64
+ const keysOnlyVars = {};
65
+ const placeholderKeys = [];
66
+ const data = JSON.parse(secret);
67
+ const picked = secretConfig.keys && secretConfig.keys.length > 0
68
+ ? secretConfig.keys
69
+ : Object.keys(data);
70
+ for (const key of picked) {
71
+ if (!Object.prototype.hasOwnProperty.call(data, key))
72
+ continue;
73
+ const value = String(data[key]);
74
+ envVars[key] = value;
75
+ if (value === PLACEHOLDER)
76
+ placeholderKeys.push(key);
77
+ }
78
+ for (const key of secretConfig.keysOnly ?? []) {
79
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
80
+ delete envVars[key];
81
+ keysOnlyVars[key] = PLACEHOLDER;
82
+ }
83
+ }
84
+ return { envVars, keysOnlyVars, placeholderKeys };
85
+ }
86
+ async function runEnvPull(options) {
87
+ const { config: toolConfig, path: configPath } = await (0, env_tool_config_1.readEnvToolConfig)(options.cwd);
88
+ const issues = new issues_1.IssueBag();
89
+ const envName = await pickEnvironment(toolConfig, options.environment);
90
+ const envConfig = toolConfig.environments[envName];
91
+ printCredentialHint();
92
+ const client = createAwsClient(envConfig.region);
93
+ const pulled = {};
94
+ const keysOnly = {};
95
+ const placeholderKeys = [];
96
+ console.info((0, colorette_1.cyan)("📥 Pulling secrets...\n"));
97
+ for (const secretConfig of envConfig.secrets) {
98
+ try {
99
+ console.info(` Pulling: ${secretConfig.name}`);
100
+ const response = await client.send(new client_secrets_manager_1.GetSecretValueCommand({ SecretId: secretConfig.name }));
101
+ const secretString = response.SecretString ??
102
+ new TextDecoder().decode(response.SecretBinary);
103
+ const parsed = parseSecret(secretString, secretConfig);
104
+ Object.assign(pulled, parsed.envVars);
105
+ Object.assign(keysOnly, parsed.keysOnlyVars);
106
+ placeholderKeys.push(...parsed.placeholderKeys);
107
+ console.info((0, colorette_1.green)(` ✓ ${Object.keys(parsed.envVars).length + Object.keys(parsed.keysOnlyVars).length} variables\n`));
108
+ }
109
+ catch (error) {
110
+ issues.warn(`Failed to pull ${secretConfig.name}: ${error.message}`);
111
+ }
112
+ }
113
+ const envTarget = node_path_1.default.resolve(options.cwd, paths_1.ENV_PATH);
114
+ let raw = "";
115
+ try {
116
+ raw = await promises_1.default.readFile(envTarget, "utf8");
117
+ }
118
+ catch {
119
+ }
120
+ const lines = (0, env_file_1.parseEnv)(raw);
121
+ const existing = (0, env_file_1.envValues)(lines);
122
+ for (const [key, newValue] of Object.entries(pulled)) {
123
+ if (key in existing && existing[key] !== newValue) {
124
+ let overwrite = false;
125
+ if (!options.yes && !options.dryRun && process.stdin.isTTY) {
126
+ overwrite = await (0, prompts_1.confirm)({
127
+ message: `${key} differs from AWS value. Overwrite?`,
128
+ default: false,
129
+ });
130
+ }
131
+ if (overwrite)
132
+ setEntry(lines, key, newValue);
133
+ }
134
+ else if (!(key in existing)) {
135
+ setEntry(lines, key, newValue);
136
+ }
137
+ }
138
+ const addedKeysOnly = [];
139
+ for (const [key, value] of Object.entries(keysOnly)) {
140
+ if (!(key in existing)) {
141
+ setEntry(lines, key, value);
142
+ addedKeysOnly.push(key);
143
+ }
144
+ }
145
+ const next = (0, env_file_1.serializeEnv)(lines);
146
+ if (next === raw) {
147
+ console.info((0, colorette_1.cyan)("[info] .env is already up to date."));
148
+ }
149
+ else if (options.dryRun) {
150
+ console.info((0, colorette_1.yellow)(`[dry-run] would update ${paths_1.ENV_PATH} (config: ${configPath})`));
151
+ }
152
+ else {
153
+ let shouldWrite = options.yes ?? false;
154
+ if (!shouldWrite && process.stdin.isTTY) {
155
+ shouldWrite = await (0, prompts_1.confirm)({
156
+ message: "Write environment variables to .env?",
157
+ default: true,
158
+ });
159
+ }
160
+ if (!shouldWrite) {
161
+ console.info((0, colorette_1.yellow)("Write cancelled"));
162
+ return;
163
+ }
164
+ await promises_1.default.writeFile(envTarget, next, "utf8");
165
+ console.info((0, colorette_1.green)(`✓ Updated ${paths_1.ENV_PATH}`));
166
+ }
167
+ const placeholders = [...new Set([...placeholderKeys, ...addedKeysOnly])];
168
+ if (placeholders.length > 0) {
169
+ console.info((0, colorette_1.yellow)(`\n⚠️ Placeholder variables needing manual values: ${placeholders.join(", ")}`));
170
+ }
171
+ issues.assertEmpty();
172
+ console.info((0, colorette_1.bold)((0, colorette_1.green)("🍺 Done!\n")));
173
+ }
174
+ async function secretExists(client, name) {
175
+ try {
176
+ await client.send(new client_secrets_manager_1.DescribeSecretCommand({ SecretId: name }));
177
+ return true;
178
+ }
179
+ catch (error) {
180
+ if (error.name === "ResourceNotFoundException")
181
+ return false;
182
+ throw error;
183
+ }
184
+ }
185
+ async function getExistingSecret(client, name) {
186
+ try {
187
+ const response = await client.send(new client_secrets_manager_1.GetSecretValueCommand({ SecretId: name }));
188
+ return response.SecretString
189
+ ? JSON.parse(response.SecretString)
190
+ : {};
191
+ }
192
+ catch (error) {
193
+ if (error.name === "ResourceNotFoundException")
194
+ return null;
195
+ throw error;
196
+ }
197
+ }
198
+ async function runEnvPush(options) {
199
+ const { config: toolConfig } = await (0, env_tool_config_1.readEnvToolConfig)(options.cwd);
200
+ const envName = await pickEnvironment(toolConfig, options.environment);
201
+ const envConfig = toolConfig.environments[envName];
202
+ printCredentialHint();
203
+ const envTarget = node_path_1.default.resolve(options.cwd, paths_1.ENV_PATH);
204
+ let raw;
205
+ try {
206
+ raw = await promises_1.default.readFile(envTarget, "utf8");
207
+ }
208
+ catch {
209
+ throw new errors_1.CliError(`${paths_1.ENV_PATH} not found; nothing to push.`);
210
+ }
211
+ const localEnv = (0, env_file_1.envValues)((0, env_file_1.parseEnv)(raw));
212
+ const client = createAwsClient(envConfig.region);
213
+ for (const secretConfig of envConfig.secrets) {
214
+ console.info((0, colorette_1.cyan)(`\n📦 Secret: ${(0, colorette_1.bold)(secretConfig.name)}`));
215
+ let keys = secretConfig.keys ?? [];
216
+ if (keys.length === 0) {
217
+ if (!process.stdin.isTTY) {
218
+ throw new errors_1.CliError(`Secret ${secretConfig.name} has no "keys" list and cannot prompt in non-interactive mode.`);
219
+ }
220
+ keys = await (0, prompts_1.checkbox)({
221
+ message: `Select variables to push to ${secretConfig.name}:`,
222
+ choices: Object.keys(localEnv).map((key) => ({
223
+ value: key,
224
+ name: key,
225
+ })),
226
+ pageSize: 15,
227
+ });
228
+ if (keys.length === 0) {
229
+ console.info((0, colorette_1.yellow)(" - No variables selected, skipping"));
230
+ continue;
231
+ }
232
+ }
233
+ const valuesToPush = {};
234
+ for (const key of keys) {
235
+ if (key in localEnv)
236
+ valuesToPush[key] = localEnv[key];
237
+ else
238
+ console.warn((0, colorette_1.yellow)(` ⚠️ ${key} not found in ${paths_1.ENV_PATH}`));
239
+ }
240
+ const preserveKeysOnly = new Set();
241
+ if ((secretConfig.keysOnly ?? []).length > 0) {
242
+ const existing = (await secretExists(client, secretConfig.name))
243
+ ? await getExistingSecret(client, secretConfig.name)
244
+ : null;
245
+ for (const key of secretConfig.keysOnly ?? []) {
246
+ if (!existing || !(key in existing)) {
247
+ valuesToPush[key] = PLACEHOLDER;
248
+ }
249
+ else {
250
+ preserveKeysOnly.add(key);
251
+ }
252
+ }
253
+ }
254
+ if (Object.keys(valuesToPush).length === 0) {
255
+ console.info((0, colorette_1.yellow)(" - Nothing to push, skipping"));
256
+ continue;
257
+ }
258
+ const exists = await secretExists(client, secretConfig.name);
259
+ if (exists) {
260
+ const existing = (await getExistingSecret(client, secretConfig.name)) ?? {};
261
+ const added = [];
262
+ const modified = [];
263
+ for (const [key, value] of Object.entries(valuesToPush)) {
264
+ if (!(key in existing))
265
+ added.push(key);
266
+ else if (existing[key] !== value && value !== PLACEHOLDER)
267
+ modified.push(key);
268
+ }
269
+ if (added.length === 0 && modified.length === 0) {
270
+ console.info((0, colorette_1.cyan)(" ℹ️ No changes, skipping"));
271
+ continue;
272
+ }
273
+ console.info((0, colorette_1.green)(` added: ${added.join(", ") || "(none)"}`));
274
+ console.info((0, colorette_1.yellow)(` modified: ${modified.join(", ") || "(none)"}`));
275
+ if (options.dryRun) {
276
+ console.info((0, colorette_1.yellow)(" [dry-run] would update secret"));
277
+ continue;
278
+ }
279
+ const confirmed = options.yes ||
280
+ (process.stdin.isTTY &&
281
+ (await (0, prompts_1.confirm)({
282
+ message: `Update ${secretConfig.name}?`,
283
+ default: true,
284
+ })));
285
+ if (!confirmed)
286
+ continue;
287
+ const merged = { ...existing };
288
+ for (const [key, value] of Object.entries(valuesToPush)) {
289
+ if (value === PLACEHOLDER &&
290
+ preserveKeysOnly.has(key) &&
291
+ key in existing)
292
+ continue;
293
+ merged[key] = value;
294
+ }
295
+ await client.send(new client_secrets_manager_1.UpdateSecretCommand({
296
+ SecretId: secretConfig.name,
297
+ SecretString: JSON.stringify(merged, null, 2),
298
+ }));
299
+ console.info((0, colorette_1.green)(` ✓ Updated ${secretConfig.name}`));
300
+ }
301
+ else {
302
+ if (options.dryRun) {
303
+ console.info((0, colorette_1.yellow)(" [dry-run] would create secret"));
304
+ continue;
305
+ }
306
+ const confirmed = options.yes ||
307
+ (process.stdin.isTTY &&
308
+ (await (0, prompts_1.confirm)({
309
+ message: `Create new secret ${secretConfig.name}?`,
310
+ default: true,
311
+ })));
312
+ if (!confirmed)
313
+ continue;
314
+ await client.send(new client_secrets_manager_1.CreateSecretCommand({
315
+ Name: secretConfig.name,
316
+ Description: secretConfig.description || "Created by newbie env tool",
317
+ SecretString: JSON.stringify(valuesToPush, null, 2),
318
+ }));
319
+ console.info((0, colorette_1.green)(` ✓ Created ${secretConfig.name}`));
320
+ }
321
+ }
322
+ console.info((0, colorette_1.bold)((0, colorette_1.green)("\n🍺 Done!\n")));
323
+ }
324
+ //# 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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"}
@@ -0,0 +1,4 @@
1
+ import { GlobalOptions } from "./shared";
2
+ export declare function runInstall(options: GlobalOptions & {
3
+ yes?: boolean;
4
+ }): Promise<void>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runInstall = runInstall;
4
+ const prompts_1 = require("@inquirer/prompts");
5
+ const colorette_1 = require("colorette");
6
+ const pipeline_1 = require("../assemble/pipeline");
7
+ const shared_1 = require("./shared");
8
+ async function runInstall(options) {
9
+ const { ctx } = await (0, shared_1.createContext)(options, { fetch: true });
10
+ const plan = await (0, pipeline_1.planReconcile)(ctx);
11
+ const { installed, uninstalled } = plan;
12
+ if (installed.length === 0 && uninstalled.length === 0) {
13
+ await (0, pipeline_1.applyPlanned)(ctx, plan);
14
+ ctx.issues.assertEmpty();
15
+ console.info((0, colorette_1.green)("[info] Project is in sync with modules.json; wiring refreshed."));
16
+ return;
17
+ }
18
+ let message;
19
+ if (!uninstalled.length && installed.length) {
20
+ message = `Do you want to INSTALL ${(0, colorette_1.cyan)(installed.join(", "))}?`;
21
+ }
22
+ else if (uninstalled.length && !installed.length) {
23
+ message = `Do you want to UNINSTALL ${(0, colorette_1.inverse)(uninstalled.join(", "))}?`;
24
+ }
25
+ else {
26
+ message = `Do you want to UNINSTALL ${(0, colorette_1.inverse)(uninstalled.join(", "))} and INSTALL ${(0, colorette_1.cyan)(installed.join(", "))}?`;
27
+ }
28
+ if (!options.yes && !options.dryRun) {
29
+ const confirmed = await (0, prompts_1.select)({
30
+ message,
31
+ choices: [
32
+ { name: "Yes", value: "yes" },
33
+ { name: "No", value: "no" },
34
+ ],
35
+ });
36
+ if (confirmed !== "yes") {
37
+ console.info("[info] Cancelled.");
38
+ return;
39
+ }
40
+ }
41
+ await (0, pipeline_1.applyPlanned)(ctx, plan);
42
+ ctx.issues.assertEmpty();
43
+ console.info((0, colorette_1.bold)((0, colorette_1.green)("\n🍺 C O M P L E T E\n")));
44
+ }
45
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":";;AAOA,gCA6CC;AApDD,+CAA2C;AAC3C,yCAAuD;AAEvD,mDAAmE;AAEnE,qCAAwD;AAEjD,KAAK,UAAU,UAAU,CAC9B,OAA0C;IAE1C,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAa,EAAC,GAAG,CAAC,CAAC;IACtC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAIxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAA,uBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CACV,IAAA,iBAAK,EAAC,gEAAgE,CAAC,CACxE,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,GAAG,0BAA0B,IAAA,gBAAI,EAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IACpE,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,GAAG,4BAA4B,IAAA,mBAAO,EAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,4BAA4B,IAAA,mBAAO,EAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAA,gBAAI,EAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IACrH,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAA,gBAAM,EAAC;YAC7B,OAAO;YACP,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;aAC5B;SACF,CAAC,CAAC;QACH,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,IAAA,uBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,IAAA,gBAAI,EAAC,IAAA,iBAAK,EAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { PipelineContext } from "../assemble/types";
2
+ import { RegistryLocation } from "../lib/registry";
3
+ import { Sink } from "../lib/sink";
4
+ export interface GlobalOptions {
5
+ cwd: string;
6
+ dryRun: boolean;
7
+ skipPrismaGenerate?: boolean;
8
+ }
9
+ export declare function readEnvMap(cwd: string): Promise<Record<string, string>>;
10
+ export declare function printBanner(): void;
11
+ export interface ContextOptions {
12
+ ensureConfig?: boolean;
13
+ fetch?: boolean;
14
+ }
15
+ export declare function createContext(options: GlobalOptions, opts?: ContextOptions): Promise<{
16
+ ctx: PipelineContext;
17
+ sink: Sink;
18
+ registry: RegistryLocation;
19
+ }>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readEnvMap = readEnvMap;
7
+ exports.printBanner = printBanner;
8
+ exports.createContext = createContext;
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const figlet_1 = __importDefault(require("figlet"));
12
+ const colorette_1 = require("colorette");
13
+ const env_file_1 = require("../core/env-file");
14
+ const paths_1 = require("../constants/paths");
15
+ const issues_1 = require("../lib/issues");
16
+ const modules_state_1 = require("../lib/modules-state");
17
+ const registry_1 = require("../lib/registry");
18
+ const sink_1 = require("../lib/sink");
19
+ async function readEnvMap(cwd) {
20
+ try {
21
+ const raw = await promises_1.default.readFile(node_path_1.default.resolve(cwd, paths_1.ENV_PATH), "utf8");
22
+ return (0, env_file_1.envValues)((0, env_file_1.parseEnv)(raw));
23
+ }
24
+ catch {
25
+ return {};
26
+ }
27
+ }
28
+ function printBanner() {
29
+ console.info((0, colorette_1.cyan)(figlet_1.default.textSync("Newbie", {
30
+ font: "Standard",
31
+ width: 120,
32
+ whitespaceBreak: true,
33
+ })));
34
+ }
35
+ async function createContext(options, opts = {}) {
36
+ const cwd = node_path_1.default.resolve(options.cwd);
37
+ const sink = (0, sink_1.createSink)(cwd, options.dryRun);
38
+ const issues = new issues_1.IssueBag();
39
+ if (opts.ensureConfig) {
40
+ await (0, modules_state_1.ensureModulesState)(cwd, sink);
41
+ }
42
+ const state = await (0, modules_state_1.readModulesState)(cwd);
43
+ const registry = await (0, registry_1.requireRegistry)({ fetch: opts.fetch });
44
+ const ctx = {
45
+ cwd,
46
+ sink,
47
+ issues,
48
+ state,
49
+ registry,
50
+ skipPrismaGenerate: options.skipPrismaGenerate,
51
+ };
52
+ return { ctx, sink, registry };
53
+ }
54
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":";;;;;AAmBA,gCAOC;AAED,kCAUC;AAaD,sCA6BC;AAhFD,gEAAkC;AAClC,0DAA6B;AAC7B,oDAA4B;AAC5B,yCAAiC;AAEjC,+CAAuD;AACvD,8CAA8C;AAE9C,0CAAyC;AACzC,wDAA4E;AAC5E,8CAAoE;AACpE,sCAA+C;AAQxC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,mBAAI,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,IAAA,oBAAS,EAAC,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,CAAC,IAAI,CACV,IAAA,gBAAI,EACF,gBAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,GAAG;QACV,eAAe,EAAE,IAAI;KACtB,CAAC,CACH,CACF,CAAC;AACJ,CAAC;AAaM,KAAK,UAAU,aAAa,CACjC,OAAsB,EACtB,OAAuB,EAAE;IAMzB,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAA,iBAAU,EAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,iBAAQ,EAAE,CAAC;IAE9B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,IAAA,kCAAkB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,gCAAgB,EAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAoB;QAC3B,GAAG;QACH,IAAI;QACJ,MAAM;QACN,KAAK;QACL,QAAQ;QACR,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { GlobalOptions } from "./shared";
2
+ export declare function runStatus(options: GlobalOptions & {
3
+ drift?: boolean;
4
+ }): Promise<void>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runStatus = runStatus;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const paths_1 = require("../constants/paths");
9
+ const drift_1 = require("../core/drift");
10
+ const modules_state_1 = require("../core/modules-state");
11
+ const check_1 = require("../lib/check");
12
+ const drift_2 = require("../lib/drift");
13
+ const fs_util_1 = require("../lib/fs-util");
14
+ const module_install_1 = require("../lib/module-install");
15
+ const modules_state_2 = require("../lib/modules-state");
16
+ const registry_1 = require("../lib/registry");
17
+ async function runStatus(options) {
18
+ const cwd = node_path_1.default.resolve(options.cwd);
19
+ const state = await (0, modules_state_2.readModulesState)(cwd);
20
+ const registry = await (0, registry_1.resolveRegistry)({ fetch: false });
21
+ const keys = (0, modules_state_1.moduleKeys)(state);
22
+ const missingEnv = await (0, check_1.collectMissingEnv)(cwd, keys);
23
+ const modules = [];
24
+ for (const record of state.modules) {
25
+ const key = record.key;
26
+ const installed = await (0, fs_util_1.fileExists)(cwd, `${paths_1.MODULES_DIR}/${key}`);
27
+ const manifest = installed ? await (0, module_install_1.readInstalledManifest)(cwd, key) : null;
28
+ const entry = {
29
+ key,
30
+ version: record.version,
31
+ sourceCommit: record.sourceCommit,
32
+ localPatches: record.localPatches,
33
+ installed,
34
+ hasSchema: Boolean(manifest?.schema),
35
+ missingEnv: missingEnv[key] ?? [],
36
+ updateAvailable: Boolean(registry?.sourceCommit &&
37
+ record.sourceCommit &&
38
+ registry.sourceCommit !== record.sourceCommit),
39
+ };
40
+ if (options.drift && installed && registry && record.sourceCommit) {
41
+ const pristine = await (0, drift_2.snapshotPristineModule)(registry, key, record.sourceCommit);
42
+ if (pristine) {
43
+ entry.drift = (0, drift_1.diffSnapshots)(await (0, drift_2.snapshotInstalledModule)(cwd, key), pristine);
44
+ }
45
+ }
46
+ modules.push(entry);
47
+ }
48
+ const output = {
49
+ cwd,
50
+ registry: registry
51
+ ? {
52
+ available: true,
53
+ local: registry.local,
54
+ path: registry.root,
55
+ sourceCommit: registry.sourceCommit,
56
+ }
57
+ : { available: false },
58
+ modules,
59
+ };
60
+ console.info(JSON.stringify(output, null, 2));
61
+ }
62
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;;;;AAmBA,8BAwEC;AA3FD,0DAA6B;AAG7B,8CAAiD;AACjD,yCAA8C;AAC9C,yDAAmD;AACnD,wCAAiD;AACjD,wCAA+E;AAC/E,4CAA4C;AAC5C,0DAA8D;AAC9D,wDAAwD;AACxD,8CAAkD;AAQ3C,KAAK,UAAU,SAAS,CAC7B,OAA4C;IAE5C,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,IAAA,gCAAgB,EAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAA,0BAAU,EAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAatD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,IAAA,oBAAU,EAAC,GAAG,EAAE,GAAG,mBAAW,IAAI,GAAG,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,IAAA,sCAAqB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE1E,MAAM,KAAK,GAAiB;YAC1B,GAAG;YACH,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS;YACT,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;YACpC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE;YACjC,eAAe,EAAE,OAAO,CACtB,QAAQ,EAAE,YAAY;gBACpB,MAAM,CAAC,YAAY;gBACnB,QAAQ,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,CAChD;SACF,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,IAAI,SAAS,IAAI,QAAQ,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAsB,EAC3C,QAAQ,EACR,GAAG,EACH,MAAM,CAAC,YAAY,CACpB,CAAC;YACF,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,KAAK,GAAG,IAAA,qBAAa,EACzB,MAAM,IAAA,+BAAuB,EAAC,GAAG,EAAE,GAAG,CAAC,EACvC,QAAQ,CACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAG;QACH,QAAQ,EAAE,QAAQ;YAChB,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;aACpC;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QACxB,OAAO;KACR,CAAC;IAEF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { GlobalOptions } from "./shared";
2
+ import { TemplateReference } from "./create";
3
+ export interface UpdateTemplateOptions extends GlobalOptions, TemplateReference {
4
+ write?: boolean;
5
+ }
6
+ export declare function runUpdateTemplate(options: UpdateTemplateOptions): Promise<void>;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runUpdateTemplate = runUpdateTemplate;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const colorette_1 = require("colorette");
10
+ const template_sync_1 = require("../core/template-sync");
11
+ const unified_diff_1 = require("../core/unified-diff");
12
+ const errors_1 = require("../lib/errors");
13
+ const sink_1 = require("../lib/sink");
14
+ const create_1 = require("./create");
15
+ async function readOrNull(root, rel) {
16
+ try {
17
+ return await promises_1.default.readFile(node_path_1.default.join(root, rel), "utf8");
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function printChangeDiff(change) {
24
+ const label = change.file.path;
25
+ if (change.kind === "missing-markers") {
26
+ console.warn((0, colorette_1.yellow)(`! ${label}: framework markers (${template_sync_1.MARKER_START} / ${template_sync_1.MARKER_END}) ` +
27
+ "not found; skipping. Add them back to re-enable template sync."));
28
+ return;
29
+ }
30
+ const kindLabel = change.kind === "create" ? "missing in project" : "differs from template";
31
+ console.info((0, colorette_1.bold)(`\n# ${label} (${kindLabel})`));
32
+ const aLabel = change.currentComparable === null ? "/dev/null" : `a/${label}`;
33
+ const diff = (0, unified_diff_1.unifiedDiff)(change.currentComparable ?? "", change.templateComparable ?? "", aLabel, `b/${label}`);
34
+ process.stdout.write(diff);
35
+ }
36
+ async function runUpdateTemplate(options) {
37
+ const cwd = node_path_1.default.resolve(options.cwd);
38
+ const sink = (0, sink_1.createSink)(cwd, options.dryRun);
39
+ const template = await (0, create_1.resolveTemplate)(options);
40
+ console.info((0, colorette_1.cyan)(`Template source: ${template.source}`));
41
+ const projectFiles = new Map();
42
+ const templateFiles = new Map();
43
+ for (const file of template_sync_1.SKELETON_FILES) {
44
+ projectFiles.set(file.path, await readOrNull(cwd, file.path));
45
+ templateFiles.set(file.path, await readOrNull(template.root, file.path));
46
+ }
47
+ let changes;
48
+ try {
49
+ changes = (0, template_sync_1.planTemplateSync)(projectFiles, templateFiles);
50
+ }
51
+ catch (error) {
52
+ throw new errors_1.CliError(error.message);
53
+ }
54
+ if (changes.length === 0) {
55
+ console.info((0, colorette_1.green)((0, colorette_1.bold)("✓ Project skeleton is up to date with the template.")));
56
+ return;
57
+ }
58
+ const actionable = changes.filter((c) => c.kind !== "missing-markers");
59
+ for (const change of changes) {
60
+ printChangeDiff(change);
61
+ }
62
+ console.info(`\n${actionable.length} skeleton file(s) to sync: ` +
63
+ actionable.map((c) => `${c.file.path} (${c.kind})`).join(", "));
64
+ if (!options.write) {
65
+ console.info("\nNext steps:");
66
+ console.info(" newbie update-template --write # apply these changes (supports --dry-run)");
67
+ console.info(" git checkout -b chore/template-sync # then review `git diff` and open a PR");
68
+ return;
69
+ }
70
+ for (const change of actionable) {
71
+ if (change.nextContent !== null) {
72
+ await sink.writeText(change.file.path, change.nextContent);
73
+ }
74
+ }
75
+ if (options.dryRun) {
76
+ console.info("[dry-run] no files were modified");
77
+ }
78
+ else {
79
+ console.info((0, colorette_1.green)((0, colorette_1.bold)("\n✓ Skeleton files updated.")));
80
+ console.info("Review with `git diff`, then commit on a branch and open a PR.");
81
+ }
82
+ }
83
+ //# sourceMappingURL=update-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-template.js","sourceRoot":"","sources":["../../src/commands/update-template.ts"],"names":[],"mappings":"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"}