scaffoldry 1.0.1

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/dist/bin.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
package/dist/bin.js ADDED
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createAppCommand,
4
+ devCommand,
5
+ doctorCommand,
6
+ initCommand,
7
+ loginCommand,
8
+ logoutCommand,
9
+ migrateCommand,
10
+ migrateCreateCommand,
11
+ planCommand,
12
+ renameCommand,
13
+ secretRotateCommand,
14
+ secretSetCommand,
15
+ upgradeCommand
16
+ } from "./chunk-AA2UXYNR.js";
17
+ import {
18
+ setupAllCommand,
19
+ setupDatabaseCommand,
20
+ setupEmailCommand,
21
+ setupStorageCommand,
22
+ setupStripeCommand
23
+ } from "./chunk-XIP7YNKZ.js";
24
+ import "./chunk-WOS3F5LR.js";
25
+
26
+ // src/bin.ts
27
+ import { program } from "commander";
28
+ var pkg = {
29
+ name: "scaffoldry-cli",
30
+ version: "1.0.0",
31
+ description: "CLI for scaffolding and managing Scaffoldry projects"
32
+ };
33
+ program.name("scaffoldry").description(pkg.description).version(pkg.version);
34
+ program.command("login").description("Authenticate with your Scaffoldry license key").action(async () => {
35
+ try {
36
+ await loginCommand();
37
+ } catch (error) {
38
+ console.error("Error:", error);
39
+ process.exit(1);
40
+ }
41
+ });
42
+ program.command("logout").description("Clear stored license credentials").action(async () => {
43
+ try {
44
+ await logoutCommand();
45
+ } catch (error) {
46
+ console.error("Error:", error);
47
+ process.exit(1);
48
+ }
49
+ });
50
+ program.command("init [dir]").description("Create a new Scaffoldry project").option("-c, --config <file>", "Path to JSON config file for non-interactive mode").option("-y, --yes", "Skip confirmation prompts (use with --config)").action(async (dir, options) => {
51
+ try {
52
+ await initCommand(dir, { configFile: options.config, skipPrompts: options.yes });
53
+ } catch (error) {
54
+ console.error("Error:", error);
55
+ process.exit(1);
56
+ }
57
+ });
58
+ var setup = program.command("setup").description("Configure services for your project");
59
+ setup.command("stripe").description("Configure Stripe for billing").action(async () => {
60
+ try {
61
+ await setupStripeCommand();
62
+ } catch (error) {
63
+ console.error("Error:", error);
64
+ process.exit(1);
65
+ }
66
+ });
67
+ setup.command("database").description("Configure Neon PostgreSQL database").action(async () => {
68
+ try {
69
+ await setupDatabaseCommand();
70
+ } catch (error) {
71
+ console.error("Error:", error);
72
+ process.exit(1);
73
+ }
74
+ });
75
+ setup.command("email").description("Configure Resend for transactional email").action(async () => {
76
+ try {
77
+ await setupEmailCommand();
78
+ } catch (error) {
79
+ console.error("Error:", error);
80
+ process.exit(1);
81
+ }
82
+ });
83
+ setup.command("storage").description("Configure AWS S3 for file storage").action(async () => {
84
+ try {
85
+ await setupStorageCommand();
86
+ } catch (error) {
87
+ console.error("Error:", error);
88
+ process.exit(1);
89
+ }
90
+ });
91
+ setup.command("all").description("Run all setup wizards").action(async () => {
92
+ try {
93
+ await setupAllCommand();
94
+ } catch (error) {
95
+ console.error("Error:", error);
96
+ process.exit(1);
97
+ }
98
+ });
99
+ program.command("dev").description("Start development server with all services").option("--skip-stripe", "Skip Stripe CLI webhook listener").option("--skip-jobs", "Skip background job processor").option("-p, --port <port>", "Port for Next.js dev server", "3000").action(async (options) => {
100
+ try {
101
+ await devCommand({
102
+ skipStripe: options.skipStripe,
103
+ skipJobs: options.skipJobs,
104
+ port: parseInt(options.port, 10)
105
+ });
106
+ } catch (error) {
107
+ console.error("Error:", error);
108
+ process.exit(1);
109
+ }
110
+ });
111
+ program.command("doctor").description("Diagnose and fix project configuration issues").action(async () => {
112
+ try {
113
+ await doctorCommand();
114
+ } catch (error) {
115
+ console.error("Error:", error);
116
+ process.exit(1);
117
+ }
118
+ });
119
+ var secret = program.command("secret").description("Manage secrets and environment variables");
120
+ secret.command("set <key> <value>").description("Set an environment variable in .env.local").action(async (key, value) => {
121
+ try {
122
+ await secretSetCommand({ key, value });
123
+ } catch (error) {
124
+ console.error("Error:", error);
125
+ process.exit(1);
126
+ }
127
+ });
128
+ secret.command("rotate <type>").description("Rotate a secret (types: auth, db)").action(async (type) => {
129
+ try {
130
+ await secretRotateCommand({ type });
131
+ } catch (error) {
132
+ console.error("Error:", error);
133
+ process.exit(1);
134
+ }
135
+ });
136
+ program.command("plan").description("Generate AI-ready implementation plan with Master Spec context").action(async () => {
137
+ try {
138
+ await planCommand();
139
+ } catch (error) {
140
+ console.error("Error:", error);
141
+ process.exit(1);
142
+ }
143
+ });
144
+ program.command("rename").description("Rename the project (replace Scaffoldry markers)").requiredOption("--product-name <name>", "The new product name").option("--product-slug <slug>", "The product slug (defaults to kebab-case of name)").option("--primary-domain <domain>", "The primary domain (defaults to slug.com)").option("--npm-scope <scope>", "The npm scope (defaults to @slug)").option("--dry-run", "Show what would be changed without making changes").action(async (options) => {
145
+ try {
146
+ await renameCommand({
147
+ productName: options.productName,
148
+ productSlug: options.productSlug,
149
+ primaryDomain: options.primaryDomain,
150
+ npmScope: options.npmScope,
151
+ dryRun: options.dryRun
152
+ });
153
+ } catch (error) {
154
+ console.error("Error:", error);
155
+ process.exit(1);
156
+ }
157
+ });
158
+ program.command("create-app <slug>").description("Create a new app in the apps/ directory").requiredOption("--name <name>", "The display name for the app").action(async (slug, options) => {
159
+ try {
160
+ await createAppCommand({
161
+ slug,
162
+ name: options.name
163
+ });
164
+ } catch (error) {
165
+ console.error("Error:", error);
166
+ process.exit(1);
167
+ }
168
+ });
169
+ program.command("upgrade").description("Check for and apply Scaffoldry package updates").option("--check", "Only check for updates, don't apply them").option("--dry-run", "Show what would be updated without making changes").option("--breaking", "Include breaking (major version) updates").action(async (options) => {
170
+ try {
171
+ await upgradeCommand({
172
+ check: options.check,
173
+ dryRun: options.dryRun,
174
+ breaking: options.breaking
175
+ });
176
+ } catch (error) {
177
+ console.error("Error:", error);
178
+ process.exit(1);
179
+ }
180
+ });
181
+ program.command("migrate").description("Run all pending database migrations").action(async () => {
182
+ try {
183
+ await migrateCommand();
184
+ } catch (error) {
185
+ console.error("Error:", error);
186
+ process.exit(1);
187
+ }
188
+ });
189
+ program.command("migrate:create <name>").description("Create a new migration file").action(async (name) => {
190
+ try {
191
+ await migrateCreateCommand({ name });
192
+ } catch (error) {
193
+ console.error("Error:", error);
194
+ process.exit(1);
195
+ }
196
+ });
197
+ program.parse();
198
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from \"commander\";\nimport {\n initCommand,\n loginCommand,\n logoutCommand,\n renameCommand,\n createAppCommand,\n upgradeCommand,\n migrateCommand,\n migrateCreateCommand,\n setupStripeCommand,\n setupDatabaseCommand,\n setupEmailCommand,\n setupStorageCommand,\n setupAllCommand,\n devCommand,\n doctorCommand,\n secretSetCommand,\n secretRotateCommand,\n planCommand,\n} from \"./commands/index.js\";\n\nconst pkg = {\n name: \"scaffoldry-cli\",\n version: \"1.0.0\",\n description: \"CLI for scaffolding and managing Scaffoldry projects\",\n};\n\nprogram\n .name(\"scaffoldry\")\n .description(pkg.description)\n .version(pkg.version);\n\n// Login command\nprogram\n .command(\"login\")\n .description(\"Authenticate with your Scaffoldry license key\")\n .action(async () => {\n try {\n await loginCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Logout command\nprogram\n .command(\"logout\")\n .description(\"Clear stored license credentials\")\n .action(async () => {\n try {\n await logoutCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Init command\nprogram\n .command(\"init [dir]\")\n .description(\"Create a new Scaffoldry project\")\n .option(\"-c, --config <file>\", \"Path to JSON config file for non-interactive mode\")\n .option(\"-y, --yes\", \"Skip confirmation prompts (use with --config)\")\n .action(async (dir: string | undefined, options: { config?: string; yes?: boolean }) => {\n try {\n await initCommand(dir, { configFile: options.config, skipPrompts: options.yes });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Setup command with subcommands\nconst setup = program\n .command(\"setup\")\n .description(\"Configure services for your project\");\n\nsetup\n .command(\"stripe\")\n .description(\"Configure Stripe for billing\")\n .action(async () => {\n try {\n await setupStripeCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nsetup\n .command(\"database\")\n .description(\"Configure Neon PostgreSQL database\")\n .action(async () => {\n try {\n await setupDatabaseCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nsetup\n .command(\"email\")\n .description(\"Configure Resend for transactional email\")\n .action(async () => {\n try {\n await setupEmailCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nsetup\n .command(\"storage\")\n .description(\"Configure AWS S3 for file storage\")\n .action(async () => {\n try {\n await setupStorageCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nsetup\n .command(\"all\")\n .description(\"Run all setup wizards\")\n .action(async () => {\n try {\n await setupAllCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Dev command\nprogram\n .command(\"dev\")\n .description(\"Start development server with all services\")\n .option(\"--skip-stripe\", \"Skip Stripe CLI webhook listener\")\n .option(\"--skip-jobs\", \"Skip background job processor\")\n .option(\"-p, --port <port>\", \"Port for Next.js dev server\", \"3000\")\n .action(async (options) => {\n try {\n await devCommand({\n skipStripe: options.skipStripe,\n skipJobs: options.skipJobs,\n port: parseInt(options.port, 10),\n });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Doctor command\nprogram\n .command(\"doctor\")\n .description(\"Diagnose and fix project configuration issues\")\n .action(async () => {\n try {\n await doctorCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Secret command with subcommands\nconst secret = program\n .command(\"secret\")\n .description(\"Manage secrets and environment variables\");\n\nsecret\n .command(\"set <key> <value>\")\n .description(\"Set an environment variable in .env.local\")\n .action(async (key: string, value: string) => {\n try {\n await secretSetCommand({ key, value });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nsecret\n .command(\"rotate <type>\")\n .description(\"Rotate a secret (types: auth, db)\")\n .action(async (type: string) => {\n try {\n await secretRotateCommand({ type: type as \"auth\" | \"db\" });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Plan command\nprogram\n .command(\"plan\")\n .description(\"Generate AI-ready implementation plan with Master Spec context\")\n .action(async () => {\n try {\n await planCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Rename command\nprogram\n .command(\"rename\")\n .description(\"Rename the project (replace Scaffoldry markers)\")\n .requiredOption(\"--product-name <name>\", \"The new product name\")\n .option(\"--product-slug <slug>\", \"The product slug (defaults to kebab-case of name)\")\n .option(\"--primary-domain <domain>\", \"The primary domain (defaults to slug.com)\")\n .option(\"--npm-scope <scope>\", \"The npm scope (defaults to @slug)\")\n .option(\"--dry-run\", \"Show what would be changed without making changes\")\n .action(async (options) => {\n try {\n await renameCommand({\n productName: options.productName,\n productSlug: options.productSlug,\n primaryDomain: options.primaryDomain,\n npmScope: options.npmScope,\n dryRun: options.dryRun,\n });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Create-app command\nprogram\n .command(\"create-app <slug>\")\n .description(\"Create a new app in the apps/ directory\")\n .requiredOption(\"--name <name>\", \"The display name for the app\")\n .action(async (slug: string, options) => {\n try {\n await createAppCommand({\n slug,\n name: options.name,\n });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Upgrade command\nprogram\n .command(\"upgrade\")\n .description(\"Check for and apply Scaffoldry package updates\")\n .option(\"--check\", \"Only check for updates, don't apply them\")\n .option(\"--dry-run\", \"Show what would be updated without making changes\")\n .option(\"--breaking\", \"Include breaking (major version) updates\")\n .action(async (options) => {\n try {\n await upgradeCommand({\n check: options.check,\n dryRun: options.dryRun,\n breaking: options.breaking,\n });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Migrate command\nprogram\n .command(\"migrate\")\n .description(\"Run all pending database migrations\")\n .action(async () => {\n try {\n await migrateCommand();\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\n// Migrate:create command\nprogram\n .command(\"migrate:create <name>\")\n .description(\"Create a new migration file\")\n .action(async (name: string) => {\n try {\n await migrateCreateCommand({ name });\n } catch (error) {\n console.error(\"Error:\", error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n"],"mappings":"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","names":[]}