claws-code 0.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/.claude/commands/claws-auto.md +90 -0
- package/.claude/commands/claws-bin.md +28 -0
- package/.claude/commands/claws-cleanup.md +28 -0
- package/.claude/commands/claws-do.md +82 -0
- package/.claude/commands/claws-fix.md +40 -0
- package/.claude/commands/claws-goal.md +111 -0
- package/.claude/commands/claws-help.md +54 -0
- package/.claude/commands/claws-plan.md +103 -0
- package/.claude/commands/claws-report.md +29 -0
- package/.claude/commands/claws-status.md +37 -0
- package/.claude/commands/claws-update.md +32 -0
- package/.claude/commands/claws.md +64 -0
- package/.claude/rules/claws-default-behavior.md +76 -0
- package/.claude/settings.json +112 -0
- package/.claude/settings.local.json +19 -0
- package/.claude/skills/claws-auto-engine/SKILL.md +97 -0
- package/.claude/skills/claws-goal-tracker/SKILL.md +106 -0
- package/.claude/skills/claws-prompt-templates/SKILL.md +203 -0
- package/.claude/skills/claws-wave-lead/SKILL.md +126 -0
- package/.claude/skills/claws-wave-subworker/SKILL.md +60 -0
- package/CHANGELOG.md +1949 -0
- package/LICENSE +21 -0
- package/README.md +420 -0
- package/bin/cli.js +84 -0
- package/cli.js +223 -0
- package/docs/ARCHITECTURE.md +511 -0
- package/docs/event-protocol.md +588 -0
- package/docs/features.md +562 -0
- package/docs/guide.md +891 -0
- package/docs/index.html +716 -0
- package/docs/protocol.md +323 -0
- package/extension/.vscodeignore +15 -0
- package/extension/CHANGELOG.md +1906 -0
- package/extension/LICENSE +21 -0
- package/extension/README.md +137 -0
- package/extension/docs/features.md +424 -0
- package/extension/docs/protocol.md +197 -0
- package/extension/esbuild.mjs +25 -0
- package/extension/icon.png +0 -0
- package/extension/native/.metadata.json +10 -0
- package/extension/native/node-pty/LICENSE +69 -0
- package/extension/native/node-pty/README.md +165 -0
- package/extension/native/node-pty/lib/conpty_console_list_agent.js +16 -0
- package/extension/native/node-pty/lib/conpty_console_list_agent.js.map +1 -0
- package/extension/native/node-pty/lib/eventEmitter2.js +47 -0
- package/extension/native/node-pty/lib/eventEmitter2.js.map +1 -0
- package/extension/native/node-pty/lib/index.js +52 -0
- package/extension/native/node-pty/lib/index.js.map +1 -0
- package/extension/native/node-pty/lib/interfaces.js +7 -0
- package/extension/native/node-pty/lib/interfaces.js.map +1 -0
- package/extension/native/node-pty/lib/shared/conout.js +11 -0
- package/extension/native/node-pty/lib/shared/conout.js.map +1 -0
- package/extension/native/node-pty/lib/terminal.js +190 -0
- package/extension/native/node-pty/lib/terminal.js.map +1 -0
- package/extension/native/node-pty/lib/types.js +7 -0
- package/extension/native/node-pty/lib/types.js.map +1 -0
- package/extension/native/node-pty/lib/unixTerminal.js +346 -0
- package/extension/native/node-pty/lib/unixTerminal.js.map +1 -0
- package/extension/native/node-pty/lib/utils.js +39 -0
- package/extension/native/node-pty/lib/utils.js.map +1 -0
- package/extension/native/node-pty/lib/windowsConoutConnection.js +125 -0
- package/extension/native/node-pty/lib/windowsConoutConnection.js.map +1 -0
- package/extension/native/node-pty/lib/windowsPtyAgent.js +320 -0
- package/extension/native/node-pty/lib/windowsPtyAgent.js.map +1 -0
- package/extension/native/node-pty/lib/windowsTerminal.js +199 -0
- package/extension/native/node-pty/lib/windowsTerminal.js.map +1 -0
- package/extension/native/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/extension/native/node-pty/lib/worker/conoutSocketWorker.js.map +1 -0
- package/extension/native/node-pty/package.json +64 -0
- package/extension/native/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/extension/native/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/extension/native/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/extension/native/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/pty.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/extension/native/node-pty/prebuilds/win32-arm64/winpty.dll +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/pty.node +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/extension/native/node-pty/prebuilds/win32-x64/winpty.dll +0 -0
- package/extension/package-lock.json +605 -0
- package/extension/package.json +343 -0
- package/extension/scripts/bundle-native.mjs +104 -0
- package/extension/scripts/deploy-dev.mjs +60 -0
- package/extension/src/ansi-strip.ts +52 -0
- package/extension/src/backends/vscode/claws-pty.ts +483 -0
- package/extension/src/backends/vscode/status-bar.ts +99 -0
- package/extension/src/backends/vscode/vscode-backend.ts +282 -0
- package/extension/src/capture-store.ts +125 -0
- package/extension/src/event-log.ts +629 -0
- package/extension/src/event-schemas.ts +478 -0
- package/extension/src/extension.js +492 -0
- package/extension/src/extension.ts +873 -0
- package/extension/src/lifecycle-engine.ts +60 -0
- package/extension/src/lifecycle-rules.ts +171 -0
- package/extension/src/lifecycle-store.ts +506 -0
- package/extension/src/peer-registry.ts +176 -0
- package/extension/src/pipeline-registry.ts +82 -0
- package/extension/src/platform.ts +64 -0
- package/extension/src/protocol.ts +532 -0
- package/extension/src/server-config.ts +98 -0
- package/extension/src/server.ts +2210 -0
- package/extension/src/task-registry.ts +51 -0
- package/extension/src/terminal-backend.ts +211 -0
- package/extension/src/terminal-manager.ts +395 -0
- package/extension/src/topic-registry.ts +70 -0
- package/extension/src/topic-utils.ts +46 -0
- package/extension/src/transport.ts +45 -0
- package/extension/src/uninstall-cleanup.ts +232 -0
- package/extension/src/wave-registry.ts +314 -0
- package/extension/src/websocket-transport.ts +153 -0
- package/extension/tsconfig.json +23 -0
- package/lib/capabilities.js +145 -0
- package/lib/dry-run.js +43 -0
- package/lib/install.js +1018 -0
- package/lib/mcp-setup.js +92 -0
- package/lib/platform.js +240 -0
- package/lib/preflight.js +152 -0
- package/lib/shell-hook.js +343 -0
- package/lib/uninstall.js +162 -0
- package/lib/verify.js +166 -0
- package/mcp_server.js +3529 -0
- package/package.json +48 -0
- package/rules/claws-default-behavior.md +72 -0
- package/scripts/_helpers/atomic-file.mjs +137 -0
- package/scripts/_helpers/fix-repair.js +64 -0
- package/scripts/_helpers/json-safe.mjs +218 -0
- package/scripts/bump-version.sh +84 -0
- package/scripts/codegen/gen-docs.mjs +61 -0
- package/scripts/codegen/gen-json-schema.mjs +62 -0
- package/scripts/codegen/gen-mcp-tools.mjs +358 -0
- package/scripts/codegen/gen-types.mjs +172 -0
- package/scripts/codegen/index.mjs +42 -0
- package/scripts/dev-hooks/check-extension-dirs.js +77 -0
- package/scripts/dev-hooks/check-open-claws-terminals.js +70 -0
- package/scripts/dev-hooks/check-stale-main.js +55 -0
- package/scripts/dev-hooks/check-tag-pushed.js +51 -0
- package/scripts/dev-hooks/check-tag-vs-main.js +56 -0
- package/scripts/dev-vsix-install.sh +60 -0
- package/scripts/fix.sh +702 -0
- package/scripts/gen-client-types.mjs +81 -0
- package/scripts/git-hooks/pre-commit +31 -0
- package/scripts/hooks/lifecycle-state.js +61 -0
- package/scripts/hooks/package.json +4 -0
- package/scripts/hooks/post-tool-use-claws.js +292 -0
- package/scripts/hooks/pre-bash-no-verify-block.js +72 -0
- package/scripts/hooks/pre-tool-use-claws.js +206 -0
- package/scripts/hooks/session-start-claws.js +97 -0
- package/scripts/hooks/stop-claws.js +88 -0
- package/scripts/inject-claude-md.js +205 -0
- package/scripts/inject-dev-hooks.js +96 -0
- package/scripts/inject-global-claude-md.js +140 -0
- package/scripts/inject-settings-hooks.js +370 -0
- package/scripts/install.ps1 +146 -0
- package/scripts/install.sh +1729 -0
- package/scripts/monitor-arm-watch.js +155 -0
- package/scripts/rebuild-node-pty.sh +245 -0
- package/scripts/report.sh +232 -0
- package/scripts/shell-hook.fish +164 -0
- package/scripts/shell-hook.ps1 +33 -0
- package/scripts/shell-hook.sh +232 -0
- package/scripts/stream-events.js +399 -0
- package/scripts/terminal-wrapper.sh +36 -0
- package/scripts/test-enforcement.sh +132 -0
- package/scripts/test-install.sh +174 -0
- package/scripts/test-installer-parity.sh +135 -0
- package/scripts/test-template-enforcement.sh +76 -0
- package/scripts/uninstall.sh +143 -0
- package/scripts/update.sh +337 -0
- package/scripts/verify-release.sh +323 -0
- package/scripts/verify-wrapped.sh +194 -0
- package/templates/CLAUDE.global.md +135 -0
- package/templates/CLAUDE.project.md +37 -0
package/cli.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claws CLI — one-command installer for Claude Code plugin
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx claws-code # install everything
|
|
7
|
+
* npx claws-code install # same
|
|
8
|
+
* npx claws-code update # pull latest + re-inject
|
|
9
|
+
* npx claws-code status # check if everything is wired
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const { execSync, spawnSync } = require('child_process');
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const os = require('os');
|
|
16
|
+
|
|
17
|
+
const HOME = os.homedir();
|
|
18
|
+
const INSTALL_DIR = process.env.CLAWS_DIR || path.join(HOME, '.claws-src');
|
|
19
|
+
const REPO = 'https://github.com/neunaha/claws.git';
|
|
20
|
+
|
|
21
|
+
function run(cmd, opts = {}) {
|
|
22
|
+
try {
|
|
23
|
+
return execSync(cmd, { encoding: 'utf8', stdio: opts.silent ? 'pipe' : 'inherit', ...opts });
|
|
24
|
+
} catch (e) {
|
|
25
|
+
if (!opts.ignoreError) throw e;
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function banner() {
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(' \x1b[38;2;200;90;62m╔═══════════════════════════════════════════╗\x1b[0m');
|
|
33
|
+
console.log(' \x1b[38;2;200;90;62m║\x1b[0m \x1b[38;2;200;90;62m║\x1b[0m');
|
|
34
|
+
console.log(' \x1b[38;2;200;90;62m║\x1b[0m \x1b[1;37mCLAWS\x1b[0m Terminal Control Bridge \x1b[38;2;200;90;62m║\x1b[0m');
|
|
35
|
+
console.log(' \x1b[38;2;200;90;62m║\x1b[0m \x1b[90mPowered by Claude Opus\x1b[0m \x1b[38;2;200;90;62m║\x1b[0m');
|
|
36
|
+
console.log(' \x1b[38;2;200;90;62m║\x1b[0m \x1b[38;2;200;90;62m║\x1b[0m');
|
|
37
|
+
console.log(' \x1b[38;2;200;90;62m╚═══════════════════════════════════════════╝\x1b[0m');
|
|
38
|
+
console.log('');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function detectExtDir() {
|
|
42
|
+
const candidates = [
|
|
43
|
+
path.join(HOME, '.vscode', 'extensions'),
|
|
44
|
+
path.join(HOME, '.vscode-insiders', 'extensions'),
|
|
45
|
+
path.join(HOME, '.cursor', 'extensions'),
|
|
46
|
+
path.join(HOME, '.windsurf', 'extensions'),
|
|
47
|
+
];
|
|
48
|
+
for (const dir of candidates) {
|
|
49
|
+
if (fs.existsSync(dir)) return dir;
|
|
50
|
+
}
|
|
51
|
+
const def = candidates[0];
|
|
52
|
+
fs.mkdirSync(def, { recursive: true });
|
|
53
|
+
return def;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function install() {
|
|
57
|
+
banner();
|
|
58
|
+
|
|
59
|
+
// 1. Clone or pull
|
|
60
|
+
if (fs.existsSync(INSTALL_DIR)) {
|
|
61
|
+
console.log('[1/7] Updating existing install...');
|
|
62
|
+
run(`cd "${INSTALL_DIR}" && git pull origin main --quiet`, { ignoreError: true });
|
|
63
|
+
} else {
|
|
64
|
+
console.log('[1/7] Cloning...');
|
|
65
|
+
run(`git clone --quiet "${REPO}" "${INSTALL_DIR}"`, { ignoreError: true });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 2. Extension symlink
|
|
69
|
+
console.log('[2/7] Installing VS Code extension...');
|
|
70
|
+
const extDir = detectExtDir();
|
|
71
|
+
const extLink = path.join(extDir, 'neunaha.claws-0.1.0');
|
|
72
|
+
try { fs.unlinkSync(extLink); } catch {}
|
|
73
|
+
try {
|
|
74
|
+
fs.symlinkSync(path.join(INSTALL_DIR, 'extension'), extLink);
|
|
75
|
+
console.log(' ✓ Extension linked');
|
|
76
|
+
} catch {
|
|
77
|
+
try {
|
|
78
|
+
// Windows: junction
|
|
79
|
+
run(`mklink /J "${extLink}" "${path.join(INSTALL_DIR, 'extension')}"`, { silent: true, ignoreError: true });
|
|
80
|
+
console.log(' ✓ Extension linked (junction)');
|
|
81
|
+
} catch {
|
|
82
|
+
console.log(' ! Manual link needed: ln -s ' + path.join(INSTALL_DIR, 'extension') + ' ' + extLink);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 3. Permissions
|
|
87
|
+
console.log('[3/7] Setting permissions...');
|
|
88
|
+
['scripts/terminal-wrapper.sh', 'scripts/install.sh', 'scripts/test-install.sh', 'mcp_server.js'].forEach(f => {
|
|
89
|
+
try { fs.chmodSync(path.join(INSTALL_DIR, f), 0o755); } catch {}
|
|
90
|
+
});
|
|
91
|
+
console.log(' ✓ Scripts executable');
|
|
92
|
+
|
|
93
|
+
// 4. MCP server — use claude mcp add if available, fall back to settings.json
|
|
94
|
+
console.log('[4/7] Registering MCP server...');
|
|
95
|
+
const mcpPath = path.join(INSTALL_DIR, 'mcp_server.js');
|
|
96
|
+
const claudeMcpResult = spawnSync('claude', ['mcp', 'add', 'claws', '-s', 'user', '--', 'node', mcpPath], {
|
|
97
|
+
encoding: 'utf8', stdio: 'pipe', timeout: 10000,
|
|
98
|
+
});
|
|
99
|
+
if (claudeMcpResult.status === 0) {
|
|
100
|
+
console.log(' ✓ MCP server registered via claude mcp add');
|
|
101
|
+
} else {
|
|
102
|
+
// Fall back to settings.json — use json-safe mergeIntoFile (M-39: atomic + JSONC-tolerant,
|
|
103
|
+
// never silently reset settings.json to {} on parse error).
|
|
104
|
+
const settingsPath = path.join(HOME, '.claude', 'settings.json');
|
|
105
|
+
const helperMjs = path.resolve(INSTALL_DIR, 'scripts', '_helpers', 'json-safe.mjs');
|
|
106
|
+
const helperUrl = `file://${helperMjs.replace(/\\/g, '/')}`;
|
|
107
|
+
const inlineScript =
|
|
108
|
+
`import{mergeIntoFile}from${JSON.stringify(helperUrl)};` +
|
|
109
|
+
`const r=await mergeIntoFile(process.env.CLAWS_SP,(cfg)=>{` +
|
|
110
|
+
`if(!cfg.mcpServers)cfg.mcpServers={};` +
|
|
111
|
+
`cfg.mcpServers.claws={command:'node',args:[process.env.CLAWS_MP],env:{CLAWS_SOCKET:'.claws/claws.sock'}};` +
|
|
112
|
+
`});` +
|
|
113
|
+
`if(!r.ok){process.stderr.write(r.error.message+'\\n');process.exit(1);}`;
|
|
114
|
+
const mergeResult = spawnSync(
|
|
115
|
+
process.execPath,
|
|
116
|
+
['--input-type=module'],
|
|
117
|
+
{
|
|
118
|
+
input: inlineScript,
|
|
119
|
+
encoding: 'utf8',
|
|
120
|
+
timeout: 10000,
|
|
121
|
+
env: { ...process.env, CLAWS_SP: settingsPath, CLAWS_MP: mcpPath },
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
if (mergeResult.status === 0) {
|
|
125
|
+
console.log(' ✓ MCP server registered in ~/.claude/settings.json');
|
|
126
|
+
} else {
|
|
127
|
+
console.log(' ! Could not register MCP — add manually');
|
|
128
|
+
if (mergeResult.stderr && mergeResult.stderr.trim()) {
|
|
129
|
+
console.log(' !', mergeResult.stderr.trim());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// 5. Global context injection
|
|
135
|
+
console.log('[5/7] Injecting rules + skills + commands...');
|
|
136
|
+
const claudeDir = path.join(HOME, '.claude');
|
|
137
|
+
const dirs = ['rules', 'skills', 'commands'];
|
|
138
|
+
dirs.forEach(d => fs.mkdirSync(path.join(claudeDir, d), { recursive: true }));
|
|
139
|
+
|
|
140
|
+
// Behavior rule
|
|
141
|
+
const ruleSrc = path.join(INSTALL_DIR, 'rules', 'claws-default-behavior.md');
|
|
142
|
+
if (fs.existsSync(ruleSrc)) {
|
|
143
|
+
fs.copyFileSync(ruleSrc, path.join(claudeDir, 'rules', 'claws-default-behavior.md'));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Skills
|
|
147
|
+
const skills = ['claws-prompt-templates'];
|
|
148
|
+
skills.forEach(skill => {
|
|
149
|
+
const src = path.join(INSTALL_DIR, '.claude', 'skills', skill);
|
|
150
|
+
const dest = path.join(claudeDir, 'skills', skill);
|
|
151
|
+
if (fs.existsSync(src)) {
|
|
152
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
153
|
+
fs.readdirSync(src).forEach(f => {
|
|
154
|
+
fs.copyFileSync(path.join(src, f), path.join(dest, f));
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Commands
|
|
160
|
+
const cmdSrc = path.join(INSTALL_DIR, '.claude', 'commands');
|
|
161
|
+
if (fs.existsSync(cmdSrc)) {
|
|
162
|
+
fs.readdirSync(cmdSrc).filter(f => f.startsWith('claws-')).forEach(f => {
|
|
163
|
+
fs.copyFileSync(path.join(cmdSrc, f), path.join(claudeDir, 'commands', f));
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
console.log(' ✓ Rules + skills + 11 slash commands injected');
|
|
167
|
+
|
|
168
|
+
// 6. Shell hook
|
|
169
|
+
console.log('[6/7] Injecting shell hook...');
|
|
170
|
+
const hookLine = `\n# CLAWS terminal hook\nsource "${path.join(INSTALL_DIR, 'scripts', 'shell-hook.sh')}"\n`;
|
|
171
|
+
['.zshrc', '.bashrc', '.bash_profile'].forEach(rc => {
|
|
172
|
+
const rcPath = path.join(HOME, rc);
|
|
173
|
+
if (fs.existsSync(rcPath)) {
|
|
174
|
+
const content = fs.readFileSync(rcPath, 'utf8');
|
|
175
|
+
if (!content.includes('CLAWS terminal hook')) {
|
|
176
|
+
fs.appendFileSync(rcPath, hookLine);
|
|
177
|
+
console.log(` ✓ Hook added to ~/${rc}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// 7. Verify
|
|
183
|
+
console.log('[7/7] Verifying...');
|
|
184
|
+
let checks = 0;
|
|
185
|
+
if (fs.existsSync(extLink)) { checks++; console.log(' ✓ Extension'); }
|
|
186
|
+
if (fs.existsSync(mcpPath)) { checks++; console.log(' ✓ MCP server'); }
|
|
187
|
+
if (fs.existsSync(path.join(claudeDir, 'rules', 'claws-default-behavior.md'))) { checks++; console.log(' ✓ Behavior rule'); }
|
|
188
|
+
if (fs.existsSync(path.join(claudeDir, 'skills', 'claws-prompt-templates'))) { checks++; console.log(' ✓ Prompt templates skill'); }
|
|
189
|
+
|
|
190
|
+
console.log('');
|
|
191
|
+
console.log(` \x1b[32m✓ Claws installed — ${checks}/4 checks passed\x1b[0m`);
|
|
192
|
+
console.log('');
|
|
193
|
+
console.log(' \x1b[1mReload VS Code:\x1b[0m Cmd+Shift+P → Developer: Reload Window');
|
|
194
|
+
console.log('');
|
|
195
|
+
console.log(' \x1b[1mThen try:\x1b[0m');
|
|
196
|
+
console.log(' /claws-help see the full prompt guide');
|
|
197
|
+
console.log(' /claws-status check if the bridge is live');
|
|
198
|
+
console.log(' "run tests in a visible terminal"');
|
|
199
|
+
console.log(' "spawn 3 parallel workers for lint, test, build"');
|
|
200
|
+
console.log('');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function status() {
|
|
204
|
+
banner();
|
|
205
|
+
const checks = [];
|
|
206
|
+
const extLink = path.join(detectExtDir(), 'neunaha.claws-0.1.0');
|
|
207
|
+
checks.push(['Extension', fs.existsSync(extLink)]);
|
|
208
|
+
checks.push(['MCP server', fs.existsSync(path.join(INSTALL_DIR, 'mcp_server.js'))]);
|
|
209
|
+
checks.push(['Behavior rule', fs.existsSync(path.join(HOME, '.claude', 'rules', 'claws-default-behavior.md'))]);
|
|
210
|
+
checks.push(['Prompt templates skill', fs.existsSync(path.join(HOME, '.claude', 'skills', 'claws-prompt-templates'))]);
|
|
211
|
+
checks.push(['Node.js', spawnSync('node', ['--version'], { stdio: 'pipe' }).status === 0]);
|
|
212
|
+
checks.forEach(([name, ok]) => console.log(` ${ok ? '✓' : '✗'} ${name}`));
|
|
213
|
+
console.log('');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Main
|
|
217
|
+
const cmd = process.argv[2] || 'install';
|
|
218
|
+
if (cmd === 'install' || cmd === 'i') install();
|
|
219
|
+
else if (cmd === 'update' || cmd === 'u') install(); // update = re-run install (idempotent)
|
|
220
|
+
else if (cmd === 'status' || cmd === 's') status();
|
|
221
|
+
else {
|
|
222
|
+
console.log('Usage: npx claws-code [install|update|status]');
|
|
223
|
+
}
|