@a5c-ai/babysitter-sdk 0.0.184 → 0.0.185

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.
Files changed (52) hide show
  1. package/dist/cli/commands/instructions.d.ts.map +1 -1
  2. package/dist/cli/commands/instructions.js +41 -0
  3. package/dist/cli/main.js +2 -2
  4. package/dist/config/defaults.d.ts +11 -0
  5. package/dist/config/defaults.d.ts.map +1 -1
  6. package/dist/config/defaults.js +55 -0
  7. package/dist/config/index.d.ts +1 -1
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/index.js +2 -1
  10. package/dist/harness/claudeCode.d.ts +2 -2
  11. package/dist/harness/claudeCode.d.ts.map +1 -1
  12. package/dist/harness/claudeCode.js +47 -72
  13. package/dist/harness/codex.d.ts.map +1 -1
  14. package/dist/harness/codex.js +10 -49
  15. package/dist/harness/cursor.d.ts.map +1 -1
  16. package/dist/harness/cursor.js +23 -34
  17. package/dist/harness/customAdapter.d.ts.map +1 -1
  18. package/dist/harness/customAdapter.js +8 -3
  19. package/dist/harness/discovery.js +7 -7
  20. package/dist/harness/geminiCli.d.ts.map +1 -1
  21. package/dist/harness/geminiCli.js +20 -27
  22. package/dist/harness/githubCopilot.d.ts.map +1 -1
  23. package/dist/harness/githubCopilot.js +17 -40
  24. package/dist/harness/index.d.ts +1 -0
  25. package/dist/harness/index.d.ts.map +1 -1
  26. package/dist/harness/index.js +3 -1
  27. package/dist/harness/installSupport.d.ts +1 -0
  28. package/dist/harness/installSupport.d.ts.map +1 -1
  29. package/dist/harness/installSupport.js +7 -3
  30. package/dist/harness/invoker.js +1 -1
  31. package/dist/harness/ohMyPi.d.ts +0 -14
  32. package/dist/harness/ohMyPi.d.ts.map +1 -1
  33. package/dist/harness/ohMyPi.js +163 -24
  34. package/dist/harness/opencode.d.ts +28 -0
  35. package/dist/harness/opencode.d.ts.map +1 -0
  36. package/dist/harness/opencode.js +578 -0
  37. package/dist/harness/pi.d.ts +1 -11
  38. package/dist/harness/pi.d.ts.map +1 -1
  39. package/dist/harness/pi.js +81 -105
  40. package/dist/harness/registry.d.ts.map +1 -1
  41. package/dist/harness/registry.js +2 -0
  42. package/dist/prompts/context.d.ts +9 -0
  43. package/dist/prompts/context.d.ts.map +1 -1
  44. package/dist/prompts/context.js +128 -20
  45. package/dist/prompts/index.d.ts +1 -1
  46. package/dist/prompts/index.d.ts.map +1 -1
  47. package/dist/prompts/index.js +2 -1
  48. package/dist/prompts/templates/completion-proof.md +8 -0
  49. package/dist/prompts/templates/critical-rules.md +5 -5
  50. package/dist/prompts/types.d.ts +4 -5
  51. package/dist/prompts/types.d.ts.map +1 -1
  52. package/package.json +1 -1
@@ -1,11 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Oh-My-Pi harness adapter.
4
- *
5
- * Extends the SDK harness layer with "pi" support while reusing the
6
- * mature Claude stop/session-start hook handlers. The Pi adapter maps
7
- * Oh-My-Pi-specific environment conventions to the generic adapter interface.
8
- */
9
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
3
  if (k2 === undefined) k2 = k;
11
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -40,72 +33,77 @@ var __importStar = (this && this.__importStar) || (function () {
40
33
  };
41
34
  })();
42
35
  Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.installPiFamilyPlugin = installPiFamilyPlugin;
36
+ exports.installPiPlugin = installPiPlugin;
44
37
  exports.createPiAdapter = createPiAdapter;
45
38
  const path = __importStar(require("node:path"));
46
- const node_fs_1 = require("node:fs");
47
- const os = __importStar(require("node:os"));
48
- const claudeCode_1 = require("./claudeCode");
49
39
  const types_1 = require("./types");
50
40
  const context_1 = require("../prompts/context");
41
+ const config_1 = require("../config");
42
+ const session_1 = require("../session");
51
43
  const installSupport_1 = require("./installSupport");
52
44
  function resolvePiPluginRoot(args = {}) {
53
- const root = args.pluginRoot || process.env.OMP_PLUGIN_ROOT || process.env.PI_PLUGIN_ROOT;
45
+ const root = args.pluginRoot || process.env.PI_PLUGIN_ROOT;
54
46
  return root ? path.resolve(root) : undefined;
55
47
  }
56
48
  function resolvePiStateDir(args) {
57
49
  if (args.stateDir)
58
50
  return path.resolve(args.stateDir);
59
- if (process.env.BABYSITTER_STATE_DIR) {
60
- return path.resolve(process.env.BABYSITTER_STATE_DIR);
61
- }
62
- const pluginRoot = resolvePiPluginRoot(args);
63
- if (pluginRoot) {
64
- // PI-family plugins keep shared Babysitter session state adjacent to the
65
- // plugin install root so the harness and plugin resolve the same files.
66
- return path.resolve(pluginRoot, "..", ".a5c");
67
- }
68
- return path.resolve(".a5c");
51
+ return (0, config_1.getGlobalStateDir)();
69
52
  }
70
53
  function resolvePiSessionId(parsed) {
71
54
  if (parsed.sessionId)
72
55
  return parsed.sessionId;
73
- if (process.env.OMP_SESSION_ID)
74
- return process.env.OMP_SESSION_ID;
56
+ if (process.env.BABYSITTER_SESSION_ID)
57
+ return process.env.BABYSITTER_SESSION_ID;
75
58
  if (process.env.PI_SESSION_ID)
76
59
  return process.env.PI_SESSION_ID;
77
60
  return undefined;
78
61
  }
79
- async function installPiFamilyHarness(args) {
80
- return (0, installSupport_1.installCliViaNpm)({
81
- harness: args.harness,
82
- cliCommand: args.cliCommand,
83
- packageName: args.packageName,
84
- summary: `Install the ${args.harness} CLI globally via npm.`,
85
- options: args.options,
62
+ async function bindPiSession(opts) {
63
+ const stateDir = resolvePiStateDir({
64
+ stateDir: opts.stateDir,
65
+ pluginRoot: opts.pluginRoot,
86
66
  });
87
- }
88
- function getPiPluginInstallRoot(args) {
89
- const base = path.resolve(args.workspace ?? os.homedir());
90
- const pluginsDir = args.harness === "oh-my-pi"
91
- ? path.join(base, ".omp", "plugins")
92
- : path.join(base, ".pi", "plugins");
93
- // PI-family plugin manifests install under the unified plugin name "babysitter".
94
- return path.join(pluginsDir, "babysitter");
95
- }
96
- async function installPiFamilyPlugin(args) {
97
- const targetDir = getPiPluginInstallRoot({
98
- harness: args.harness,
99
- workspace: args.options.workspace,
100
- });
101
- if ((0, node_fs_1.existsSync)(targetDir)) {
67
+ const stateFile = (0, session_1.getSessionFilePath)(stateDir, opts.sessionId);
68
+ if (await (0, session_1.sessionFileExists)(stateFile)) {
69
+ const existing = await (0, session_1.readSessionFile)(stateFile);
70
+ if (existing.state.runId && existing.state.runId !== opts.runId) {
71
+ return {
72
+ harness: "pi",
73
+ sessionId: opts.sessionId,
74
+ stateFile,
75
+ error: `Session already associated with run ${existing.state.runId}`,
76
+ };
77
+ }
78
+ await (0, session_1.updateSessionState)(stateFile, { active: true, runId: opts.runId }, existing);
102
79
  return {
103
- harness: args.harness,
104
- warning: "The Babysitter PI plugin is already installed at the target location; skipping reinstall.",
105
- location: targetDir,
80
+ harness: "pi",
81
+ sessionId: opts.sessionId,
82
+ stateFile,
106
83
  };
107
84
  }
108
- const packageArgs = ["install", "--harness", args.harness];
85
+ const now = (0, session_1.getCurrentTimestamp)();
86
+ const state = {
87
+ active: true,
88
+ iteration: 1,
89
+ maxIterations: opts.maxIterations ?? 256,
90
+ runId: opts.runId,
91
+ startedAt: now,
92
+ lastIterationAt: now,
93
+ iterationTimes: [],
94
+ };
95
+ await (0, session_1.writeSessionFile)(stateFile, state, opts.prompt);
96
+ return {
97
+ harness: "pi",
98
+ sessionId: opts.sessionId,
99
+ stateFile,
100
+ };
101
+ }
102
+ function writeNoopHookResult() {
103
+ process.stdout.write("{}\n");
104
+ }
105
+ async function installPiFamilyPlugin(args) {
106
+ const packageArgs = ["install"];
109
107
  if (args.options.workspace) {
110
108
  packageArgs.push("--workspace", path.resolve(args.options.workspace));
111
109
  }
@@ -114,29 +112,42 @@ async function installPiFamilyPlugin(args) {
114
112
  }
115
113
  return (0, installSupport_1.runPackageBinaryViaNpx)({
116
114
  harness: args.harness,
117
- packageName: "@a5c-ai/babysitter-pi",
115
+ packageName: args.packageName,
118
116
  packageArgs,
119
117
  summary: args.options.workspace
120
- ? `Install the published Babysitter PI plugin into the target workspace for ${args.harness}.`
121
- : `Install the published Babysitter PI plugin into the user-level ${args.harness} plugin directory.`,
118
+ ? `Install the published Babysitter ${args.harness} package for the target workspace.`
119
+ : `Install the published Babysitter ${args.harness} package into the user profile.`,
122
120
  options: args.options,
123
121
  env: process.env,
124
- location: targetDir,
122
+ });
123
+ }
124
+ async function installPiPlugin(options) {
125
+ return installPiFamilyPlugin({
126
+ harness: "pi",
127
+ packageName: "@a5c-ai/babysitter-pi",
128
+ options,
125
129
  });
126
130
  }
127
131
  function createPiAdapter() {
128
- const claude = (0, claudeCode_1.createClaudeCodeAdapter)();
129
132
  return {
130
133
  name: "pi",
131
134
  isActive() {
132
- return !!(process.env.OMP_SESSION_ID ||
135
+ return !!(process.env.BABYSITTER_SESSION_ID ||
133
136
  process.env.PI_SESSION_ID ||
134
- process.env.OMP_PLUGIN_ROOT ||
135
137
  process.env.PI_PLUGIN_ROOT);
136
138
  },
137
139
  autoResolvesSessionId() {
138
140
  return true;
139
141
  },
142
+ getMissingSessionIdHint() {
143
+ return "Pi should provide PI_SESSION_ID when the Babysitter package is active.";
144
+ },
145
+ supportsHookType(_hookType) {
146
+ return false;
147
+ },
148
+ getUnsupportedHookMessage(hookType) {
149
+ return `Pi does not use babysitter hook:run for "${hookType}". Use the Pi package skills and extension bridge instead.`;
150
+ },
140
151
  resolveSessionId(parsed) {
141
152
  return resolvePiSessionId(parsed);
142
153
  },
@@ -146,69 +157,34 @@ function createPiAdapter() {
146
157
  resolvePluginRoot(args) {
147
158
  return resolvePiPluginRoot(args);
148
159
  },
149
- async bindSession(opts) {
150
- const stateDir = resolvePiStateDir({
151
- stateDir: opts.stateDir,
152
- pluginRoot: opts.pluginRoot,
153
- });
154
- const result = await claude.bindSession({
155
- ...opts,
156
- stateDir,
157
- });
158
- return { ...result, harness: "pi" };
160
+ bindSession(opts) {
161
+ return bindPiSession(opts);
159
162
  },
160
- handleStopHook(args) {
161
- const pluginRoot = resolvePiPluginRoot(args);
162
- const stateDir = resolvePiStateDir({
163
- stateDir: args.stateDir,
164
- pluginRoot,
165
- });
166
- return claude.handleStopHook({
167
- ...args,
168
- pluginRoot,
169
- stateDir,
170
- });
163
+ handleStopHook(_args) {
164
+ writeNoopHookResult();
165
+ return Promise.resolve(0);
171
166
  },
172
- handleSessionStartHook(args) {
173
- const pluginRoot = resolvePiPluginRoot(args);
174
- const stateDir = resolvePiStateDir({
175
- stateDir: args.stateDir,
176
- pluginRoot,
177
- });
178
- return claude.handleSessionStartHook({
179
- ...args,
180
- pluginRoot,
181
- stateDir,
182
- });
167
+ handleSessionStartHook(_args) {
168
+ writeNoopHookResult();
169
+ return Promise.resolve(0);
183
170
  },
184
- findHookDispatcherPath(startCwd) {
185
- const pluginRoot = resolvePiPluginRoot();
186
- if (pluginRoot) {
187
- const candidate = path.join(pluginRoot, "hooks", "hook-dispatcher.sh");
188
- if ((0, node_fs_1.existsSync)(candidate))
189
- return candidate;
190
- }
191
- const local = path.join(path.resolve(startCwd), ".omp", "hooks", "hook-dispatcher.sh");
192
- if ((0, node_fs_1.existsSync)(local))
193
- return local;
171
+ findHookDispatcherPath(_startCwd) {
194
172
  return null;
195
173
  },
196
174
  installHarness(options) {
197
- return installPiFamilyHarness({
175
+ return (0, installSupport_1.installCliViaNpm)({
198
176
  harness: "pi",
199
177
  cliCommand: "pi",
200
178
  packageName: "@mariozechner/pi-coding-agent",
179
+ summary: "Install the Pi Coding Agent CLI globally via npm.",
201
180
  options,
202
181
  });
203
182
  },
204
183
  installPlugin(options) {
205
- return installPiFamilyPlugin({
206
- harness: "pi",
207
- options,
208
- });
184
+ return installPiPlugin(options);
209
185
  },
210
186
  getCapabilities() {
211
- return [types_1.HarnessCapability.SessionBinding, types_1.HarnessCapability.StopHook, types_1.HarnessCapability.HeadlessPrompt];
187
+ return [types_1.HarnessCapability.Programmatic, types_1.HarnessCapability.SessionBinding, types_1.HarnessCapability.HeadlessPrompt];
212
188
  },
213
189
  getPromptContext(opts) {
214
190
  return (0, context_1.createPiContext)(opts);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/harness/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA+B9C;;;GAGG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAK9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAKpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAQD;;GAEG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAK3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/harness/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiC9C;;;GAGG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAK9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAKpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AAQD;;GAEG;AACH,wBAAgB,UAAU,IAAI,cAAc,CAK3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
@@ -21,6 +21,7 @@ const ohMyPi_1 = require("./ohMyPi");
21
21
  const internal_1 = require("./internal");
22
22
  const cursor_1 = require("./cursor");
23
23
  const githubCopilot_1 = require("./githubCopilot");
24
+ const opencode_1 = require("./opencode");
24
25
  const customAdapter_1 = require("./customAdapter");
25
26
  // ---------------------------------------------------------------------------
26
27
  // Registry of known adapters (ordered by priority)
@@ -30,6 +31,7 @@ const knownAdapters = [
30
31
  (0, ohMyPi_1.createOhMyPiAdapter)(),
31
32
  (0, internal_1.createInternalAdapter)(),
32
33
  (0, pi_1.createPiAdapter)(),
34
+ (0, opencode_1.createOpenCodeAdapter)(),
33
35
  (0, claudeCode_1.createClaudeCodeAdapter)(),
34
36
  (0, geminiCli_1.createGeminiCliAdapter)(),
35
37
  (0, cursor_1.createCursorAdapter)(),
@@ -20,8 +20,17 @@ export declare function createGithubCopilotContext(overrides?: Partial<PromptCon
20
20
  * Create a PromptContext pre-configured for Cursor IDE/CLI.
21
21
  */
22
22
  export declare function createCursorContext(overrides?: Partial<PromptContext>): PromptContext;
23
+ /**
24
+ * Create a PromptContext pre-configured for Gemini CLI.
25
+ */
26
+ export declare function createGeminiCliContext(overrides?: Partial<PromptContext>): PromptContext;
27
+ /**
28
+ * Create a PromptContext pre-configured for OpenCode.
29
+ */
30
+ export declare function createOpenCodeContext(overrides?: Partial<PromptContext>): PromptContext;
23
31
  /**
24
32
  * Create a PromptContext pre-configured for PI.
25
33
  */
26
34
  export declare function createPiContext(overrides?: Partial<PromptContext>): PromptContext;
35
+ export declare function createOhMyPiContext(overrides?: Partial<PromptContext>): PromptContext;
27
36
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/prompts/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAUxC;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAgCf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAiCf;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAiCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAiCf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CA+Bf"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/prompts/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAUxC;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CA+Bf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAgCf;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAiCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAiCf;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CA+Bf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CAkCf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CA+Bf;AAED,wBAAgB,mBAAmB,CACjC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GACjC,aAAa,CA+Bf"}
@@ -9,7 +9,10 @@ exports.createClaudeCodeContext = createClaudeCodeContext;
9
9
  exports.createCodexContext = createCodexContext;
10
10
  exports.createGithubCopilotContext = createGithubCopilotContext;
11
11
  exports.createCursorContext = createCursorContext;
12
+ exports.createGeminiCliContext = createGeminiCliContext;
13
+ exports.createOpenCodeContext = createOpenCodeContext;
12
14
  exports.createPiContext = createPiContext;
15
+ exports.createOhMyPiContext = createOhMyPiContext;
13
16
  const COMMON_DEFAULTS = {
14
17
  interactive: true,
15
18
  platform: typeof process !== 'undefined' ? process.platform : 'linux',
@@ -28,11 +31,11 @@ function createClaudeCodeContext(overrides) {
28
31
  capabilities: ['hooks', 'stop-hook', 'ask-user-question', 'task-tool', 'breakpoint-routing'],
29
32
  pluginRootVar: '${CLAUDE_PLUGIN_ROOT}',
30
33
  loopControlTerm: 'stop-hook',
31
- sessionBindingFlags: '--plugin-root "${CLAUDE_PLUGIN_ROOT}"',
34
+ sessionBindingFlags: '',
32
35
  hookDriven: true,
33
36
  interactiveToolName: 'AskUserQuestion tool',
34
- sessionEnvVars: 'CLAUDE_SESSION_ID, CLAUDE_ENV_FILE',
35
- resumeFlags: '--state-dir "${CLAUDE_PLUGIN_ROOT}/skills/babysit/state"',
37
+ sessionEnvVars: 'BABYSITTER_SESSION_ID (via CLAUDE_ENV_FILE)',
38
+ resumeFlags: '',
36
39
  cliSetupSnippet: [
37
40
  'Read the SDK version from `versions.json` to ensure version compatibility:',
38
41
  '',
@@ -46,7 +49,7 @@ function createClaudeCodeContext(overrides) {
46
49
  '**Alternatively:** `CLI="npx -y @a5c-ai/babysitter-sdk@$SDK_VERSION"`',
47
50
  ].join('\n'),
48
51
  sdkVersionExpr: '$SDK_VERSION',
49
- iterateFlags: '--plugin-root "${CLAUDE_PLUGIN_ROOT}"',
52
+ iterateFlags: '',
50
53
  hasIntentFidelityChecks: false,
51
54
  hasNonNegotiables: false,
52
55
  ...overrides,
@@ -63,11 +66,11 @@ function createCodexContext(overrides) {
63
66
  capabilities: ['hooks', 'stop-hook', 'ask-user-question', 'task-tool', 'breakpoint-routing'],
64
67
  pluginRootVar: '${CODEX_PLUGIN_ROOT}',
65
68
  loopControlTerm: 'stop-hook',
66
- sessionBindingFlags: '--state-dir .a5c --plugin-root "${CODEX_PLUGIN_ROOT}"',
67
- hookDriven: typeof globalThis.process !== 'undefined' ? globalThis.process.platform !== 'win32' : true,
69
+ sessionBindingFlags: '',
70
+ hookDriven: true, // overridden at instruction-generation time if session-start hook hasn't run
68
71
  interactiveToolName: 'AskUserQuestion tool',
69
- sessionEnvVars: 'CODEX_THREAD_ID, CODEX_SESSION_ID, CODEX_ENV_FILE',
70
- resumeFlags: '--state-dir .a5c',
72
+ sessionEnvVars: 'BABYSITTER_SESSION_ID, CODEX_THREAD_ID (auto-injected)',
73
+ resumeFlags: '',
71
74
  cliSetupSnippet: [
72
75
  'Use the installed CLI alias:',
73
76
  '',
@@ -81,7 +84,7 @@ function createCodexContext(overrides) {
81
84
  'CLI="npx -y @a5c-ai/babysitter-sdk"',
82
85
  '```',
83
86
  ].join('\n'),
84
- iterateFlags: '--plugin-root "${CODEX_PLUGIN_ROOT}"',
87
+ iterateFlags: '',
85
88
  hasIntentFidelityChecks: true,
86
89
  hasNonNegotiables: true,
87
90
  ...overrides,
@@ -100,11 +103,11 @@ function createGithubCopilotContext(overrides) {
100
103
  // In-turn model: agent drives orchestration loop within a single session.
101
104
  // No stop-hook available — Copilot CLI sessionEnd output is ignored.
102
105
  loopControlTerm: 'in-turn',
103
- sessionBindingFlags: '--state-dir .a5c/state',
106
+ sessionBindingFlags: '',
104
107
  hookDriven: false,
105
108
  interactiveToolName: 'AskUserQuestion tool',
106
- sessionEnvVars: 'session_id (via hook stdin JSON, if configured)',
107
- resumeFlags: '--state-dir .a5c/state',
109
+ sessionEnvVars: 'BABYSITTER_SESSION_ID (via COPILOT_ENV_FILE or CLAUDE_ENV_FILE)',
110
+ resumeFlags: '',
108
111
  cliSetupSnippet: [
109
112
  'Use the installed CLI alias:',
110
113
  '',
@@ -137,11 +140,84 @@ function createCursorContext(overrides) {
137
140
  // Stop-hook model: Cursor's stop hook returns {followup_message: "..."}
138
141
  // to auto-continue (controlled by loop_limit in hooks.json).
139
142
  loopControlTerm: 'stop-hook',
140
- sessionBindingFlags: '--state-dir .a5c/state',
143
+ sessionBindingFlags: '',
144
+ hookDriven: true,
145
+ interactiveToolName: 'AskUserQuestion tool',
146
+ sessionEnvVars: 'BABYSITTER_SESSION_ID or conversation_id (via hook stdin JSON)',
147
+ resumeFlags: '',
148
+ cliSetupSnippet: [
149
+ 'Use the installed CLI alias:',
150
+ '',
151
+ '```bash',
152
+ 'CLI="babysitter"',
153
+ '```',
154
+ '',
155
+ 'If it is not available on the path, use:',
156
+ '',
157
+ '```bash',
158
+ 'CLI="npx -y @a5c-ai/babysitter-sdk"',
159
+ '```',
160
+ ].join('\n'),
161
+ iterateFlags: '',
162
+ hasIntentFidelityChecks: false,
163
+ hasNonNegotiables: false,
164
+ ...overrides,
165
+ };
166
+ }
167
+ /**
168
+ * Create a PromptContext pre-configured for Gemini CLI.
169
+ */
170
+ function createGeminiCliContext(overrides) {
171
+ return {
172
+ ...COMMON_DEFAULTS,
173
+ harness: 'gemini-cli',
174
+ harnessLabel: 'Gemini CLI',
175
+ capabilities: ['hooks', 'stop-hook', 'task-tool', 'breakpoint-routing'],
176
+ pluginRootVar: '${GEMINI_EXTENSION_PATH}',
177
+ loopControlTerm: 'stop-hook',
178
+ sessionBindingFlags: '',
141
179
  hookDriven: true,
142
180
  interactiveToolName: 'AskUserQuestion tool',
143
- sessionEnvVars: 'conversation_id (via hook stdin JSON)',
144
- resumeFlags: '--state-dir .a5c/state',
181
+ sessionEnvVars: 'BABYSITTER_SESSION_ID, GEMINI_SESSION_ID (auto-injected)',
182
+ resumeFlags: '',
183
+ cliSetupSnippet: [
184
+ 'Use the installed CLI alias:',
185
+ '',
186
+ '```bash',
187
+ 'CLI="babysitter"',
188
+ '```',
189
+ '',
190
+ 'If it is not available on the path, use:',
191
+ '',
192
+ '```bash',
193
+ 'CLI="npx -y @a5c-ai/babysitter-sdk"',
194
+ '```',
195
+ ].join('\n'),
196
+ iterateFlags: '',
197
+ hasIntentFidelityChecks: false,
198
+ hasNonNegotiables: false,
199
+ ...overrides,
200
+ };
201
+ }
202
+ /**
203
+ * Create a PromptContext pre-configured for OpenCode.
204
+ */
205
+ function createOpenCodeContext(overrides) {
206
+ return {
207
+ ...COMMON_DEFAULTS,
208
+ harness: 'opencode',
209
+ harnessLabel: 'OpenCode',
210
+ capabilities: ['task-tool', 'breakpoint-routing'],
211
+ pluginRootVar: '',
212
+ // In-turn model: OpenCode has no blocking stop hook.
213
+ // session.idle is fire-and-forget. Orchestration is driven in-turn
214
+ // by the agent itself or via the SDK loop driver.
215
+ loopControlTerm: 'in-turn',
216
+ sessionBindingFlags: '',
217
+ hookDriven: false,
218
+ interactiveToolName: '',
219
+ sessionEnvVars: 'BABYSITTER_SESSION_ID (self-injected via shell.env hook)',
220
+ resumeFlags: '',
145
221
  cliSetupSnippet: [
146
222
  'Use the installed CLI alias:',
147
223
  '',
@@ -168,14 +244,46 @@ function createPiContext(overrides) {
168
244
  return {
169
245
  ...COMMON_DEFAULTS,
170
246
  harness: 'pi',
171
- harnessLabel: 'PI',
172
- capabilities: ['loop-driver', 'ask-user-question', 'task-tool', 'breakpoint-routing', 'harness-routing'],
173
- pluginRootVar: '',
174
- loopControlTerm: 'loop-driver',
247
+ harnessLabel: 'Pi Coding Agent',
248
+ capabilities: ['skills', 'slash-commands', 'task-tool', 'harness-routing', 'programmatic-session'],
249
+ pluginRootVar: '${PI_PLUGIN_ROOT}',
250
+ loopControlTerm: 'skill-driven',
251
+ sessionBindingFlags: '',
252
+ hookDriven: false,
253
+ interactiveToolName: 'AskUserQuestion',
254
+ sessionEnvVars: 'BABYSITTER_SESSION_ID, PI_SESSION_ID, PI_PLUGIN_ROOT',
255
+ resumeFlags: '',
256
+ cliSetupSnippet: [
257
+ 'Use the installed CLI alias:',
258
+ '',
259
+ '```bash',
260
+ 'CLI="babysitter"',
261
+ '```',
262
+ '',
263
+ 'If it is not available on the path, use:',
264
+ '',
265
+ '```bash',
266
+ 'CLI="npx -y @a5c-ai/babysitter-sdk"',
267
+ '```',
268
+ ].join('\n'),
269
+ iterateFlags: '',
270
+ hasIntentFidelityChecks: false,
271
+ hasNonNegotiables: false,
272
+ ...overrides,
273
+ };
274
+ }
275
+ function createOhMyPiContext(overrides) {
276
+ return {
277
+ ...COMMON_DEFAULTS,
278
+ harness: 'oh-my-pi',
279
+ harnessLabel: 'oh-my-pi',
280
+ capabilities: ['skills', 'slash-commands', 'task-tool', 'harness-routing', 'programmatic-session', 'mcp'],
281
+ pluginRootVar: '${OMP_PLUGIN_ROOT}',
282
+ loopControlTerm: 'skill-driven',
175
283
  sessionBindingFlags: '',
176
284
  hookDriven: false,
177
285
  interactiveToolName: 'AskUserQuestion',
178
- sessionEnvVars: '(auto-resolved by PI extension)',
286
+ sessionEnvVars: 'BABYSITTER_SESSION_ID, OMP_SESSION_ID, OMP_PLUGIN_ROOT',
179
287
  resumeFlags: '',
180
288
  cliSetupSnippet: [
181
289
  'Use the installed CLI alias:',
@@ -4,7 +4,7 @@
4
4
  * @module prompts
5
5
  */
6
6
  export type { PromptContext, PromptPart } from './types';
7
- export { createClaudeCodeContext, createCodexContext, createPiContext, } from './context';
7
+ export { createClaudeCodeContext, createCodexContext, createGeminiCliContext, createPiContext, } from './context';
8
8
  export { renderTemplate, renderTemplateString, resolveTemplatePath, } from './templateRenderer';
9
9
  export { renderCommandTemplate, resolveCommandTemplatePath, } from './commandTemplates';
10
10
  export { composeBabysitSkillPrompt, composeProcessCreatePrompt, composeOrchestrationPrompt, composeBreakpointPrompt, joinNonEmpty, } from './compose';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,uBAAuB,EACvB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,uBAAuB,EACvB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
@@ -5,11 +5,12 @@
5
5
  * @module prompts
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.renderNonNegotiables = exports.renderSeeAlso = exports.renderCriticalRules = exports.renderProcessGuidelines = exports.renderRecovery = exports.renderQuickReference = exports.renderTaskExamples = exports.renderTaskKinds = exports.renderCompletionProof = exports.renderLoopControl = exports.renderResultsPosting = exports.renderBreakpointHandling = exports.renderEffects = exports.renderIteration = exports.renderRunCreation = exports.renderIntentFidelityChecks = exports.renderProcessCreation = exports.renderUserProfile = exports.renderInterview = exports.renderDependencies = exports.joinNonEmpty = exports.composeBreakpointPrompt = exports.composeOrchestrationPrompt = exports.composeProcessCreatePrompt = exports.composeBabysitSkillPrompt = exports.resolveCommandTemplatePath = exports.renderCommandTemplate = exports.resolveTemplatePath = exports.renderTemplateString = exports.renderTemplate = exports.createPiContext = exports.createCodexContext = exports.createClaudeCodeContext = void 0;
8
+ exports.renderNonNegotiables = exports.renderSeeAlso = exports.renderCriticalRules = exports.renderProcessGuidelines = exports.renderRecovery = exports.renderQuickReference = exports.renderTaskExamples = exports.renderTaskKinds = exports.renderCompletionProof = exports.renderLoopControl = exports.renderResultsPosting = exports.renderBreakpointHandling = exports.renderEffects = exports.renderIteration = exports.renderRunCreation = exports.renderIntentFidelityChecks = exports.renderProcessCreation = exports.renderUserProfile = exports.renderInterview = exports.renderDependencies = exports.joinNonEmpty = exports.composeBreakpointPrompt = exports.composeOrchestrationPrompt = exports.composeProcessCreatePrompt = exports.composeBabysitSkillPrompt = exports.resolveCommandTemplatePath = exports.renderCommandTemplate = exports.resolveTemplatePath = exports.renderTemplateString = exports.renderTemplate = exports.createPiContext = exports.createGeminiCliContext = exports.createCodexContext = exports.createClaudeCodeContext = void 0;
9
9
  // Context factories
10
10
  var context_1 = require("./context");
11
11
  Object.defineProperty(exports, "createClaudeCodeContext", { enumerable: true, get: function () { return context_1.createClaudeCodeContext; } });
12
12
  Object.defineProperty(exports, "createCodexContext", { enumerable: true, get: function () { return context_1.createCodexContext; } });
13
+ Object.defineProperty(exports, "createGeminiCliContext", { enumerable: true, get: function () { return context_1.createGeminiCliContext; } });
13
14
  Object.defineProperty(exports, "createPiContext", { enumerable: true, get: function () { return context_1.createPiContext; } });
14
15
  // Template renderer
15
16
  var templateRenderer_1 = require("./templateRenderer");
@@ -7,7 +7,15 @@ loop.
7
7
 
8
8
  ### Progressing Between The Phases
9
9
 
10
+ {{#hookDriven}}
10
11
  After you run `run:create`, progress through the phases above by stopping the
11
12
  session, which will trigger the {{loopControlTerm}} and call you with the next phase.
12
13
  After you finish each phase after `run:create`, stop the session and return
13
14
  control to the user until you are called again by the hook.
15
+ {{/hookDriven}}
16
+ {{^hookDriven}}
17
+ After you run `run:create`, progress through the phases above by continuing
18
+ to iterate in the same session. Drive the loop yourself: call `run:iterate`,
19
+ perform effects, post results, and repeat until the run completes or you need
20
+ explicit user input for a breakpoint.
21
+ {{/hookDriven}}
@@ -37,11 +37,11 @@ continue. Running multiple iterations in a single session turn bypasses the hook
37
37
  loop and breaks the orchestration model.
38
38
  {{/hookDriven}}
39
39
  {{^hookDriven}}
40
- CRITICAL RULE: After run:create and after each effect is posted, you MUST finish
41
- your turn and return control. Do NOT proceed to the next run:iterate in the same
42
- agent turn. The {{loopControlTerm}} will call you back to continue. Running multiple
43
- iterations in a single agent turn bypasses the loop and breaks the orchestration
44
- model.
40
+ CRITICAL RULE: Hooks are NOT available in this environment. You MUST drive the
41
+ orchestration loop yourself in-turn: after run:create, keep calling run:iterate,
42
+ performing effects, and posting results in the same session until the run reaches
43
+ a terminal state or you need explicit user input for a breakpoint. Do NOT stop
44
+ and wait for a hook callback -- it will never arrive.
45
45
  {{/hookDriven}}
46
46
 
47
47
  CRITICAL RULE: NEVER use `kind: 'node'` in generated process files. All tasks
@@ -49,15 +49,14 @@ export interface PromptContext {
49
49
  interactiveToolName: string;
50
50
  /**
51
51
  * Environment variables the harness auto-resolves for session binding.
52
- * e.g., 'CLAUDE_SESSION_ID, CLAUDE_ENV_FILE' or
53
- * 'CODEX_THREAD_ID, CODEX_SESSION_ID, CODEX_ENV_FILE'
52
+ * e.g., 'BABYSITTER_SESSION_ID (via CLAUDE_ENV_FILE)' or
53
+ * 'BABYSITTER_SESSION_ID, CODEX_THREAD_ID (auto-injected)'
54
54
  */
55
55
  sessionEnvVars: string;
56
56
  /**
57
57
  * Extra flags for session:resume command.
58
- * e.g., '--state-dir "${CLAUDE_PLUGIN_ROOT}/skills/babysit/state"'
59
- * or '--state-dir .a5c'
60
- * or '' (PI, no extra flags)
58
+ * Usually empty — state dir defaults to ~/.a5c/state/ globally.
59
+ * Only set when a harness needs an explicit override.
61
60
  */
62
61
  resumeFlags: string;
63
62
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompts/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IAErB;sFACkF;IAClF,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IAEjC;;;;OAIG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;uFACmF;IACnF,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prompts/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAEhB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IAErB;sFACkF;IAClF,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IAEjC;;;;OAIG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;uFACmF;IACnF,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a5c-ai/babysitter-sdk",
3
- "version": "0.0.184",
3
+ "version": "0.0.185",
4
4
  "description": "Storage and run-registry primitives for event-sourced babysitter workflows.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "commonjs",