@factiii/stack 0.1.152 → 0.1.153

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/bin/stack CHANGED
@@ -18,6 +18,7 @@ const { upgrade } = require('../dist/cli/upgrade');
18
18
  const { validate } = require('../dist/cli/validate');
19
19
  const { checkConfig } = require('../dist/cli/check-config');
20
20
  const { devSync } = require('../dist/cli/dev-sync');
21
+ const { devReset } = require('../dist/cli/dev-reset');
21
22
 
22
23
  // Read version from package.json
23
24
  const packageJson = require('../package.json');
@@ -205,6 +206,15 @@ if (process.env.DEV_MODE === 'true') {
205
206
  });
206
207
  }
207
208
 
209
+ // Dev reset command
210
+ program
211
+ .command('dev-reset')
212
+ .description('Reset local config/secrets to test 0-to-deployed flow')
213
+ .option('--dry-run', 'Show what would be deleted without doing it')
214
+ .action(async (options) => {
215
+ await devReset(options);
216
+ });
217
+
208
218
  // Legacy commands (for backwards compatibility)
209
219
  program
210
220
  .command('validate')
@@ -242,6 +252,7 @@ program.addHelpText('after', '\n' +
242
252
  ' npx stack fix [--stage] Auto-fix detected issues (installs tools, creates configs)\n' +
243
253
  ' npx stack deploy --<stage> Build and deploy to an environment\n' +
244
254
  ' npx stack undeploy --<stage> Remove deployment from a server\n' +
255
+ ' npx stack dev-reset [--dry-run] Reset local config/secrets for fresh bootstrap\n' +
245
256
  '\n' +
246
257
  'SECRETS — npx stack deploy --secrets <action>\n' +
247
258
  ' list Show all stored vault secrets\n' +
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Dev Reset Command
3
+ *
4
+ * Deletes local config and secrets files so developers can re-test
5
+ * the 0-to-deployed flow (bootstrap → fix → deploy) from scratch.
6
+ *
7
+ * Only touches LOCAL files — no AWS cleanup, no server cleanup.
8
+ */
9
+ interface DevResetOptions {
10
+ dryRun?: boolean;
11
+ }
12
+ export declare function devReset(options?: DevResetOptions): Promise<void>;
13
+ export default devReset;
14
+ //# sourceMappingURL=dev-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-reset.d.ts","sourceRoot":"","sources":["../../src/cli/dev-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmFD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE3E;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Dev Reset Command
4
+ *
5
+ * Deletes local config and secrets files so developers can re-test
6
+ * the 0-to-deployed flow (bootstrap → fix → deploy) from scratch.
7
+ *
8
+ * Only touches LOCAL files — no AWS cleanup, no server cleanup.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.devReset = devReset;
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const os = __importStar(require("os"));
48
+ const readline = __importStar(require("readline"));
49
+ const config_helpers_js_1 = require("../utils/config-helpers.js");
50
+ /**
51
+ * Collect all local files that would be deleted.
52
+ * Returns array of { path, label } for display.
53
+ */
54
+ function collectFiles(rootDir, projectName) {
55
+ const files = [];
56
+ const home = os.homedir();
57
+ // Project root config files
58
+ const rootFiles = ['stack.yml', 'stackAuto.yml', 'stack.local.yml', '.env.staging', '.env.prod'];
59
+ for (const f of rootFiles) {
60
+ const fullPath = path.join(rootDir, f);
61
+ if (fs.existsSync(fullPath)) {
62
+ files.push({ path: fullPath, label: f });
63
+ }
64
+ }
65
+ // Vault directory (group_vars/)
66
+ const groupVarsDir = path.join(rootDir, 'group_vars');
67
+ if (fs.existsSync(groupVarsDir)) {
68
+ files.push({ path: groupVarsDir, label: 'group_vars/' });
69
+ }
70
+ // GitHub workflow files (stack-*.yml only)
71
+ const workflowDir = path.join(rootDir, '.github', 'workflows');
72
+ if (fs.existsSync(workflowDir)) {
73
+ try {
74
+ const workflowFiles = fs.readdirSync(workflowDir).filter(f => f.startsWith('stack-') && f.endsWith('.yml'));
75
+ for (const f of workflowFiles) {
76
+ files.push({ path: path.join(workflowDir, f), label: '.github/workflows/' + f });
77
+ }
78
+ }
79
+ catch {
80
+ // Permission error — skip
81
+ }
82
+ }
83
+ // Vault password file
84
+ const vaultPass = path.join(home, '.vault_pass');
85
+ if (fs.existsSync(vaultPass)) {
86
+ files.push({ path: vaultPass, label: '~/.vault_pass' });
87
+ }
88
+ // SSH deploy keys (generic + repo-specific)
89
+ const sshDir = path.join(home, '.ssh');
90
+ if (fs.existsSync(sshDir)) {
91
+ try {
92
+ const sshFiles = fs.readdirSync(sshDir);
93
+ for (const stage of ['staging', 'prod']) {
94
+ for (const f of sshFiles) {
95
+ if (f.startsWith(stage + '_deploy_key')) {
96
+ // Match generic keys and repo-specific keys
97
+ // e.g. staging_deploy_key, staging_deploy_key_myapp, staging_deploy_key.pub
98
+ files.push({ path: path.join(sshDir, f), label: '~/.ssh/' + f });
99
+ }
100
+ }
101
+ }
102
+ }
103
+ catch {
104
+ // Permission error — skip
105
+ }
106
+ }
107
+ return files;
108
+ }
109
+ /**
110
+ * Prompt user to type the project name for confirmation.
111
+ */
112
+ async function confirmReset(projectName) {
113
+ const rl = readline.createInterface({
114
+ input: process.stdin,
115
+ output: process.stdout,
116
+ });
117
+ return new Promise((resolve) => {
118
+ rl.question('Type "' + projectName + '" to confirm: ', (answer) => {
119
+ rl.close();
120
+ resolve(answer.trim() === projectName);
121
+ });
122
+ });
123
+ }
124
+ async function devReset(options = {}) {
125
+ const rootDir = process.cwd();
126
+ // Try to load config for project name (before we delete it)
127
+ let projectName = 'unknown';
128
+ try {
129
+ const config = (0, config_helpers_js_1.loadConfig)(rootDir);
130
+ if (config?.name) {
131
+ projectName = config.name;
132
+ }
133
+ }
134
+ catch {
135
+ // No config — use directory name
136
+ projectName = path.basename(rootDir);
137
+ }
138
+ const files = collectFiles(rootDir, projectName);
139
+ if (files.length === 0) {
140
+ console.log('Nothing to reset — no local config or secrets files found.');
141
+ return;
142
+ }
143
+ // Show what will be deleted
144
+ console.log('');
145
+ console.log('WARNING: This will DELETE local config and secrets:');
146
+ console.log('');
147
+ for (const f of files) {
148
+ console.log(' ' + (options.dryRun ? '[dry-run] ' : '') + f.label);
149
+ }
150
+ console.log('');
151
+ if (options.dryRun) {
152
+ console.log(files.length + ' file(s) would be deleted.');
153
+ console.log('Run without --dry-run to execute.');
154
+ return;
155
+ }
156
+ // Confirmation
157
+ const confirmed = await confirmReset(projectName);
158
+ if (!confirmed) {
159
+ console.log('Cancelled.');
160
+ return;
161
+ }
162
+ // Delete files
163
+ let deleted = 0;
164
+ for (const f of files) {
165
+ try {
166
+ const stat = fs.statSync(f.path);
167
+ if (stat.isDirectory()) {
168
+ fs.rmSync(f.path, { recursive: true, force: true });
169
+ }
170
+ else {
171
+ fs.unlinkSync(f.path);
172
+ }
173
+ deleted++;
174
+ }
175
+ catch (e) {
176
+ const msg = e instanceof Error ? e.message : String(e);
177
+ console.log(' Failed to delete ' + f.label + ': ' + msg);
178
+ }
179
+ }
180
+ console.log('');
181
+ console.log('Dev reset complete — ' + deleted + ' item(s) deleted');
182
+ console.log('Run `npx stack` to start fresh bootstrap');
183
+ }
184
+ exports.default = devReset;
185
+ //# sourceMappingURL=dev-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-reset.js","sourceRoot":"","sources":["../../src/cli/dev-reset.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@factiii/stack",
3
- "version": "0.1.152",
3
+ "version": "0.1.153",
4
4
  "description": "Infrastructure management package for deploying services to servers",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",