@stackweld/core 0.2.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 (172) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +498 -0
  3. package/.turbo/turbo-test.log +21 -0
  4. package/.turbo/turbo-typecheck.log +4 -0
  5. package/dist/__tests__/compatibility-scorer.test.d.ts +2 -0
  6. package/dist/__tests__/compatibility-scorer.test.d.ts.map +1 -0
  7. package/dist/__tests__/compatibility-scorer.test.js +226 -0
  8. package/dist/__tests__/compatibility-scorer.test.js.map +1 -0
  9. package/dist/__tests__/rules-engine.test.d.ts +2 -0
  10. package/dist/__tests__/rules-engine.test.d.ts.map +1 -0
  11. package/dist/__tests__/rules-engine.test.js +161 -0
  12. package/dist/__tests__/rules-engine.test.js.map +1 -0
  13. package/dist/__tests__/scaffold-orchestrator.test.d.ts +2 -0
  14. package/dist/__tests__/scaffold-orchestrator.test.d.ts.map +1 -0
  15. package/dist/__tests__/scaffold-orchestrator.test.js +149 -0
  16. package/dist/__tests__/scaffold-orchestrator.test.js.map +1 -0
  17. package/dist/__tests__/stack-engine.test.d.ts +2 -0
  18. package/dist/__tests__/stack-engine.test.d.ts.map +1 -0
  19. package/dist/__tests__/stack-engine.test.js +278 -0
  20. package/dist/__tests__/stack-engine.test.js.map +1 -0
  21. package/dist/db/database.d.ts +9 -0
  22. package/dist/db/database.d.ts.map +1 -0
  23. package/dist/db/database.js +106 -0
  24. package/dist/db/database.js.map +1 -0
  25. package/dist/db/index.d.ts +2 -0
  26. package/dist/db/index.d.ts.map +1 -0
  27. package/dist/db/index.js +2 -0
  28. package/dist/db/index.js.map +1 -0
  29. package/dist/engine/compatibility-scorer.d.ts +37 -0
  30. package/dist/engine/compatibility-scorer.d.ts.map +1 -0
  31. package/dist/engine/compatibility-scorer.js +178 -0
  32. package/dist/engine/compatibility-scorer.js.map +1 -0
  33. package/dist/engine/compose-generator.d.ts +35 -0
  34. package/dist/engine/compose-generator.d.ts.map +1 -0
  35. package/dist/engine/compose-generator.js +95 -0
  36. package/dist/engine/compose-generator.js.map +1 -0
  37. package/dist/engine/cost-estimator.d.ts +22 -0
  38. package/dist/engine/cost-estimator.d.ts.map +1 -0
  39. package/dist/engine/cost-estimator.js +451 -0
  40. package/dist/engine/cost-estimator.js.map +1 -0
  41. package/dist/engine/env-analyzer.d.ts +36 -0
  42. package/dist/engine/env-analyzer.d.ts.map +1 -0
  43. package/dist/engine/env-analyzer.js +111 -0
  44. package/dist/engine/env-analyzer.js.map +1 -0
  45. package/dist/engine/health-checker.d.ts +20 -0
  46. package/dist/engine/health-checker.d.ts.map +1 -0
  47. package/dist/engine/health-checker.js +377 -0
  48. package/dist/engine/health-checker.js.map +1 -0
  49. package/dist/engine/index.d.ts +11 -0
  50. package/dist/engine/index.d.ts.map +1 -0
  51. package/dist/engine/index.js +7 -0
  52. package/dist/engine/index.js.map +1 -0
  53. package/dist/engine/infra-generator.d.ts +26 -0
  54. package/dist/engine/infra-generator.d.ts.map +1 -0
  55. package/dist/engine/infra-generator.js +751 -0
  56. package/dist/engine/infra-generator.js.map +1 -0
  57. package/dist/engine/migration-planner.d.ts +34 -0
  58. package/dist/engine/migration-planner.d.ts.map +1 -0
  59. package/dist/engine/migration-planner.js +427 -0
  60. package/dist/engine/migration-planner.js.map +1 -0
  61. package/dist/engine/performance-profiler.d.ts +22 -0
  62. package/dist/engine/performance-profiler.d.ts.map +1 -0
  63. package/dist/engine/performance-profiler.js +292 -0
  64. package/dist/engine/performance-profiler.js.map +1 -0
  65. package/dist/engine/plugin-loader.d.ts +36 -0
  66. package/dist/engine/plugin-loader.d.ts.map +1 -0
  67. package/dist/engine/plugin-loader.js +157 -0
  68. package/dist/engine/plugin-loader.js.map +1 -0
  69. package/dist/engine/preferences.d.ts +24 -0
  70. package/dist/engine/preferences.d.ts.map +1 -0
  71. package/dist/engine/preferences.js +62 -0
  72. package/dist/engine/preferences.js.map +1 -0
  73. package/dist/engine/rules-engine.d.ts +31 -0
  74. package/dist/engine/rules-engine.d.ts.map +1 -0
  75. package/dist/engine/rules-engine.js +179 -0
  76. package/dist/engine/rules-engine.js.map +1 -0
  77. package/dist/engine/runtime-manager.d.ts +65 -0
  78. package/dist/engine/runtime-manager.d.ts.map +1 -0
  79. package/dist/engine/runtime-manager.js +181 -0
  80. package/dist/engine/runtime-manager.js.map +1 -0
  81. package/dist/engine/scaffold-orchestrator.d.ts +103 -0
  82. package/dist/engine/scaffold-orchestrator.d.ts.map +1 -0
  83. package/dist/engine/scaffold-orchestrator.js +934 -0
  84. package/dist/engine/scaffold-orchestrator.js.map +1 -0
  85. package/dist/engine/stack-detector.d.ts +21 -0
  86. package/dist/engine/stack-detector.d.ts.map +1 -0
  87. package/dist/engine/stack-detector.js +313 -0
  88. package/dist/engine/stack-detector.js.map +1 -0
  89. package/dist/engine/stack-differ.d.ts +26 -0
  90. package/dist/engine/stack-differ.d.ts.map +1 -0
  91. package/dist/engine/stack-differ.js +80 -0
  92. package/dist/engine/stack-differ.js.map +1 -0
  93. package/dist/engine/stack-engine.d.ts +54 -0
  94. package/dist/engine/stack-engine.d.ts.map +1 -0
  95. package/dist/engine/stack-engine.js +186 -0
  96. package/dist/engine/stack-engine.js.map +1 -0
  97. package/dist/engine/stack-serializer.d.ts +32 -0
  98. package/dist/engine/stack-serializer.d.ts.map +1 -0
  99. package/dist/engine/stack-serializer.js +75 -0
  100. package/dist/engine/stack-serializer.js.map +1 -0
  101. package/dist/engine/standards-linter.d.ts +34 -0
  102. package/dist/engine/standards-linter.d.ts.map +1 -0
  103. package/dist/engine/standards-linter.js +162 -0
  104. package/dist/engine/standards-linter.js.map +1 -0
  105. package/dist/engine/tech-installer.d.ts +37 -0
  106. package/dist/engine/tech-installer.d.ts.map +1 -0
  107. package/dist/engine/tech-installer.js +508 -0
  108. package/dist/engine/tech-installer.js.map +1 -0
  109. package/dist/index.d.ts +39 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +25 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/types/index.d.ts +6 -0
  114. package/dist/types/index.d.ts.map +1 -0
  115. package/dist/types/index.js +2 -0
  116. package/dist/types/index.js.map +1 -0
  117. package/dist/types/project.d.ts +33 -0
  118. package/dist/types/project.d.ts.map +1 -0
  119. package/dist/types/project.js +6 -0
  120. package/dist/types/project.js.map +1 -0
  121. package/dist/types/stack.d.ts +29 -0
  122. package/dist/types/stack.d.ts.map +1 -0
  123. package/dist/types/stack.js +6 -0
  124. package/dist/types/stack.js.map +1 -0
  125. package/dist/types/technology.d.ts +47 -0
  126. package/dist/types/technology.d.ts.map +1 -0
  127. package/dist/types/technology.js +6 -0
  128. package/dist/types/technology.js.map +1 -0
  129. package/dist/types/template.d.ts +34 -0
  130. package/dist/types/template.d.ts.map +1 -0
  131. package/dist/types/template.js +6 -0
  132. package/dist/types/template.js.map +1 -0
  133. package/dist/types/validation.d.ts +20 -0
  134. package/dist/types/validation.d.ts.map +1 -0
  135. package/dist/types/validation.js +5 -0
  136. package/dist/types/validation.js.map +1 -0
  137. package/package.json +39 -0
  138. package/src/__tests__/compatibility-scorer.test.ts +264 -0
  139. package/src/__tests__/rules-engine.test.ts +170 -0
  140. package/src/__tests__/scaffold-orchestrator.test.ts +161 -0
  141. package/src/__tests__/stack-engine.test.ts +328 -0
  142. package/src/db/database.ts +112 -0
  143. package/src/db/index.ts +1 -0
  144. package/src/engine/compatibility-scorer.ts +222 -0
  145. package/src/engine/compose-generator.ts +134 -0
  146. package/src/engine/cost-estimator.ts +498 -0
  147. package/src/engine/env-analyzer.ts +156 -0
  148. package/src/engine/health-checker.ts +421 -0
  149. package/src/engine/index.ts +17 -0
  150. package/src/engine/infra-generator.ts +837 -0
  151. package/src/engine/migration-planner.ts +496 -0
  152. package/src/engine/performance-profiler.ts +354 -0
  153. package/src/engine/plugin-loader.ts +216 -0
  154. package/src/engine/preferences.ts +85 -0
  155. package/src/engine/rules-engine.ts +204 -0
  156. package/src/engine/runtime-manager.ts +207 -0
  157. package/src/engine/scaffold-orchestrator.ts +1052 -0
  158. package/src/engine/stack-detector.ts +345 -0
  159. package/src/engine/stack-differ.ts +118 -0
  160. package/src/engine/stack-engine.ts +258 -0
  161. package/src/engine/stack-serializer.ts +95 -0
  162. package/src/engine/standards-linter.ts +210 -0
  163. package/src/engine/tech-installer.ts +650 -0
  164. package/src/index.ts +78 -0
  165. package/src/types/index.ts +10 -0
  166. package/src/types/project.ts +36 -0
  167. package/src/types/stack.ts +32 -0
  168. package/src/types/technology.ts +58 -0
  169. package/src/types/template.ts +37 -0
  170. package/src/types/validation.ts +22 -0
  171. package/tsconfig.json +10 -0
  172. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Environment Analyzer — Sync .env files and detect dangerous values.
3
+ */
4
+ export interface EnvVar {
5
+ key: string;
6
+ value: string;
7
+ line: number;
8
+ }
9
+ export interface EnvSyncResult {
10
+ missing: string[];
11
+ extra: string[];
12
+ dangerous: EnvDangerousVar[];
13
+ total: {
14
+ example: number;
15
+ actual: number;
16
+ };
17
+ }
18
+ export interface EnvDangerousVar {
19
+ key: string;
20
+ value: string;
21
+ reason: string;
22
+ }
23
+ /**
24
+ * Parse a .env file content into an array of key/value pairs.
25
+ * Skips blank lines and comments (lines starting with #).
26
+ */
27
+ export declare function parseEnvFile(content: string): EnvVar[];
28
+ /**
29
+ * Compare .env.example against .env and detect mismatches.
30
+ */
31
+ export declare function syncEnv(exampleContent: string, actualContent: string): EnvSyncResult;
32
+ /**
33
+ * Detect environment variables with insecure or placeholder values.
34
+ */
35
+ export declare function checkDangerous(vars: EnvVar[]): EnvDangerousVar[];
36
+ //# sourceMappingURL=env-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-analyzer.d.ts","sourceRoot":"","sources":["../../src/engine/env-analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BtD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,aAAa,CA6BpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAWhE"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Environment Analyzer — Sync .env files and detect dangerous values.
3
+ */
4
+ // ─── Dangerous value patterns ──────────────────────────
5
+ const PLACEHOLDER_PATTERNS = [
6
+ /change[-_]?me/i,
7
+ /changeme/i,
8
+ /replace/i,
9
+ /your[-_]/i,
10
+ /xxx/i,
11
+ /todo/i,
12
+ ];
13
+ const SENSITIVE_KEY_PATTERNS = [/SECRET/i, /KEY/i, /PASSWORD/i, /TOKEN/i];
14
+ const MIN_SECRET_LENGTH = 16;
15
+ const DEFAULT_PASSWORDS = new Set(["postgres", "admin", "root", "password", "123456"]);
16
+ // ─── Public functions ──────────────────────────────────
17
+ /**
18
+ * Parse a .env file content into an array of key/value pairs.
19
+ * Skips blank lines and comments (lines starting with #).
20
+ */
21
+ export function parseEnvFile(content) {
22
+ const vars = [];
23
+ const lines = content.split("\n");
24
+ for (let i = 0; i < lines.length; i++) {
25
+ const raw = lines[i].trim();
26
+ if (raw === "" || raw.startsWith("#"))
27
+ continue;
28
+ const eqIndex = raw.indexOf("=");
29
+ if (eqIndex === -1)
30
+ continue;
31
+ const key = raw.slice(0, eqIndex).trim();
32
+ let value = raw.slice(eqIndex + 1).trim();
33
+ // Strip surrounding quotes
34
+ if ((value.startsWith('"') && value.endsWith('"')) ||
35
+ (value.startsWith("'") && value.endsWith("'"))) {
36
+ value = value.slice(1, -1);
37
+ }
38
+ if (key) {
39
+ vars.push({ key, value, line: i + 1 });
40
+ }
41
+ }
42
+ return vars;
43
+ }
44
+ /**
45
+ * Compare .env.example against .env and detect mismatches.
46
+ */
47
+ export function syncEnv(exampleContent, actualContent) {
48
+ const exampleVars = parseEnvFile(exampleContent);
49
+ const actualVars = parseEnvFile(actualContent);
50
+ const exampleKeys = new Set(exampleVars.map((v) => v.key));
51
+ const actualKeys = new Set(actualVars.map((v) => v.key));
52
+ const missing = [];
53
+ for (const key of exampleKeys) {
54
+ if (!actualKeys.has(key)) {
55
+ missing.push(key);
56
+ }
57
+ }
58
+ const extra = [];
59
+ for (const key of actualKeys) {
60
+ if (!exampleKeys.has(key)) {
61
+ extra.push(key);
62
+ }
63
+ }
64
+ const dangerous = checkDangerous(actualVars);
65
+ return {
66
+ missing,
67
+ extra,
68
+ dangerous,
69
+ total: { example: exampleVars.length, actual: actualVars.length },
70
+ };
71
+ }
72
+ /**
73
+ * Detect environment variables with insecure or placeholder values.
74
+ */
75
+ export function checkDangerous(vars) {
76
+ const results = [];
77
+ for (const v of vars) {
78
+ const reason = detectDanger(v);
79
+ if (reason) {
80
+ results.push({ key: v.key, value: v.value, reason });
81
+ }
82
+ }
83
+ return results;
84
+ }
85
+ function detectDanger(v) {
86
+ // Check placeholder patterns
87
+ for (const pattern of PLACEHOLDER_PATTERNS) {
88
+ if (pattern.test(v.value)) {
89
+ return "Placeholder detected";
90
+ }
91
+ }
92
+ // Check default passwords
93
+ if (DEFAULT_PASSWORDS.has(v.value.toLowerCase())) {
94
+ return "Default password";
95
+ }
96
+ // Check DEBUG enabled
97
+ if (v.key.toUpperCase().includes("DEBUG") && (v.value === "true" || v.value === "1")) {
98
+ return "Debug enabled";
99
+ }
100
+ // Check short secrets
101
+ const isSensitiveKey = SENSITIVE_KEY_PATTERNS.some((p) => p.test(v.key));
102
+ if (isSensitiveKey && v.value.length > 0 && v.value.length < MIN_SECRET_LENGTH) {
103
+ return `Secret too short (${v.value.length} chars, minimum ${MIN_SECRET_LENGTH})`;
104
+ }
105
+ // Check DATABASE_URL with localhost
106
+ if (v.key === "DATABASE_URL" && v.value.includes("localhost")) {
107
+ return "Database URL points to localhost";
108
+ }
109
+ return null;
110
+ }
111
+ //# sourceMappingURL=env-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-analyzer.js","sourceRoot":"","sources":["../../src/engine/env-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Stack Health Monitor — Checks project health across multiple dimensions.
3
+ */
4
+ export interface HealthReport {
5
+ overall: "healthy" | "warning" | "critical";
6
+ checks: HealthCheck[];
7
+ summary: {
8
+ passed: number;
9
+ warnings: number;
10
+ critical: number;
11
+ };
12
+ }
13
+ export interface HealthCheck {
14
+ name: string;
15
+ status: "pass" | "warn" | "fail";
16
+ message: string;
17
+ suggestion?: string;
18
+ }
19
+ export declare function checkProjectHealth(projectPath: string): HealthReport;
20
+ //# sourceMappingURL=health-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-checker.d.ts","sourceRoot":"","sources":["../../src/engine/health-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5C,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkXD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CA6BpE"}
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Stack Health Monitor — Checks project health across multiple dimensions.
3
+ */
4
+ import { execSync } from "node:child_process";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ // ─── Helpers ──────────────────────────────────────────
8
+ function fileExists(filePath) {
9
+ return fs.existsSync(filePath);
10
+ }
11
+ function readFileContent(filePath) {
12
+ try {
13
+ return fs.readFileSync(filePath, "utf-8");
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ function execQuiet(command, cwd) {
20
+ try {
21
+ return execSync(command, { stdio: "pipe", timeout: 10000, cwd }).toString().trim();
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function getDirSizeMB(dirPath) {
28
+ const result = execQuiet(`du -sm "${dirPath}" 2>/dev/null`);
29
+ if (!result)
30
+ return null;
31
+ const match = result.match(/^(\d+)/);
32
+ return match ? parseInt(match[1], 10) : null;
33
+ }
34
+ // ─── Individual Checks ───────────────────────────────
35
+ function checkLockFile(projectPath) {
36
+ const lockFiles = ["pnpm-lock.yaml", "package-lock.json", "yarn.lock", "bun.lockb"];
37
+ for (const lockFile of lockFiles) {
38
+ if (fileExists(path.join(projectPath, lockFile))) {
39
+ return {
40
+ name: "Lock file present",
41
+ status: "pass",
42
+ message: `${lockFile} found`,
43
+ };
44
+ }
45
+ }
46
+ if (fileExists(path.join(projectPath, "package.json"))) {
47
+ return {
48
+ name: "Lock file present",
49
+ status: "warn",
50
+ message: "No lock file found (pnpm-lock.yaml, package-lock.json, yarn.lock)",
51
+ suggestion: "Run your package manager install to generate a lock file",
52
+ };
53
+ }
54
+ return {
55
+ name: "Lock file present",
56
+ status: "pass",
57
+ message: "No package.json — lock file not applicable",
58
+ };
59
+ }
60
+ function checkEnvExample(projectPath) {
61
+ const hasEnv = fileExists(path.join(projectPath, ".env"));
62
+ const hasExample = fileExists(path.join(projectPath, ".env.example"));
63
+ if (hasEnv && !hasExample) {
64
+ return {
65
+ name: ".env.example exists",
66
+ status: "warn",
67
+ message: ".env exists but no .env.example for reference",
68
+ suggestion: "Create .env.example with placeholder values for team onboarding",
69
+ };
70
+ }
71
+ if (hasExample) {
72
+ return {
73
+ name: ".env.example exists",
74
+ status: "pass",
75
+ message: ".env.example found",
76
+ };
77
+ }
78
+ return {
79
+ name: ".env.example exists",
80
+ status: "pass",
81
+ message: "No .env file — .env.example not needed",
82
+ };
83
+ }
84
+ function checkGitignore(projectPath) {
85
+ const isGitRepo = fileExists(path.join(projectPath, ".git"));
86
+ const hasGitignore = fileExists(path.join(projectPath, ".gitignore"));
87
+ if (isGitRepo && !hasGitignore) {
88
+ return {
89
+ name: ".gitignore exists",
90
+ status: "warn",
91
+ message: "Git repo without .gitignore",
92
+ suggestion: "Create a .gitignore to prevent committing unwanted files",
93
+ };
94
+ }
95
+ if (hasGitignore) {
96
+ return {
97
+ name: ".gitignore exists",
98
+ status: "pass",
99
+ message: ".gitignore found",
100
+ };
101
+ }
102
+ return {
103
+ name: ".gitignore exists",
104
+ status: "pass",
105
+ message: "Not a git repo — .gitignore not applicable",
106
+ };
107
+ }
108
+ function checkNodeModulesSize(projectPath) {
109
+ const nmPath = path.join(projectPath, "node_modules");
110
+ if (!fileExists(nmPath)) {
111
+ return {
112
+ name: "node_modules size",
113
+ status: "pass",
114
+ message: "No node_modules directory",
115
+ };
116
+ }
117
+ const sizeMB = getDirSizeMB(nmPath);
118
+ if (sizeMB === null) {
119
+ return {
120
+ name: "node_modules size",
121
+ status: "pass",
122
+ message: "Could not determine node_modules size",
123
+ };
124
+ }
125
+ if (sizeMB > 500) {
126
+ return {
127
+ name: "node_modules size",
128
+ status: "warn",
129
+ message: `node_modules: ${sizeMB}MB (consider cleaning)`,
130
+ suggestion: "Run `npx npkill` or reinstall with fewer dependencies",
131
+ };
132
+ }
133
+ return {
134
+ name: "node_modules size",
135
+ status: "pass",
136
+ message: `node_modules: ${sizeMB}MB`,
137
+ };
138
+ }
139
+ function checkDockerAvailable(projectPath) {
140
+ const hasCompose = fileExists(path.join(projectPath, "docker-compose.yml")) ||
141
+ fileExists(path.join(projectPath, "docker-compose.yaml")) ||
142
+ fileExists(path.join(projectPath, "compose.yml")) ||
143
+ fileExists(path.join(projectPath, "compose.yaml"));
144
+ if (!hasCompose) {
145
+ return {
146
+ name: "Docker available",
147
+ status: "pass",
148
+ message: "No docker-compose file — Docker check not applicable",
149
+ };
150
+ }
151
+ const dockerVersion = execQuiet("docker --version");
152
+ if (!dockerVersion) {
153
+ return {
154
+ name: "Docker available",
155
+ status: "warn",
156
+ message: "docker-compose file found but Docker is not available",
157
+ suggestion: "Install Docker: https://docs.docker.com/get-docker/",
158
+ };
159
+ }
160
+ return {
161
+ name: "Docker available",
162
+ status: "pass",
163
+ message: "Docker available for docker-compose project",
164
+ };
165
+ }
166
+ function checkTypeScriptStrict(projectPath) {
167
+ const tsconfigPath = path.join(projectPath, "tsconfig.json");
168
+ if (!fileExists(tsconfigPath)) {
169
+ return {
170
+ name: "TypeScript strict mode",
171
+ status: "pass",
172
+ message: "No tsconfig.json — TypeScript check not applicable",
173
+ };
174
+ }
175
+ const content = readFileContent(tsconfigPath);
176
+ if (!content) {
177
+ return {
178
+ name: "TypeScript strict mode",
179
+ status: "pass",
180
+ message: "Could not read tsconfig.json",
181
+ };
182
+ }
183
+ try {
184
+ // Strip comments for basic JSON parsing
185
+ const stripped = content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
186
+ const config = JSON.parse(stripped);
187
+ if (config.compilerOptions?.strict === true) {
188
+ return {
189
+ name: "TypeScript strict mode",
190
+ status: "pass",
191
+ message: "strict: true enabled",
192
+ };
193
+ }
194
+ return {
195
+ name: "TypeScript strict mode",
196
+ status: "warn",
197
+ message: "TypeScript strict mode is not enabled",
198
+ suggestion: 'Set "strict": true in tsconfig.json compilerOptions',
199
+ };
200
+ }
201
+ catch {
202
+ return {
203
+ name: "TypeScript strict mode",
204
+ status: "pass",
205
+ message: "Could not parse tsconfig.json",
206
+ };
207
+ }
208
+ }
209
+ function checkGitClean(projectPath) {
210
+ const isGitRepo = fileExists(path.join(projectPath, ".git"));
211
+ if (!isGitRepo) {
212
+ return {
213
+ name: "Git status clean",
214
+ status: "pass",
215
+ message: "Not a git repo",
216
+ };
217
+ }
218
+ const output = execQuiet("git status --porcelain", projectPath);
219
+ if (output === null) {
220
+ return {
221
+ name: "Git status clean",
222
+ status: "pass",
223
+ message: "Could not check git status",
224
+ };
225
+ }
226
+ if (output.length === 0) {
227
+ return {
228
+ name: "Git status clean",
229
+ status: "pass",
230
+ message: "Working tree is clean",
231
+ };
232
+ }
233
+ const changedFiles = output.split("\n").length;
234
+ return {
235
+ name: "Git status clean",
236
+ status: "warn",
237
+ message: `${changedFiles} uncommitted change(s)`,
238
+ suggestion: "Commit or stash your changes",
239
+ };
240
+ }
241
+ function checkEnvNotCommitted(projectPath) {
242
+ const gitignorePath = path.join(projectPath, ".gitignore");
243
+ const hasEnv = fileExists(path.join(projectPath, ".env"));
244
+ const isGitRepo = fileExists(path.join(projectPath, ".git"));
245
+ if (!hasEnv || !isGitRepo) {
246
+ return {
247
+ name: ".env not committed",
248
+ status: "pass",
249
+ message: "No .env or not a git repo",
250
+ };
251
+ }
252
+ const gitignoreContent = readFileContent(gitignorePath);
253
+ if (!gitignoreContent) {
254
+ return {
255
+ name: ".env not committed",
256
+ status: "fail",
257
+ message: ".env exists but no .gitignore found — secrets may be committed",
258
+ suggestion: 'Create .gitignore with ".env" entry',
259
+ };
260
+ }
261
+ const lines = gitignoreContent.split("\n").map((l) => l.trim());
262
+ const envIgnored = lines.some((line) => line === ".env" || line === ".env*" || line === "*.env" || line === ".env.*");
263
+ if (!envIgnored) {
264
+ return {
265
+ name: ".env not committed",
266
+ status: "fail",
267
+ message: ".env exists but is not listed in .gitignore",
268
+ suggestion: "Add .env to your .gitignore immediately",
269
+ };
270
+ }
271
+ return {
272
+ name: ".env not committed",
273
+ status: "pass",
274
+ message: ".env is listed in .gitignore",
275
+ };
276
+ }
277
+ function checkNoSecretsInCode(projectPath) {
278
+ const srcDir = path.join(projectPath, "src");
279
+ if (!fileExists(srcDir)) {
280
+ return {
281
+ name: "No secrets in code",
282
+ status: "pass",
283
+ message: "No src/ directory to scan",
284
+ };
285
+ }
286
+ const secretPatterns = [
287
+ "sk-[a-zA-Z0-9]{20,}",
288
+ "sk_live_[a-zA-Z0-9]+",
289
+ "AKIA[A-Z0-9]{16}",
290
+ "ghp_[a-zA-Z0-9]{36}",
291
+ "gho_[a-zA-Z0-9]{36}",
292
+ "glpat-[a-zA-Z0-9\\-_]{20}",
293
+ "xox[bpors]-[a-zA-Z0-9\\-]+",
294
+ ];
295
+ const pattern = secretPatterns.join("|");
296
+ const result = execQuiet(`grep -rEl '${pattern}' "${srcDir}" --include='*.ts' --include='*.js' --include='*.tsx' --include='*.jsx' --include='*.py' --include='*.go' --include='*.rs' 2>/dev/null`);
297
+ if (result && result.length > 0) {
298
+ const files = result.split("\n").filter(Boolean);
299
+ return {
300
+ name: "No secrets in code",
301
+ status: "fail",
302
+ message: `Potential secrets found in ${files.length} file(s)`,
303
+ suggestion: "Move secrets to environment variables and rotate compromised keys",
304
+ };
305
+ }
306
+ return {
307
+ name: "No secrets in code",
308
+ status: "pass",
309
+ message: "No secret patterns detected in src/",
310
+ };
311
+ }
312
+ function checkPackageJson(projectPath) {
313
+ const pkgPath = path.join(projectPath, "package.json");
314
+ if (!fileExists(pkgPath)) {
315
+ return {
316
+ name: "package.json present",
317
+ status: "pass",
318
+ message: "No package.json — not a Node.js project",
319
+ };
320
+ }
321
+ // Check if lock file exists alongside it (already handled in checkLockFile)
322
+ // Here we just verify package.json is valid
323
+ const content = readFileContent(pkgPath);
324
+ if (!content) {
325
+ return {
326
+ name: "package.json present",
327
+ status: "warn",
328
+ message: "Could not read package.json",
329
+ };
330
+ }
331
+ try {
332
+ JSON.parse(content);
333
+ return {
334
+ name: "package.json present",
335
+ status: "pass",
336
+ message: "package.json is valid JSON",
337
+ };
338
+ }
339
+ catch {
340
+ return {
341
+ name: "package.json present",
342
+ status: "warn",
343
+ message: "package.json contains invalid JSON",
344
+ suggestion: "Fix the JSON syntax in package.json",
345
+ };
346
+ }
347
+ }
348
+ // ─── Main Function ────────────────────────────────────
349
+ export function checkProjectHealth(projectPath) {
350
+ const resolvedPath = path.resolve(projectPath);
351
+ const checks = [
352
+ checkPackageJson(resolvedPath),
353
+ checkLockFile(resolvedPath),
354
+ checkGitignore(resolvedPath),
355
+ checkEnvExample(resolvedPath),
356
+ checkEnvNotCommitted(resolvedPath),
357
+ checkNoSecretsInCode(resolvedPath),
358
+ checkTypeScriptStrict(resolvedPath),
359
+ checkDockerAvailable(resolvedPath),
360
+ checkNodeModulesSize(resolvedPath),
361
+ checkGitClean(resolvedPath),
362
+ ];
363
+ const passed = checks.filter((c) => c.status === "pass").length;
364
+ const warnings = checks.filter((c) => c.status === "warn").length;
365
+ const critical = checks.filter((c) => c.status === "fail").length;
366
+ let overall = "healthy";
367
+ if (critical > 0)
368
+ overall = "critical";
369
+ else if (warnings > 0)
370
+ overall = "warning";
371
+ return {
372
+ overall,
373
+ checks,
374
+ summary: { passed, warnings, critical },
375
+ };
376
+ }
377
+ //# sourceMappingURL=health-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-checker.js","sourceRoot":"","sources":["../../src/engine/health-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { UserPreferences } from "./preferences.js";
2
+ export { getDefaultPreferences, getPreference, getPreferenceKeys, getPreferences, resetPreferences, setPreference, } from "./preferences.js";
3
+ export { RulesEngine } from "./rules-engine.js";
4
+ export type { RuntimeOptions } from "./runtime-manager.js";
5
+ export { RuntimeManager } from "./runtime-manager.js";
6
+ export type { ScaffoldOutput } from "./scaffold-orchestrator.js";
7
+ export { ScaffoldOrchestrator } from "./scaffold-orchestrator.js";
8
+ export { StackEngine } from "./stack-engine.js";
9
+ export type { InstallContext, InstallResult } from "./tech-installer.js";
10
+ export { installTechnologies } from "./tech-installer.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { getDefaultPreferences, getPreference, getPreferenceKeys, getPreferences, resetPreferences, setPreference, } from "./preferences.js";
2
+ export { RulesEngine } from "./rules-engine.js";
3
+ export { RuntimeManager } from "./runtime-manager.js";
4
+ export { ScaffoldOrchestrator } from "./scaffold-orchestrator.js";
5
+ export { StackEngine } from "./stack-engine.js";
6
+ export { installTechnologies } from "./tech-installer.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Infrastructure as Code Generator — Produces deployment files for VPS, AWS, and GCP targets.
3
+ * No disk I/O — returns structured data for writing.
4
+ */
5
+ export type DeployTarget = "vps" | "aws" | "gcp";
6
+ export interface InfraOutput {
7
+ target: DeployTarget;
8
+ files: Array<{
9
+ path: string;
10
+ content: string;
11
+ }>;
12
+ instructions: string[];
13
+ }
14
+ interface InfraTechnology {
15
+ id: string;
16
+ name: string;
17
+ category: string;
18
+ dockerImage?: string;
19
+ defaultPort?: number;
20
+ }
21
+ export declare function generateInfra(
22
+ technologies: InfraTechnology[],
23
+ projectName: string,
24
+ target: DeployTarget,
25
+ ): InfraOutput;
26
+ //# sourceMappingURL=infra-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-generator.d.ts","sourceRoot":"","sources":["../../src/engine/infra-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8vBD,wBAAgB,aAAa,CAC3B,YAAY,EAAE,eAAe,EAAE,EAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,GACnB,WAAW,CA6Cb"}