opencode-cc10x 6.0.21 → 6.0.24

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/README.md CHANGED
@@ -67,8 +67,14 @@ irm https://raw.githubusercontent.com/Chaim12345/cc10x/main/project/opencode-cc1
67
67
  3. **Alternative package-manager install (public npm):**
68
68
 
69
69
  ```bash
70
- npm add @chaim12345/opencode-cc10x
71
- bun add @chaim12345/opencode-cc10x
70
+ npm add opencode-cc10x
71
+ bun add opencode-cc10x
72
+ ```
73
+
74
+ If commands do not appear in OpenCode, run:
75
+
76
+ ```bash
77
+ npx opencode-cc10x init
72
78
  ```
73
79
 
74
80
  If you are testing locally before publishing, install from a tarball:
@@ -89,12 +95,12 @@ The plugin automatically configures the necessary agents. You can customize them
89
95
  ```json
90
96
  {
91
97
  "agent": {
92
- "component-builder": {
93
- "color": "green",
98
+ "cc10x-component-builder": {
99
+ "color": "#00ff00",
94
100
  "temperature": 0.3
95
101
  },
96
- "code-reviewer": {
97
- "color": "yellow",
102
+ "cc10x-code-reviewer": {
103
+ "color": "#ffff00",
98
104
  "temperature": 0.1
99
105
  }
100
106
  }
@@ -121,7 +127,7 @@ All cc10x agents can be configured in `opencode.json`:
121
127
  ```json
122
128
  {
123
129
  "agent": {
124
- "component-builder": {
130
+ "cc10x-component-builder": {
125
131
  "description": "Builds features using TDD",
126
132
  "model": "anthropic/claude-sonnet-4-20250514",
127
133
  "temperature": 0.3,
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { mkdirSync, existsSync, writeFileSync, readFileSync } from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { spawnSync } from "node:child_process";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ const PLUGIN_NAME = "opencode-cc10x";
10
+
11
+ function configBase() {
12
+ if (process.platform === "win32") {
13
+ return process.env.APPDATA || path.join(os.homedir(), "AppData", "Roaming");
14
+ }
15
+ return process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config");
16
+ }
17
+
18
+ function opencodeConfigDir() {
19
+ return path.join(configBase(), "opencode");
20
+ }
21
+
22
+ function ensureDir(p) {
23
+ mkdirSync(p, { recursive: true });
24
+ }
25
+
26
+ function readBundledOpencodeConfig() {
27
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
28
+ const pkgDir = path.resolve(scriptDir, "..");
29
+ const configPath = path.join(pkgDir, "opencode.json");
30
+ const raw = readFileSync(configPath, "utf8");
31
+ return JSON.parse(raw);
32
+ }
33
+
34
+ function isPlainObject(v) {
35
+ return Boolean(v && typeof v === "object" && !Array.isArray(v));
36
+ }
37
+
38
+ function deepMerge(target, source) {
39
+ // Merge objects without overwriting user customizations.
40
+ // Arrays are unioned (unique by primitive identity) and objects merge recursively.
41
+ if (!isPlainObject(target) || !isPlainObject(source)) return target;
42
+
43
+ for (const [k, sv] of Object.entries(source)) {
44
+ const tv = target[k];
45
+ if (tv === undefined) {
46
+ target[k] = sv;
47
+ continue;
48
+ }
49
+ if (Array.isArray(tv) && Array.isArray(sv)) {
50
+ const set = new Set(tv);
51
+ for (const item of sv) set.add(item);
52
+ target[k] = Array.from(set);
53
+ continue;
54
+ }
55
+ if (isPlainObject(tv) && isPlainObject(sv)) {
56
+ deepMerge(tv, sv);
57
+ continue;
58
+ }
59
+ // Keep user's existing value.
60
+ }
61
+ return target;
62
+ }
63
+
64
+ function upsertOpencodeJson(pluginName) {
65
+ const cfgDir = opencodeConfigDir();
66
+ const cfgFile = path.join(cfgDir, "opencode.json");
67
+ ensureDir(cfgDir);
68
+
69
+ let cfg = {};
70
+ if (existsSync(cfgFile)) {
71
+ try {
72
+ cfg = JSON.parse(readFileSync(cfgFile, "utf8"));
73
+ } catch (err) {
74
+ const detail = err instanceof Error ? err.message : String(err);
75
+ throw new Error(
76
+ `Refusing to modify invalid JSON at ${cfgFile}. Fix the file first. Parse error: ${detail}`
77
+ );
78
+ }
79
+ }
80
+
81
+ // Ensure base schema + plugin list.
82
+ if (!Array.isArray(cfg.plugin)) cfg.plugin = [];
83
+ if (!cfg.plugin.includes(pluginName)) cfg.plugin.push(pluginName);
84
+ if (!cfg.$schema) cfg.$schema = "https://opencode.ai/config.json";
85
+
86
+ // Merge bundled configuration (agents, permissions, etc.) without clobbering user customizations.
87
+ // This is how we make "everything loads automatically" work in a package-managed install.
88
+ const bundled = readBundledOpencodeConfig();
89
+ deepMerge(cfg, bundled);
90
+
91
+ writeFileSync(cfgFile, `${JSON.stringify(cfg, null, 2)}\n`);
92
+ }
93
+
94
+ function writeCommands() {
95
+ const commandsDir = path.join(opencodeConfigDir(), "commands");
96
+ ensureDir(commandsDir);
97
+
98
+ const files = [
99
+ {
100
+ name: "cc10x-orchestrate.md",
101
+ content: `---\ndescription: Intelligent orchestration system for development tasks with multi-agent workflows\nagent: cc10x-planner\n---\n\nRun cc10x intelligent orchestration for this development task:\n\n$ARGUMENTS\n\nThis will automatically detect the intent and orchestrate the appropriate workflow with multiple specialized agents.\n`,
102
+ },
103
+ {
104
+ name: "cc10x-build.md",
105
+ content: `---\ndescription: Build features using TDD cycle (RED -> GREEN -> REFACTOR)\nagent: cc10x-component-builder\n---\n\nBuild this feature using TDD:\n\n$ARGUMENTS\n\nFollow the TDD cycle strictly:\n1. RED: Write a failing test first\n2. GREEN: Write minimal code to pass\n3. REFACTOR: Clean up while keeping tests green\n4. VERIFY: All tests must pass\n`,
106
+ },
107
+ {
108
+ name: "cc10x-debug.md",
109
+ content: `---\ndescription: Investigate and fix bugs with log-first approach\nagent: cc10x-bug-investigator\n---\n\nDebug this issue:\n\n$ARGUMENTS\n\nUse a log-first approach to:\n1. Identify the root cause\n2. Find all related error logs\n3. Propose fixes with evidence\n4. Implement the solution\n`,
110
+ },
111
+ {
112
+ name: "cc10x-review.md",
113
+ content: `---\ndescription: Comprehensive code review with 80%+ confidence threshold\nagent: cc10x-code-reviewer\n---\n\nReview this code:\n\n$ARGUMENTS\n\nPerform a comprehensive code review with 80%+ confidence threshold:\n- Check for bugs and security issues\n- Verify code quality and best practices\n- Suggest improvements\n- Only approve if confidence is high\n`,
114
+ },
115
+ {
116
+ name: "cc10x-plan.md",
117
+ content: `---\ndescription: Create detailed plans with research and architecture design\nagent: cc10x-planner\n---\n\nCreate a comprehensive plan for:\n\n$ARGUMENTS\n\nInclude:\n- Research phase\n- Architecture design\n- Implementation steps\n- Risk assessment\n- Timeline estimates\n`,
118
+ },
119
+ ];
120
+
121
+ for (const f of files) {
122
+ const target = path.join(commandsDir, f.name);
123
+ if (!existsSync(target)) {
124
+ writeFileSync(target, f.content);
125
+ continue;
126
+ }
127
+
128
+ const current = readFileSync(target, "utf8");
129
+ const migrated = current
130
+ .replace(/(^|\n)agent:\s*planner(\n|$)/g, "$1agent: cc10x-planner$2")
131
+ .replace(/(^|\n)agent:\s*component-builder(\n|$)/g, "$1agent: cc10x-component-builder$2")
132
+ .replace(/(^|\n)agent:\s*bug-investigator(\n|$)/g, "$1agent: cc10x-bug-investigator$2")
133
+ .replace(/(^|\n)agent:\s*code-reviewer(\n|$)/g, "$1agent: cc10x-code-reviewer$2")
134
+ .replace(/(^|\n)model:\s*anthropic\/claude-sonnet-4-20250514(\n|$)/g, "$1");
135
+
136
+ if (migrated !== current) {
137
+ writeFileSync(target, migrated);
138
+ }
139
+ }
140
+ }
141
+
142
+ function canPrompt() {
143
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
144
+ }
145
+
146
+ function shouldAttemptSudo() {
147
+ if (process.platform === "win32") return false;
148
+ if (typeof process.getuid === "function" && process.getuid() === 0) return false;
149
+ if (process.env.CC10X_ELEVATED === "1") return false;
150
+ return canPrompt();
151
+ }
152
+
153
+ function reRunWithSudo(argv) {
154
+ const nodePath = process.execPath;
155
+ const scriptPath = path.resolve(argv[1]);
156
+ const args = ["-E", nodePath, scriptPath, ...argv.slice(2)];
157
+ const result = spawnSync("sudo", args, { stdio: "inherit" });
158
+ process.exit(result.status ?? 1);
159
+ }
160
+
161
+ function usage() {
162
+ console.log(
163
+ `Usage: opencode-cc10x <command>\n\nCommands:\n init Install OpenCode commands and merge bundled config into opencode.json\n`
164
+ );
165
+ }
166
+
167
+ async function main() {
168
+ const cmd = process.argv[2] || "";
169
+ if (cmd === "init") {
170
+ const args = process.argv.slice(3);
171
+ const commandsOnly = args.includes("--commands-only");
172
+ const isPostinstall = args.includes("--postinstall");
173
+
174
+ try {
175
+ if (!commandsOnly) upsertOpencodeJson(PLUGIN_NAME);
176
+ writeCommands();
177
+ console.log("cc10x initialized: commands installed" + (commandsOnly ? "" : " and plugin ensured in opencode.json"));
178
+ } catch (err) {
179
+ const code = err && typeof err === "object" ? err.code : "";
180
+ if (code === "EACCES" || code === "EPERM") {
181
+ console.error("Permission denied writing OpenCode config.");
182
+ console.error(`Try re-running with elevated privileges: sudo opencode-cc10x init`);
183
+
184
+ // During postinstall we want "everything", but we also must not brick installs in non-interactive contexts.
185
+ // Best effort: if interactive, we can prompt for sudo; otherwise print the instruction and exit success.
186
+ if (isPostinstall && !canPrompt()) {
187
+ console.error("postinstall is non-interactive; skipping sudo escalation.");
188
+ process.exit(0);
189
+ }
190
+ if (shouldAttemptSudo()) {
191
+ console.error("Attempting to re-run with sudo...");
192
+ process.env.CC10X_ELEVATED = "1";
193
+ reRunWithSudo(process.argv);
194
+ }
195
+ }
196
+ throw err;
197
+ }
198
+ return;
199
+ }
200
+ usage();
201
+ process.exit(cmd ? 1 : 0);
202
+ }
203
+
204
+ main();
package/dist/index.js CHANGED
@@ -459,7 +459,7 @@ ${(/* @__PURE__ */ new Date()).toISOString()}
459
459
  try {
460
460
  await readFile(input, path);
461
461
  const currentContent = await readFile(input, path);
462
- await editFile(input, {
462
+ await editFile(input, path, {
463
463
  oldString: currentContent,
464
464
  newString: content
465
465
  });
@@ -1195,7 +1195,6 @@ var workflowExecutor = new WorkflowExecutor();
1195
1195
  // src/router.ts
1196
1196
  async function cc10xRouter(input) {
1197
1197
  await memoryManager.initialize(input);
1198
- const activeWorkflows = /* @__PURE__ */ new Map();
1199
1198
  const routerHooks = {
1200
1199
  // Main message interceptor - this is where cc10x magic happens
1201
1200
  messageReceived: async (input2, output) => {
@@ -1210,7 +1209,8 @@ async function cc10xRouter(input) {
1210
1209
  return;
1211
1210
  }
1212
1211
  const memory = await memoryManager.load(input2);
1213
- const intent = detectIntent(userMessage, memory);
1212
+ const intentResult = detectIntent(userMessage, memory);
1213
+ const intent = intentResult.intent;
1214
1214
  const workflowTask = await taskOrchestrator.createWorkflowTask(input2, {
1215
1215
  userRequest: userMessage,
1216
1216
  intent,
@@ -1244,8 +1244,8 @@ async function cc10xRouter(input) {
1244
1244
  toolExecuteAfter: async (input2, output) => {
1245
1245
  if (output.exitCode !== void 0) {
1246
1246
  await taskOrchestrator.recordExecutionResult(input2, {
1247
- tool: input2.tool,
1248
- command: input2.args?.command,
1247
+ tool: input2.tool || "unknown",
1248
+ command: String(input2.args?.command || ""),
1249
1249
  exitCode: output.exitCode,
1250
1250
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1251
1251
  });
@@ -1278,22 +1278,17 @@ async function cc10xRouter(input) {
1278
1278
  return "Please provide a task description.";
1279
1279
  }
1280
1280
  console.log(`\u{1F680} Manual cc10x invocation: ${request}`);
1281
- const syntheticMessage = {
1282
- id: `manual-${Date.now()}`,
1283
- content: request,
1284
- role: "user",
1285
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
1286
- };
1287
1281
  try {
1288
- await routerHooks.messageReceived(context, syntheticMessage);
1282
+ await routerHooks.messageReceived({ args: { message: request }, ...context }, {});
1289
1283
  return `\u2705 cc10x orchestration started for: ${request}`;
1290
1284
  } catch (error) {
1291
1285
  console.error("Manual invocation failed:", error);
1292
- return `\u274C cc10x orchestration failed: ${error.message}`;
1286
+ const message = error instanceof Error ? error.message : String(error);
1287
+ return `\u274C cc10x orchestration failed: ${message}`;
1293
1288
  }
1294
1289
  }
1295
1290
  };
1296
- return { routerHooks };
1291
+ return routerHooks;
1297
1292
  }
1298
1293
  function isDevelopmentIntent(message) {
1299
1294
  const devKeywords = [
@@ -1365,14 +1360,24 @@ function isMemoryOperation(input) {
1365
1360
  ];
1366
1361
  return memoryPaths.some((path) => filePath.includes(path));
1367
1362
  }
1368
- async function enforceTDDRequirements(ctx, input) {
1363
+ async function enforceTDDRequirements(_ctx, _input) {
1369
1364
  }
1370
- async function validateMemoryOperation(ctx, input) {
1365
+ async function validateMemoryOperation(_ctx, _input) {
1371
1366
  }
1372
1367
  async function checkForActiveWorkflow(ctx) {
1373
- return null;
1368
+ const active = await taskOrchestrator.checkForActiveWorkflows(ctx);
1369
+ if (!active) {
1370
+ return null;
1371
+ }
1372
+ return {
1373
+ id: active.id,
1374
+ type: active.type,
1375
+ status: "in_progress",
1376
+ startedAt: active.createdAt,
1377
+ userRequest: active.userRequest
1378
+ };
1374
1379
  }
1375
- async function resumeWorkflow(workflow, userMessage, ctx) {
1380
+ async function resumeWorkflow(workflow, userMessage, _ctx) {
1376
1381
  }
1377
1382
  function extractMemoryNotes(result) {
1378
1383
  if (typeof result === "string") {
@@ -1400,13 +1405,13 @@ function extractMemoryNotes(result) {
1400
1405
 
1401
1406
  // src/index.ts
1402
1407
  var OpenCodeCC10xPlugin = async (input) => {
1403
- console.log("\u{1F50C} OpenCode cc10x Plugin v6.0.18 initializing...");
1408
+ console.log("\u{1F50C} OpenCode cc10x Plugin v6.0.24 initializing...");
1404
1409
  const { $ } = input;
1405
1410
  const routerHook = await cc10xRouter({ ...input, $ });
1406
1411
  return {
1407
1412
  name: "opencode-cc10x",
1408
1413
  description: "Intelligent orchestration system for OpenCode - port of cc10x from Claude Code",
1409
- version: "6.0.18",
1414
+ version: "6.0.24",
1410
1415
  hooks: {
1411
1416
  // Router hook that intercepts user requests and orchestrates workflows
1412
1417
  "message.received": routerHook.messageReceived,
@@ -87,21 +87,93 @@ function findPluginDir(rootDir) {
87
87
  return null;
88
88
  }
89
89
 
90
- function upsertConfig(configFile, pluginName) {
90
+ function isPlainObject(v) {
91
+ return Boolean(v && typeof v === "object" && !Array.isArray(v));
92
+ }
93
+
94
+ function deepMerge(target, source) {
95
+ if (!isPlainObject(target) || !isPlainObject(source)) return target;
96
+ for (const [k, sv] of Object.entries(source)) {
97
+ const tv = target[k];
98
+ if (tv === undefined) {
99
+ target[k] = sv;
100
+ continue;
101
+ }
102
+ if (Array.isArray(tv) && Array.isArray(sv)) {
103
+ const set = new Set(tv);
104
+ for (const item of sv) set.add(item);
105
+ target[k] = Array.from(set);
106
+ continue;
107
+ }
108
+ if (isPlainObject(tv) && isPlainObject(sv)) {
109
+ deepMerge(tv, sv);
110
+ }
111
+ }
112
+ return target;
113
+ }
114
+
115
+ function upsertConfig(configFile, pluginName, bundledConfig) {
91
116
  let cfg = {};
92
117
  if (existsSync(configFile)) {
93
118
  try {
94
119
  cfg = JSON.parse(readFileSync(configFile, "utf8"));
95
- } catch {
96
- cfg = {};
120
+ } catch (err) {
121
+ const detail = err instanceof Error ? err.message : String(err);
122
+ fail(`Refusing to modify invalid JSON at ${configFile}. Fix this file first. Parse error: ${detail}`);
97
123
  }
98
124
  }
99
125
  if (!Array.isArray(cfg.plugin)) cfg.plugin = [];
100
126
  if (!cfg.plugin.includes(pluginName)) cfg.plugin.push(pluginName);
101
127
  if (!cfg.$schema) cfg.$schema = "https://opencode.ai/config.json";
128
+ if (bundledConfig && isPlainObject(bundledConfig)) {
129
+ deepMerge(cfg, bundledConfig);
130
+ }
102
131
  writeFileSync(configFile, `${JSON.stringify(cfg, null, 2)}\n`);
103
132
  }
104
133
 
134
+ function writeCommands(commandsDir) {
135
+ mkdirSync(commandsDir, { recursive: true });
136
+
137
+ const files = [
138
+ {
139
+ name: "cc10x-orchestrate.md",
140
+ content: `---\ndescription: Intelligent orchestration system for development tasks with multi-agent workflows\nagent: cc10x-planner\n---\n\nRun cc10x intelligent orchestration for this development task:\n\n$ARGUMENTS\n\nThis will automatically detect the intent and orchestrate the appropriate workflow with multiple specialized agents.\n`,
141
+ },
142
+ {
143
+ name: "cc10x-build.md",
144
+ content: `---\ndescription: Build features using TDD cycle (RED -> GREEN -> REFACTOR)\nagent: cc10x-component-builder\n---\n\nBuild this feature using TDD:\n\n$ARGUMENTS\n\nFollow the TDD cycle strictly:\n1. RED: Write a failing test first\n2. GREEN: Write minimal code to pass\n3. REFACTOR: Clean up while keeping tests green\n4. VERIFY: All tests must pass\n`,
145
+ },
146
+ {
147
+ name: "cc10x-debug.md",
148
+ content: `---\ndescription: Investigate and fix bugs with log-first approach\nagent: cc10x-bug-investigator\n---\n\nDebug this issue:\n\n$ARGUMENTS\n\nUse a log-first approach to:\n1. Identify the root cause\n2. Find all related error logs\n3. Propose fixes with evidence\n4. Implement the solution\n`,
149
+ },
150
+ {
151
+ name: "cc10x-review.md",
152
+ content: `---\ndescription: Comprehensive code review with 80%+ confidence threshold\nagent: cc10x-code-reviewer\n---\n\nReview this code:\n\n$ARGUMENTS\n\nPerform a comprehensive code review with 80%+ confidence threshold:\n- Check for bugs and security issues\n- Verify code quality and best practices\n- Suggest improvements\n- Only approve if confidence is high\n`,
153
+ },
154
+ {
155
+ name: "cc10x-plan.md",
156
+ content: `---\ndescription: Create detailed plans with research and architecture design\nagent: cc10x-planner\n---\n\nCreate a comprehensive plan for:\n\n$ARGUMENTS\n\nInclude:\n- Research phase\n- Architecture design\n- Implementation steps\n- Risk assessment\n- Timeline estimates\n`,
157
+ },
158
+ ];
159
+
160
+ for (const f of files) {
161
+ const target = path.join(commandsDir, f.name);
162
+ if (!existsSync(target)) {
163
+ writeFileSync(target, f.content);
164
+ continue;
165
+ }
166
+ const current = readFileSync(target, "utf8");
167
+ const migrated = current
168
+ .replace(/(^|\n)agent:\s*planner(\n|$)/g, "$1agent: cc10x-planner$2")
169
+ .replace(/(^|\n)agent:\s*component-builder(\n|$)/g, "$1agent: cc10x-component-builder$2")
170
+ .replace(/(^|\n)agent:\s*bug-investigator(\n|$)/g, "$1agent: cc10x-bug-investigator$2")
171
+ .replace(/(^|\n)agent:\s*code-reviewer(\n|$)/g, "$1agent: cc10x-code-reviewer$2")
172
+ .replace(/(^|\n)model:\s*anthropic\/claude-sonnet-4-20250514(\n|$)/g, "$1");
173
+ if (migrated !== current) writeFileSync(target, migrated);
174
+ }
175
+ }
176
+
105
177
  async function main() {
106
178
  log(`Installing ${PLUGIN_NAME} from GitHub (${REPO}@${REF})...`);
107
179
 
@@ -143,9 +215,18 @@ async function main() {
143
215
  }
144
216
 
145
217
  if (!installed) fail("Installation failed.");
146
- upsertConfig(configFile, PLUGIN_NAME);
218
+ let bundledConfig = null;
219
+ try {
220
+ bundledConfig = JSON.parse(await downloadText(`${RAW_BASE}/opencode.json`));
221
+ } catch (err) {
222
+ log(`Warning: could not load bundled opencode.json (${err instanceof Error ? err.message : String(err)}). Continuing with plugin registration only.`);
223
+ }
224
+
225
+ upsertConfig(configFile, PLUGIN_NAME, bundledConfig);
226
+ writeCommands(path.join(configDir, "commands"));
147
227
 
148
228
  log(`Installed ${PLUGIN_NAME} to ${pluginFile}`);
229
+ log(`Installed cc10x commands to ${path.join(configDir, "commands")}`);
149
230
  log("Restart OpenCode to load the plugin.");
150
231
  }
151
232
 
package/install.sh CHANGED
@@ -1,295 +1,30 @@
1
1
  #!/bin/bash
2
2
 
3
- # OpenCode cc10x Plugin Installer
4
- # This script installs and configures the cc10x orchestration system for OpenCode
3
+ set -euo pipefail
5
4
 
6
- set -e
5
+ echo "Installing OpenCode cc10x plugin..."
7
6
 
8
- echo "🔌 Installing OpenCode cc10x Plugin..."
7
+ if ! command -v opencode >/dev/null 2>&1; then
8
+ echo "OpenCode is not installed. Install OpenCode first."
9
+ exit 1
10
+ fi
9
11
 
10
- # Check if OpenCode is installed
11
- if ! command -v opencode &> /dev/null; then
12
- echo "❌ OpenCode is not installed. Please install OpenCode first."
13
- exit 1
12
+ if [ ! -f "dist/index.js" ]; then
13
+ echo "dist/index.js not found. Building plugin..."
14
+ npm run build
14
15
  fi
15
16
 
16
- # Create plugin directory
17
- PLUGIN_DIR="$HOME/.config/opencode/plugins"
17
+ CONFIG_BASE="${XDG_CONFIG_HOME:-$HOME/.config}"
18
+ PLUGIN_DIR="$CONFIG_BASE/opencode/plugins"
18
19
  mkdir -p "$PLUGIN_DIR"
19
-
20
- # Copy plugin file
21
- echo "📦 Installing plugin..."
22
20
  cp dist/index.js "$PLUGIN_DIR/opencode-cc10x.js"
23
21
 
24
- # Create global config
25
- CONFIG_DIR="$HOME/.config/opencode"
26
- CONFIG_FILE="$CONFIG_DIR/opencode.json"
27
-
28
- echo "⚙️ Creating global configuration..."
29
-
30
- # Create config with proper structure
31
- cat > "$CONFIG_FILE" << 'EOF'
32
- {
33
- "$schema": "https://opencode.ai/config.json",
34
- "plugin": ["opencode-cc10x"],
35
- "command": {
36
- "cc10x-orchestrate": {
37
- "template": "Run cc10x intelligent orchestration for this development task: ${input}",
38
- "description": "Intelligent orchestration system for development tasks with multi-agent workflows",
39
- "agent": "planner",
40
- "model": "anthropic/claude-sonnet-4-20250514"
41
- },
42
- "cc10x-build": {
43
- "template": "Build this feature using TDD: ${input}",
44
- "description": "Build features using TDD cycle (RED → GREEN → REFACTOR)",
45
- "agent": "component-builder",
46
- "model": "anthropic/claude-sonnet-4-20250514"
47
- },
48
- "cc10x-debug": {
49
- "template": "Debug this issue: ${input}",
50
- "description": "Investigate and fix bugs with log-first approach",
51
- "agent": "bug-investigator",
52
- "model": "anthropic/claude-sonnet-4-20250514"
53
- },
54
- "cc10x-review": {
55
- "template": "Review this code: ${input}",
56
- "description": "Comprehensive code review with 80%+ confidence threshold",
57
- "agent": "code-reviewer",
58
- "model": "anthropic/claude-sonnet-4-20250514"
59
- },
60
- "cc10x-plan": {
61
- "template": "Create a comprehensive plan for: ${input}",
62
- "description": "Create detailed plans with research and architecture design",
63
- "agent": "planner",
64
- "model": "anthropic/claude-sonnet-4-20250514"
65
- }
66
- },
67
- "agent": {
68
- "component-builder": {
69
- "description": "Builds features using TDD cycle (RED → GREEN → REFACTOR). Part of cc10x orchestration system.",
70
- "mode": "subagent",
71
- "temperature": 0.3,
72
- "color": "#00ff00",
73
- "tools": {
74
- "write": true,
75
- "edit": true,
76
- "bash": true,
77
- "grep": true,
78
- "glob": true,
79
- "skill": true,
80
- "lsp": true,
81
- "askUserQuestion": true
82
- }
83
- },
84
- "bug-investigator": {
85
- "description": "Investigates bugs with log-first approach. Part of cc10x orchestration system.",
86
- "mode": "subagent",
87
- "temperature": 0.2,
88
- "color": "#ffa500",
89
- "tools": {
90
- "write": false,
91
- "edit": false,
92
- "bash": true,
93
- "grep": true,
94
- "glob": true,
95
- "skill": true,
96
- "lsp": true,
97
- "webfetch": true
98
- }
99
- },
100
- "code-reviewer": {
101
- "description": "Reviews code with 80%+ confidence threshold. Part of cc10x orchestration system.",
102
- "mode": "subagent",
103
- "temperature": 0.1,
104
- "color": "#ffff00",
105
- "tools": {
106
- "write": false,
107
- "edit": false,
108
- "bash": true,
109
- "grep": true,
110
- "glob": true,
111
- "skill": true,
112
- "lsp": true
113
- }
114
- },
115
- "silent-failure-hunter": {
116
- "description": "Finds silent failures and error handling gaps. Part of cc10x orchestration system.",
117
- "mode": "subagent",
118
- "temperature": 0.2,
119
- "color": "#ff0000",
120
- "tools": {
121
- "write": false,
122
- "edit": false,
123
- "bash": true,
124
- "grep": true,
125
- "glob": true,
126
- "skill": true,
127
- "lsp": true
128
- }
129
- },
130
- "integration-verifier": {
131
- "description": "Performs end-to-end validation. Part of cc10x orchestration system.",
132
- "mode": "subagent",
133
- "temperature": 0.1,
134
- "color": "#0000ff",
135
- "tools": {
136
- "write": false,
137
- "edit": false,
138
- "bash": true,
139
- "grep": true,
140
- "glob": true,
141
- "skill": true,
142
- "lsp": true,
143
- "askUserQuestion": true
144
- }
145
- },
146
- "planner": {
147
- "description": "Creates comprehensive plans with research. Part of cc10x orchestration system.",
148
- "mode": "subagent",
149
- "temperature": 0.4,
150
- "color": "#800080",
151
- "tools": {
152
- "write": true,
153
- "edit": true,
154
- "bash": true,
155
- "grep": true,
156
- "glob": true,
157
- "skill": true,
158
- "lsp": true,
159
- "webfetch": true
160
- }
161
- }
162
- },
163
- "permission": {
164
- "bash": {
165
- "mkdir -p .claude/cc10x": "allow",
166
- "git status": "allow",
167
- "git diff": "allow",
168
- "git log": "allow",
169
- "npm test": "allow",
170
- "yarn test": "allow",
171
- "bun test": "allow",
172
- "npm start": "allow",
173
- "*": "ask"
174
- },
175
- "edit": "allow",
176
- "write": "allow",
177
- "skill": {
178
- "cc10x:*": "allow"
179
- }
180
- }
181
- }
182
- EOF
183
-
184
- # Create commands directory
185
- COMMANDS_DIR="$CONFIG_DIR/commands"
186
- mkdir -p "$COMMANDS_DIR"
187
-
188
- echo "📝 Creating command files..."
189
-
190
- # Create cc10x-orchestrate command
191
- cat > "$COMMANDS_DIR/cc10x-orchestrate.md" << 'EOF'
192
- ---
193
- description: Intelligent orchestration system for development tasks with multi-agent workflows
194
- agent: planner
195
- model: anthropic/claude-sonnet-4-20250514
196
- ---
197
-
198
- Run cc10x intelligent orchestration for this development task:
199
-
200
- $ARGUMENTS
201
-
202
- This will automatically detect the intent and orchestrate the appropriate workflow with multiple specialized agents.
203
- EOF
204
-
205
- # Create cc10x-build command
206
- cat > "$COMMANDS_DIR/cc10x-build.md" << 'EOF'
207
- ---
208
- description: Build features using TDD cycle (RED → GREEN → REFACTOR)
209
- agent: component-builder
210
- model: anthropic/claude-sonnet-4-20250514
211
- ---
212
-
213
- Build this feature using TDD:
214
-
215
- $ARGUMENTS
216
-
217
- Follow the TDD cycle strictly:
218
- 1. RED: Write a failing test first
219
- 2. GREEN: Write minimal code to pass
220
- 3. REFACTOR: Clean up while keeping tests green
221
- 4. VERIFY: All tests must pass
222
- EOF
223
-
224
- # Create cc10x-debug command
225
- cat > "$COMMANDS_DIR/cc10x-debug.md" << 'EOF'
226
- ---
227
- description: Investigate and fix bugs with log-first approach
228
- agent: bug-investigator
229
- model: anthropic/claude-sonnet-4-20250514
230
- ---
231
-
232
- Debug this issue:
233
-
234
- $ARGUMENTS
235
-
236
- Use a log-first approach to:
237
- 1. Identify the root cause
238
- 2. Find all related error logs
239
- 3. Propose fixes with evidence
240
- 4. Implement the solution
241
- EOF
242
-
243
- # Create cc10x-review command
244
- cat > "$COMMANDS_DIR/cc10x-review.md" << 'EOF'
245
- ---
246
- description: Comprehensive code review with 80%+ confidence threshold
247
- agent: code-reviewer
248
- model: anthropic/claude-sonnet-4-20250514
249
- ---
250
-
251
- Review this code:
252
-
253
- $ARGUMENTS
254
-
255
- Perform a comprehensive code review with 80%+ confidence threshold:
256
- - Check for bugs and security issues
257
- - Verify code quality and best practices
258
- - Suggest improvements
259
- - Only approve if confidence is high
260
- EOF
261
-
262
- # Create cc10x-plan command
263
- cat > "$COMMANDS_DIR/cc10x-plan.md" << 'EOF'
264
- ---
265
- description: Create detailed plans with research and architecture design
266
- agent: planner
267
- model: anthropic/claude-sonnet-4-20250514
268
- ---
269
-
270
- Create a comprehensive plan for:
271
-
272
- $ARGUMENTS
273
-
274
- Include:
275
- - Research phase
276
- - Architecture design
277
- - Implementation steps
278
- - Risk assessment
279
- - Timeline estimates
280
- EOF
22
+ if [ -f "bin/opencode-cc10x.mjs" ]; then
23
+ node bin/opencode-cc10x.mjs init
24
+ else
25
+ echo "bin/opencode-cc10x.mjs is missing."
26
+ echo "Plugin copied, but config/commands were not initialized."
27
+ exit 1
28
+ fi
281
29
 
282
- echo "Installation complete!"
283
- echo ""
284
- echo "📁 Files installed:"
285
- echo " Plugin: $PLUGIN_DIR/opencode-cc10x.js"
286
- echo " Config: $CONFIG_FILE"
287
- echo " Commands: $COMMANDS_DIR/"
288
- echo ""
289
- echo "🚀 Usage:"
290
- echo " • Start OpenCode: opencode"
291
- echo " • Press '/' to see cc10x commands"
292
- echo " • Or use directly: /cc10x-orchestrate <task>"
293
- echo " • Or run: opencode run \"<your task>\""
294
- echo ""
295
- echo "🎯 The cc10x orchestration system is now ready!"
30
+ echo "Installation complete. Restart OpenCode to load updates."
package/opencode.json CHANGED
@@ -96,23 +96,5 @@
96
96
  "webfetch": true
97
97
  }
98
98
  }
99
- },
100
- "permission": {
101
- "bash": {
102
- "mkdir -p .claude/cc10x": "allow",
103
- "git status": "allow",
104
- "git diff": "allow",
105
- "git log": "allow",
106
- "npm test": "allow",
107
- "yarn test": "allow",
108
- "bun test": "allow",
109
- "npm start": "allow",
110
- "*": "ask"
111
- },
112
- "edit": "allow",
113
- "write": "allow",
114
- "skill": {
115
- "cc10x:*": "allow"
116
- }
117
99
  }
118
100
  }
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "opencode-cc10x",
3
- "version": "6.0.21",
3
+ "version": "6.0.24",
4
4
  "description": "Intelligent orchestration plugin for OpenCode - port of cc10x from Claude Code",
5
5
  "main": "dist/index.js",
6
+ "bin": {
7
+ "opencode-cc10x": "bin/opencode-cc10x.mjs"
8
+ },
6
9
  "scripts": {
7
10
  "build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/index.js --external:@opencode-ai/plugin",
8
11
  "dev": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/index.js --external:@opencode-ai/plugin --watch",
9
12
  "test": "bun test --coverage",
10
13
  "test:watch": "bun test --watch",
11
14
  "lint": "bun x tsc --noEmit",
12
- "prepublishOnly": "npm run build"
15
+ "prepublishOnly": "npm run build",
16
+ "postinstall": "node bin/opencode-cc10x.mjs init --postinstall || exit 0"
13
17
  },
14
18
  "keywords": [
15
19
  "opencode",
@@ -26,6 +30,9 @@
26
30
  "type": "git",
27
31
  "url": "https://github.com/Chaim12345/cc10x.git"
28
32
  },
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org"
35
+ },
29
36
  "devDependencies": {
30
37
  "@types/node": "^20.0.0",
31
38
  "esbuild": "^0.25.10",