@a5c-ai/babysitter-opencode 5.0.1-staging.d73033a7 → 5.0.1-staging.daf8e165bc4a

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 (63) hide show
  1. package/README.md +19 -21
  2. package/bin/cli.cjs +1 -191
  3. package/bin/cli.js +90 -49
  4. package/bin/install-shared.cjs +1 -478
  5. package/bin/install-shared.js +615 -0
  6. package/bin/install.cjs +1 -143
  7. package/bin/install.js +18 -98
  8. package/bin/uninstall.cjs +1 -87
  9. package/bin/uninstall.js +12 -34
  10. package/commands/blueprints.md +64 -0
  11. package/commands/call.md +11 -7
  12. package/commands/check-forbidden-markers.md +68 -0
  13. package/commands/cleanup.md +37 -9
  14. package/commands/contrib.md +31 -31
  15. package/commands/doctor.md +7 -8
  16. package/commands/forever.md +6 -6
  17. package/commands/help.md +246 -244
  18. package/commands/observe.md +17 -12
  19. package/commands/plan.md +17 -7
  20. package/commands/plugins.md +22 -255
  21. package/commands/project-install.md +10 -10
  22. package/commands/resume.md +8 -8
  23. package/commands/retrospect.md +55 -55
  24. package/commands/user-install.md +10 -10
  25. package/commands/yolo.md +11 -7
  26. package/hooks/babysitter-proxied-session-created.js +20 -212
  27. package/hooks/babysitter-proxied-session-created.sh +11 -0
  28. package/hooks/babysitter-proxied-shell-env.js +23 -145
  29. package/hooks/babysitter-proxied-shell-env.sh +3 -0
  30. package/hooks/babysitter-proxied-stop-hook.sh +3 -0
  31. package/hooks/babysitter-proxied-tool-execute-after.js +22 -160
  32. package/hooks/babysitter-proxied-tool-execute-after.sh +3 -0
  33. package/hooks/babysitter-proxied-tool-execute-before.js +22 -162
  34. package/hooks/babysitter-proxied-tool-execute-before.sh +3 -0
  35. package/hooks/hooks.json +14 -22
  36. package/package.json +21 -19
  37. package/plugin.json +6 -4
  38. package/scripts/create-release-tag.mjs +18 -0
  39. package/scripts/publish-from-tag.mjs +41 -0
  40. package/scripts/team-install.js +23 -0
  41. package/skills/accomplish-status/SKILL.md +8 -2
  42. package/skills/babysit/SKILL.md +35 -10
  43. package/skills/blueprints/SKILL.md +66 -0
  44. package/skills/call/SKILL.md +5 -1
  45. package/skills/check-forbidden-markers/SKILL.md +69 -0
  46. package/skills/cleanup/SKILL.md +37 -9
  47. package/skills/doctor/SKILL.md +7 -8
  48. package/skills/help/SKILL.md +13 -11
  49. package/skills/observe/SKILL.md +7 -2
  50. package/skills/plan/SKILL.md +11 -1
  51. package/skills/plugins/SKILL.md +12 -245
  52. package/skills/yolo/SKILL.md +5 -1
  53. package/versions.json +2 -2
  54. package/hooks/babysitter-proxied-session-idle.js +0 -173
  55. package/hooks/hooks.json.legacy +0 -46
  56. package/hooks/proxied-hooks.json +0 -47
  57. package/hooks/session-created.js +0 -182
  58. package/hooks/session-idle.js +0 -124
  59. package/hooks/shell-env.js +0 -88
  60. package/hooks/tool-execute-after.js +0 -107
  61. package/hooks/tool-execute-before.js +0 -109
  62. package/scripts/sync-command-docs.cjs +0 -107
  63. package/scripts/sync-command-surfaces.js +0 -52
@@ -1,107 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Babysitter Tool Execute After Hook for OpenCode
4
- *
5
- * Fires after a tool execution in OpenCode. Delegates to
6
- * `babysitter hook:run --hook-type post-tool-use` for post-tool-use awareness.
7
- *
8
- * This hook can be used to:
9
- * - Log tool execution results for babysitter run observability
10
- * - Trigger babysitter effects based on tool outputs
11
- * - Update session state after tool executions
12
- *
13
- * OpenCode plugin protocol:
14
- * - Receives tool result context as JSON via stdin
15
- * - Outputs JSON to stdout
16
- * - Exit 0 = success
17
- */
18
-
19
- "use strict";
20
-
21
- const { execSync } = require("child_process");
22
- const { readFileSync, mkdirSync, appendFileSync } = require("fs");
23
- const os = require("os");
24
- const path = require("path");
25
-
26
- const PLUGIN_ROOT = process.env.OPENCODE_PLUGIN_ROOT || path.resolve(__dirname, "..");
27
- const GLOBAL_ROOT = process.env.BABYSITTER_GLOBAL_STATE_DIR || path.join(os.homedir(), ".a5c");
28
- const STATE_DIR = process.env.BABYSITTER_STATE_DIR || path.join(GLOBAL_ROOT, "state");
29
- const LOG_DIR = process.env.BABYSITTER_LOG_DIR || path.join(GLOBAL_ROOT, "logs");
30
- const LOG_FILE = path.join(LOG_DIR, "babysitter-tool-after-hook.log");
31
-
32
- function ensureDir(dir) {
33
- try { mkdirSync(dir, { recursive: true }); } catch { /* best-effort */ }
34
- }
35
-
36
- function blog(msg) {
37
- ensureDir(LOG_DIR);
38
- const ts = new Date().toISOString();
39
- try {
40
- appendFileSync(LOG_FILE, `[INFO] ${ts} ${msg}\n`);
41
- } catch { /* best-effort */ }
42
- }
43
-
44
- function getSdkVersion() {
45
- try {
46
- const versions = JSON.parse(readFileSync(path.join(PLUGIN_ROOT, "versions.json"), "utf8"));
47
- return versions.sdkVersion || "latest";
48
- } catch {
49
- return "latest";
50
- }
51
- }
52
-
53
- function main() {
54
- const sessionId = process.env.BABYSITTER_SESSION_ID
55
- || process.env.OPENCODE_SESSION_ID
56
- || "";
57
-
58
- if (!sessionId) {
59
- process.stdout.write("{}\n");
60
- return;
61
- }
62
-
63
- // Read stdin for tool result context
64
- let inputData = "";
65
- try {
66
- inputData = require("fs").readFileSync(0, "utf8");
67
- } catch {
68
- // No stdin available
69
- }
70
-
71
- blog(`tool-execute-after: session=${sessionId}`);
72
-
73
- const hookInput = JSON.stringify({
74
- session_id: sessionId,
75
- cwd: process.cwd(),
76
- harness: "opencode",
77
- plugin_root: PLUGIN_ROOT,
78
- tool_result: inputData ? JSON.parse(inputData) : {},
79
- });
80
-
81
- const sdkVersion = getSdkVersion();
82
- const args = [
83
- "hook:run",
84
- "--hook-type", "post-tool-use",
85
- "--harness", "opencode",
86
- "--plugin-root", PLUGIN_ROOT,
87
- "--state-dir", STATE_DIR,
88
- "--json",
89
- ];
90
-
91
- try {
92
- const result = execSync(`babysitter ${args.join(" ")}`, {
93
- input: hookInput,
94
- stdio: ["pipe", "pipe", "pipe"],
95
- timeout: 10000,
96
- env: { ...process.env, BABYSITTER_STATE_DIR: STATE_DIR },
97
- });
98
- const output = result.toString("utf8").trim();
99
- blog(`Hook result: ${output}`);
100
- process.stdout.write((output || "{}") + "\n");
101
- } catch {
102
- blog("Post-tool-use hook failed -- non-blocking");
103
- process.stdout.write("{}\n");
104
- }
105
- }
106
-
107
- main();
@@ -1,109 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Babysitter Tool Execute Before Hook for OpenCode
4
- *
5
- * Fires before a tool execution in OpenCode. Delegates to
6
- * `babysitter hook:run --hook-type pre-tool-use` for pre-tool-use awareness.
7
- *
8
- * This hook can be used to:
9
- * - Log tool invocations for babysitter run observability
10
- * - Block certain tool calls during specific orchestration phases
11
- * - Inject babysitter context into tool arguments
12
- *
13
- * OpenCode plugin protocol:
14
- * - Receives tool context as JSON via stdin
15
- * - Outputs JSON to stdout (empty = allow, { block: true } = block)
16
- * - Exit 0 = success
17
- */
18
-
19
- "use strict";
20
-
21
- const { execSync } = require("child_process");
22
- const { readFileSync, mkdirSync, appendFileSync } = require("fs");
23
- const os = require("os");
24
- const path = require("path");
25
-
26
- const PLUGIN_ROOT = process.env.OPENCODE_PLUGIN_ROOT || path.resolve(__dirname, "..");
27
- const GLOBAL_ROOT = process.env.BABYSITTER_GLOBAL_STATE_DIR || path.join(os.homedir(), ".a5c");
28
- const STATE_DIR = process.env.BABYSITTER_STATE_DIR || path.join(GLOBAL_ROOT, "state");
29
- const LOG_DIR = process.env.BABYSITTER_LOG_DIR || path.join(GLOBAL_ROOT, "logs");
30
- const LOG_FILE = path.join(LOG_DIR, "babysitter-tool-before-hook.log");
31
-
32
- function ensureDir(dir) {
33
- try { mkdirSync(dir, { recursive: true }); } catch { /* best-effort */ }
34
- }
35
-
36
- function blog(msg) {
37
- ensureDir(LOG_DIR);
38
- const ts = new Date().toISOString();
39
- try {
40
- appendFileSync(LOG_FILE, `[INFO] ${ts} ${msg}\n`);
41
- } catch { /* best-effort */ }
42
- }
43
-
44
- function getSdkVersion() {
45
- try {
46
- const versions = JSON.parse(readFileSync(path.join(PLUGIN_ROOT, "versions.json"), "utf8"));
47
- return versions.sdkVersion || "latest";
48
- } catch {
49
- return "latest";
50
- }
51
- }
52
-
53
- function main() {
54
- const sessionId = process.env.BABYSITTER_SESSION_ID
55
- || process.env.OPENCODE_SESSION_ID
56
- || "";
57
-
58
- if (!sessionId) {
59
- // No session -- pass through without intervention
60
- process.stdout.write("{}\n");
61
- return;
62
- }
63
-
64
- // Read stdin for tool context
65
- let inputData = "";
66
- try {
67
- inputData = require("fs").readFileSync(0, "utf8");
68
- } catch {
69
- // No stdin available
70
- }
71
-
72
- blog(`tool-execute-before: session=${sessionId}`);
73
-
74
- const hookInput = JSON.stringify({
75
- session_id: sessionId,
76
- cwd: process.cwd(),
77
- harness: "opencode",
78
- plugin_root: PLUGIN_ROOT,
79
- tool_context: inputData ? JSON.parse(inputData) : {},
80
- });
81
-
82
- const sdkVersion = getSdkVersion();
83
- const args = [
84
- "hook:run",
85
- "--hook-type", "pre-tool-use",
86
- "--harness", "opencode",
87
- "--plugin-root", PLUGIN_ROOT,
88
- "--state-dir", STATE_DIR,
89
- "--json",
90
- ];
91
-
92
- try {
93
- const result = execSync(`babysitter ${args.join(" ")}`, {
94
- input: hookInput,
95
- stdio: ["pipe", "pipe", "pipe"],
96
- timeout: 10000,
97
- env: { ...process.env, BABYSITTER_STATE_DIR: STATE_DIR },
98
- });
99
- const output = result.toString("utf8").trim();
100
- blog(`Hook result: ${output}`);
101
- process.stdout.write((output || "{}") + "\n");
102
- } catch {
103
- // On failure, allow the tool execution to proceed
104
- blog("Pre-tool-use hook failed -- allowing execution");
105
- process.stdout.write("{}\n");
106
- }
107
- }
108
-
109
- main();
@@ -1,107 +0,0 @@
1
- 'use strict';
2
-
3
- const path = require('path');
4
- const {
5
- listMarkdownBasenames,
6
- reportCheckResult,
7
- syncCommandMirrors,
8
- syncSkillsFromCommands,
9
- writeFileIfChanged,
10
- } = require('../../../scripts/plugin-command-sync-lib.cjs');
11
-
12
- const PACKAGE_ROOT = path.resolve(__dirname, '..');
13
- const REPO_ROOT = path.resolve(PACKAGE_ROOT, '..', '..');
14
- const ROOT_COMMANDS = path.join(REPO_ROOT, 'plugins', 'babysitter', 'commands');
15
- const COMMANDS_ROOT = path.join(PACKAGE_ROOT, 'commands');
16
- const SKILLS_ROOT = path.join(PACKAGE_ROOT, 'skills');
17
- const LABEL = 'babysitter-opencode sync';
18
-
19
- const BABYSIT_SKILL = `---
20
- name: babysit
21
- description: Orchestrate via @babysitter. Use this skill when asked to babysit a run, orchestrate a process or whenever it is called explicitly. (babysit, babysitter, orchestrate, orchestrate a run, workflow, etc.)
22
- ---
23
-
24
- # babysit
25
-
26
- Orchestrate \`.a5c/runs/<runId>/\` through iterative execution.
27
-
28
- ## Dependencies
29
-
30
- ### Babysitter SDK and CLI
31
-
32
- Read the SDK version from \`versions.json\` to ensure version compatibility:
33
-
34
- \`\`\`bash
35
- SDK_VERSION=$(node -e "try{const fs=require('fs');const probes=['./plugins/babysitter-opencode/versions.json','./node_modules/@a5c-ai/babysitter-opencode/versions.json'];for(const probe of probes){if(fs.existsSync(probe)){console.log(JSON.parse(fs.readFileSync(probe,'utf8')).sdkVersion||'latest');process.exit(0)}}console.log('latest')}catch{console.log('latest')}")
36
-
37
- npm i -g @a5c-ai/babysitter-sdk@$SDK_VERSION
38
- CLI="npx -y @a5c-ai/babysitter-sdk@$SDK_VERSION"
39
- \`\`\`
40
-
41
- ## Instructions
42
-
43
- Run the following command to get full orchestration instructions:
44
-
45
- \`\`\`bash
46
- babysitter instructions:babysit-skill --harness opencode --interactive
47
- \`\`\`
48
-
49
- For non-interactive mode:
50
-
51
- \`\`\`bash
52
- babysitter instructions:babysit-skill --harness opencode --no-interactive
53
- \`\`\`
54
-
55
- Follow the instructions returned by the command above to orchestrate the run.
56
- `;
57
-
58
- function getCommandNames() {
59
- return listMarkdownBasenames(ROOT_COMMANDS);
60
- }
61
-
62
- function main() {
63
- const check = process.argv.includes('--check');
64
- const commandNames = getCommandNames();
65
- const mirrorResult = syncCommandMirrors({
66
- label: LABEL,
67
- sourceRoot: ROOT_COMMANDS,
68
- targetRoot: COMMANDS_ROOT,
69
- names: commandNames,
70
- check,
71
- cwd: PACKAGE_ROOT,
72
- });
73
- const skillsResult = syncSkillsFromCommands({
74
- label: LABEL,
75
- sourceRoot: COMMANDS_ROOT,
76
- skillsRoot: SKILLS_ROOT,
77
- names: commandNames,
78
- check,
79
- cwd: PACKAGE_ROOT,
80
- });
81
-
82
- const babysitSkillPath = path.join(SKILLS_ROOT, 'babysit', 'SKILL.md');
83
- if (check) {
84
- const fs = require('fs');
85
- const stale = [...mirrorResult.stale, ...skillsResult.stale];
86
- const current = fs.existsSync(babysitSkillPath)
87
- ? fs.readFileSync(babysitSkillPath, 'utf8')
88
- : null;
89
- if (current !== BABYSIT_SKILL) {
90
- stale.push(path.relative(PACKAGE_ROOT, babysitSkillPath));
91
- }
92
- reportCheckResult(LABEL, stale);
93
- return;
94
- }
95
-
96
- const babysitUpdated = writeFileIfChanged(babysitSkillPath, BABYSIT_SKILL) ? 1 : 0;
97
- const updated = mirrorResult.updated + skillsResult.updated + babysitUpdated;
98
-
99
- if (updated === 0) {
100
- console.log(`[${LABEL}] no OpenCode command or skill changes were needed.`);
101
- return;
102
- }
103
-
104
- console.log(`[${LABEL}] updated ${updated} OpenCode command/skill file(s).`);
105
- }
106
-
107
- main();
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Sync command surfaces from the canonical babysitter plugin.
4
- *
5
- * Copies command .md files from the cursor/codex plugins or generates
6
- * them from the SDK CLI command definitions. Used during build/deploy
7
- * to keep command surfaces in sync across harness plugins.
8
- */
9
-
10
- "use strict";
11
-
12
- const fs = require("fs");
13
- const path = require("path");
14
-
15
- const PLUGIN_ROOT = path.resolve(__dirname, "..");
16
- const COMMANDS_DIR = path.join(PLUGIN_ROOT, "commands");
17
-
18
- // Check mode
19
- const checkOnly = process.argv.includes("--check");
20
-
21
- function main() {
22
- // Verify commands directory exists and has files
23
- if (!fs.existsSync(COMMANDS_DIR)) {
24
- console.error("ERROR: commands/ directory not found");
25
- process.exit(1);
26
- }
27
-
28
- const files = fs.readdirSync(COMMANDS_DIR).filter(f => f.endsWith(".md"));
29
- if (files.length === 0) {
30
- console.error("ERROR: No command .md files found in commands/");
31
- process.exit(1);
32
- }
33
-
34
- console.log(`Found ${files.length} command files:`);
35
- for (const file of files) {
36
- const content = fs.readFileSync(path.join(COMMANDS_DIR, file), "utf8");
37
- const hasHeader = content.startsWith("---");
38
- const status = hasHeader ? "OK" : "MISSING FRONTMATTER";
39
- console.log(` ${file} [${status}]`);
40
- if (checkOnly && !hasHeader) {
41
- process.exit(1);
42
- }
43
- }
44
-
45
- if (checkOnly) {
46
- console.log("\nAll command files are valid.");
47
- } else {
48
- console.log("\nCommand surfaces synced.");
49
- }
50
- }
51
-
52
- main();