@a5c-ai/babysitter-codex 0.1.6-staging.2df34517 → 0.1.6-staging.3faa6c86

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/.app.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "apps": {}
3
+ }
@@ -19,6 +19,7 @@
19
19
  ],
20
20
  "skills": "./skills/",
21
21
  "hooks": "./hooks.json",
22
+ "apps": "./.app.json",
22
23
  "interface": {
23
24
  "displayName": "Babysitter",
24
25
  "shortDescription": "Run Babysitter orchestration flows from Codex",
@@ -39,6 +40,8 @@
39
40
  "Resume the latest Babysitter run in this workspace"
40
41
  ],
41
42
  "brandColor": "#0F766E",
43
+ "composerIcon": "./assets/icon.svg",
44
+ "logo": "./assets/logo.svg",
42
45
  "screenshots": []
43
46
  }
44
47
  }
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Babysitter integration package for OpenAI Codex CLI.
4
4
 
5
- This package now ships as a real Codex plugin bundle:
5
+ This package ships a real Codex plugin bundle:
6
6
 
7
7
  - `.codex-plugin/plugin.json`
8
8
  - `skills/`
@@ -10,8 +10,9 @@ This package now ships as a real Codex plugin bundle:
10
10
  - `hooks/`
11
11
 
12
12
  It still uses the Babysitter SDK CLI and the shared `~/.a5c` process-library
13
- state, but it no longer installs itself by copying fake skill and hook payloads
14
- into `~/.codex/skills` and `~/.codex/hooks.json`.
13
+ state. The installer registers the plugin bundle and also materializes the
14
+ active Codex `skills/`, `hooks/`, and `hooks.json` surface at the selected
15
+ scope so Codex can execute the Babysitter commands and hook scripts directly.
15
16
 
16
17
  ## Installation
17
18
 
@@ -21,27 +22,17 @@ Install the SDK CLI first:
21
22
  npm install -g @a5c-ai/babysitter-sdk
22
23
  ```
23
24
 
24
- Install the Codex plugin globally:
25
+ clone the repo and install the plugin globally:
25
26
 
26
27
  ```bash
27
- npx @a5c-ai/babysitter-codex install
28
- ```
29
-
30
- This copies the plugin into `~/.codex/plugins/babysitter-codex`, registers it
31
- in `~/.agents/plugins/marketplace.json`, merges the required global Codex
32
- config into `~/.codex/config.toml`, and ensures the Babysitter process library
33
- is active in `~/.a5c`.
28
+ git clone https://github.com/a5c-ai/babysitter.git
29
+ cd babysitter
30
+ codex
34
31
 
35
- Install the plugin into a specific workspace:
36
-
37
- ```bash
38
- npx @a5c-ai/babysitter-codex install --workspace /path/to/repo
32
+ > /plugins
39
33
  ```
40
34
 
41
- This copies the plugin into `<workspace>/plugins/babysitter-codex`, registers
42
- it in `<workspace>/.agents/plugins/marketplace.json`, merges
43
- `<workspace>/.codex/config.toml`, and records install metadata under
44
- `<workspace>/.a5c/team/`.
35
+ then navigate to the 'babysitter' entry and select 'Install'.
45
36
 
46
37
  ## Integration Model
47
38
 
@@ -62,6 +53,9 @@ After `install --workspace`, the important files are:
62
53
  - `plugins/babysitter-codex/.codex-plugin/plugin.json`
63
54
  - `plugins/babysitter-codex/skills/babysit/SKILL.md`
64
55
  - `plugins/babysitter-codex/hooks.json`
56
+ - `.codex/skills/`
57
+ - `.codex/hooks/`
58
+ - `.codex/hooks.json`
65
59
  - `.agents/plugins/marketplace.json`
66
60
  - `.codex/config.toml`
67
61
  - `.a5c/team/install.json`
@@ -77,6 +71,9 @@ test -f ~/.codex/plugins/babysitter-codex/.codex-plugin/plugin.json
77
71
  test -f ~/.codex/plugins/babysitter-codex/hooks.json
78
72
  test -f ~/.codex/plugins/babysitter-codex/hooks/babysitter-stop-hook.sh
79
73
  test -f ~/.codex/plugins/babysitter-codex/skills/babysit/SKILL.md
74
+ test -f ~/.codex/hooks.json
75
+ test -f ~/.codex/hooks/babysitter-stop-hook.sh
76
+ test -f ~/.codex/skills/babysit/SKILL.md
80
77
  test -f ~/.agents/plugins/marketplace.json
81
78
  ```
82
79
 
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Babysitter icon">
2
+ <rect width="64" height="64" rx="14" fill="#0F766E"/>
3
+ <path d="M16 22h32v20H16z" fill="#ECFEFF"/>
4
+ <circle cx="24" cy="32" r="3" fill="#0F766E"/>
5
+ <circle cx="32" cy="32" r="3" fill="#0F766E"/>
6
+ <circle cx="40" cy="32" r="3" fill="#0F766E"/>
7
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 80" role="img" aria-label="Babysitter logo">
2
+ <rect x="0" y="8" width="64" height="64" rx="14" fill="#0F766E"/>
3
+ <path d="M16 26h32v28H16z" fill="#ECFEFF"/>
4
+ <circle cx="24" cy="40" r="3" fill="#0F766E"/>
5
+ <circle cx="32" cy="40" r="3" fill="#0F766E"/>
6
+ <circle cx="40" cy="40" r="3" fill="#0F766E"/>
7
+ <text x="80" y="50" font-family="Arial, sans-serif" font-size="34" fill="#0F766E">Babysitter</text>
8
+ </svg>
@@ -58,10 +58,11 @@ const DEFAULT_MARKETPLACE = {
58
58
  };
59
59
  const PLUGIN_BUNDLE_ENTRIES = [
60
60
  '.codex-plugin',
61
+ '.app.json',
62
+ 'assets',
61
63
  'hooks',
62
64
  'hooks.json',
63
65
  'skills',
64
- 'README.md',
65
66
  'babysitter.lock.json',
66
67
  ];
67
68
 
@@ -306,6 +307,26 @@ function writeJson(filePath, value) {
306
307
  writeFileIfChanged(filePath, `${JSON.stringify(value, null, 2)}\n`);
307
308
  }
308
309
 
310
+ function ensureExecutable(filePath) {
311
+ try {
312
+ fs.chmodSync(filePath, 0o755);
313
+ } catch {
314
+ // Best-effort only. Windows and some filesystems may ignore mode changes.
315
+ }
316
+ }
317
+
318
+ function normalizeMarketplaceSourcePath(marketplacePath, pluginSourcePath) {
319
+ let next = pluginSourcePath;
320
+ if (path.isAbsolute(next)) {
321
+ next = path.relative(path.dirname(marketplacePath), next);
322
+ }
323
+ next = String(next || '').replace(/\\/g, '/');
324
+ if (!next.startsWith('./') && !next.startsWith('../')) {
325
+ next = `./${next}`;
326
+ }
327
+ return next;
328
+ }
329
+
309
330
  function ensureMarketplaceEntry(marketplacePath, pluginSourcePath) {
310
331
  const marketplace = fs.existsSync(marketplacePath)
311
332
  ? readJson(marketplacePath)
@@ -318,7 +339,7 @@ function ensureMarketplaceEntry(marketplacePath, pluginSourcePath) {
318
339
  name: PLUGIN_NAME,
319
340
  source: {
320
341
  source: 'local',
321
- path: pluginSourcePath,
342
+ path: normalizeMarketplaceSourcePath(marketplacePath, pluginSourcePath),
322
343
  },
323
344
  policy: {
324
345
  installation: 'AVAILABLE',
@@ -401,6 +422,69 @@ function removeLegacyCodexSurface(codexHome) {
401
422
  }
402
423
  }
403
424
 
425
+ function installManagedSkills(packageRoot, codexHome) {
426
+ const sourceRoot = path.join(packageRoot, 'skills');
427
+ const targetRoot = path.join(codexHome, 'skills');
428
+ fs.mkdirSync(targetRoot, { recursive: true });
429
+
430
+ for (const entry of fs.readdirSync(sourceRoot, { withFileTypes: true })) {
431
+ if (!entry.isDirectory()) continue;
432
+ copyRecursive(
433
+ path.join(sourceRoot, entry.name),
434
+ path.join(targetRoot, entry.name),
435
+ );
436
+ }
437
+ }
438
+
439
+ function mergeManagedHooksConfig(packageRoot, codexHome) {
440
+ const managedHooks = readJson(path.join(packageRoot, 'hooks.json')).hooks || {};
441
+ const hooksConfigPath = path.join(codexHome, 'hooks.json');
442
+ const existing = fs.existsSync(hooksConfigPath)
443
+ ? readJson(hooksConfigPath)
444
+ : { hooks: {} };
445
+ if (!existing.hooks || typeof existing.hooks !== 'object') {
446
+ existing.hooks = {};
447
+ }
448
+
449
+ for (const [eventName, matchers] of Object.entries(managedHooks)) {
450
+ const existingMatchers = Array.isArray(existing.hooks[eventName]) ? existing.hooks[eventName] : [];
451
+ const filteredMatchers = existingMatchers
452
+ .map((matcher) => {
453
+ const hooks = Array.isArray(matcher.hooks) ? matcher.hooks : [];
454
+ const keptHooks = hooks.filter((hook) => {
455
+ const command = String(hook.command || '');
456
+ return !LEGACY_HOOK_SCRIPT_NAMES.some((name) => command.includes(name));
457
+ });
458
+ return keptHooks.length > 0 ? { ...matcher, hooks: keptHooks } : null;
459
+ })
460
+ .filter(Boolean);
461
+ existing.hooks[eventName] = [...filteredMatchers, ...matchers];
462
+ }
463
+
464
+ writeJson(hooksConfigPath, existing);
465
+ }
466
+
467
+ function installManagedHooks(packageRoot, codexHome) {
468
+ const sourceRoot = path.join(packageRoot, 'hooks');
469
+ const targetRoot = path.join(codexHome, 'hooks');
470
+ fs.mkdirSync(targetRoot, { recursive: true });
471
+
472
+ for (const scriptName of LEGACY_HOOK_SCRIPT_NAMES) {
473
+ const sourcePath = path.join(sourceRoot, scriptName);
474
+ const targetPath = path.join(targetRoot, scriptName);
475
+ copyRecursive(sourcePath, targetPath);
476
+ ensureExecutable(targetPath);
477
+ }
478
+
479
+ mergeManagedHooksConfig(packageRoot, codexHome);
480
+ }
481
+
482
+ function installCodexSurface(packageRoot, codexHome) {
483
+ removeLegacyCodexSurface(codexHome);
484
+ installManagedSkills(packageRoot, codexHome);
485
+ installManagedHooks(packageRoot, codexHome);
486
+ }
487
+
404
488
  function warnWindowsHooks() {
405
489
  if (process.platform !== 'win32') {
406
490
  return;
@@ -416,6 +500,7 @@ module.exports = {
416
500
  getCodexHome,
417
501
  getHomeMarketplacePath,
418
502
  getHomePluginRoot,
503
+ installCodexSurface,
419
504
  mergeCodexConfigFile,
420
505
  removeLegacyCodexSurface,
421
506
  removeMarketplaceEntry,
package/bin/install.js CHANGED
@@ -9,8 +9,8 @@ const {
9
9
  getCodexHome,
10
10
  getHomeMarketplacePath,
11
11
  getHomePluginRoot,
12
+ installCodexSurface,
12
13
  mergeCodexConfigFile,
13
- removeLegacyCodexSurface,
14
14
  warnWindowsHooks,
15
15
  } = require('./install-shared');
16
16
 
@@ -25,9 +25,9 @@ function main() {
25
25
 
26
26
  try {
27
27
  copyPluginBundle(PACKAGE_ROOT, pluginRoot);
28
- ensureMarketplaceEntry(marketplacePath, './plugins/babysitter-codex');
28
+ ensureMarketplaceEntry(marketplacePath, pluginRoot);
29
29
  mergeCodexConfigFile(path.join(codexHome, 'config.toml'));
30
- removeLegacyCodexSurface(codexHome);
30
+ installCodexSurface(PACKAGE_ROOT, codexHome);
31
31
 
32
32
  const active = ensureGlobalProcessLibrary(PACKAGE_ROOT);
33
33
  console.log(`[babysitter-codex] marketplace: ${marketplacePath}`);
@@ -11,16 +11,23 @@ export CODEX_PLUGIN_ROOT="${CODEX_PLUGIN_ROOT:-${PLUGIN_ROOT}}"
11
11
  export BABYSITTER_STATE_DIR="${STATE_DIR}"
12
12
 
13
13
  mkdir -p "$LOG_DIR" 2>/dev/null
14
- {
15
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook script invoked"
16
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) PLUGIN_ROOT=$PLUGIN_ROOT"
17
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) STATE_DIR=$STATE_DIR"
18
- } >> "$LOG_FILE" 2>/dev/null
14
+
15
+ blog() {
16
+ local msg="$1"
17
+ local ts
18
+ ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
19
+ echo "[INFO] $ts $msg" >> "$LOG_FILE" 2>/dev/null
20
+ babysitter log --type hook --label "hook:session-start" --message "$msg" --source shell-hook 2>/dev/null || true
21
+ }
22
+
23
+ blog "Hook script invoked"
24
+ blog "PLUGIN_ROOT=$PLUGIN_ROOT"
25
+ blog "STATE_DIR=$STATE_DIR"
19
26
 
20
27
  INPUT_FILE=$(mktemp 2>/dev/null || echo "/tmp/codex-session-start-hook-$$.json")
21
28
  cat > "$INPUT_FILE"
22
29
 
23
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook input received ($(wc -c < "$INPUT_FILE") bytes)" >> "$LOG_FILE" 2>/dev/null
30
+ blog "Hook input received ($(wc -c < "$INPUT_FILE") bytes)"
24
31
 
25
32
  RESULT=$(babysitter hook:run \
26
33
  --hook-type session-start \
@@ -30,7 +37,7 @@ RESULT=$(babysitter hook:run \
30
37
  < "$INPUT_FILE" 2>"$LOG_DIR/babysitter-session-start-hook-stderr.log")
31
38
  EXIT_CODE=$?
32
39
 
33
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) CLI exit code=$EXIT_CODE" >> "$LOG_FILE" 2>/dev/null
40
+ blog "CLI exit code=$EXIT_CODE"
34
41
 
35
42
  rm -f "$INPUT_FILE" 2>/dev/null
36
43
  printf '%s\n' "$RESULT"
@@ -11,16 +11,23 @@ export CODEX_PLUGIN_ROOT="${CODEX_PLUGIN_ROOT:-${PLUGIN_ROOT}}"
11
11
  export BABYSITTER_STATE_DIR="${STATE_DIR}"
12
12
 
13
13
  mkdir -p "$LOG_DIR" 2>/dev/null
14
- {
15
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook script invoked"
16
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) PLUGIN_ROOT=$PLUGIN_ROOT"
17
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) STATE_DIR=$STATE_DIR"
18
- } >> "$LOG_FILE" 2>/dev/null
14
+
15
+ blog() {
16
+ local msg="$1"
17
+ local ts
18
+ ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
19
+ echo "[INFO] $ts $msg" >> "$LOG_FILE" 2>/dev/null
20
+ babysitter log --type hook --label "hook:stop" --message "$msg" --source shell-hook 2>/dev/null || true
21
+ }
22
+
23
+ blog "Hook script invoked"
24
+ blog "PLUGIN_ROOT=$PLUGIN_ROOT"
25
+ blog "STATE_DIR=$STATE_DIR"
19
26
 
20
27
  INPUT_FILE=$(mktemp 2>/dev/null || echo "/tmp/codex-stop-hook-$$.json")
21
28
  cat > "$INPUT_FILE"
22
29
 
23
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook input received ($(wc -c < "$INPUT_FILE") bytes)" >> "$LOG_FILE" 2>/dev/null
30
+ blog "Hook input received ($(wc -c < "$INPUT_FILE") bytes)"
24
31
 
25
32
  RESULT=$(babysitter hook:run \
26
33
  --hook-type stop \
@@ -30,7 +37,7 @@ RESULT=$(babysitter hook:run \
30
37
  < "$INPUT_FILE" 2>"$LOG_DIR/babysitter-stop-hook-stderr.log")
31
38
  EXIT_CODE=$?
32
39
 
33
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) CLI exit code=$EXIT_CODE" >> "$LOG_FILE" 2>/dev/null
40
+ blog "CLI exit code=$EXIT_CODE"
34
41
 
35
42
  rm -f "$INPUT_FILE" 2>/dev/null
36
43
  printf '%s\n' "$RESULT"
@@ -5,22 +5,16 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
5
  PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
6
6
  STATE_DIR="${BABYSITTER_STATE_DIR:-${PWD}/.a5c}"
7
7
  LOG_DIR="${BABYSITTER_LOG_DIR:-$PLUGIN_ROOT/.a5c/logs}"
8
- LOG_FILE="$LOG_DIR/babysitter-user-prompt-submit-hook.log"
9
8
 
10
9
  export CODEX_PLUGIN_ROOT="${CODEX_PLUGIN_ROOT:-${PLUGIN_ROOT}}"
11
10
  export BABYSITTER_STATE_DIR="${STATE_DIR}"
12
11
 
13
12
  mkdir -p "$LOG_DIR" 2>/dev/null
14
- {
15
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook script invoked"
16
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) PLUGIN_ROOT=$PLUGIN_ROOT"
17
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) STATE_DIR=$STATE_DIR"
18
- } >> "$LOG_FILE" 2>/dev/null
19
13
 
20
14
  INPUT_FILE=$(mktemp 2>/dev/null || echo "/tmp/codex-user-prompt-submit-hook-$$.json")
21
15
  cat > "$INPUT_FILE"
22
16
 
23
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) Hook input received ($(wc -c < "$INPUT_FILE") bytes)" >> "$LOG_FILE" 2>/dev/null
17
+ babysitter log --type hook --label "hook:user-prompt-submit" --message "Hook invoked" --source shell-hook 2>/dev/null || true
24
18
 
25
19
  RESULT=$(babysitter hook:run \
26
20
  --hook-type user-prompt-submit \
@@ -30,7 +24,7 @@ RESULT=$(babysitter hook:run \
30
24
  < "$INPUT_FILE" 2>"$LOG_DIR/babysitter-user-prompt-submit-hook-stderr.log")
31
25
  EXIT_CODE=$?
32
26
 
33
- echo "[INFO] $(date -u +%Y-%m-%dT%H:%M:%SZ) CLI exit code=$EXIT_CODE" >> "$LOG_FILE" 2>/dev/null
27
+ babysitter log --type hook --label "hook:user-prompt-submit" --message "CLI exit code=$EXIT_CODE" --source shell-hook 2>/dev/null || true
34
28
 
35
29
  rm -f "$INPUT_FILE" 2>/dev/null
36
30
  if [ -n "$RESULT" ]; then
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a5c-ai/babysitter-codex",
3
- "version": "0.1.6-staging.2df34517",
3
+ "version": "0.1.6-staging.3faa6c86",
4
4
  "description": "Babysitter Codex skill bundle and integration package for OpenAI Codex CLI with SDK-managed process-library bootstrapping, 15 orchestration modes, and BOM-safe SKILL installation",
5
5
  "scripts": {
6
6
  "test": "node test/integration.test.js && node test/packaged-install.test.js",
@@ -15,6 +15,8 @@
15
15
  },
16
16
  "files": [
17
17
  ".codex-plugin/",
18
+ ".app.json",
19
+ "assets/",
18
20
  "hooks/",
19
21
  "hooks.json",
20
22
  "skills/",
@@ -41,6 +43,6 @@
41
43
  },
42
44
  "homepage": "https://github.com/a5c-ai/babysitter/tree/main/plugins/babysitter-codex#readme",
43
45
  "dependencies": {
44
- "@a5c-ai/babysitter-sdk": "0.0.183-staging.2df34517"
46
+ "@a5c-ai/babysitter-sdk": "0.0.183-staging.3faa6c86"
45
47
  }
46
48
  }
@@ -7,6 +7,7 @@ const {
7
7
  copyPluginBundle,
8
8
  ensureGlobalProcessLibrary,
9
9
  ensureMarketplaceEntry,
10
+ installCodexSurface,
10
11
  mergeCodexConfigFile,
11
12
  warnWindowsHooks,
12
13
  writeJson,
@@ -54,8 +55,9 @@ function main() {
54
55
  }
55
56
 
56
57
  copyPluginBundle(packageRoot, workspacePluginRoot);
57
- ensureMarketplaceEntry(workspaceMarketplacePath, './plugins/babysitter-codex');
58
+ ensureMarketplaceEntry(workspaceMarketplacePath, workspacePluginRoot);
58
59
  mergeCodexConfigFile(workspaceConfigPath);
60
+ installCodexSurface(packageRoot, path.join(workspaceRoot, '.codex'));
59
61
 
60
62
  const active = ensureGlobalProcessLibrary(packageRoot);
61
63
  installInfo.processLibraryStateFile = active.stateFile;
@@ -1,414 +1,47 @@
1
1
  ---
2
2
  name: babysit
3
3
  description: >-
4
- Run babysitter workflows from Codex using the installed babysit skill bundle,
5
- Codex mode-wrapper skills, Codex hooks/config, and the Babysitter SDK runtime
6
- loop. Use when the user wants to babysit a task, start or resume a run,
7
- diagnose run health, install Codex integration, or assimilate a methodology.
4
+ Orchestrate via @babysitter. Use this skill when asked to babysit a run,
5
+ orchestrate a process or whenever it is called explicitly. (babysit,
6
+ babysitter, orchestrate, orchestrate a run, workflow, etc.)
8
7
  ---
9
8
 
10
9
  # babysit
11
10
 
12
- Babysitter on Codex is implemented as:
13
-
14
- - the installed plugin under `~/.codex/plugins/babysitter-codex` or `<workspace>/plugins/babysitter-codex`
15
- - the plugin skill tree under `skills/babysit` and `skills/<mode>`
16
- - the plugin hook registry at `hooks.json`
17
- - the plugin hook scripts under `hooks/`
18
- - global `~/.codex/config.toml`
19
- - optional workspace `.codex/config.toml`
20
- - workspace `.a5c/`
21
- - shared global `.a5c/` process-library state
22
- - the Babysitter SDK CLI for `run:create`, `run:iterate`, `run:status`,
23
- `task:list`, `task:post`, and process-library binding
24
-
25
- This package supports only the hooks model for the Codex plugin path. Do not
26
- introduce an app-server loop, an external orchestrator, or fake plugin-manifest
27
- machinery for the Codex integration.
28
-
29
- Native Windows caveat: Codex does not execute hooks on Windows yet. When the
30
- current Codex session is running on native Windows, do not yield the turn and
31
- wait for the `Stop` hook. Keep driving the Babysitter loop in the current turn
32
- until the run completes or you hit a real user breakpoint that requires chat
33
- input. Only rely on the `SessionStart`/`Stop` hook handoff on platforms where
34
- Codex hook execution is actually available.
35
-
36
- ## Choosing a Mode
37
-
38
- Use this skill whenever it is invoked directly, and whenever one of the
39
- installed mode-wrapper skills such as `$call`, `$plan`, `$resume`, or `$yolo`
40
- loads it.
41
-
42
- Choose the mode from either:
43
-
44
- 1. the direct user intent when the skill is invoked as `$babysit`
45
- 2. the installed wrapper skill name when the user invoked `$call`, `$plan`,
46
- `$resume`, `$yolo`, and the rest
47
-
48
- | User intent | Mode |
49
- |-------------|------|
50
- | Start an orchestration run | `call` |
51
- | Work an issue-centric flow | `issue` |
52
- | Run autonomously | `yolo` |
53
- | Run continuously / recurring workflow | `forever` |
54
- | Resume an existing run | `resume` |
55
- | Plan without executing | `plan` |
56
- | Observe or inspect a run | `observe` |
57
- | Summarize a completed run | `retrospect` |
58
- | Diagnose run health | `doctor` |
59
- | Change or inspect model routing | `model` |
60
- | Help and documentation | `help` |
61
- | Install into a project | `project-install` |
62
- | Install user profile/setup | `user-install` |
63
- | Install team-pinned setup | `team-install` |
64
- | Assimilate external methodology | `assimilate` |
65
-
66
- Deprecated prompt aliases are not the Codex command surface anymore. Do not
67
- depend on `.codex/prompts` for normal operation.
11
+ Orchestrate `.a5c/runs/<runId>/` through iterative execution.
68
12
 
69
13
  ## Dependencies
70
14
 
71
15
  ### Babysitter SDK and CLI
72
16
 
73
- Use the installed CLI alias:
17
+ Read the SDK version from `versions.json` to ensure version compatibility:
74
18
 
75
19
  ```bash
76
- CLI="babysitter"
20
+ SDK_VERSION=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('${CODEX_PLUGIN_ROOT}/versions.json','utf8')).sdkVersion||'latest')}catch{console.log('latest')}")
21
+ sudo npm i -g @a5c-ai/babysitter-sdk@$SDK_VERSION
22
+ # sudo is depending on the env and system
77
23
  ```
78
24
 
79
- If it is not available on the path, use:
25
+ then use the CLI alias: CLI="babysitter"
80
26
 
81
- ```bash
82
- CLI="npx -y @a5c-ai/babysitter-sdk"
83
- ```
27
+ **Alternatively, use the CLI alias:** `CLI="npx -y @a5c-ai/babysitter-sdk@$SDK_VERSION"`
84
28
 
85
29
  ### jq
86
30
 
87
- Make sure `jq` is available in the path. Install it if missing.
88
-
89
- ## Core Iteration Workflow
90
-
91
- The Babysitter workflow has 8 steps:
92
-
93
- 1. **Create or find the process** - interview the user or parse the prompt,
94
- research the repo and process library, and build a process definition
95
- 2. **Create run and bind session** - create the run via the Babysitter CLI and
96
- bind it to the current Codex session honestly
97
- 3. **Run iteration** - execute one orchestration step
98
- 4. **Get effects** - inspect pending effects
99
- 5. **Perform effects** - execute the requested tasks through skills, agents, or
100
- shell work
101
- 6. **Post results** - commit results back through `task:post`
102
- 7. **Stop and yield** - on platforms with working Codex hooks, the Codex stop
103
- hook decides whether to continue; on native Windows, stay in-turn and
104
- continue the loop yourself instead of waiting for a hook that will not run
105
- 8. **Completion proof** - finish only when the emitted proof is returned
106
-
107
- ### 1. Create or find the process for the run
108
-
109
- #### Interview phase
110
-
111
- ##### Interactive mode (default)
112
-
113
- Interview the user for intent, requirements, goals, scope, and constraints
114
- before entering the hook-driven loop.
115
-
116
- This phase should be iterative and adaptive:
117
-
118
- - inspect the current repo state first
119
- - resolve the active process-library root with
120
- `babysitter process-library:active --json`
121
- - conduct an actual search against that active process library before writing a
122
- process
123
- - research the repo, online references, methodologies, specializations, skills,
124
- agents, and related processes as needed
125
- - ask the user follow-up questions when the intent or constraints are still not
126
- clear
127
-
128
- Do not plan more than one step ahead during the interview phase. After each
129
- step, decide the next best step from the current evidence.
130
-
131
- The `process-library:active` command bootstraps the shared global SDK process
132
- library automatically if no binding exists yet. Read:
133
-
134
- - `binding.dir` as the active process-library root that must be searched
135
- - `defaultSpec.cloneDir` as the cloned repo root when adjacent repo-level
136
- material is needed
137
-
138
- After that, treat `specializations/**/**/**`, `methodologies/`, `contrib/`, and
139
- `reference/` as paths relative to `binding.dir`.
140
-
141
- ##### Non-interactive mode
31
+ make sure you have jq installed and available in the path. if not, install it.
142
32
 
143
- When running non-interactively:
33
+ ## Instructions
144
34
 
145
- 1. parse the initial prompt to extract intent, scope, and constraints
146
- 2. inspect the repo structure
147
- 3. resolve the active process-library root with
148
- `babysitter process-library:active --json`
149
- 4. search that active library for the most relevant specialization,
150
- methodology, process, skill, or agent
151
- 5. proceed directly to process creation
152
-
153
- Do not skip the active-library search step.
154
-
155
- #### User Profile Integration
156
-
157
- Before building the process, check for an existing user profile:
158
-
159
- 1. run `babysitter profile:read --user --json`
160
- 2. use the profile to pre-fill user preferences, expertise, and communication
161
- style
162
- 3. calibrate breakpoint density from `breakpointTolerance`
163
- 4. prefer tools, skills, and agents the user already uses
164
- 5. adapt explanations and breakpoint text to the user's communication style
165
- 6. if no profile exists, proceed normally and consider suggesting `$user-install`
166
-
167
- All profile read/write/merge/render operations must go through the Babysitter
168
- CLI, never direct SDK imports.
169
-
170
- #### Process creation phase
171
-
172
- After the interview phase, create the full custom process files for the run
173
- according to the process-library patterns and the process-creation guidelines
174
- below.
175
-
176
- Install `@a5c-ai/babysitter-sdk` into `.a5c/` if it is missing. When doing so,
177
- run the install from the project root and use either `npm i --prefix .a5c ...`
178
- or a subshell so the working directory does not stay inside `.a5c/`.
179
-
180
- Always use an **absolute path** for `--entry` when calling `run:create`.
181
-
182
- After the process is created and before creating the run:
183
-
184
- - in interactive mode, describe the process at a high level, generate
185
- `[process-name].diagram.md` and `[process-name].process.md`, and get user
186
- confirmation before proceeding
187
- - in non-interactive mode, proceed directly to `run:create`
188
-
189
- Common mistakes to avoid:
190
-
191
- - wrong: skipping repo/process-library research before writing the process
192
- - wrong: bypassing the orchestration model with helper scripts or inline logic
193
- - wrong: using `kind: 'node'` in generated tasks
194
- - correct: use `agent` or `skill` tasks for reasoning work, with `shell` only
195
- for existing CLIs, tests, linters, git, or builds
196
- - correct: include verification loops, refinement loops, quality gates, and
197
- breakpoints where appropriate
198
-
199
- ### 2. Create run and bind session
200
-
201
- For new runs:
35
+ Run the following command to get full orchestration instructions:
202
36
 
203
37
  ```bash
204
- $CLI run:create \
205
- --process-id <id> \
206
- --entry <absolute-path>#<export> \
207
- --inputs <file> \
208
- --prompt "$PROMPT" \
209
- --harness codex \
210
- --state-dir .a5c \
211
- --plugin-root "${CODEX_PLUGIN_ROOT}" \
212
- --json
38
+ babysitter instructions:babysit-skill --harness codex --interactive
213
39
  ```
214
40
 
215
- Required flags:
216
-
217
- - `--process-id <id>` - unique identifier for the process definition
218
- - `--entry <absolute-path>#<export>` - process JS file plus named export
219
- - `--prompt "$PROMPT"` - the user's initial request
220
- - `--harness codex` - activates Codex session binding
221
- - `--state-dir .a5c` - required for honest workspace-local Codex session state
222
- - `--plugin-root "${CODEX_PLUGIN_ROOT}"` - plugin root used for session/state
223
- resolution
224
-
225
- Optional flags:
226
-
227
- - `--inputs <file>` - process input JSON
228
- - `--run-id <id>` - override the generated run id
229
- - `--runs-dir <dir>` - override the default runs directory
230
-
231
- Inside a real Codex hook/session environment, do **not** pass `--session-id`
232
- explicitly. The Codex adapter auto-resolves the session/thread id from
233
- `CODEX_THREAD_ID`, `CODEX_SESSION_ID`, or `CODEX_ENV_FILE`. Only pass
234
- `--session-id` in out-of-band recovery flows where no ambient Codex session
235
- identity exists.
236
-
237
- In normal Codex usage, `run:create` must bind the session into the active
238
- workspace `.a5c`, not the global `~/.a5c`, so the Stop hook can find the same
239
- session state file in later turns.
240
-
241
- On native Windows, still bind the session honestly with `run:create`, but do
242
- not assume that later turns will be resumed by Codex hooks. After `run:create`
243
- you must keep executing the orchestration loop yourself in the current turn
244
- until completion or a real user-facing breakpoint.
245
-
246
- For resuming existing runs in a manual recovery flow:
41
+ For non-interactive runs (e.g., with `-p` flag or no question tool):
247
42
 
248
43
  ```bash
249
- $CLI session:resume \
250
- --session-id <id> \
251
- --state-dir .a5c \
252
- --run-id <runId> \
253
- --runs-dir .a5c/runs \
254
- --json
44
+ babysitter instructions:babysit-skill --harness codex --no-interactive
255
45
  ```
256
46
 
257
- ### 3. Run iteration
258
-
259
- ```bash
260
- $CLI run:iterate .a5c/runs/<runId> --json --iteration <n> --plugin-root "${CODEX_PLUGIN_ROOT}"
261
- ```
262
-
263
- Status values:
264
-
265
- - `"executed"` - tasks executed, continue looping
266
- - `"waiting"` - breakpoint or sleep is pending
267
- - `"completed"` - run finished successfully
268
- - `"failed"` - run failed
269
- - `"none"` - no runnable effects exist
270
-
271
- ### 4. Get effects
272
-
273
- ```bash
274
- $CLI task:list .a5c/runs/<runId> --pending --json
275
- ```
276
-
277
- ### 5. Perform effects
278
-
279
- Run the effect externally to the SDK, then post the outcome summary with
280
- `task:post`.
281
-
282
- Important:
283
-
284
- - delegate using Codex skills or agent tooling when possible
285
- - make sure the requested change actually happened
286
- - do not describe or imply success without verifying the requested effect
287
- - do not use the `babysit` skill itself inside delegated task execution
288
-
289
- #### 5.1 Breakpoint handling
290
-
291
- ##### Interactive mode
292
-
293
- Ask the user explicitly for approval. If the Codex environment provides a
294
- structured question UI, include explicit approve/reject options. If not, ask in
295
- chat and require an explicit approval response.
296
-
297
- Never infer approval from silence, ambiguity, or dismissal.
298
-
299
- Breakpoint rejections must still be posted with `--status ok` and a value such
300
- as `{"approved": false, "response": "..."}`.
301
-
302
- ##### Non-interactive mode
303
-
304
- Choose the best option from context and post the result. Rejections still use
305
- `--status ok` with `{"approved": false}`.
306
-
307
- ### 6. Results posting
308
-
309
- Never write `result.json` directly.
310
-
311
- Workflow:
312
-
313
- 1. write the result value to `tasks/<effectId>/output.json`
314
- 2. call `task:post` with `--value tasks/<effectId>/output.json`
315
- 3. let the SDK write `result.json`, append the journal event, and update state
316
-
317
- ### 7. Stop after every phase after run-session association
318
-
319
- After `run:create` or any posted effect result, end the current assistant turn
320
- and yield back to the Codex hook loop. Do not run multiple `run:iterate` steps
321
- in the same turn.
322
-
323
- Native Windows exception: because Codex does not execute hooks on Windows yet,
324
- do not end the turn and wait for the hook loop there. Continue with the next
325
- `run:iterate`, inspect tasks, perform effects, and post results in the same
326
- turn until the run completes or you need explicit user input for a breakpoint.
327
- Do not tell the user you are waiting for the stop hook on Windows.
328
-
329
- ### 8. Completion proof
330
-
331
- When `run:iterate` or `run:status` returns `completionProof`, return that exact
332
- value wrapped in `<promise>...</promise>`.
333
-
334
- ## Hook Loop
335
-
336
- Global install must register the plugin in `~/.agents/plugins/marketplace.json`
337
- with the plugin bundle at `~/.codex/plugins/babysitter-codex`, and must merge
338
- `~/.codex/config.toml`.
339
-
340
- Workspace onboarding may also register the plugin in
341
- `<workspace>/.agents/plugins/marketplace.json` with the plugin bundle at
342
- `<workspace>/plugins/babysitter-codex`, and may merge `.codex/config.toml` for
343
- repo-local pinning.
344
-
345
- Both levels must provide:
346
-
347
- 1. `SessionStart` seeds `.a5c` session state
348
- 2. `UserPromptSubmit` performs prompt-time transformations when needed
349
- 3. `Stop` decides whether the run is complete or Codex should receive the next
350
- Babysitter iteration context
351
-
352
- On native Windows, treat these hook registrations as installation/configuration
353
- state only. Codex currently does not execute them there, so the skill must keep
354
- the orchestration loop moving in-turn instead of waiting for hook callbacks.
355
-
356
- ## Task Kinds
357
-
358
- Never generate `kind: 'node'` effects.
359
-
360
- | Kind | When to use |
361
- |------|-------------|
362
- | `agent` | default for planning, implementation, analysis, debugging, scoring, research |
363
- | `skill` | when a matching installed skill exists |
364
- | `shell` | existing CLI tools, tests, git, linters, builds |
365
- | `breakpoint` | human approval gates |
366
- | `sleep` | time gates |
367
-
368
- ## Process Creation Guidelines
369
-
370
- - always research the repo and the active process library before writing the
371
- process
372
- - prefer composing multiple relevant library processes rather than copying just
373
- one template blindly
374
- - include verification and refinement loops
375
- - prefer processes that close the widest practical quality loop
376
- - add `@skill` and `@agent` discovery markers to generated process files for
377
- the dependencies you actually selected
378
- - prefer incremental work that can be tested as you go
379
-
380
- Search for relevant processes, skills, agents, methodologies, and references
381
- in:
382
-
383
- 1. `.a5c/processes/`
384
- 2. the active process-library root from `binding.dir`
385
- 3. the cloned repo root from `defaultSpec.cloneDir` when adjacent material is
386
- needed
387
-
388
- ## Codex-Specific Rules
389
-
390
- - `$babysit` is the core skill
391
- - `$call`, `$plan`, `$resume`, `$yolo`, and the other mode skills are thin
392
- wrappers that must only load `babysit` for the matching mode
393
- - do not revive prompt aliases as a parallel integration surface
394
- - do not fabricate a session id
395
- - use `notify` only for telemetry or monitoring, never as the orchestration
396
- control loop
397
- - on native Windows, never claim that you are yielding to or waiting for the
398
- Codex stop hook; continue the Babysitter loop in the current turn instead
399
-
400
- ## Critical Rules
401
-
402
- CRITICAL RULE: The completion proof is emitted only when the run is truly
403
- completed. Output `<promise>SECRET</promise>` only when the orchestration status
404
- is completed.
405
-
406
- CRITICAL RULE: Never bypass the Babysitter orchestration model when this skill
407
- is active. Do not replace it with ad-hoc direct execution.
408
-
409
- CRITICAL RULE: Never build helper scripts or wrapper programs to drive the run.
410
- Use the CLI and the hook loop directly.
411
-
412
- CRITICAL RULE: In interactive mode, never auto-approve breakpoints.
413
-
414
- CRITICAL RULE: Do not use `kind: 'node'` in generated process files.
47
+ Follow the instructions returned by the command above to orchestrate the run.
@@ -12,5 +12,6 @@ Resolve the request in `call` mode:
12
12
  - treat everything after `$call` as the initial Babysitter request for a new
13
13
  orchestration run
14
14
  - create the process, create the run, and enter the Babysitter loop
15
+ - using this always means the user meant an interactive run.
15
16
  - do not create a separate command surface here; this skill only forwards into
16
17
  `babysit`
@@ -12,5 +12,8 @@ Resolve the request in `yolo` mode:
12
12
  - treat everything after `$yolo` as the autonomous execution request
13
13
  - follow the `babysit` skill contract while optimizing for minimal manual
14
14
  interruption
15
+ - using this means the user wants to run autonomously with minimal manual
16
+ interruption, so optimize for that by skipping or minimizing any steps that
17
+ would require user input or decision-making during the run
15
18
  - do not create a separate command surface here; this skill only forwards into
16
19
  `babysit`