@phenx-inc/ctlsurf 0.1.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/bin/ctlsurf-worker.js +173 -0
- package/electron-vite.config.ts +34 -0
- package/out/headless/index.mjs +1364 -0
- package/out/headless/index.mjs.map +7 -0
- package/out/main/index.js +1131 -0
- package/out/preload/index.js +67 -0
- package/out/renderer/assets/abap-D5KwWAsZ.js +1399 -0
- package/out/renderer/assets/apex-DVGUZ64i.js +331 -0
- package/out/renderer/assets/azcli-BEAhqcuE.js +69 -0
- package/out/renderer/assets/bat-Bqkp9Cfu.js +101 -0
- package/out/renderer/assets/bicep-DIlfshcM.js +110 -0
- package/out/renderer/assets/cameligo-CLaaYNMV.js +175 -0
- package/out/renderer/assets/clojure-fcgFaMHx.js +762 -0
- package/out/renderer/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/out/renderer/assets/coffee-CzJ5oEdj.js +233 -0
- package/out/renderer/assets/cpp-CcN6f0ik.js +390 -0
- package/out/renderer/assets/csharp-BJeIuvde.js +327 -0
- package/out/renderer/assets/csp-D_3BK2Wp.js +54 -0
- package/out/renderer/assets/css-i3rI3_64.js +186 -0
- package/out/renderer/assets/css.worker-umuuUiIb.js +53567 -0
- package/out/renderer/assets/cssMode-DL0XItGB.js +208 -0
- package/out/renderer/assets/cypher-D0--_GAN.js +264 -0
- package/out/renderer/assets/dart-vLMHv35g.js +282 -0
- package/out/renderer/assets/dockerfile--oxj0cAH.js +131 -0
- package/out/renderer/assets/ecl-CeuUgzaZ.js +457 -0
- package/out/renderer/assets/editor.worker-CNgWLVu7.js +13695 -0
- package/out/renderer/assets/elixir-eLfY1jWH.js +570 -0
- package/out/renderer/assets/flow9-ZSTChSMd.js +143 -0
- package/out/renderer/assets/freemarker2-CrOEuDcF.js +995 -0
- package/out/renderer/assets/fsharp-D2uoxuLH.js +218 -0
- package/out/renderer/assets/go-brnMpFrj.js +219 -0
- package/out/renderer/assets/graphql-BeiGgjIU.js +152 -0
- package/out/renderer/assets/handlebars-D4QYaBof.js +414 -0
- package/out/renderer/assets/hcl-CrX1Es2W.js +184 -0
- package/out/renderer/assets/html-B2Dqk2ai.js +303 -0
- package/out/renderer/assets/html.worker-BT47iy49.js +29777 -0
- package/out/renderer/assets/htmlMode-CdZ0Prhd.js +224 -0
- package/out/renderer/assets/index-CJ6RsQWP.css +8108 -0
- package/out/renderer/assets/index-pZmE1QXB.js +211777 -0
- package/out/renderer/assets/ini-BcQysCTb.js +72 -0
- package/out/renderer/assets/java-Dt3iMn2o.js +233 -0
- package/out/renderer/assets/javascript-CK8zNQXj.js +72 -0
- package/out/renderer/assets/json.worker-D4JVmXIe.js +21424 -0
- package/out/renderer/assets/jsonMode-Cewaellc.js +931 -0
- package/out/renderer/assets/julia-Cm3ItYL_.js +512 -0
- package/out/renderer/assets/kotlin-Ddo1SjA5.js +253 -0
- package/out/renderer/assets/less-B7Qaxw-O.js +162 -0
- package/out/renderer/assets/lexon-C1U0m2n9.js +158 -0
- package/out/renderer/assets/liquid-Bd3GPNs2.js +235 -0
- package/out/renderer/assets/lspLanguageFeatures-DSDH7BnA.js +1841 -0
- package/out/renderer/assets/lua-hNsuGJkO.js +163 -0
- package/out/renderer/assets/m3-6ko6q9-_.js +211 -0
- package/out/renderer/assets/markdown-B0YTnTxW.js +230 -0
- package/out/renderer/assets/mdx-CCPVCrXC.js +159 -0
- package/out/renderer/assets/mips-CJm71dS3.js +199 -0
- package/out/renderer/assets/msdax-BBeIktCY.js +376 -0
- package/out/renderer/assets/mysql-BWiizXSn.js +879 -0
- package/out/renderer/assets/objective-c-B1L1C5EC.js +184 -0
- package/out/renderer/assets/pascal-DMQyD4Xk.js +252 -0
- package/out/renderer/assets/pascaligo-VA_LQ1oU.js +165 -0
- package/out/renderer/assets/perl-DC0Z0tlO.js +627 -0
- package/out/renderer/assets/pgsql-DaSGFTLp.js +852 -0
- package/out/renderer/assets/php-Bkx1qpkQ.js +501 -0
- package/out/renderer/assets/pla-DEV89yYj.js +138 -0
- package/out/renderer/assets/postiats-CVVurEnu.js +908 -0
- package/out/renderer/assets/powerquery-BQ_t1ZiQ.js +891 -0
- package/out/renderer/assets/powershell-BXiKvz7Z.js +240 -0
- package/out/renderer/assets/protobuf-CndvAUGu.js +421 -0
- package/out/renderer/assets/pug-BxCXwerb.js +403 -0
- package/out/renderer/assets/python-34jOtlcC.js +295 -0
- package/out/renderer/assets/qsharp-BWK6YLKm.js +302 -0
- package/out/renderer/assets/r-CtqYUQ6l.js +244 -0
- package/out/renderer/assets/razor-DXRw694z.js +545 -0
- package/out/renderer/assets/redis-O7gSt3oh.js +303 -0
- package/out/renderer/assets/redshift-CvYMMYZY.js +810 -0
- package/out/renderer/assets/restructuredtext-B-KQCVu_.js +175 -0
- package/out/renderer/assets/ruby-DCd4DmAr.js +512 -0
- package/out/renderer/assets/rust-B1c0VCeq.js +344 -0
- package/out/renderer/assets/sb-Chfc_wZF.js +116 -0
- package/out/renderer/assets/scala-DbVzH-3O.js +371 -0
- package/out/renderer/assets/scheme-D7PxodDG.js +109 -0
- package/out/renderer/assets/scss-B42qMyAu.js +261 -0
- package/out/renderer/assets/shell-vZEubQ82.js +222 -0
- package/out/renderer/assets/solidity-yHOxYChb.js +1368 -0
- package/out/renderer/assets/sophia-D7pU0Y1d.js +200 -0
- package/out/renderer/assets/sparql-DxuVdnRl.js +202 -0
- package/out/renderer/assets/sql-BAGepFCR.js +854 -0
- package/out/renderer/assets/st-C-b0Dh53.js +417 -0
- package/out/renderer/assets/swift-BmOZGynf.js +313 -0
- package/out/renderer/assets/systemverilog-BOC0OOdC.js +577 -0
- package/out/renderer/assets/tcl-Bb4GCwBr.js +233 -0
- package/out/renderer/assets/ts.worker-C7hW3aY-.js +225330 -0
- package/out/renderer/assets/tsMode-CmND5_wB.js +1265 -0
- package/out/renderer/assets/twig-DvgEGWAV.js +393 -0
- package/out/renderer/assets/typescript-BNNI0Euv.js +337 -0
- package/out/renderer/assets/typespec-R77Ln7Jb.js +128 -0
- package/out/renderer/assets/vb-Bm6ESA0Q.js +373 -0
- package/out/renderer/assets/wgsl-_KPae5vw.js +454 -0
- package/out/renderer/assets/xml-CgdndrNB.js +89 -0
- package/out/renderer/assets/yaml-DNWPIf1s.js +200 -0
- package/out/renderer/index.html +13 -0
- package/package.json +67 -0
- package/resources/icon.icns +0 -0
- package/resources/icon.ico +0 -0
- package/resources/icon.png +0 -0
- package/src/main/agents.ts +46 -0
- package/src/main/bridge.ts +180 -0
- package/src/main/ctlsurfApi.ts +142 -0
- package/src/main/detectMode.ts +17 -0
- package/src/main/headless.ts +182 -0
- package/src/main/index.ts +300 -0
- package/src/main/orchestrator.ts +404 -0
- package/src/main/pty.ts +65 -0
- package/src/main/settingsDir.ts +17 -0
- package/src/main/tui.ts +366 -0
- package/src/main/workerWs.ts +312 -0
- package/src/preload/index.ts +114 -0
- package/src/renderer/App.tsx +275 -0
- package/src/renderer/components/CtlsurfPanel.tsx +49 -0
- package/src/renderer/components/EditorPanel.tsx +232 -0
- package/src/renderer/components/MultiSplitPane.tsx +251 -0
- package/src/renderer/components/PaneLayout.tsx +419 -0
- package/src/renderer/components/SettingsDialog.tsx +204 -0
- package/src/renderer/components/SplitPane.tsx +82 -0
- package/src/renderer/components/StatusBar.tsx +73 -0
- package/src/renderer/components/TerminalPanel.tsx +140 -0
- package/src/renderer/index.html +12 -0
- package/src/renderer/main.tsx +10 -0
- package/src/renderer/styles.css +722 -0
- package/tsconfig.json +8 -0
- package/tsconfig.main.json +15 -0
- package/tsconfig.preload.json +14 -0
- package/tsconfig.renderer.json +15 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ctlsurf launcher
|
|
5
|
+
*
|
|
6
|
+
* Subcommands:
|
|
7
|
+
* ctlsurf update — pull latest and rebuild
|
|
8
|
+
* ctlsurf doctor — check all dependencies
|
|
9
|
+
* ctlsurf version — print version
|
|
10
|
+
*
|
|
11
|
+
* Modes (auto-detected or forced):
|
|
12
|
+
* ctlsurf --terminal — terminal TUI mode
|
|
13
|
+
* ctlsurf --desktop — Electron GUI mode
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const { execFileSync, execSync } = require('child_process')
|
|
17
|
+
const path = require('path')
|
|
18
|
+
const fs = require('fs')
|
|
19
|
+
|
|
20
|
+
const ROOT = path.resolve(__dirname, '..')
|
|
21
|
+
const args = process.argv.slice(2)
|
|
22
|
+
const subcommand = args[0]
|
|
23
|
+
|
|
24
|
+
// ─── Subcommands ──────────────────────────────────
|
|
25
|
+
|
|
26
|
+
if (subcommand === 'version' || args.includes('--version') || args.includes('-v')) {
|
|
27
|
+
try {
|
|
28
|
+
const pkg = require(path.join(ROOT, 'package.json'))
|
|
29
|
+
console.log(`ctlsurf v${pkg.version}`)
|
|
30
|
+
} catch {
|
|
31
|
+
console.log('ctlsurf (unknown version)')
|
|
32
|
+
}
|
|
33
|
+
process.exit(0)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (subcommand === 'update') {
|
|
37
|
+
const G = '\x1b[32m'
|
|
38
|
+
const Y = '\x1b[33m'
|
|
39
|
+
const B = '\x1b[34m'
|
|
40
|
+
const D = '\x1b[90m'
|
|
41
|
+
const R = '\x1b[0m'
|
|
42
|
+
|
|
43
|
+
console.log(`\n${B} ctlsurf update${R}\n`)
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
console.log(`${D}Updating via npm...${R}`)
|
|
47
|
+
execSync('npm update -g @phenx-inc/ctlsurf', { stdio: 'inherit' })
|
|
48
|
+
|
|
49
|
+
// Re-read version after update
|
|
50
|
+
let ver = '?'
|
|
51
|
+
try { ver = require(path.join(ROOT, 'package.json')).version } catch {}
|
|
52
|
+
console.log(`\n${G}✓${R} ctlsurf v${ver}\n`)
|
|
53
|
+
} catch (err) {
|
|
54
|
+
console.error(`\n${Y}!${R} Update failed: ${err.message}\n`)
|
|
55
|
+
process.exit(1)
|
|
56
|
+
}
|
|
57
|
+
process.exit(0)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (subcommand === 'doctor') {
|
|
61
|
+
const G = '\x1b[32m'
|
|
62
|
+
const Y = '\x1b[33m'
|
|
63
|
+
const R = '\x1b[0m'
|
|
64
|
+
const D = '\x1b[90m'
|
|
65
|
+
const B = '\x1b[34m'
|
|
66
|
+
|
|
67
|
+
console.log(`\n${B} ctlsurf doctor${R}\n`)
|
|
68
|
+
|
|
69
|
+
function check(name, cmd, required, fix) {
|
|
70
|
+
try {
|
|
71
|
+
const out = execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
|
|
72
|
+
const ver = out.split('\n')[0]
|
|
73
|
+
console.log(` ${G}✓${R} ${name} ${D}${ver}${R}`)
|
|
74
|
+
return true
|
|
75
|
+
} catch {
|
|
76
|
+
if (required) {
|
|
77
|
+
console.log(` ${Y}✗${R} ${name} ${Y}(required)${R}`)
|
|
78
|
+
} else {
|
|
79
|
+
console.log(` ${Y}✗${R} ${name} ${D}(optional)${R}`)
|
|
80
|
+
}
|
|
81
|
+
if (fix) console.log(` ${D}Install: ${fix}${R}`)
|
|
82
|
+
return false
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Required
|
|
87
|
+
check('Node.js', 'node --version', true)
|
|
88
|
+
check('npm', 'npm --version', true)
|
|
89
|
+
check('git', 'git --version', true)
|
|
90
|
+
|
|
91
|
+
// node-pty native addon
|
|
92
|
+
try {
|
|
93
|
+
require(path.join(ROOT, 'node_modules/node-pty'))
|
|
94
|
+
console.log(` ${G}✓${R} node-pty ${D}(native addon loaded)${R}`)
|
|
95
|
+
} catch {
|
|
96
|
+
console.log(` ${Y}✗${R} node-pty ${Y}(native addon failed to load)${R}`)
|
|
97
|
+
console.log(` ${D}Run: cd ${ROOT} && npm install --omit=dev${R}`)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
console.log('')
|
|
101
|
+
|
|
102
|
+
// Coding agents
|
|
103
|
+
check('Claude Code', 'claude --version', false, 'npm install -g @anthropic-ai/claude-code')
|
|
104
|
+
check('Codex CLI', 'codex --version', false, 'npm install -g @openai/codex')
|
|
105
|
+
|
|
106
|
+
console.log('')
|
|
107
|
+
|
|
108
|
+
// Desktop
|
|
109
|
+
try {
|
|
110
|
+
require.resolve('electron')
|
|
111
|
+
console.log(` ${G}✓${R} Electron ${D}(desktop mode available)${R}`)
|
|
112
|
+
} catch {
|
|
113
|
+
console.log(` ${D}-${R} Electron ${D}(not installed — desktop mode unavailable)${R}`)
|
|
114
|
+
console.log(` ${D}Install: cd ${ROOT} && npm install${R}`)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Build status
|
|
118
|
+
const headlessBuilt = fs.existsSync(path.join(ROOT, 'out/headless/index.mjs'))
|
|
119
|
+
const desktopBuilt = fs.existsSync(path.join(ROOT, 'out/main/index.js'))
|
|
120
|
+
console.log('')
|
|
121
|
+
console.log(` ${headlessBuilt ? G + '✓' : Y + '✗'}${R} Terminal build ${D}(out/headless/index.mjs)${R}`)
|
|
122
|
+
console.log(` ${desktopBuilt ? G + '✓' : D + '-'}${R} Desktop build ${D}(out/main/index.js)${R}`)
|
|
123
|
+
|
|
124
|
+
console.log('')
|
|
125
|
+
process.exit(0)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ─── Mode detection ───────────────────────────────
|
|
129
|
+
|
|
130
|
+
function detectMode(argv) {
|
|
131
|
+
if (argv.includes('--terminal')) return 'terminal'
|
|
132
|
+
if (argv.includes('--desktop')) return 'desktop'
|
|
133
|
+
if (process.env.SSH_CONNECTION || process.env.SSH_TTY) return 'terminal'
|
|
134
|
+
if (process.env.container || process.env.DOCKER_CONTAINER) return 'terminal'
|
|
135
|
+
if (process.platform === 'linux') {
|
|
136
|
+
if (!process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) return 'terminal'
|
|
137
|
+
}
|
|
138
|
+
return 'desktop'
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const mode = detectMode(args)
|
|
142
|
+
|
|
143
|
+
if (mode === 'desktop') {
|
|
144
|
+
let electronPath
|
|
145
|
+
try {
|
|
146
|
+
electronPath = require('electron')
|
|
147
|
+
} catch {
|
|
148
|
+
console.error('[ctlsurf] Electron not found, falling back to terminal mode')
|
|
149
|
+
runTerminal()
|
|
150
|
+
process.exit(0)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
execFileSync(String(electronPath), [ROOT, ...args], { stdio: 'inherit' })
|
|
155
|
+
} catch (err) {
|
|
156
|
+
process.exit(err.status || 0)
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
runTerminal()
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function runTerminal() {
|
|
163
|
+
const terminalPath = path.join(ROOT, 'out/headless/index.mjs')
|
|
164
|
+
if (!fs.existsSync(terminalPath)) {
|
|
165
|
+
console.error('[ctlsurf] Terminal build not found. Run: npm run build:headless')
|
|
166
|
+
process.exit(1)
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
execFileSync(process.execPath, [terminalPath, ...args], { stdio: 'inherit' })
|
|
170
|
+
} catch (err) {
|
|
171
|
+
process.exit(err.status || 0)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
|
|
2
|
+
import react from '@vitejs/plugin-react'
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
main: {
|
|
6
|
+
plugins: [externalizeDepsPlugin({
|
|
7
|
+
exclude: []
|
|
8
|
+
})],
|
|
9
|
+
build: {
|
|
10
|
+
lib: {
|
|
11
|
+
entry: 'src/main/index.ts'
|
|
12
|
+
},
|
|
13
|
+
rollupOptions: {
|
|
14
|
+
external: [
|
|
15
|
+
'electron',
|
|
16
|
+
'node-pty',
|
|
17
|
+
/^node:/
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
resolve: {
|
|
22
|
+
conditions: ['node']
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
preload: {
|
|
26
|
+
plugins: [externalizeDepsPlugin()]
|
|
27
|
+
},
|
|
28
|
+
renderer: {
|
|
29
|
+
plugins: [react()],
|
|
30
|
+
worker: {
|
|
31
|
+
format: 'es'
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
})
|