claudeos-core 1.6.2 → 1.7.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.
@@ -1,126 +1,129 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * ClaudeOS-Core — plan-installer (orchestrator)
5
- *
6
- * Modules:
7
- * - stack-detector.js — detectStack()
8
- * - structure-scanner.js — scanStructure(), resolveSharedQueryDomains()
9
- * - domain-grouper.js — splitDomainGroups(), determineActiveDomains(), selectTemplates()
10
- * - prompt-generator.js — generatePrompts()
11
- */
12
-
13
- const path = require("path");
14
- const { ensureDir, writeFileSafe } = require("../lib/safe-fs");
15
- const { detectStack } = require("./stack-detector");
16
- const { scanStructure } = require("./structure-scanner");
17
- const { splitDomainGroups, determineActiveDomains, selectTemplates } = require("./domain-grouper");
18
- const { generatePrompts } = require("./prompt-generator");
19
-
20
- const ROOT = process.env.CLAUDEOS_ROOT || path.resolve(__dirname, "../..");
21
- const GENERATED_DIR = path.join(ROOT, "claudeos-core/generated");
22
- const TEMPLATES_DIR = path.join(__dirname, "../pass-prompts/templates");
23
-
24
- async function main() {
25
- console.log("\n╔═══════════════════════════════════════╗");
26
- console.log("║ ClaudeOS-Core — Plan Installer ║");
27
- console.log("╚═══════════════════════════════════════╝\n");
28
-
29
- ensureDir(GENERATED_DIR);
30
-
31
- // Phase 1: Stack detection
32
- console.log(" [Phase 1] Detecting stack...");
33
- const stack = await detectStack(ROOT);
34
- console.log(` Language: ${stack.language || "unknown"} ${stack.languageVersion || ""}`);
35
- console.log(` Framework: ${stack.framework || "none"} ${stack.frameworkVersion || ""}`);
36
- if (!stack.language && !stack.framework) {
37
- console.warn("\n ⚠️ No language or framework detected.");
38
- console.warn(" Supported: Java, Kotlin, TypeScript, JavaScript, Python");
39
- console.warn(" Ensure you have build.gradle, package.json, pyproject.toml, or requirements.txt in the project root.\n");
40
- }
41
- console.log(` Frontend: ${stack.frontend || "none"} ${stack.frontendVersion || ""}`);
42
- console.log(` Database: ${stack.database || "none"}`);
43
- console.log(` ORM: ${stack.orm || "none"}`);
44
- console.log(` PackageMgr: ${stack.packageManager || "none"}\n`);
45
-
46
- // Phase 2: Structure scan
47
- console.log(" [Phase 2] Scanning structure...");
48
- const { domains, backendDomains, frontendDomains, rootPackage, frontend } = await scanStructure(stack, ROOT);
49
- console.log(` Backend: ${backendDomains.length} domains`);
50
- console.log(` Frontend: ${frontendDomains.length} domains`);
51
- console.log(` Total: ${domains.length} domains`);
52
- if (rootPackage) console.log(` Package: ${rootPackage}`);
53
- if (frontend.exists) console.log(` Components: ${frontend.components} components, ${frontend.pages} pages, ${frontend.hooks} hooks`);
54
- if (backendDomains.length === 0 && frontendDomains.length === 0) {
55
- console.warn("\n ⚠️ No domains detected.");
56
- console.warn(" Pass 1 will be skipped. Generated output may be minimal.\n");
57
- }
58
- console.log();
59
-
60
- // Phase 3: Template selection
61
- console.log(" [Phase 3] Selecting templates...");
62
- const templates = selectTemplates(stack);
63
- const isMultiStack = !!(templates.backend && templates.frontend);
64
- if (templates.backend) console.log(` Backend: ${templates.backend}`);
65
- if (templates.frontend) console.log(` Frontend: ${templates.frontend}`);
66
- console.log(` Mode: ${isMultiStack ? "🔀 Multi-stack" : "Single-stack"}`);
67
- console.log();
68
-
69
- // Phase 4: Domain group splitting
70
- console.log(" [Phase 4] Splitting domain groups...");
71
- const allGroups = [];
72
- if (templates.backend && backendDomains.length > 0) allGroups.push(...splitDomainGroups(backendDomains, "backend", templates.backend));
73
- if (templates.frontend && frontendDomains.length > 0) allGroups.push(...splitDomainGroups(frontendDomains, "frontend", templates.frontend));
74
- allGroups.forEach((g, i) => { g.passNum = i + 1; });
75
- allGroups.forEach((g, i) => {
76
- const icon = g.type === "backend" ? "⚙️" : "🎨";
77
- console.log(` ${icon} Group ${i + 1}: [${g.domains.join(", ")}] (${g.type}, ~${g.estimatedFiles} files)`);
78
- });
79
- console.log();
80
-
81
- // Phase 5: Active domains
82
- console.log(" [Phase 5] Active domains...");
83
- const active = determineActiveDomains(stack);
84
- Object.entries(active).forEach(([k, v]) => console.log(` ${v ? "✅" : "⏭️"} ${k}`));
85
- console.log();
86
-
87
- // Phase 6: Prompt generation
88
- const lang = process.env.CLAUDEOS_LANG || "en";
89
- console.log(` [Phase 6] Generating prompts (lang: ${lang})...`);
90
- generatePrompts(templates, lang, TEMPLATES_DIR, GENERATED_DIR);
91
- console.log();
92
-
93
- // Save outputs
94
- const defaultPort = (stack.framework === "fastapi" || stack.framework === "django") ? 8000
95
- : stack.framework === "flask" ? 5000
96
- : (stack.framework === "express" || stack.framework === "nestjs" || stack.framework === "fastify") ? 3000 : 8080;
97
- const analysis = {
98
- analyzedAt: new Date().toISOString(), lang,
99
- stack: { ...stack, port: stack.port || defaultPort },
100
- templates, isMultiStack, rootPackage,
101
- domains, backendDomains, frontendDomains, frontend,
102
- activeDomains: active,
103
- summary: {
104
- totalDomains: domains.length, backendDomains: backendDomains.length,
105
- frontendDomains: frontendDomains.length,
106
- totalFiles: domains.reduce((s, d) => s + d.totalFiles, 0),
107
- },
108
- };
109
- writeFileSafe(path.join(GENERATED_DIR, "project-analysis.json"), JSON.stringify(analysis, null, 2));
110
- console.log(" 💾 project-analysis.json saved");
111
-
112
- const domainGroups = {
113
- generatedAt: new Date().toISOString(), isMultiStack, templates,
114
- totalDomains: domains.length, totalGroups: allGroups.length,
115
- maxDomainsPerGroup: 4, maxFilesPerGroup: 40, groups: allGroups,
116
- };
117
- writeFileSafe(path.join(GENERATED_DIR, "domain-groups.json"), JSON.stringify(domainGroups, null, 2));
118
- console.log(" 💾 domain-groups.json saved\n");
119
- console.log(" ✅ Plan Installer complete\n");
120
- }
121
-
122
- main().catch(e => {
123
- console.error(`\n ❌ Plan Installer failed: ${e.message || e}`);
124
- if (e.code === "EACCES" || e.code === "EPERM") console.error(" Check file/directory permissions.");
125
- process.exit(1);
126
- });
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ClaudeOS-Core — plan-installer (orchestrator)
5
+ *
6
+ * Modules:
7
+ * - stack-detector.js — detectStack()
8
+ * - structure-scanner.js — scanStructure(), resolveSharedQueryDomains()
9
+ * - domain-grouper.js — splitDomainGroups(), determineActiveDomains(), selectTemplates()
10
+ * - prompt-generator.js — generatePrompts()
11
+ */
12
+
13
+ const path = require("path");
14
+ const { ensureDir, writeFileSafe } = require("../lib/safe-fs");
15
+ const { detectStack } = require("./stack-detector");
16
+ const { scanStructure } = require("./structure-scanner");
17
+ const { splitDomainGroups, determineActiveDomains, selectTemplates } = require("./domain-grouper");
18
+ const { generatePrompts } = require("./prompt-generator");
19
+
20
+ const ROOT = process.env.CLAUDEOS_ROOT || path.resolve(__dirname, "../..");
21
+ const GENERATED_DIR = path.join(ROOT, "claudeos-core/generated");
22
+ const TEMPLATES_DIR = path.join(__dirname, "../pass-prompts/templates");
23
+
24
+ async function main() {
25
+ console.log("\n╔═══════════════════════════════════════╗");
26
+ console.log("║ ClaudeOS-Core — Plan Installer ║");
27
+ console.log("╚═══════════════════════════════════════╝\n");
28
+
29
+ ensureDir(GENERATED_DIR);
30
+
31
+ // Phase 1: Stack detection
32
+ console.log(" [Phase 1] Detecting stack...");
33
+ const stack = await detectStack(ROOT);
34
+ console.log(` Language: ${stack.language || "unknown"} ${stack.languageVersion || ""}`);
35
+ console.log(` Framework: ${stack.framework || "none"} ${stack.frameworkVersion || ""}`);
36
+ if (!stack.language && !stack.framework) {
37
+ console.warn("\n ⚠️ No language or framework detected.");
38
+ console.warn(" Supported: Java, Kotlin, TypeScript, JavaScript, Python");
39
+ console.warn(" Ensure you have build.gradle, package.json, pyproject.toml, or requirements.txt in the project root.\n");
40
+ }
41
+ console.log(` Frontend: ${stack.frontend || "none"} ${stack.frontendVersion || ""}`);
42
+ console.log(` Database: ${stack.database || "none"}`);
43
+ console.log(` ORM: ${stack.orm || "none"}`);
44
+ console.log(` PackageMgr: ${stack.packageManager || "none"}\n`);
45
+
46
+ // Phase 2: Structure scan
47
+ console.log(" [Phase 2] Scanning structure...");
48
+ const { domains, backendDomains, frontendDomains, rootPackage, frontend } = await scanStructure(stack, ROOT);
49
+ console.log(` Backend: ${backendDomains.length} domains`);
50
+ console.log(` Frontend: ${frontendDomains.length} domains`);
51
+ console.log(` Total: ${domains.length} domains`);
52
+ if (rootPackage) console.log(` Package: ${rootPackage}`);
53
+ if (frontend.exists) console.log(` Components: ${frontend.components} components, ${frontend.pages} pages, ${frontend.hooks} hooks`);
54
+ if (backendDomains.length === 0 && frontendDomains.length === 0) {
55
+ console.warn("\n ⚠️ No domains detected.");
56
+ console.warn(" Pass 1 will be skipped. Generated output may be minimal.\n");
57
+ }
58
+ console.log();
59
+
60
+ // Phase 3: Template selection
61
+ console.log(" [Phase 3] Selecting templates...");
62
+ const templates = selectTemplates(stack);
63
+ const isMultiStack = !!(templates.backend && templates.frontend);
64
+ if (templates.backend) console.log(` Backend: ${templates.backend}`);
65
+ if (templates.frontend) console.log(` Frontend: ${templates.frontend}`);
66
+ console.log(` Mode: ${isMultiStack ? "🔀 Multi-stack" : "Single-stack"}`);
67
+ console.log();
68
+
69
+ // Phase 4: Domain group splitting
70
+ console.log(" [Phase 4] Splitting domain groups...");
71
+ const allGroups = [];
72
+ if (templates.backend && backendDomains.length > 0) allGroups.push(...splitDomainGroups(backendDomains, "backend", templates.backend));
73
+ if (templates.frontend && frontendDomains.length > 0) allGroups.push(...splitDomainGroups(frontendDomains, "frontend", templates.frontend));
74
+ allGroups.forEach((g, i) => { g.passNum = i + 1; });
75
+ allGroups.forEach((g, i) => {
76
+ const icon = g.type === "backend" ? "⚙️" : "🎨";
77
+ console.log(` ${icon} Group ${i + 1}: [${g.domains.join(", ")}] (${g.type}, ~${g.estimatedFiles} files)`);
78
+ });
79
+ console.log();
80
+
81
+ // Phase 5: Active domains
82
+ console.log(" [Phase 5] Active domains...");
83
+ const active = determineActiveDomains(stack);
84
+ Object.entries(active).forEach(([k, v]) => console.log(` ${v ? "✅" : "⏭️"} ${k}`));
85
+ console.log();
86
+
87
+ // Phase 6: Prompt generation
88
+ const lang = process.env.CLAUDEOS_LANG || "en";
89
+ console.log(` [Phase 6] Generating prompts (lang: ${lang})...`);
90
+ generatePrompts(templates, lang, TEMPLATES_DIR, GENERATED_DIR);
91
+ console.log();
92
+
93
+ // Save outputs
94
+ const defaultPort = (stack.framework === "fastapi" || stack.framework === "django") ? 8000
95
+ : stack.framework === "flask" ? 5000
96
+ : stack.framework === "vite" ? 5173
97
+ : stack.frontend === "angular" ? 4200
98
+ : stack.frontend === "nextjs" ? 3000
99
+ : (stack.framework === "express" || stack.framework === "nestjs" || stack.framework === "fastify") ? 3000 : 8080;
100
+ const analysis = {
101
+ analyzedAt: new Date().toISOString(), lang,
102
+ stack: { ...stack, port: stack.port || defaultPort },
103
+ templates, isMultiStack, rootPackage,
104
+ domains, backendDomains, frontendDomains, frontend,
105
+ activeDomains: active,
106
+ summary: {
107
+ totalDomains: domains.length, backendDomains: backendDomains.length,
108
+ frontendDomains: frontendDomains.length,
109
+ totalFiles: domains.reduce((s, d) => s + d.totalFiles, 0),
110
+ },
111
+ };
112
+ writeFileSafe(path.join(GENERATED_DIR, "project-analysis.json"), JSON.stringify(analysis, null, 2));
113
+ console.log(" 💾 project-analysis.json saved");
114
+
115
+ const domainGroups = {
116
+ generatedAt: new Date().toISOString(), isMultiStack, templates,
117
+ totalDomains: domains.length, totalGroups: allGroups.length,
118
+ maxDomainsPerGroup: 4, maxFilesPerGroup: 40, groups: allGroups,
119
+ };
120
+ writeFileSafe(path.join(GENERATED_DIR, "domain-groups.json"), JSON.stringify(domainGroups, null, 2));
121
+ console.log(" 💾 domain-groups.json saved\n");
122
+ console.log(" ✅ Plan Installer complete\n");
123
+ }
124
+
125
+ main().catch(e => {
126
+ console.error(`\n ❌ Plan Installer failed: ${e.message || e}`);
127
+ if (e.code === "EACCES" || e.code === "EPERM") console.error(" Check file/directory permissions.");
128
+ process.exit(1);
129
+ });