@ornexus/neocortex 3.8.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.
- package/LICENSE +56 -0
- package/README.md +661 -0
- package/install.js +453 -0
- package/install.ps1 +1478 -0
- package/install.sh +1409 -0
- package/package.json +93 -0
- package/packages/client/dist/adapters/adapter-registry.d.ts +62 -0
- package/packages/client/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/packages/client/dist/adapters/adapter-registry.js +107 -0
- package/packages/client/dist/adapters/adapter-registry.js.map +1 -0
- package/packages/client/dist/adapters/antigravity-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/antigravity-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/antigravity-adapter.js +78 -0
- package/packages/client/dist/adapters/antigravity-adapter.js.map +1 -0
- package/packages/client/dist/adapters/claude-code-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/claude-code-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/claude-code-adapter.js +80 -0
- package/packages/client/dist/adapters/claude-code-adapter.js.map +1 -0
- package/packages/client/dist/adapters/codex-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/codex-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/codex-adapter.js +81 -0
- package/packages/client/dist/adapters/codex-adapter.js.map +1 -0
- package/packages/client/dist/adapters/cursor-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/cursor-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/cursor-adapter.js +116 -0
- package/packages/client/dist/adapters/cursor-adapter.js.map +1 -0
- package/packages/client/dist/adapters/gemini-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/gemini-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/gemini-adapter.js +72 -0
- package/packages/client/dist/adapters/gemini-adapter.js.map +1 -0
- package/packages/client/dist/adapters/index.d.ts +20 -0
- package/packages/client/dist/adapters/index.d.ts.map +1 -0
- package/packages/client/dist/adapters/index.js +22 -0
- package/packages/client/dist/adapters/index.js.map +1 -0
- package/packages/client/dist/adapters/platform-detector.d.ts +47 -0
- package/packages/client/dist/adapters/platform-detector.d.ts.map +1 -0
- package/packages/client/dist/adapters/platform-detector.js +107 -0
- package/packages/client/dist/adapters/platform-detector.js.map +1 -0
- package/packages/client/dist/adapters/target-adapter.d.ts +71 -0
- package/packages/client/dist/adapters/target-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/target-adapter.js +13 -0
- package/packages/client/dist/adapters/target-adapter.js.map +1 -0
- package/packages/client/dist/adapters/vscode-adapter.d.ts +20 -0
- package/packages/client/dist/adapters/vscode-adapter.d.ts.map +1 -0
- package/packages/client/dist/adapters/vscode-adapter.js +73 -0
- package/packages/client/dist/adapters/vscode-adapter.js.map +1 -0
- package/packages/client/dist/cache/crypto-utils.d.ts +31 -0
- package/packages/client/dist/cache/crypto-utils.d.ts.map +1 -0
- package/packages/client/dist/cache/crypto-utils.js +77 -0
- package/packages/client/dist/cache/crypto-utils.js.map +1 -0
- package/packages/client/dist/cache/encrypted-cache.d.ts +31 -0
- package/packages/client/dist/cache/encrypted-cache.d.ts.map +1 -0
- package/packages/client/dist/cache/encrypted-cache.js +92 -0
- package/packages/client/dist/cache/encrypted-cache.js.map +1 -0
- package/packages/client/dist/cache/index.d.ts +14 -0
- package/packages/client/dist/cache/index.d.ts.map +1 -0
- package/packages/client/dist/cache/index.js +14 -0
- package/packages/client/dist/cache/index.js.map +1 -0
- package/packages/client/dist/cli.d.ts +15 -0
- package/packages/client/dist/cli.d.ts.map +1 -0
- package/packages/client/dist/cli.js +182 -0
- package/packages/client/dist/cli.js.map +1 -0
- package/packages/client/dist/commands/activate.d.ts +48 -0
- package/packages/client/dist/commands/activate.d.ts.map +1 -0
- package/packages/client/dist/commands/activate.js +186 -0
- package/packages/client/dist/commands/activate.js.map +1 -0
- package/packages/client/dist/commands/cache-status.d.ts +40 -0
- package/packages/client/dist/commands/cache-status.d.ts.map +1 -0
- package/packages/client/dist/commands/cache-status.js +113 -0
- package/packages/client/dist/commands/cache-status.js.map +1 -0
- package/packages/client/dist/commands/invoke.d.ts +71 -0
- package/packages/client/dist/commands/invoke.d.ts.map +1 -0
- package/packages/client/dist/commands/invoke.js +345 -0
- package/packages/client/dist/commands/invoke.js.map +1 -0
- package/packages/client/dist/config/resolver-selection.d.ts +41 -0
- package/packages/client/dist/config/resolver-selection.d.ts.map +1 -0
- package/packages/client/dist/config/resolver-selection.js +278 -0
- package/packages/client/dist/config/resolver-selection.js.map +1 -0
- package/packages/client/dist/context/context-collector.d.ts +29 -0
- package/packages/client/dist/context/context-collector.d.ts.map +1 -0
- package/packages/client/dist/context/context-collector.js +223 -0
- package/packages/client/dist/context/context-collector.js.map +1 -0
- package/packages/client/dist/context/context-sanitizer.d.ts +29 -0
- package/packages/client/dist/context/context-sanitizer.d.ts.map +1 -0
- package/packages/client/dist/context/context-sanitizer.js +146 -0
- package/packages/client/dist/context/context-sanitizer.js.map +1 -0
- package/packages/client/dist/index.d.ts +55 -0
- package/packages/client/dist/index.d.ts.map +1 -0
- package/packages/client/dist/index.js +37 -0
- package/packages/client/dist/index.js.map +1 -0
- package/packages/client/dist/license/index.d.ts +6 -0
- package/packages/client/dist/license/index.d.ts.map +1 -0
- package/packages/client/dist/license/index.js +6 -0
- package/packages/client/dist/license/index.js.map +1 -0
- package/packages/client/dist/license/license-client.d.ts +53 -0
- package/packages/client/dist/license/license-client.d.ts.map +1 -0
- package/packages/client/dist/license/license-client.js +164 -0
- package/packages/client/dist/license/license-client.js.map +1 -0
- package/packages/client/dist/machine/fingerprint.d.ts +24 -0
- package/packages/client/dist/machine/fingerprint.d.ts.map +1 -0
- package/packages/client/dist/machine/fingerprint.js +61 -0
- package/packages/client/dist/machine/fingerprint.js.map +1 -0
- package/packages/client/dist/machine/index.d.ts +6 -0
- package/packages/client/dist/machine/index.d.ts.map +1 -0
- package/packages/client/dist/machine/index.js +6 -0
- package/packages/client/dist/machine/index.js.map +1 -0
- package/packages/client/dist/resilience/circuit-breaker.d.ts +71 -0
- package/packages/client/dist/resilience/circuit-breaker.d.ts.map +1 -0
- package/packages/client/dist/resilience/circuit-breaker.js +171 -0
- package/packages/client/dist/resilience/circuit-breaker.js.map +1 -0
- package/packages/client/dist/resilience/degradation-manager.d.ts +68 -0
- package/packages/client/dist/resilience/degradation-manager.d.ts.map +1 -0
- package/packages/client/dist/resilience/degradation-manager.js +165 -0
- package/packages/client/dist/resilience/degradation-manager.js.map +1 -0
- package/packages/client/dist/resilience/freshness-indicator.d.ts +60 -0
- package/packages/client/dist/resilience/freshness-indicator.d.ts.map +1 -0
- package/packages/client/dist/resilience/freshness-indicator.js +101 -0
- package/packages/client/dist/resilience/freshness-indicator.js.map +1 -0
- package/packages/client/dist/resilience/index.d.ts +9 -0
- package/packages/client/dist/resilience/index.d.ts.map +1 -0
- package/packages/client/dist/resilience/index.js +9 -0
- package/packages/client/dist/resilience/index.js.map +1 -0
- package/packages/client/dist/resilience/recovery-detector.d.ts +60 -0
- package/packages/client/dist/resilience/recovery-detector.d.ts.map +1 -0
- package/packages/client/dist/resilience/recovery-detector.js +75 -0
- package/packages/client/dist/resilience/recovery-detector.js.map +1 -0
- package/packages/client/dist/resolvers/asset-resolver.d.ts +80 -0
- package/packages/client/dist/resolvers/asset-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/asset-resolver.js +14 -0
- package/packages/client/dist/resolvers/asset-resolver.js.map +1 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts +27 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/local-resolver.js +219 -0
- package/packages/client/dist/resolvers/local-resolver.js.map +1 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts +63 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts.map +1 -0
- package/packages/client/dist/resolvers/remote-resolver.js +207 -0
- package/packages/client/dist/resolvers/remote-resolver.js.map +1 -0
- package/packages/client/dist/telemetry/index.d.ts +6 -0
- package/packages/client/dist/telemetry/index.d.ts.map +1 -0
- package/packages/client/dist/telemetry/index.js +6 -0
- package/packages/client/dist/telemetry/index.js.map +1 -0
- package/packages/client/dist/telemetry/offline-queue.d.ts +58 -0
- package/packages/client/dist/telemetry/offline-queue.d.ts.map +1 -0
- package/packages/client/dist/telemetry/offline-queue.js +132 -0
- package/packages/client/dist/telemetry/offline-queue.js.map +1 -0
- package/packages/client/dist/types/index.d.ts +141 -0
- package/packages/client/dist/types/index.d.ts.map +1 -0
- package/packages/client/dist/types/index.js +39 -0
- package/packages/client/dist/types/index.js.map +1 -0
- package/targets-stubs/antigravity/README.md +20 -0
- package/targets-stubs/claude-code/README.md +20 -0
- package/targets-stubs/codex/README.md +20 -0
- package/targets-stubs/cursor/README.md +20 -0
- package/targets-stubs/gemini-cli/README.md +20 -0
- package/targets-stubs/vscode/README.md +20 -0
package/install.js
ADDED
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Neocortex - Cross-Platform Multi-Target Installer
|
|
5
|
+
* Interactive platform selection with @clack/prompts + OS detection + shell dispatch
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { spawn } = require('child_process');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const os = require('os');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const {
|
|
13
|
+
intro, outro, multiselect, confirm, spinner, cancel, isCancel, note, log
|
|
14
|
+
} = require('@clack/prompts');
|
|
15
|
+
const color = require('picocolors');
|
|
16
|
+
|
|
17
|
+
const SCRIPT_DIR = __dirname;
|
|
18
|
+
const args = process.argv.slice(2);
|
|
19
|
+
|
|
20
|
+
// Read version from package.json
|
|
21
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(SCRIPT_DIR, 'package.json'), 'utf8'));
|
|
22
|
+
const VERSION = pkg.version;
|
|
23
|
+
|
|
24
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
25
|
+
// PLATFORM DEFINITIONS
|
|
26
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
27
|
+
|
|
28
|
+
const PLATFORMS = [
|
|
29
|
+
{ name: 'Claude Code CLI', key: 'claude-code', tier: 1, default: true, detect: 'claude', label: 'Tier 1 - Full Pipeline' },
|
|
30
|
+
{ name: 'Cursor IDE', key: 'cursor', tier: 2, default: false, detect: 'cursor', label: 'Tier 2 - CLI Pipeline' },
|
|
31
|
+
{ name: 'VS Code / GitHub Copilot', key: 'vscode', tier: 3, default: false, detect: 'code', label: 'Tier 3 - Agent-Directed' },
|
|
32
|
+
{ name: 'Gemini CLI', key: 'gemini-cli', tier: 2, default: false, detect: 'gemini', label: 'Tier 2 - CLI Pipeline' },
|
|
33
|
+
{ name: 'OpenAI Codex CLI', key: 'codex', tier: 2, default: false, detect: 'codex', label: 'Tier 2 - CLI Pipeline' },
|
|
34
|
+
{ name: 'Google Antigravity', key: 'antigravity', tier: 3, default: false, detect: 'agy', label: 'Tier 3 - Agent-Directed', experimental: true },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
38
|
+
// PLATFORM DETECTION
|
|
39
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
40
|
+
|
|
41
|
+
function detectPlatform(command) {
|
|
42
|
+
const { execSync } = require('child_process');
|
|
43
|
+
try {
|
|
44
|
+
execSync(`which ${command} 2>/dev/null || where ${command} 2>NUL`, { stdio: 'pipe' });
|
|
45
|
+
return true;
|
|
46
|
+
} catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function detectInstalledPlatforms() {
|
|
52
|
+
const detected = {};
|
|
53
|
+
for (const p of PLATFORMS) {
|
|
54
|
+
detected[p.key] = detectPlatform(p.detect);
|
|
55
|
+
}
|
|
56
|
+
return detected;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
60
|
+
// ARGUMENT HANDLING
|
|
61
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
62
|
+
|
|
63
|
+
function parseTargetsArg() {
|
|
64
|
+
for (const arg of args) {
|
|
65
|
+
if (arg.startsWith('--targets=')) {
|
|
66
|
+
return arg.replace('--targets=', '').split(',').map(t => t.trim()).filter(Boolean);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isAutoYes() {
|
|
73
|
+
return args.includes('-y') || args.includes('--yes') || args.includes('-Yes');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isHelp() {
|
|
77
|
+
return args.includes('-h') || args.includes('--help') || args.includes('-Help');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function isDebug() {
|
|
81
|
+
return args.includes('-d') || args.includes('--debug') || args.includes('-Debug');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Declarative flag mapping: Unix CLI flags -> PowerShell parameters.
|
|
86
|
+
* To add a new flag, just add an entry here. No switch/case to update.
|
|
87
|
+
*/
|
|
88
|
+
const FLAG_MAP_WIN32 = {
|
|
89
|
+
// Auto-confirm mode
|
|
90
|
+
'-y': '-Yes',
|
|
91
|
+
'--yes': '-Yes',
|
|
92
|
+
// Debug output
|
|
93
|
+
'-d': '-Debug',
|
|
94
|
+
'--debug': '-Debug',
|
|
95
|
+
// Skip project directory creation
|
|
96
|
+
'-s': '-SkipProject',
|
|
97
|
+
'--skip-project': '-SkipProject',
|
|
98
|
+
// Force project directory creation
|
|
99
|
+
'--create-project': '-CreateProject',
|
|
100
|
+
// Suppress non-essential output
|
|
101
|
+
'-q': '-Quiet',
|
|
102
|
+
'--quiet': '-Quiet',
|
|
103
|
+
// Suppress ASCII banner
|
|
104
|
+
'--no-banner': '-NoBanner',
|
|
105
|
+
// Show help text
|
|
106
|
+
'-h': '-Help',
|
|
107
|
+
'--help': '-Help',
|
|
108
|
+
// Remove legacy artifacts from ~/.claude/
|
|
109
|
+
'--cleanup-legacy': '-CleanupLegacy',
|
|
110
|
+
// Local mode (copy IP for development)
|
|
111
|
+
'--local': '-Local',
|
|
112
|
+
// Server URL override
|
|
113
|
+
// --server-url=<url> is passed through as-is (handled by shell scripts)
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
function mapArgs(platform, originalArgs) {
|
|
117
|
+
const filtered = originalArgs.filter(a => !a.startsWith('--targets='));
|
|
118
|
+
if (platform === 'win32') {
|
|
119
|
+
return filtered.map(arg => FLAG_MAP_WIN32[arg] || arg);
|
|
120
|
+
}
|
|
121
|
+
return filtered;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
125
|
+
// SCRIPT EXECUTION
|
|
126
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
127
|
+
|
|
128
|
+
function checkScript(scriptPath) {
|
|
129
|
+
if (!fs.existsSync(scriptPath)) {
|
|
130
|
+
log.error(`Script nao encontrado: ${scriptPath}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function runWindows(selectedTargets) {
|
|
136
|
+
const scriptPath = path.join(SCRIPT_DIR, 'install.ps1');
|
|
137
|
+
checkScript(scriptPath);
|
|
138
|
+
|
|
139
|
+
const mappedArgs = mapArgs('win32', args);
|
|
140
|
+
if (selectedTargets) {
|
|
141
|
+
mappedArgs.push('-Targets', selectedTargets.join(','));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const shells = ['pwsh', 'powershell'];
|
|
145
|
+
|
|
146
|
+
function tryShell(index) {
|
|
147
|
+
if (index >= shells.length) {
|
|
148
|
+
log.error('PowerShell nao encontrado.');
|
|
149
|
+
log.info('Instale o PowerShell Core: https://aka.ms/powershell');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const shell = shells[index];
|
|
154
|
+
const psArgs = ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', scriptPath, ...mappedArgs];
|
|
155
|
+
|
|
156
|
+
const child = spawn(shell, psArgs, { stdio: 'inherit', shell: false });
|
|
157
|
+
|
|
158
|
+
child.on('error', (err) => {
|
|
159
|
+
if (err.code === 'ENOENT') tryShell(index + 1);
|
|
160
|
+
else {
|
|
161
|
+
log.error(`Falha ao executar ${shell}: ${err.message}`);
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
child.on('exit', (code) => process.exit(code || 0));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
tryShell(0);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function runUnix(selectedTargets) {
|
|
173
|
+
const scriptPath = path.join(SCRIPT_DIR, 'install.sh');
|
|
174
|
+
checkScript(scriptPath);
|
|
175
|
+
|
|
176
|
+
try { fs.chmodSync(scriptPath, '755'); } catch { }
|
|
177
|
+
|
|
178
|
+
const filteredArgs = mapArgs('unix', args);
|
|
179
|
+
if (selectedTargets) {
|
|
180
|
+
filteredArgs.push(`--targets=${selectedTargets.join(',')}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const child = spawn('bash', [scriptPath, ...filteredArgs], { stdio: 'inherit', shell: false });
|
|
184
|
+
|
|
185
|
+
child.on('error', (err) => {
|
|
186
|
+
if (err.code === 'ENOENT') {
|
|
187
|
+
const shChild = spawn('sh', [scriptPath, ...filteredArgs], { stdio: 'inherit', shell: false });
|
|
188
|
+
shChild.on('error', (e) => { log.error(`Shell nao encontrado: ${e.message}`); process.exit(1); });
|
|
189
|
+
shChild.on('exit', (code) => process.exit(code || 0));
|
|
190
|
+
} else {
|
|
191
|
+
log.error(`Falha ao executar instalador: ${err.message}`);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
child.on('exit', (code) => process.exit(code || 0));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
200
|
+
// HELP
|
|
201
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
202
|
+
|
|
203
|
+
function showHelp() {
|
|
204
|
+
console.log('');
|
|
205
|
+
console.log(color.bold(` Neocortex Installer v${VERSION}`));
|
|
206
|
+
console.log(color.dim(' Epic & Story Development Orchestrator'));
|
|
207
|
+
console.log('');
|
|
208
|
+
console.log(` ${color.dim('Uso:')} npx @ornexus/neocortex ${color.dim('[opcoes]')}`);
|
|
209
|
+
console.log('');
|
|
210
|
+
console.log(color.dim(' Opcoes:'));
|
|
211
|
+
console.log(` ${color.cyan('-y, --yes')} Modo automatico (Claude Code only)`);
|
|
212
|
+
console.log(` ${color.cyan('--targets=<lista>')} Plataformas separadas por virgula`);
|
|
213
|
+
console.log(` ${color.cyan('--create-project')} Instalar estrutura no projeto`);
|
|
214
|
+
console.log(` ${color.cyan('-s, --skip-project')} Nao perguntar sobre projeto`);
|
|
215
|
+
console.log(` ${color.cyan('-q, --quiet')} Modo silencioso`);
|
|
216
|
+
console.log(` ${color.cyan('--cleanup-legacy')} Remover artefatos legados de ~/.claude/`);
|
|
217
|
+
console.log(` ${color.cyan('--local')} Modo local (copia IP para desenvolvimento)`);
|
|
218
|
+
console.log(` ${color.cyan('--server-url=<url>')} URL do server Neocortex`);
|
|
219
|
+
console.log(` ${color.cyan('-d, --debug')} Modo debug`);
|
|
220
|
+
console.log(` ${color.cyan('-h, --help')} Mostra esta ajuda`);
|
|
221
|
+
console.log('');
|
|
222
|
+
console.log(color.dim(' Plataformas:'));
|
|
223
|
+
for (const p of PLATFORMS) {
|
|
224
|
+
const tag = p.experimental ? color.red(' [experimental]') : '';
|
|
225
|
+
console.log(` ${color.cyan(p.key.padEnd(20))} ${p.name} ${color.dim(`(${p.label})`)}${tag}`);
|
|
226
|
+
}
|
|
227
|
+
console.log('');
|
|
228
|
+
console.log(color.dim(' Exemplos:'));
|
|
229
|
+
console.log(` npx @ornexus/neocortex ${color.dim('# Selecao interativa')}`);
|
|
230
|
+
console.log(` npx @ornexus/neocortex --yes ${color.dim('# Claude Code (auto)')}`);
|
|
231
|
+
console.log(` npx @ornexus/neocortex --targets=claude-code,cursor`);
|
|
232
|
+
console.log('');
|
|
233
|
+
process.exit(0);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
237
|
+
// INTERACTIVE WIZARD
|
|
238
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
239
|
+
|
|
240
|
+
async function interactiveWizard() {
|
|
241
|
+
// Detect installed platforms
|
|
242
|
+
const s = spinner();
|
|
243
|
+
s.start('Detectando plataformas instaladas...');
|
|
244
|
+
const detected = detectInstalledPlatforms();
|
|
245
|
+
const detectedNames = PLATFORMS.filter(p => detected[p.key]).map(p => p.name);
|
|
246
|
+
s.stop(
|
|
247
|
+
detectedNames.length > 0
|
|
248
|
+
? `${detectedNames.length} plataforma(s) detectada(s): ${color.dim(detectedNames.join(', '))}`
|
|
249
|
+
: 'Nenhuma plataforma detectada automaticamente'
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
// Platform selection
|
|
253
|
+
const options = PLATFORMS.map(p => {
|
|
254
|
+
const hints = [];
|
|
255
|
+
if (detected[p.key]) hints.push('detectado');
|
|
256
|
+
if (p.experimental) hints.push('experimental');
|
|
257
|
+
hints.push(p.label);
|
|
258
|
+
|
|
259
|
+
return {
|
|
260
|
+
value: p.key,
|
|
261
|
+
label: p.name,
|
|
262
|
+
hint: hints.join(' | '),
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
const selectedPlatforms = await multiselect({
|
|
267
|
+
message: 'Selecione as plataformas de destino:',
|
|
268
|
+
options,
|
|
269
|
+
initialValues: PLATFORMS.filter(p => p.default).map(p => p.key),
|
|
270
|
+
required: true,
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
if (isCancel(selectedPlatforms)) {
|
|
274
|
+
cancel('Instalacao cancelada.');
|
|
275
|
+
process.exit(0);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Show selection summary
|
|
279
|
+
const selectedNames = selectedPlatforms.map(key => {
|
|
280
|
+
const p = PLATFORMS.find(pl => pl.key === key);
|
|
281
|
+
return p.name;
|
|
282
|
+
});
|
|
283
|
+
log.info(`Plataformas: ${color.bold(selectedNames.join(', '))}`);
|
|
284
|
+
|
|
285
|
+
// Ask about project-level installation
|
|
286
|
+
let createProject = false;
|
|
287
|
+
if (!args.includes('-s') && !args.includes('--skip-project')) {
|
|
288
|
+
const projectInstall = await confirm({
|
|
289
|
+
message: 'Instalar estrutura completa no diretorio atual do projeto?',
|
|
290
|
+
initialValue: false,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (isCancel(projectInstall)) {
|
|
294
|
+
cancel('Instalacao cancelada.');
|
|
295
|
+
process.exit(0);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
createProject = projectInstall;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return { selectedPlatforms, createProject };
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
305
|
+
// ASCII BANNER
|
|
306
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
307
|
+
|
|
308
|
+
function showAsciiBanner() {
|
|
309
|
+
const g = (n) => `\x1b[38;5;${n}m`;
|
|
310
|
+
const r = '\x1b[0m';
|
|
311
|
+
|
|
312
|
+
// True color gradient matching neocortex-cli theme (#00B4FF → #7DD3FC → #0070A8)
|
|
313
|
+
const tc = (r, g, b) => `\x1b[38;2;${r};${g};${b}m`;
|
|
314
|
+
const lines = [
|
|
315
|
+
{ text: ' ███╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ████████╗███████╗██╗ ██╗', esc: tc(0,180,255) },
|
|
316
|
+
{ text: ' ████╗ ██║██╔════╝██╔═══██╗██╔════╝██╔═══██╗██╔══██╗╚══██╔══╝██╔════╝╚██╗██╔╝', esc: tc(48,191,254) },
|
|
317
|
+
{ text: ' ██╔██╗ ██║█████╗ ██║ ██║██║ ██║ ██║██████╔╝ ██║ █████╗ ╚███╔╝', esc: tc(95,204,253) },
|
|
318
|
+
{ text: ' ██║╚██╗██║██╔══╝ ██║ ██║██║ ██║ ██║██╔══██╗ ██║ ██╔══╝ ██╔██╗', esc: tc(102,192,236) },
|
|
319
|
+
{ text: ' ██║ ╚████║███████╗╚██████╔╝╚██████╗╚██████╔╝██║ ██║ ██║ ███████╗██╔╝ ██╗', esc: tc(56,154,204) },
|
|
320
|
+
{ text: ' ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝', esc: tc(0,112,168) },
|
|
321
|
+
{ text: '', esc: '' },
|
|
322
|
+
{ text: ' ──────────────────────────────────────────────────────────────────────────────────', esc: g(236) },
|
|
323
|
+
{ text: ` Development Orchestrator | OrNexus Team v${VERSION}`, esc: g(243) },
|
|
324
|
+
];
|
|
325
|
+
|
|
326
|
+
console.log('');
|
|
327
|
+
for (const line of lines) {
|
|
328
|
+
if (line.text === '') { console.log(''); continue; }
|
|
329
|
+
console.log(`${line.esc}${line.text}${r}`);
|
|
330
|
+
}
|
|
331
|
+
console.log('');
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
335
|
+
// MAIN
|
|
336
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
337
|
+
|
|
338
|
+
async function main() {
|
|
339
|
+
const platform = os.platform();
|
|
340
|
+
|
|
341
|
+
// Debug info
|
|
342
|
+
if (isDebug()) {
|
|
343
|
+
console.log(color.dim(` [debug] Platform: ${platform} | Node: ${process.version} | Dir: ${SCRIPT_DIR}`));
|
|
344
|
+
console.log(color.dim(` [debug] Args: ${args.join(' ') || '(none)'}`));
|
|
345
|
+
console.log('');
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Help
|
|
349
|
+
if (isHelp()) {
|
|
350
|
+
showHelp();
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Determine selected targets
|
|
355
|
+
let selectedTargets = null;
|
|
356
|
+
let createProject = false;
|
|
357
|
+
|
|
358
|
+
// Priority 1: --targets= argument
|
|
359
|
+
const targetsArg = parseTargetsArg();
|
|
360
|
+
if (targetsArg) {
|
|
361
|
+
const validKeys = PLATFORMS.map(p => p.key);
|
|
362
|
+
const invalid = targetsArg.filter(t => !validKeys.includes(t));
|
|
363
|
+
if (invalid.length > 0) {
|
|
364
|
+
console.log('');
|
|
365
|
+
log.error(`Plataformas invalidas: ${color.bold(invalid.join(', '))}`);
|
|
366
|
+
log.info(`Validas: ${validKeys.join(', ')}`);
|
|
367
|
+
process.exit(1);
|
|
368
|
+
}
|
|
369
|
+
selectedTargets = targetsArg;
|
|
370
|
+
|
|
371
|
+
// In non-interactive mode with explicit targets, still check for project flag
|
|
372
|
+
if (args.includes('--create-project')) createProject = true;
|
|
373
|
+
}
|
|
374
|
+
// Priority 2: --yes flag = Claude Code only (backward compat)
|
|
375
|
+
else if (isAutoYes()) {
|
|
376
|
+
selectedTargets = ['claude-code'];
|
|
377
|
+
createProject = true;
|
|
378
|
+
}
|
|
379
|
+
// Priority 3: Interactive selection (if TTY)
|
|
380
|
+
else if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
381
|
+
showAsciiBanner();
|
|
382
|
+
intro(color.bgWhite(color.black(` Neocortex v${VERSION} `)));
|
|
383
|
+
|
|
384
|
+
const result = await interactiveWizard();
|
|
385
|
+
selectedTargets = result.selectedPlatforms;
|
|
386
|
+
createProject = result.createProject;
|
|
387
|
+
|
|
388
|
+
if (selectedTargets.length === 0) {
|
|
389
|
+
cancel('Nenhuma plataforma selecionada.');
|
|
390
|
+
process.exit(0);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Priority 4: Non-interactive, no flags = Claude Code only
|
|
394
|
+
else {
|
|
395
|
+
selectedTargets = ['claude-code'];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// ── Remote Mode Detection (Epic 43) ─────────────────────────────
|
|
399
|
+
// Detect if running as end-user (no core/ directory = npm install)
|
|
400
|
+
// vs developer (core/ exists = git clone)
|
|
401
|
+
const hasCore = fs.existsSync(path.join(SCRIPT_DIR, 'core'));
|
|
402
|
+
const hasLocalFlag = args.includes('--local');
|
|
403
|
+
const configPath = path.join(os.homedir(), '.neocortex', 'config.json');
|
|
404
|
+
const hasConfig = fs.existsSync(configPath);
|
|
405
|
+
|
|
406
|
+
if (!hasCore && !hasLocalFlag) {
|
|
407
|
+
// End-user mode: no local IP assets available
|
|
408
|
+
if (!hasConfig) {
|
|
409
|
+
// No config = not activated yet
|
|
410
|
+
log.info('');
|
|
411
|
+
log.info(color.cyan('Remote Mode Detected'));
|
|
412
|
+
log.info(color.dim('No local assets found (end-user installation).'));
|
|
413
|
+
log.info(color.dim('Content will be served by the IP Protection Server.'));
|
|
414
|
+
log.info('');
|
|
415
|
+
log.info(color.yellow('To activate your license:'));
|
|
416
|
+
log.info(color.bold(' neocortex activate NX-PRO-xxx'));
|
|
417
|
+
log.info('');
|
|
418
|
+
log.info(color.dim('Tip: Use --local to force local mode (requires core/ directory).'));
|
|
419
|
+
log.info('');
|
|
420
|
+
} else {
|
|
421
|
+
// Has config = already activated
|
|
422
|
+
try {
|
|
423
|
+
const cfg = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
424
|
+
if (cfg.mode === 'remote') {
|
|
425
|
+
log.info(color.dim(`Remote mode active (server: ${cfg.serverUrl || 'default'})`));
|
|
426
|
+
}
|
|
427
|
+
} catch { /* ignore corrupted config */ }
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Dispatch to platform-specific installer
|
|
432
|
+
if (createProject) {
|
|
433
|
+
args.push('--create-project');
|
|
434
|
+
} else if (!args.includes('-s') && !args.includes('--skip-project')) {
|
|
435
|
+
args.push('--skip-project');
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Suppress shell banner when JS wizard already showed it (avoid duplicate)
|
|
439
|
+
if (process.stdin.isTTY && process.stdout.isTTY && !args.includes('-q') && !args.includes('--quiet')) {
|
|
440
|
+
args.push('--no-banner');
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
if (platform === 'win32') {
|
|
444
|
+
runWindows(selectedTargets);
|
|
445
|
+
} else {
|
|
446
|
+
runUnix(selectedTargets);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
main().catch(err => {
|
|
451
|
+
log.error(err.message);
|
|
452
|
+
process.exit(1);
|
|
453
|
+
});
|