@cocorograph/hub-agent 0.5.8 → 0.5.9

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocorograph/hub-agent",
3
- "version": "0.5.8",
3
+ "version": "0.5.9",
4
4
  "description": "Hub Hosted Cockpit のローカル常駐 agent。Hub と outbound WSS で接続し、ローカルの tmux/pty を中継する。",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
package/src/main.mjs CHANGED
@@ -319,6 +319,8 @@ async function dispatch(msg, ctx) {
319
319
  try {
320
320
  await createTmuxSession(name, cwd, {
321
321
  claudeCmd: typeof msg.claude_cmd === "string" ? msg.claude_cmd : undefined,
322
+ initialPrompt:
323
+ typeof msg.initial_prompt === "string" ? msg.initial_prompt : undefined,
322
324
  logger: ctx.logger,
323
325
  })
324
326
  ctx.client.send({
@@ -364,6 +366,8 @@ async function dispatch(msg, ctx) {
364
366
  // worktree dir で tmux session を作成 (claude_cmd は createSession の default)
365
367
  await createTmuxSession(wtName, wtPath, {
366
368
  claudeCmd: typeof msg.claude_cmd === "string" ? msg.claude_cmd : undefined,
369
+ initialPrompt:
370
+ typeof msg.initial_prompt === "string" ? msg.initial_prompt : undefined,
367
371
  logger: ctx.logger,
368
372
  })
369
373
  ctx.client.send({
package/src/tmux.mjs CHANGED
@@ -163,6 +163,26 @@ function tmuxBin(opts = {}) {
163
163
  return opts.tmuxBin || DEFAULT_TMUX_BIN
164
164
  }
165
165
 
166
+ /**
167
+ * claudeCmd の各 `claude ... --permission-mode auto` の直後に
168
+ * initialPrompt を shell-safe quoting で末尾引数として注入する。
169
+ *
170
+ * `claude --foo --permission-mode auto || claude --bar --permission-mode auto`
171
+ * のように `||` で連結された OR 構造の両側に同じ prompt を埋め込むため、
172
+ * グローバル置換を行う。マッチが無ければ無加工の claudeCmd を返す
173
+ * (ユーザー定義 claudeCmd が独自フォーマットで `--permission-mode auto` を
174
+ * 含まない場合は noop)。
175
+ *
176
+ * `JSON.stringify` は `"` `\` 制御文字を `\u00xx` 等で安全にエスケープし、
177
+ * 結果は double-quoted な shell リテラルとしてそのまま使える。
178
+ */
179
+ export function injectInitialPrompt(claudeCmd, initialPrompt) {
180
+ if (!initialPrompt || typeof initialPrompt !== "string") return claudeCmd
181
+ if (typeof claudeCmd !== "string" || claudeCmd.length === 0) return claudeCmd
182
+ const quoted = JSON.stringify(initialPrompt)
183
+ return claudeCmd.replace(/--permission-mode auto/g, `--permission-mode auto ${quoted}`)
184
+ }
185
+
166
186
  /**
167
187
  * 汎用 tmux 実行。`tmux.exec` メッセージから呼び出される。
168
188
  *
@@ -317,6 +337,9 @@ export async function killManySessions(names, opts = {}) {
317
337
  * 新規 session を detached で作成して claude を起動する。
318
338
  * - 同名 session が既にあれば 'duplicate session' throw
319
339
  * - opts.claudeCmd で send-keys 内容を上書き可 (空文字なら claude 自動起動しない)
340
+ * - opts.initialPrompt を渡すと `claude ... --permission-mode auto` の直後に
341
+ * shell-safe 引数として埋め込まれ、claude TUI の初回プロンプトとして実行される
342
+ * (`/orchestrate` 等のスキル発火に利用)
320
343
  */
321
344
  export async function createSession(name, cwd, opts = {}) {
322
345
  // tmux は `-c` をシェル展開しないため、ここで `~` を絶対パスに展開する。
@@ -366,7 +389,8 @@ export async function createSession(name, cwd, opts = {}) {
366
389
  // display-message 失敗は致命的でないので飲み込む
367
390
  }
368
391
  }
369
- const claudeCmd = opts.claudeCmd ?? DEFAULT_CLAUDE_CMD
392
+ const claudeCmdBase = opts.claudeCmd ?? DEFAULT_CLAUDE_CMD
393
+ const claudeCmd = injectInitialPrompt(claudeCmdBase, opts.initialPrompt)
370
394
  if (claudeCmd) {
371
395
  await execFileP(tmuxBin(opts), ["send-keys", "-t", name, claudeCmd, "Enter"])
372
396
  }