@scrylog/cli 0.4.1 → 0.5.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/README.md +148 -93
- package/dist/cli/assets/providers/SOURCES.md +9 -9
- package/dist/cli/index.js +395 -224
- package/dist/cli/index.js.map +43 -32
- package/dist/daemon/index.js +580 -488
- package/dist/daemon/index.js.map +144 -213
- package/dist/hooks/claude.js +3 -3
- package/dist/hooks/claude.js.map +4 -4
- package/dist/hooks/codex.js +6 -6
- package/dist/hooks/codex.js.map +4 -4
- package/dist/mcp/index.js +41 -41
- package/dist/mcp/index.js.map +23 -22
- package/dist/oc/index.js +3 -3
- package/dist/oc/index.js.map +3 -3
- package/package.json +44 -36
- package/src/postinstall.cjs +8 -8
package/dist/oc/index.js
CHANGED
|
@@ -12,10 +12,10 @@ Environment variables:
|
|
|
12
12
|
Behavior:
|
|
13
13
|
Auto-discovers running OpenCode instances and attaches when possible.
|
|
14
14
|
Launches a new instance on port 4096 when none is available.
|
|
15
|
-
`)}function F(){let q=Bun.spawnSync(["ps","-ax","-o","pid=,command="],{
|
|
15
|
+
`)}function F(){let q=Bun.spawnSync(["ps","-ax","-o","pid=,command="],{stderr:"pipe",stdout:"pipe"});if(q.exitCode!==0)return[];let y=Buffer.from(q.stdout).toString("utf8");return M(y,/^\s*(\d+)\s+(.*)$/)}function L(){let q=Bun.spawnSync(["wmic","process","get","ProcessId,CommandLine","/format:csv"],{stderr:"pipe",stdout:"pipe"});if(q.exitCode!==0)return[];let y=Buffer.from(q.stdout).toString("utf8"),z=[];for(let E of y.split(/\r?\n/).filter(Boolean)){let B=E.split(",");if(B.length<3)continue;let G=B.slice(1,-1).join(","),K=B[B.length-1]??"",J=Number.parseInt(K.trim(),10);if(Number.isNaN(J))continue;let N=j(G,J);if(N)z.push(N)}return z}function M(q,y){let z=[];for(let E of q.split(/\r?\n/).filter(Boolean)){let B=E.match(y);if(!B)continue;let G=Number.parseInt(B[1]??"",10),K=B[2]??"",J=j(K,G);if(J)z.push(J)}return z}function j(q,y){let z=/\bopencode\b.*\bserve\b/i.test(q),E=/\bopencode\b/i.test(q)&&/--port[=\s]+([1-9]\d*)/.test(q)&&!/\bserve\b/i.test(q);if(!z&&!E)return null;let B=q.match(/--port[=\s]+(\d+)/),G=q.match(/--hostname[=\s]+(\S+)/),K=B?Number.parseInt(B[1]??"",10):4096,J=G?G[1]??"127.0.0.1":"127.0.0.1";return{pid:y,url:`http://${J==="0.0.0.0"?"127.0.0.1":J}:${K}`}}function f(){let q=process.platform==="win32"?L():F(),y=new Set,z=q.filter((E)=>{if(y.has(E.url))return!1;return y.add(E.url),!0});if(!y.has("http://127.0.0.1:4096"))z.push({url:"http://127.0.0.1:4096"});return z}async function Z(q){try{return(await fetch(`${q}/global/health`,{signal:AbortSignal.timeout(800)})).ok}catch{return!1}}async function H(q){return(await Promise.all(q.map(async(z)=>({alive:await Z(z.url),candidate:z})))).filter((z)=>z.alive).map((z)=>z.candidate)}async function b(q){let y=[`Found ${q.length} running OpenCode instances:`,...q.map((z,E)=>` [${E+1}] ${z.url}${z.pid!==void 0?` (pid ${z.pid})`:""}`),`Select [1-${q.length}]: `];process.stderr.write(y.join(`
|
|
16
16
|
`));for(let z=0;z<3;z++){let E=await C(),B=Number.parseInt(E.trim(),10);if(!Number.isNaN(B)&&B>=1&&B<=q.length)return q[B-1];if(z<2)process.stderr.write(`Invalid choice. Select [1-${q.length}]: `)}process.stderr.write(`
|
|
17
17
|
Invalid selection. Exiting.
|
|
18
18
|
`),process.exit(1)}function C(){return new Promise((q)=>{let y="";process.stdin.setEncoding("utf8"),process.stdin.resume(),process.stdin.once("data",(z)=>{process.stdin.pause(),y+=z,q(y.split(`
|
|
19
|
-
`)[0]??"")})})}async function O(q){let z=await Bun.spawn(q,{stdio:["inherit","inherit","inherit"]}).exited;process.exit(z??0)}function P(q){return q.includes("--dir")||q.some((y)=>y.startsWith("--dir="))}function w(q){let
|
|
19
|
+
`)[0]??"")})})}async function O(q){let z=await Bun.spawn(q,{stdio:["inherit","inherit","inherit"]}).exited;process.exit(z??0)}function P(q){return q.includes("--dir")||q.some((y)=>y.startsWith("--dir="))}function w(q){let[y]=q;return y!==void 0&&!y.startsWith("-")}function R(q,y,z){return P(y)?["opencode","attach",q,...y]:["opencode","attach",q,"--dir",z,...y]}function Y(q,y,z,E){let G=["opencode",...w(q)?[...q]:[y,...q]];if(z!==void 0)G.push("--port",z);if(E!==void 0)G.push("--hostname",E);return G}async function v(){let q=process.argv.slice(2);if(q.includes("--help")||q.includes("-h"))W(),process.exit(0);let y=process.cwd(),z=process.env.OPENCODE_LOCAL_PORT,E=process.env.OPENCODE_HOST;if(z!==void 0&&E!==void 0){let J=`http://${E}:${z}`;if(await Z(J))await O(R(J,q,y));else await O(Y(q,y,z,E));return}if(z!==void 0||E!==void 0){let J=z??String(4096),N=E??"127.0.0.1",_=`http://${N}:${J}`;if(await Z(_))await O(R(_,q,y));else await O(Y(q,y,J,N));return}let B=f(),G=await H(B);if(G.length===0){await O(Y(q,y,String(4096)));return}if(G.length===1){await O(R(G[0].url,q,y));return}let K=await b(G);await O(R(K.url,q,y))}if(import.meta.main)await v();export{Y as buildLaunchCommand,R as buildAttachCommand};
|
|
20
20
|
|
|
21
|
-
//# debugId=
|
|
21
|
+
//# debugId=139505EF3332919964756E2164756E21
|
package/dist/oc/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/oc/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"#!/usr/bin/env bun\n/**\n * oc — OpenCode launcher / attach helper\n *\n * Usage:\n * oc [args...] Auto-discover running instance → attach or launch\n * oc [args...] All extra args are forwarded to the opencode command\n *\n * Environment variables:\n * OPENCODE_LOCAL_PORT Force a specific port (skips discovery)\n * OPENCODE_HOST Force a specific host (skips discovery, default 127.0.0.1)\n *\n * When both env vars are absent, oc discovers running opencode processes via\n * process scanning (ps on Unix, wmic on Windows), probes their health endpoints,\n * and either attaches to a live instance or launches a new one on port 4096.\n *\n * If multiple live instances are found an interactive numbered selector is shown.\n */\n\nconst DEFAULT_PORT = 4096;\nconst DEFAULT_HOST =
|
|
5
|
+
"#!/usr/bin/env bun\n/**\n * oc — OpenCode launcher / attach helper\n *\n * Usage:\n * oc [args...] Auto-discover running instance → attach or launch\n * oc [args...] All extra args are forwarded to the opencode command\n *\n * Environment variables:\n * OPENCODE_LOCAL_PORT Force a specific port (skips discovery)\n * OPENCODE_HOST Force a specific host (skips discovery, default 127.0.0.1)\n *\n * When both env vars are absent, oc discovers running opencode processes via\n * process scanning (ps on Unix, wmic on Windows), probes their health endpoints,\n * and either attaches to a live instance or launches a new one on port 4096.\n *\n * If multiple live instances are found an interactive numbered selector is shown.\n */\n\nconst DEFAULT_PORT = 4096;\nconst DEFAULT_HOST = '127.0.0.1';\nconst HEALTH_TIMEOUT_MS = 800;\n\nfunction printHelp() {\n process.stdout.write(`oc\n\nUsage:\n oc [opencode args...]\n\nEnvironment variables:\n OPENCODE_LOCAL_PORT Force a specific port\n OPENCODE_HOST Force a specific host\n\nBehavior:\n Auto-discovers running OpenCode instances and attaches when possible.\n Launches a new instance on port 4096 when none is available.\n`);\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ninterface Candidate {\n url: string;\n pid?: number;\n}\n\n// ── Process scanning ──────────────────────────────────────────────────────────\n\nfunction scanProcessesUnix(): Candidate[] {\n const proc = Bun.spawnSync(['ps', '-ax', '-o', 'pid=,command='], {\n stderr: 'pipe',\n stdout: 'pipe',\n });\n if (proc.exitCode !== 0) return [];\n\n const output = Buffer.from(proc.stdout).toString('utf8');\n return parseProcessLines(output, /^\\s*(\\d+)\\s+(.*)$/);\n}\n\nfunction scanProcessesWindows(): Candidate[] {\n const proc = Bun.spawnSync(\n ['wmic', 'process', 'get', 'ProcessId,CommandLine', '/format:csv'],\n { stderr: 'pipe', stdout: 'pipe' }\n );\n if (proc.exitCode !== 0) return [];\n\n const output = Buffer.from(proc.stdout).toString('utf8');\n const candidates: Candidate[] = [];\n\n for (const line of output.split(/\\r?\\n/).filter(Boolean)) {\n // CSV columns: Node,CommandLine,ProcessId\n const cols = line.split(',');\n if (cols.length < 3) continue;\n const command = cols.slice(1, -1).join(','); // CommandLine may contain commas\n const pidStr = cols[cols.length - 1] ?? '';\n const pid = Number.parseInt(pidStr.trim(), 10);\n if (Number.isNaN(pid)) continue;\n\n const candidate = extractFromCommand(command, pid);\n if (candidate) candidates.push(candidate);\n }\n\n return candidates;\n}\n\nfunction parseProcessLines(output: string, linePattern: RegExp): Candidate[] {\n const candidates: Candidate[] = [];\n\n for (const line of output.split(/\\r?\\n/).filter(Boolean)) {\n const match = line.match(linePattern);\n if (!match) continue;\n const pid = Number.parseInt(match[1] ?? '', 10);\n const command = match[2] ?? '';\n const candidate = extractFromCommand(command, pid);\n if (candidate) candidates.push(candidate);\n }\n\n return candidates;\n}\n\nfunction extractFromCommand(command: string, pid: number): Candidate | null {\n const isServe = /\\bopencode\\b.*\\bserve\\b/i.test(command);\n const isTuiWithPort =\n /\\bopencode\\b/i.test(command) &&\n /--port[=\\s]+([1-9]\\d*)/.test(command) &&\n !/\\bserve\\b/i.test(command);\n\n if (!isServe && !isTuiWithPort) return null;\n\n const portMatch = command.match(/--port[=\\s]+(\\d+)/);\n const hostMatch = command.match(/--hostname[=\\s]+(\\S+)/);\n const port = portMatch\n ? Number.parseInt(portMatch[1] ?? '', 10)\n : DEFAULT_PORT;\n const rawHost = hostMatch ? (hostMatch[1] ?? DEFAULT_HOST) : DEFAULT_HOST;\n // 0.0.0.0 listens on all interfaces — connect via loopback\n const host = rawHost === '0.0.0.0' ? '127.0.0.1' : rawHost;\n\n return { pid, url: `http://${host}:${port}` };\n}\n\nfunction discoverCandidates(): Candidate[] {\n const raw =\n process.platform === 'win32' ? scanProcessesWindows() : scanProcessesUnix();\n\n // Deduplicate by URL\n const seen = new Set<string>();\n const deduped = raw.filter((c) => {\n if (seen.has(c.url)) return false;\n seen.add(c.url);\n return true;\n });\n\n // Always include the default endpoint as a fallback\n if (!seen.has(`http://${DEFAULT_HOST}:${DEFAULT_PORT}`)) {\n deduped.push({ url: `http://${DEFAULT_HOST}:${DEFAULT_PORT}` });\n }\n\n return deduped;\n}\n\n// ── Health probe ──────────────────────────────────────────────────────────────\n\nasync function isAlive(url: string): Promise<boolean> {\n try {\n const res = await fetch(`${url}/global/health`, {\n signal: AbortSignal.timeout(HEALTH_TIMEOUT_MS),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nasync function filterAlive(candidates: Candidate[]): Promise<Candidate[]> {\n const results = await Promise.all(\n candidates.map(async (c) => ({ alive: await isAlive(c.url), candidate: c }))\n );\n return results.filter((r) => r.alive).map((r) => r.candidate);\n}\n\n// ── Interactive selector ──────────────────────────────────────────────────────\n\nasync function selectInstance(candidates: Candidate[]): Promise<Candidate> {\n const lines = [\n `Found ${candidates.length} running OpenCode instances:`,\n ...candidates.map(\n (c, i) =>\n ` [${i + 1}] ${c.url}${c.pid !== undefined ? ` (pid ${c.pid})` : ''}`\n ),\n `Select [1-${candidates.length}]: `,\n ];\n\n process.stderr.write(lines.join('\\n'));\n\n // Read a line from stdin\n for (let attempt = 0; attempt < 3; attempt++) {\n const raw = await readLine();\n const n = Number.parseInt(raw.trim(), 10);\n if (!Number.isNaN(n) && n >= 1 && n <= candidates.length) {\n return candidates[n - 1]!;\n }\n if (attempt < 2) {\n process.stderr.write(`Invalid choice. Select [1-${candidates.length}]: `);\n }\n }\n\n process.stderr.write('\\nInvalid selection. Exiting.\\n');\n process.exit(1);\n}\n\nfunction readLine(): Promise<string> {\n return new Promise((resolve) => {\n let buffer = '';\n process.stdin.setEncoding('utf8');\n process.stdin.resume();\n process.stdin.once('data', (chunk: string) => {\n process.stdin.pause();\n buffer += chunk;\n resolve(buffer.split('\\n')[0] ?? '');\n });\n });\n}\n\n// ── Spawn helpers ─────────────────────────────────────────────────────────────\n\nasync function run(cmd: string[]): Promise<void> {\n const proc = Bun.spawn(cmd, {\n stdio: ['inherit', 'inherit', 'inherit'],\n });\n const code = await proc.exited;\n process.exit(code ?? 0);\n}\n\nfunction hasDirFlag(args: string[]): boolean {\n return args.includes('--dir') || args.some((arg) => arg.startsWith('--dir='));\n}\n\nfunction hasProjectArg(args: string[]): boolean {\n const [first] = args;\n return first !== undefined && !first.startsWith('-');\n}\n\nexport function buildAttachCommand(\n url: string,\n extraArgs: string[],\n cwd: string\n): string[] {\n return hasDirFlag(extraArgs)\n ? ['opencode', 'attach', url, ...extraArgs]\n : ['opencode', 'attach', url, '--dir', cwd, ...extraArgs];\n}\n\nexport function buildLaunchCommand(\n extraArgs: string[],\n cwd: string,\n port?: string,\n host?: string\n): string[] {\n const args = hasProjectArg(extraArgs) ? [...extraArgs] : [cwd, ...extraArgs];\n const command = ['opencode', ...args];\n if (port !== undefined) command.push('--port', port);\n if (host !== undefined) command.push('--hostname', host);\n return command;\n}\n\n// ── Main ──────────────────────────────────────────────────────────────────────\n\nasync function main(): Promise<void> {\n const extraArgs = process.argv.slice(2);\n if (extraArgs.includes('--help') || extraArgs.includes('-h')) {\n printHelp();\n process.exit(0);\n }\n const cwd = process.cwd();\n\n const envPort = process.env['OPENCODE_LOCAL_PORT'];\n const envHost = process.env['OPENCODE_HOST'];\n\n // ── Explicit mode: both env vars set ───────────────────────────────────────\n if (envPort !== undefined && envHost !== undefined) {\n const url = `http://${envHost}:${envPort}`;\n const alive = await isAlive(url);\n if (alive) {\n await run(buildAttachCommand(url, extraArgs, cwd));\n } else {\n await run(buildLaunchCommand(extraArgs, cwd, envPort, envHost));\n }\n return;\n }\n\n // Partial override: only port or only host specified\n if (envPort !== undefined || envHost !== undefined) {\n const port = envPort ?? String(DEFAULT_PORT);\n const host = envHost ?? DEFAULT_HOST;\n const url = `http://${host}:${port}`;\n const alive = await isAlive(url);\n if (alive) {\n await run(buildAttachCommand(url, extraArgs, cwd));\n } else {\n await run(buildLaunchCommand(extraArgs, cwd, port, host));\n }\n return;\n }\n\n // ── Auto-discovery mode ────────────────────────────────────────────────────\n const candidates = discoverCandidates();\n const alive = await filterAlive(candidates);\n\n if (alive.length === 0) {\n // Nothing running — launch on default port\n await run(buildLaunchCommand(extraArgs, cwd, String(DEFAULT_PORT)));\n return;\n }\n\n if (alive.length === 1) {\n await run(buildAttachCommand(alive[0]!.url, extraArgs, cwd));\n return;\n }\n\n // Multiple instances — show selector\n const chosen = await selectInstance(alive);\n await run(buildAttachCommand(chosen.url, extraArgs, cwd));\n}\n\nif (import.meta.main) {\n await main();\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;08BAuBA,SAAS,CAAS,EAAG,CACnB,QAAQ,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAYtB,EAYD,SAAS,CAAiB,EAAgB,CACxC,IAAM,EAAO,IAAI,UAAU,CAAC,KAAM,MAAO,KAAM,eAAe,EAAG,CAC/D,OAAQ,OACR,OAAQ,MACV,CAAC,EACD,GAAI,EAAK,WAAa,EAAG,MAAO,CAAC,EAEjC,IAAM,EAAS,OAAO,KAAK,EAAK,MAAM,EAAE,SAAS,MAAM,EACvD,OAAO,EAAkB,EAAQ,mBAAmB,EAGtD,SAAS,CAAoB,EAAgB,CAC3C,IAAM,EAAO,IAAI,UACf,CAAC,OAAQ,UAAW,MAAO,wBAAyB,aAAa,EACjE,CAAE,OAAQ,OAAQ,OAAQ,MAAO,CACnC,EACA,GAAI,EAAK,WAAa,EAAG,MAAO,CAAC,EAEjC,IAAM,EAAS,OAAO,KAAK,EAAK,MAAM,EAAE,SAAS,MAAM,EACjD,EAA0B,CAAC,EAEjC,QAAW,KAAQ,EAAO,MAAM,OAAO,EAAE,OAAO,OAAO,EAAG,CAExD,IAAM,EAAO,EAAK,MAAM,GAAG,EAC3B,GAAI,EAAK,OAAS,EAAG,SACrB,IAAM,EAAU,EAAK,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EACpC,EAAS,EAAK,EAAK,OAAS,IAAM,GAClC,EAAM,OAAO,SAAS,EAAO,KAAK,EAAG,EAAE,EAC7C,GAAI,OAAO,MAAM,CAAG,EAAG,SAEvB,IAAM,EAAY,EAAmB,EAAS,CAAG,EACjD,GAAI,EAAW,EAAW,KAAK,CAAS,EAG1C,OAAO,EAGT,SAAS,CAAiB,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "139505EF3332919964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/package.json
CHANGED
|
@@ -1,42 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scrylog/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Terminal dashboard for monitoring tmux sessions running AI coding agents",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"author": "Joel D. Martinez",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/scrylog/scrylog.git",
|
|
11
|
-
"directory": "apps/cli"
|
|
12
|
-
},
|
|
13
|
-
"homepage": "https://github.com/scrylog/scrylog#readme",
|
|
14
|
-
"bugs": {
|
|
15
|
-
"url": "https://github.com/scrylog/scrylog/issues"
|
|
16
|
-
},
|
|
17
5
|
"keywords": [
|
|
18
|
-
"tmux",
|
|
19
|
-
"tui",
|
|
20
|
-
"terminal",
|
|
21
6
|
"bun",
|
|
22
|
-
"
|
|
7
|
+
"claude",
|
|
23
8
|
"cli",
|
|
24
|
-
"opencode",
|
|
25
9
|
"codex",
|
|
10
|
+
"dashboard",
|
|
26
11
|
"mcp",
|
|
27
|
-
"
|
|
28
|
-
"
|
|
12
|
+
"opencode",
|
|
13
|
+
"ssh",
|
|
14
|
+
"terminal",
|
|
15
|
+
"tmux",
|
|
16
|
+
"tui"
|
|
29
17
|
],
|
|
30
|
-
"
|
|
31
|
-
|
|
18
|
+
"homepage": "https://github.com/scrylog/scrylog#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/scrylog/scrylog/issues"
|
|
21
|
+
},
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"author": "Joel D. Martinez",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/scrylog/scrylog.git",
|
|
27
|
+
"directory": "apps/cli"
|
|
32
28
|
},
|
|
33
29
|
"bin": {
|
|
30
|
+
"oc": "dist/oc/index.js",
|
|
34
31
|
"scrylog": "dist/cli/index.js",
|
|
35
|
-
"scrylogd": "dist/daemon/index.js",
|
|
36
|
-
"scrylog-mcp": "dist/mcp/index.js",
|
|
37
32
|
"scrylog-claude-hook": "dist/hooks/claude.js",
|
|
38
33
|
"scrylog-codex-hook": "dist/hooks/codex.js",
|
|
39
|
-
"
|
|
34
|
+
"scrylog-mcp": "dist/mcp/index.js",
|
|
35
|
+
"scrylogd": "dist/daemon/index.js"
|
|
40
36
|
},
|
|
41
37
|
"files": [
|
|
42
38
|
"dist",
|
|
@@ -44,21 +40,33 @@
|
|
|
44
40
|
"README.md",
|
|
45
41
|
"LICENSE"
|
|
46
42
|
],
|
|
43
|
+
"type": "module",
|
|
47
44
|
"publishConfig": {
|
|
48
45
|
"access": "public"
|
|
49
46
|
},
|
|
50
47
|
"scripts": {
|
|
48
|
+
"build": "bun run build.ts",
|
|
49
|
+
"check-types": "tsc --noEmit",
|
|
51
50
|
"clean": "rm -rf .turbo && rm -rf dist",
|
|
52
51
|
"clean:node-modules": "rm -rf node_modules",
|
|
53
|
-
"dev": "bun run src/cli/index.ts",
|
|
52
|
+
"dev": "bun run src/cli/index.ts --wait-for-daemon 30",
|
|
54
53
|
"dev:daemon": "bun run src/daemon/index.ts --loglevel debug",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
54
|
+
"lint": "concurrently --kill-others-on-fail \"bun lint:fmt\" \"bun lint:oxc\" \"bun lint:eslint\" \"bun lint:tsc\"",
|
|
55
|
+
"lint:eslint": "eslint ./src --max-warnings 0",
|
|
56
|
+
"lint:eslint:fix": "bun lint:eslint -- --fix",
|
|
57
|
+
"lint:fmt": "bun --bun oxfmt --check",
|
|
58
|
+
"lint:fmt:fix": "bun --bun oxfmt",
|
|
59
|
+
"lint:oxc": "oxlint --tsconfig ./tsconfig.json --deny-warnings",
|
|
60
|
+
"lint:oxc:fix": "bun lint:oxc -- --fix --fix-suggestions",
|
|
61
|
+
"lint:oxc:type-aware": "bun lint:oxc -- --type-aware",
|
|
62
|
+
"lint:oxc:type-check": "bun lint:oxc:type-aware -- --type-check",
|
|
63
|
+
"lint:tsc": "bun tsc --noEmit",
|
|
64
|
+
"lint:tsc:go": "bun tsgo --project ./tsconfig.base.json --noEmit",
|
|
65
|
+
"pack:dry-run": "bash ../../scripts/npm-pack.sh \"$PWD\" \"\" --dry-run",
|
|
58
66
|
"postinstall": "bun src/postinstall.cjs",
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
67
|
+
"prepack": "bun run build",
|
|
68
|
+
"start": "bun run src/cli/index.ts",
|
|
69
|
+
"test": "bun test"
|
|
62
70
|
},
|
|
63
71
|
"dependencies": {
|
|
64
72
|
"@opentui/core": "0.5.11"
|
|
@@ -67,16 +75,16 @@
|
|
|
67
75
|
"@hono/zod-openapi": "^1.3.0",
|
|
68
76
|
"@joeldmtz/prtl-core": "^0.3.0",
|
|
69
77
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
70
|
-
"@opentui/react": "0.5.11",
|
|
71
78
|
"@opencode-ai/sdk": "1.4.10",
|
|
79
|
+
"@opentui/react": "0.5.11",
|
|
72
80
|
"@scalar/hono-api-reference": "^0.10.11",
|
|
73
81
|
"@scalar/openapi-to-markdown": "^0.5.9",
|
|
74
|
-
"commander": "15.0.0",
|
|
75
|
-
"hono": "^4.12.15",
|
|
76
|
-
"react": "19.2.7",
|
|
77
82
|
"@types/bun": "^1.3.14",
|
|
78
83
|
"@types/node": "^24.3.0",
|
|
79
84
|
"@types/react": "19.2.17",
|
|
85
|
+
"commander": "15.0.0",
|
|
86
|
+
"hono": "^4.12.15",
|
|
87
|
+
"react": "19.2.7",
|
|
80
88
|
"typescript": "5.9.3",
|
|
81
89
|
"zod": "^4.3.6"
|
|
82
90
|
}
|
package/src/postinstall.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
const message = [
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
].join(
|
|
2
|
+
'scrylog installed or updated.',
|
|
3
|
+
'If scrylogd is already running, activate this version with:',
|
|
4
|
+
' scrylog daemon restart',
|
|
5
|
+
'For a foreground or unsupported service, stop it and run:',
|
|
6
|
+
' scrylogd',
|
|
7
|
+
'Hooks use the installed binaries and do not need reinstallation.',
|
|
8
|
+
'If integrations misbehave, run: scrylog setup',
|
|
9
|
+
].join('\n');
|
|
10
10
|
|
|
11
11
|
process.stdout.write(`${message}\n`);
|