@a5c-ai/babysitter-cursor 0.1.1-staging.d0170171 → 0.1.1-staging.f2d9bb68

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.
@@ -1,11 +1,10 @@
1
1
  {
2
- "name": "babysitter-cursor",
2
+ "name": "babysitter",
3
3
  "version": "0.1.0",
4
4
  "description": "Babysitter orchestration plugin for Cursor IDE/CLI with lifecycle hooks and SDK-managed process-library bootstrapping",
5
5
  "author": {
6
6
  "name": "a5c.ai",
7
- "email": "support@a5c.ai",
8
- "url": "https://github.com/a5c-ai/babysitter"
7
+ "email": "support@a5c.ai"
9
8
  },
10
9
  "homepage": "https://github.com/a5c-ai/babysitter/tree/main/plugins/babysitter-cursor#readme",
11
10
  "repository": "https://github.com/a5c-ai/babysitter",
@@ -18,7 +17,6 @@
18
17
  "skills"
19
18
  ],
20
19
  "skills": "skills/",
21
- "commands": [],
22
- "hooks": "hooks.json",
23
- "logo": null
20
+ "commands": "commands/",
21
+ "hooks": "hooks/hooks-cursor.json"
24
22
  }
package/README.md CHANGED
@@ -27,22 +27,27 @@ npm install -g @a5c-ai/babysitter-sdk
27
27
 
28
28
  ### Via Cursor Marketplace (recommended)
29
29
 
30
- Install directly from the Cursor Marketplace:
30
+ Install through Cursor's marketplace UI using the repo-root
31
+ `/.cursor-plugin/marketplace.json` manifest:
31
32
 
32
- 1. Open **Cursor IDE** and navigate to **Settings > Plugins**
33
- 2. Search for **babysitter-cursor**
34
- 3. Click **Install**
33
+ 1. Add this repository as a Cursor marketplace source
34
+ 2. Open the marketplace entry named **a5c-ai**
35
+ 3. Install the plugin named **babysitter**
35
36
 
36
37
  ### Via Babysitter plugin manager
37
38
 
39
+ This path installs the Babysitter plugin package named
40
+ `babysitter-cursor` from the SDK marketplace, not the Cursor UI plugin
41
+ entry:
42
+
38
43
  ```bash
39
- babysitter plugin:install babysitter-cursor --marketplace-name a5c.ai --global
44
+ babysitter plugin:install babysitter-cursor --marketplace-name a5c-ai --global
40
45
  ```
41
46
 
42
47
  ### Workspace installation
43
48
 
44
49
  ```bash
45
- babysitter plugin:install babysitter-cursor --marketplace-name a5c.ai --project
50
+ babysitter plugin:install babysitter-cursor --marketplace-name a5c-ai --project
46
51
  ```
47
52
 
48
53
  If the workspace does not already have an active process-library binding, the
@@ -76,6 +81,8 @@ Copy the plugin directory to your local Cursor plugins path:
76
81
 
77
82
  ```bash
78
83
  cp -r plugins/babysitter-cursor ~/.cursor/plugins/local/babysitter-cursor
84
+ # Or symlink for faster iteration:
85
+ ln -s "$(pwd)/plugins/babysitter-cursor" ~/.cursor/plugins/local/babysitter-cursor
79
86
  ```
80
87
 
81
88
  ## Uninstallation
@@ -95,10 +102,11 @@ babysitter plugin:uninstall babysitter-cursor --global
95
102
  ```
96
103
  plugins/babysitter-cursor/
97
104
  .cursor-plugin/
98
- plugin.json # Cursor Marketplace manifest
99
- plugin.json # Plugin manifest (skills dir, hooks path, metadata)
100
- hooks.json # Hook configuration (sessionStart, stop)
105
+ plugin.json # Cursor plugin manifest (skills, commands, hooks, metadata)
106
+ plugin.json # Babysitter plugin manifest (skills dir, hooks path, metadata)
107
+ hooks.json # Legacy/manual hook configuration
101
108
  hooks/
109
+ hooks-cursor.json # Cursor plugin hook configuration
102
110
  session-start.sh # SessionStart lifecycle hook (bash)
103
111
  session-start.ps1 # SessionStart lifecycle hook (PowerShell)
104
112
  stop-hook.sh # Stop hook -- orchestration loop driver (bash)
@@ -129,7 +137,7 @@ plugins/babysitter-cursor/
129
137
 
130
138
  ## Hook Configuration
131
139
 
132
- The plugin declares lifecycle hooks in `hooks.json` using the version 1
140
+ The plugin declares lifecycle hooks in `hooks/hooks-cursor.json` using the version 1
133
141
  format. Hook event names use camelCase (e.g., `sessionStart`, `stop`).
134
142
 
135
143
  ```json
@@ -139,16 +147,16 @@ format. Hook event names use camelCase (e.g., `sessionStart`, `stop`).
139
147
  "sessionStart": [
140
148
  {
141
149
  "type": "command",
142
- "bash": "./hooks/session-start.sh",
143
- "powershell": "./hooks/session-start.ps1",
150
+ "bash": "bash \"./hooks/session-start.sh\"",
151
+ "powershell": "powershell -NoProfile -ExecutionPolicy Bypass -File \"./hooks/session-start.ps1\"",
144
152
  "timeoutSec": 30
145
153
  }
146
154
  ],
147
155
  "stop": [
148
156
  {
149
157
  "type": "command",
150
- "bash": "./hooks/stop-hook.sh",
151
- "powershell": "./hooks/stop-hook.ps1",
158
+ "bash": "bash \"./hooks/stop-hook.sh\"",
159
+ "powershell": "powershell -NoProfile -ExecutionPolicy Bypass -File \"./hooks/stop-hook.ps1\"",
152
160
  "loop_limit": null
153
161
  }
154
162
  ]
@@ -265,7 +273,7 @@ When Cursor attempts to end its turn, this hook intercepts the exit and:
265
273
 
266
274
  This is what keeps Babysitter iterating autonomously -- each turn performs
267
275
  one orchestration phase, and the stop hook decides whether to loop or yield.
268
- The `loop_limit: null` setting in `hooks.json` allows unlimited iterations.
276
+ The `loop_limit: null` setting in `hooks/hooks-cursor.json` allows unlimited iterations.
269
277
 
270
278
  **Important:** The stop hook uses `{followup_message: "..."}` to signal
271
279
  continuation, NOT `{decision: "block"}`. This is a Cursor-specific
@@ -305,7 +313,7 @@ The Cursor marketplace manifest lives at `.cursor-plugin/plugin.json`:
305
313
 
306
314
  ```json
307
315
  {
308
- "name": "babysitter-cursor",
316
+ "name": "babysitter",
309
317
  "version": "0.1.0",
310
318
  "description": "Babysitter orchestration plugin for Cursor IDE/CLI ...",
311
319
  "author": {
@@ -317,36 +325,35 @@ The Cursor marketplace manifest lives at `.cursor-plugin/plugin.json`:
317
325
  "repository": "https://github.com/a5c-ai/babysitter",
318
326
  "license": "MIT",
319
327
  "skills": "skills/",
320
- "hooks": "hooks.json"
328
+ "hooks": "hooks/hooks-cursor.json"
321
329
  }
322
330
  ```
323
331
 
324
332
  The `skills` field points to the skills directory where Cursor
325
333
  auto-discovers `SKILL.md` files in subdirectories. The `hooks` field
326
- references the `hooks.json` configuration file.
334
+ references the `hooks/hooks-cursor.json` configuration file.
327
335
 
328
336
  ### Marketplace Manifest
329
337
 
330
- To distribute through a marketplace, add the plugin to the marketplace's
331
- `marketplace.json`:
338
+ The repo-root Cursor marketplace manifest lives at `/.cursor-plugin/marketplace.json`:
332
339
 
333
340
  ```json
334
341
  {
335
- "name": "a5c.ai",
342
+ "name": "a5c-ai",
336
343
  "owner": {
337
- "name": "a5c.ai",
344
+ "name": "a5c-ai",
338
345
  "email": "support@a5c.ai"
339
346
  },
340
347
  "metadata": {
341
348
  "description": "Babysitter orchestration plugins",
342
- "version": "1.0.0"
349
+ "pluginRoot": "plugins"
343
350
  },
344
351
  "plugins": [
345
352
  {
346
- "name": "babysitter-cursor",
353
+ "name": "babysitter",
347
354
  "description": "Multi-step workflow orchestration for Cursor IDE",
348
355
  "version": "0.1.0",
349
- "source": "./plugins/babysitter-cursor"
356
+ "source": "babysitter-cursor"
350
357
  }
351
358
  ]
352
359
  }
@@ -355,9 +362,9 @@ To distribute through a marketplace, add the plugin to the marketplace's
355
362
  ### User Commands
356
363
 
357
364
  ```bash
358
- babysitter plugin:add-marketplace --marketplace-url https://github.com/a5c-ai/babysitter --global
359
- babysitter plugin:list-plugins --marketplace-name a5c.ai --global
360
- babysitter plugin:install babysitter-cursor --marketplace-name a5c.ai --global
365
+ babysitter plugin:add-marketplace --marketplace-url https://github.com/a5c-ai/babysitter --marketplace-path plugins/a5c/marketplace/marketplace.json --global
366
+ babysitter plugin:list-plugins --marketplace-name a5c-ai --global
367
+ babysitter plugin:install babysitter-cursor --marketplace-name a5c-ai --global
361
368
  ```
362
369
 
363
370
  ## Troubleshooting
@@ -378,6 +385,9 @@ Also check log output in `<plugin-root>/.a5c/logs/`:
378
385
  - `babysitter-stop-hook-stderr.log`
379
386
  - `babysitter-session-start-hook-stderr.log`
380
387
 
388
+ - `$HOME/.a5c/logs/` and relevant logs and run/session specific logs there
389
+
390
+
381
391
  ### Run stuck or not progressing
382
392
 
383
393
  Check the run status and diagnose:
@@ -429,7 +439,7 @@ modes.
429
439
  On native Windows, hook execution depends on shell configuration. The
430
440
  plugin includes both `bash` (.sh) and `powershell` (.ps1) hook scripts
431
441
  to maximize compatibility. If hooks do not fire, try running from Git Bash
432
- or WSL. The `hooks.json` file includes `powershell` entries alongside
442
+ or WSL. The Cursor hook manifest includes explicit `powershell` entries alongside
433
443
  `bash` entries for Windows PowerShell execution support.
434
444
 
435
445
  ## Development / Contributing
@@ -5,7 +5,7 @@ const os = require('os');
5
5
  const path = require('path');
6
6
  const { spawnSync } = require('child_process');
7
7
 
8
- const PLUGIN_NAME = 'babysitter-cursor';
8
+ const PLUGIN_NAME = 'babysitter';
9
9
  const PLUGIN_CATEGORY = 'Coding';
10
10
  const HOOK_SCRIPT_NAMES = [
11
11
  'session-start.sh',
@@ -20,12 +20,17 @@ const DEFAULT_MARKETPLACE = {
20
20
  },
21
21
  plugins: [],
22
22
  };
23
+ const MANAGED_HOOKS_CONFIG_PATHS = [
24
+ path.join('hooks', 'hooks-cursor.json'),
25
+ 'hooks.json',
26
+ ];
23
27
  const PLUGIN_BUNDLE_ENTRIES = [
24
28
  '.cursor-plugin',
25
29
  'plugin.json',
26
30
  'hooks.json',
27
31
  'hooks',
28
32
  'skills',
33
+ 'commands',
29
34
  'versions.json',
30
35
  '.cursorrules',
31
36
  ];
@@ -52,7 +57,7 @@ function getHomePluginRoot() {
52
57
  if (process.env.BABYSITTER_CURSOR_PLUGIN_DIR) {
53
58
  return path.resolve(process.env.BABYSITTER_CURSOR_PLUGIN_DIR, PLUGIN_NAME);
54
59
  }
55
- return path.join(getCursorHome(), 'plugins', PLUGIN_NAME);
60
+ return path.join(getCursorHome(), 'plugins', 'local', PLUGIN_NAME);
56
61
  }
57
62
 
58
63
  function getHomeMarketplacePath() {
@@ -135,15 +140,33 @@ function readJson(filePath) {
135
140
  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
136
141
  }
137
142
 
143
+ function getManagedHooksConfigPath(packageRoot) {
144
+ for (const relativePath of MANAGED_HOOKS_CONFIG_PATHS) {
145
+ const candidate = path.join(packageRoot, relativePath);
146
+ if (fs.existsSync(candidate)) {
147
+ return candidate;
148
+ }
149
+ }
150
+ return null;
151
+ }
152
+
138
153
  function writeJson(filePath, value) {
139
154
  writeFileIfChanged(filePath, `${JSON.stringify(value, null, 2)}\n`);
140
155
  }
141
156
 
157
+ function normalizeMarketplaceName(name) {
158
+ const raw = String(name || '').trim();
159
+ const sanitized = raw
160
+ .replace(/[^A-Za-z0-9_-]+/g, '-')
161
+ .replace(/^-+|-+$/g, '');
162
+ return sanitized || DEFAULT_MARKETPLACE.name;
163
+ }
164
+
142
165
  function ensureMarketplaceEntry(marketplacePath, pluginSourcePath) {
143
166
  const marketplace = fs.existsSync(marketplacePath)
144
167
  ? readJson(marketplacePath)
145
168
  : { ...DEFAULT_MARKETPLACE, plugins: [] };
146
- marketplace.name = marketplace.name || DEFAULT_MARKETPLACE.name;
169
+ marketplace.name = normalizeMarketplaceName(marketplace.name);
147
170
  marketplace.interface = marketplace.interface || {};
148
171
  marketplace.interface.displayName =
149
172
  marketplace.interface.displayName || DEFAULT_MARKETPLACE.interface.displayName;
@@ -186,8 +209,8 @@ function removeMarketplaceEntry(marketplacePath) {
186
209
  }
187
210
 
188
211
  function mergeManagedHooksConfig(packageRoot, cursorHome) {
189
- const hooksJsonPath = path.join(packageRoot, 'hooks.json');
190
- if (!fs.existsSync(hooksJsonPath)) return;
212
+ const hooksJsonPath = getManagedHooksConfigPath(packageRoot);
213
+ if (!hooksJsonPath) return;
191
214
  const managedConfig = readJson(hooksJsonPath);
192
215
  const managedHooks = managedConfig.hooks || {};
193
216
  const hooksConfigPath = path.join(cursorHome, 'hooks.json');
@@ -358,6 +381,7 @@ module.exports = {
358
381
  copyPluginBundle,
359
382
  ensureGlobalProcessLibrary,
360
383
  ensureMarketplaceEntry,
384
+ getManagedHooksConfigPath,
361
385
  getCursorHome,
362
386
  getHomeMarketplacePath,
363
387
  getHomePluginRoot,
@@ -366,4 +390,5 @@ module.exports = {
366
390
  removeMarketplaceEntry,
367
391
  warnWindowsHooks,
368
392
  writeJson,
393
+ normalizeMarketplaceName,
369
394
  };
package/bin/install.js CHANGED
@@ -20,7 +20,7 @@ function main() {
20
20
  const pluginRoot = getHomePluginRoot();
21
21
  const marketplacePath = getHomeMarketplacePath();
22
22
 
23
- console.log(`[babysitter-cursor] Installing plugin to ${pluginRoot}`);
23
+ console.log(`[babysitter] Installing plugin to ${pluginRoot}`);
24
24
 
25
25
  try {
26
26
  copyPluginBundle(PACKAGE_ROOT, pluginRoot);
@@ -28,17 +28,17 @@ function main() {
28
28
  installCursorSurface(PACKAGE_ROOT, cursorHome);
29
29
 
30
30
  const active = ensureGlobalProcessLibrary(PACKAGE_ROOT);
31
- console.log(`[babysitter-cursor] marketplace: ${marketplacePath}`);
32
- console.log(`[babysitter-cursor] process library: ${active.binding?.dir}`);
31
+ console.log(`[babysitter] marketplace: ${marketplacePath}`);
32
+ console.log(`[babysitter] process library: ${active.binding?.dir}`);
33
33
  if (active.defaultSpec?.cloneDir) {
34
- console.log(`[babysitter-cursor] process library clone: ${active.defaultSpec.cloneDir}`);
34
+ console.log(`[babysitter] process library clone: ${active.defaultSpec.cloneDir}`);
35
35
  }
36
- console.log(`[babysitter-cursor] process library state: ${active.stateFile}`);
36
+ console.log(`[babysitter] process library state: ${active.stateFile}`);
37
37
  warnWindowsHooks();
38
- console.log('[babysitter-cursor] Installation complete!');
39
- console.log('[babysitter-cursor] Restart Cursor to pick up the installed plugin and config changes.');
38
+ console.log('[babysitter] Installation complete!');
39
+ console.log('[babysitter] Restart Cursor to pick up the installed plugin and config changes.');
40
40
  } catch (err) {
41
- console.error(`[babysitter-cursor] Failed to install plugin: ${err.message}`);
41
+ console.error(`[babysitter] Failed to install plugin: ${err.message}`);
42
42
  process.exitCode = 1;
43
43
  }
44
44
  }
package/bin/uninstall.js CHANGED
@@ -19,10 +19,10 @@ function main() {
19
19
  if (fs.existsSync(pluginRoot)) {
20
20
  try {
21
21
  fs.rmSync(pluginRoot, { recursive: true, force: true });
22
- console.log(`[babysitter-cursor] Removed ${pluginRoot}`);
22
+ console.log(`[babysitter] Removed ${pluginRoot}`);
23
23
  removedPlugin = true;
24
24
  } catch (err) {
25
- console.warn(`[babysitter-cursor] Warning: Could not remove plugin directory ${pluginRoot}: ${err.message}`);
25
+ console.warn(`[babysitter] Warning: Could not remove plugin directory ${pluginRoot}: ${err.message}`);
26
26
  }
27
27
  }
28
28
 
@@ -30,11 +30,11 @@ function main() {
30
30
  removeManagedHooks(cursorHome);
31
31
 
32
32
  if (!removedPlugin) {
33
- console.log('[babysitter-cursor] Plugin directory not found, config and hooks cleaned if present.');
33
+ console.log('[babysitter] Plugin directory not found, config and hooks cleaned if present.');
34
34
  return;
35
35
  }
36
36
 
37
- console.log('[babysitter-cursor] Restart Cursor to complete uninstallation.');
37
+ console.log('[babysitter] Restart Cursor to complete uninstallation.');
38
38
  }
39
39
 
40
40
  main();
@@ -0,0 +1,37 @@
1
+ ---
2
+ description: Assimilate an external methodology, harness, or specification into babysitter process definitions with skills and agents.
3
+ argument-hint: Target to assimilate (e.g. repo URL, harness name, or spec path)
4
+ allowed-tools: Read, Grep, Write, Task, Bash, Edit, Grep, Glob, WebFetch, WebSearch, Search, AskUserQuestion, TodoWrite, TodoRead, Skill, BashOutput, KillShell, MultiEdit, LS
5
+ ---
6
+
7
+ Invoke the babysitter:babysit skill (using the Skill tool) and follow its instructions (SKILL.md).
8
+
9
+ Use the assimilation domain processes from the active process library to convert external sources into well-defined babysitter process definitions with accompanying skills/ and agents/ directories.
10
+
11
+ If the workspace does not already have an active process-library binding, initialize it first through the shared global SDK binding:
12
+
13
+ ```bash
14
+ babysitter process-library:active --json
15
+ ```
16
+
17
+ Run the process after formalizing it.
18
+
19
+ Available assimilation workflows:
20
+ - **methodology-assimilation** (`specializations/domains/assimilation/workflows/methodology-assimilation`) - Learns an external methodology from its repo and converts procedural instructions, commands, and manual flows into babysitter processes with refactored skills and agents. Supports output as methodology or specialization.
21
+ - **harness integration** (`specializations/domains/assimilation/harness/*`) - Integrates babysitter SDK with a specific AI coding harness (generic, codex, opencode, gemini-cli, openclaw, antigravity).
22
+
23
+ During the interview phase, determine which assimilation workflow to use based on the user's target:
24
+ - If the target is a **repo URL or methodology name** then use the methodology-assimilation workflow.
25
+ - If the target is a **harness name** (e.g. codex, opencode, antigravity) then use the matching harness process.
26
+ - If the target is a **specification or other source** then adapt the methodology-assimilation workflow for the spec format.
27
+ - If unclear, ask the user to clarify the assimilation target and type.
28
+
29
+ ## After Assimilation: Contribute Back
30
+
31
+ After successfully assimilating a methodology or harness integration, prompt the user to share it with the community. The assimilated process definitions, skills, and agents could benefit other babysitter users:
32
+
33
+ - **Completed a methodology assimilation**: `/babysitter:contrib library contribution: assimilated [methodology-name] into babysitter process definitions`
34
+ - **Completed a harness integration**: `/babysitter:contrib library contribution: [harness-name] harness integration`
35
+ - **Hit issues during assimilation** (e.g. unsupported patterns, missing SDK features): `/babysitter:contrib bug report: assimilation of [target] failed because [description]` or `/babysitter:contrib feature request: [what the SDK needs to support]`
36
+
37
+ Even just reporting that an assimilation didn't work well helps improve babysitter for everyone.
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Orchestrate a babysitter run. use this command to start babysitting a complex workflow.
3
+ argument-hint: Specific instructions for the run.
4
+ allowed-tools: Read, Grep, Write, Task, Bash, Edit, Grep, Glob, WebFetch, WebSearch, Search, AskUserQuestion, TodoWrite, TodoRead, Skill, BashOutput, KillShell, MultiEdit, LS
5
+ ---
6
+
7
+ Invoke the babysitter:babysit skill (using the Skill tool) and follow its instructions (SKILL.md).
@@ -0,0 +1,20 @@
1
+ ---
2
+ description: Clean up .a5c/runs and .a5c/processes directories. Aggregates insights from completed/failed runs into docs/run-history-insights.md, then removes old run data and orphaned process files.
3
+ argument-hint: "[--dry-run] [--keep-days N] Optional flags. --dry-run shows what would be removed without deleting. --keep-days N keeps runs newer than N days (default 7)."
4
+ allowed-tools: Read, Grep, Write, Task, Bash, Edit, Grep, Glob, WebFetch, WebSearch, Search, AskUserQuestion, TodoWrite, TodoRead, Skill, BashOutput, KillShell, MultiEdit, LS
5
+ ---
6
+
7
+ Invoke the babysitter:babysit skill (using the Skill tool) and follow its instructions (SKILL.md).
8
+
9
+ Create and run a cleanup process using the process at `skills\babysit\process\cradle\cleanup-runs.js/processes/cleanup-runs.js`.
10
+
11
+ Implementation notes (for the process):
12
+ - Parse arguments for `--dry-run` flag (if present, set dryRun: true in inputs) and `--keep-days N` (default: 7)
13
+ - The process scans .a5c/runs/ for completed/failed runs, aggregates insights, writes summaries, then removes old data
14
+ - Always show the user what will be removed before removing (in interactive mode via breakpoints)
15
+ - In non-interactive mode (yolo), proceed with cleanup using defaults
16
+ - The insights file goes to docs/run-history-insights.md
17
+ - Only remove terminal runs (completed/failed) older than the keep-days threshold
18
+ - Never remove active/in-progress runs
19
+ - Remove orphaned process files not referenced by remaining runs
20
+ - After cleanup, show remaining run count and disk usage
@@ -0,0 +1,33 @@
1
+ ---
2
+ description: Submit feedback or contribute to babysitter project
3
+ argument-hint: Specific instructions for the run.
4
+ allowed-tools: Read, Grep, Write, Task, Bash, Edit, Grep, Glob, WebFetch, WebSearch, Search, AskUserQuestion, TodoWrite, TodoRead, Skill, BashOutput, KillShell, MultiEdit, LS
5
+ ---
6
+
7
+ Invoke the babysitter:babysit skill (using the Skill tool) and follow its instructions (SKILL.md).
8
+
9
+ ## Process Routing
10
+
11
+ Contribution processes live under the active process library's `cradle/` directory. Resolve the active library root with `babysitter process-library:active --json` and route based on arguments:
12
+
13
+ ### Issue-based (opens a GitHub issue in a5c-ai/babysitter)
14
+ * **Bug report** → `cradle/bug-report.js#process` — Report a bug in the SDK, CLI, process library, etc.
15
+ * **Feature request** → `cradle/feature-request.js#process` — Request a new feature or enhancement
16
+ * **Documentation question** → `cradle/documentation-question.js#process` — Ask about undocumented behavior or missing docs
17
+
18
+ ### PR-based (forks repo, creates branch, submits PR to a5c-ai/babysitter)
19
+ * **Bugfix** → `cradle/bugfix.js#process` — User already has the fix for a bug
20
+ * **Feature implementation** → `cradle/feature-implementation-contribute.js#process` — User already has a feature implementation
21
+ * **Harness integration** → `cradle/feature-harness-integration-contribute.js#process` — User has a harness (CI/CD, IDE, editor) integration
22
+ * **Library contribution** → `cradle/library-contribution.js#process` — New or improved process/skill/subagent for the library
23
+ * **Documentation answer** → `cradle/documentation-contribute-answer.js#process` — User has an answer for an unanswered docs question
24
+
25
+ ### Router (when arguments are empty or general)
26
+ * **Contribute** → `cradle/contribute.js#process` — Explains contribution types and routes to the specific process
27
+
28
+ ## Contribution Rules
29
+
30
+ * PR-based contributions: fork the babysitter repo (a5c-ai/babysitter) for the user, ask to star if not already starred, perform changes, submit PR
31
+ * Issue-based contributions: gather details, search for duplicates, review, then open an issue in a5c-ai/babysitter
32
+ * Add breakpoints (permissions) before ALL gh actions (fork, star, submit PR/issue) to allow user review and cancellation
33
+ * If arguments are empty: use the `contribute.js` router process to show options and route accordingly