@hiai-gg/hiai-opencode 0.1.5 → 0.1.6

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 (67) hide show
  1. package/.env.example +14 -8
  2. package/AGENTS.md +14 -5
  3. package/LICENSE.md +0 -1
  4. package/README.md +42 -23
  5. package/assets/cli/hiai-opencode.mjs +590 -7
  6. package/assets/mcp/mempalace.mjs +159 -25
  7. package/config/hiai-opencode.schema.json +13 -2
  8. package/dist/agents/dynamic-agent-core-sections.d.ts +4 -1
  9. package/dist/agents/dynamic-agent-prompt-builder.d.ts +1 -1
  10. package/dist/config/platform-schema.d.ts +2 -6
  11. package/dist/config/schema/commands.d.ts +1 -0
  12. package/dist/config/schema/oh-my-opencode-config.d.ts +1 -3
  13. package/dist/config/types.d.ts +1 -3
  14. package/dist/features/builtin-commands/templates/doctor.d.ts +1 -0
  15. package/dist/features/builtin-commands/types.d.ts +1 -1
  16. package/dist/features/builtin-skills/skills/hiai-opencode-setup.d.ts +2 -0
  17. package/dist/features/builtin-skills/skills/index.d.ts +1 -0
  18. package/dist/index.js +348 -1424
  19. package/dist/shared/mcp-static-export.d.ts +22 -0
  20. package/dist/tools/ast-grep/constants.d.ts +1 -1
  21. package/dist/tools/ast-grep/environment-check.d.ts +1 -5
  22. package/dist/tools/ast-grep/language-support.d.ts +0 -1
  23. package/dist/tools/ast-grep/types.d.ts +1 -2
  24. package/hiai-opencode.json +4 -2
  25. package/package.json +6 -4
  26. package/src/agents/bob/default.ts +6 -1
  27. package/src/agents/bob/gpt-pro.ts +1 -0
  28. package/src/agents/bob.ts +1 -0
  29. package/src/agents/coder/gpt-codex.ts +1 -0
  30. package/src/agents/coder/gpt-pro.ts +1 -0
  31. package/src/agents/coder/gpt.ts +1 -0
  32. package/src/agents/dynamic-agent-core-sections.ts +36 -0
  33. package/src/agents/dynamic-agent-prompt-builder.ts +1 -0
  34. package/src/config/defaults.ts +14 -1
  35. package/src/config/model-slots-and-export.test.ts +55 -0
  36. package/src/config/platform-schema.ts +1 -3
  37. package/src/config/schema/commands.ts +1 -0
  38. package/src/config/schema/oh-my-opencode-config.ts +0 -3
  39. package/src/config/types.ts +1 -3
  40. package/src/features/builtin-commands/commands.ts +7 -0
  41. package/src/features/builtin-commands/templates/doctor.ts +43 -0
  42. package/src/features/builtin-commands/types.ts +1 -1
  43. package/src/features/builtin-skills/skills/hiai-opencode-setup.ts +69 -0
  44. package/src/features/builtin-skills/skills/index.ts +1 -0
  45. package/src/features/builtin-skills/skills.ts +10 -1
  46. package/src/index.ts +3 -75
  47. package/src/shared/mcp-static-export.ts +121 -0
  48. package/src/tools/ast-grep/constants.ts +1 -1
  49. package/src/tools/ast-grep/environment-check.ts +2 -32
  50. package/src/tools/ast-grep/language-support.ts +0 -3
  51. package/src/tools/ast-grep/types.ts +1 -2
  52. package/src/tools/skill-mcp/tools.test.ts +44 -0
  53. package/dist/ast-grep-napi.win32-x64-msvc-67c0y8nc.node +0 -0
  54. package/dist/config/loader.test.d.ts +0 -1
  55. package/dist/config/models.d.ts +0 -13
  56. package/dist/internals/plugins/websearch-cited/google.d.ts +0 -38
  57. package/dist/internals/plugins/websearch-cited/index.d.ts +0 -17
  58. package/dist/internals/plugins/websearch-cited/openai.d.ts +0 -9
  59. package/dist/internals/plugins/websearch-cited/openrouter.d.ts +0 -2
  60. package/dist/internals/plugins/websearch-cited/types.d.ts +0 -5
  61. package/src/internals/plugins/websearch-cited/LICENSE +0 -214
  62. package/src/internals/plugins/websearch-cited/codex_prompt.txt +0 -79
  63. package/src/internals/plugins/websearch-cited/google.ts +0 -749
  64. package/src/internals/plugins/websearch-cited/index.ts +0 -306
  65. package/src/internals/plugins/websearch-cited/openai.ts +0 -407
  66. package/src/internals/plugins/websearch-cited/openrouter.ts +0 -190
  67. package/src/internals/plugins/websearch-cited/types.ts +0 -7
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { mkdirSync } from "node:fs";
3
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
4
4
  import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { spawn, spawnSync } from "node:child_process";
7
+ import { homedir } from "node:os";
8
+ import { parse as parseJsonc } from "jsonc-parser";
7
9
 
8
10
  function resolveCacheRoot() {
9
11
  const xdgCache = process.env.XDG_CACHE_HOME?.trim();
@@ -27,14 +29,103 @@ function parsePalacePath(argv) {
27
29
  || join(resolveCacheRoot(), "hiai-opencode", "mempalace-palace");
28
30
  }
29
31
 
32
+ function resolveEnvTemplate(value) {
33
+ if (typeof value !== "string") return "";
34
+ return value.replace(/\{env:([^}]+)\}/g, (_match, expression) => {
35
+ const [name, fallback] = String(expression).split(":-", 2);
36
+ return process.env[name] || fallback || "";
37
+ }).trim();
38
+ }
39
+
40
+ function candidateConfigPaths() {
41
+ const cwd = process.cwd();
42
+ const home = homedir();
43
+ const paths = [
44
+ join(cwd, "hiai-opencode.json"),
45
+ join(cwd, "hiai-opencode.jsonc"),
46
+ join(cwd, ".opencode", "hiai-opencode.json"),
47
+ join(cwd, ".opencode", "hiai-opencode.jsonc"),
48
+ join(home, ".config", "opencode", "hiai-opencode.json"),
49
+ join(home, ".config", "opencode", "hiai-opencode.jsonc"),
50
+ ];
51
+
52
+ if (process.platform === "win32" && process.env.APPDATA) {
53
+ paths.push(join(process.env.APPDATA, "opencode", "hiai-opencode.json"));
54
+ paths.push(join(process.env.APPDATA, "opencode", "hiai-opencode.jsonc"));
55
+ }
56
+
57
+ return paths;
58
+ }
59
+
60
+ function loadUserConfig() {
61
+ for (const path of candidateConfigPaths()) {
62
+ if (!existsSync(path)) continue;
63
+ try {
64
+ return parseJsonc(readFileSync(path, "utf-8")) ?? {};
65
+ } catch {
66
+ return {};
67
+ }
68
+ }
69
+ return {};
70
+ }
71
+
72
+ function getConfiguredPythonPath() {
73
+ const config = loadUserConfig();
74
+ const value = config?.mcp?.mempalace?.pythonPath;
75
+ return resolveEnvTemplate(typeof value === "string" ? value : "");
76
+ }
77
+
78
+ function resolveVenvPythonCandidates(basePath) {
79
+ if (!basePath) return [];
80
+
81
+ if (process.platform === "win32") {
82
+ return [
83
+ join(basePath, ".venv", "Scripts", "python.exe"),
84
+ join(basePath, "venv", "Scripts", "python.exe"),
85
+ ];
86
+ }
87
+
88
+ return [
89
+ join(basePath, ".venv", "bin", "python"),
90
+ join(basePath, ".venv", "bin", "python3"),
91
+ join(basePath, "venv", "bin", "python"),
92
+ join(basePath, "venv", "bin", "python3"),
93
+ ];
94
+ }
95
+
30
96
  function pythonCandidates() {
97
+ const configPython = getConfiguredPythonPath();
31
98
  const explicit = process.env.MEMPALACE_PYTHON?.trim();
99
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
100
+ const pluginRoot = join(scriptDir, "..", "..");
32
101
  const candidates = [];
33
102
 
34
103
  if (explicit) {
35
104
  candidates.push({ command: explicit, args: [] });
36
105
  }
37
106
 
107
+ if (configPython) {
108
+ candidates.push({ command: configPython, args: [] });
109
+ }
110
+
111
+ for (const candidate of resolveVenvPythonCandidates(process.cwd())) {
112
+ if (existsSync(candidate)) {
113
+ candidates.push({ command: candidate, args: [] });
114
+ }
115
+ }
116
+
117
+ for (const candidate of resolveVenvPythonCandidates(pluginRoot)) {
118
+ if (existsSync(candidate)) {
119
+ candidates.push({ command: candidate, args: [] });
120
+ }
121
+ }
122
+
123
+ for (const candidate of resolveVenvPythonCandidates(join(homedir(), ".config", "opencode", "plugins", "hiai-opencode"))) {
124
+ if (existsSync(candidate)) {
125
+ candidates.push({ command: candidate, args: [] });
126
+ }
127
+ }
128
+
38
129
  if (process.platform === "win32") {
39
130
  candidates.push({ command: "py", args: ["-3"] });
40
131
  }
@@ -42,7 +133,13 @@ function pythonCandidates() {
42
133
  candidates.push({ command: "python3", args: [] });
43
134
  candidates.push({ command: "python", args: [] });
44
135
 
45
- return candidates;
136
+ const seen = new Set();
137
+ return candidates.filter((candidate) => {
138
+ const key = `${candidate.command}\0${candidate.args.join("\0")}`;
139
+ if (seen.has(key)) return false;
140
+ seen.add(key);
141
+ return true;
142
+ });
46
143
  }
47
144
 
48
145
  function hasUv() {
@@ -57,7 +154,7 @@ function hasUv() {
57
154
  function canRunModule(candidate, moduleName) {
58
155
  const probe = spawnSync(
59
156
  candidate.command,
60
- [...candidate.args, "-c", `import importlib.util, sys; sys.exit(0 if importlib.util.find_spec("${moduleName}") else 1)`],
157
+ [...candidate.args, "-c", `import importlib, sys; importlib.import_module("${moduleName}")`],
61
158
  { stdio: "ignore", timeout: 10000 },
62
159
  );
63
160
 
@@ -105,6 +202,31 @@ function installMempalaceWithPip(candidate) {
105
202
  return result.status === 0 && canRunModule(candidate, "mempalace.mcp_server");
106
203
  }
107
204
 
205
+ function spawnWithUv(uvBinary, palacePath) {
206
+ return spawn(
207
+ uvBinary,
208
+ [
209
+ "tool",
210
+ "run",
211
+ "--from",
212
+ "mempalace[all]>=3.3.0",
213
+ "python",
214
+ "-m",
215
+ "mempalace.mcp_server",
216
+ "--palace",
217
+ palacePath,
218
+ ],
219
+ {
220
+ stdio: "inherit",
221
+ env: {
222
+ ...process.env,
223
+ UV_CACHE_DIR: resolveUvCacheRoot(),
224
+ MEMPALACE_PALACE_PATH: palacePath,
225
+ },
226
+ },
227
+ );
228
+ }
229
+
108
230
  function resolveUvCacheRoot() {
109
231
  return process.env.UV_CACHE_DIR
110
232
  || join(resolveCacheRoot(), "hiai-opencode", "uv");
@@ -129,30 +251,30 @@ function main() {
129
251
  const palacePath = parsePalacePath(process.argv.slice(2));
130
252
  mkdirSync(palacePath, { recursive: true });
131
253
 
254
+ const configuredPython =
255
+ process.env.MEMPALACE_PYTHON?.trim() || getConfiguredPythonPath();
256
+ if (configuredPython) {
257
+ const configuredCandidate = { command: configuredPython, args: [] };
258
+ if (canRunModule(configuredCandidate, "mempalace.mcp_server")) {
259
+ const configuredChild = spawn(
260
+ configuredCandidate.command,
261
+ [...configuredCandidate.args, "-m", "mempalace.mcp_server", "--palace", palacePath],
262
+ {
263
+ stdio: "inherit",
264
+ env: {
265
+ ...process.env,
266
+ MEMPALACE_PALACE_PATH: palacePath,
267
+ },
268
+ },
269
+ );
270
+ forwardChildExit(configuredChild, "[hiai-opencode] mempalace launcher failed:");
271
+ return;
272
+ }
273
+ }
274
+
132
275
  const uvBinary = hasUv();
133
276
  if (uvBinary) {
134
- const child = spawn(
135
- uvBinary,
136
- [
137
- "tool",
138
- "run",
139
- "--from",
140
- "mempalace[all]>=3.3.0",
141
- "python",
142
- "-m",
143
- "mempalace.mcp_server",
144
- "--palace",
145
- palacePath,
146
- ],
147
- {
148
- stdio: "inherit",
149
- env: {
150
- ...process.env,
151
- UV_CACHE_DIR: resolveUvCacheRoot(),
152
- MEMPALACE_PALACE_PATH: palacePath,
153
- },
154
- },
155
- );
277
+ const child = spawnWithUv(uvBinary, palacePath);
156
278
 
157
279
  forwardChildExit(child, "[hiai-opencode] mempalace uv launcher failed:");
158
280
  return;
@@ -167,10 +289,22 @@ function main() {
167
289
  if (pipPython && installMempalaceWithPip(pipPython)) {
168
290
  return pipPython;
169
291
  }
292
+
293
+ const fallbackUv = hasUv();
294
+ if (fallbackUv) {
295
+ const uvChild = spawnWithUv(fallbackUv, palacePath);
296
+ forwardChildExit(uvChild, "[hiai-opencode] mempalace uv fallback failed:");
297
+ return "__uv_fallback_started__";
298
+ }
299
+
170
300
  return null;
171
301
  })()
172
302
  : null);
173
303
 
304
+ if (fallbackPython === "__uv_fallback_started__") {
305
+ return;
306
+ }
307
+
174
308
  if (!fallbackPython) {
175
309
  console.error(
176
310
  "[hiai-opencode] mempalace skipped: install uv or Python 3.9+ with `pip install --user mempalace`",
@@ -37,7 +37,6 @@
37
37
  "type": "object",
38
38
  "additionalProperties": { "type": "string" },
39
39
  "properties": {
40
- "googleSearch": { "type": "string" },
41
40
  "stitch": { "type": "string" },
42
41
  "firecrawl": { "type": "string" },
43
42
  "context7": { "type": "string" }
@@ -52,7 +51,7 @@
52
51
  "sequential-thinking": { "$ref": "#/definitions/toggle" },
53
52
  "firecrawl": { "$ref": "#/definitions/toggle" },
54
53
  "rag": { "$ref": "#/definitions/toggle" },
55
- "mempalace": { "$ref": "#/definitions/toggle" },
54
+ "mempalace": { "$ref": "#/definitions/mempalaceToggle" },
56
55
  "context7": { "$ref": "#/definitions/toggle" }
57
56
  }
58
57
  },
@@ -112,6 +111,18 @@
112
111
  },
113
112
  "required": ["enabled"],
114
113
  "additionalProperties": false
114
+ },
115
+ "mempalaceToggle": {
116
+ "type": "object",
117
+ "properties": {
118
+ "enabled": { "type": "boolean", "default": true },
119
+ "pythonPath": {
120
+ "type": "string",
121
+ "description": "Optional explicit Python executable for MemPalace (for example: ./.venv/bin/python)."
122
+ }
123
+ },
124
+ "required": ["enabled"],
125
+ "additionalProperties": false
115
126
  }
116
127
  }
117
128
  }
@@ -8,7 +8,10 @@ import type { AvailableTool } from "./dynamic-agent-prompt-types";
8
8
  */
9
9
  export declare function buildAgentIdentitySection(agentName: string, roleDescription: string): string;
10
10
  export declare function buildKeyTriggersSection(agents: AvailableAgent[], _skills?: AvailableSkill[]): string;
11
- export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[], _skills?: AvailableSkill[]): string;
11
+ export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[], _skills?: AvailableSkill[], options?: {
12
+ includeIntegrationPrimer?: boolean;
13
+ }): string;
14
+ export declare function buildHiaiIntegrationPrimerSection(): string;
12
15
  export declare function buildResearcherSection(agents: AvailableAgent[]): string;
13
16
  export declare function buildDelegationTable(agents: AvailableAgent[]): string;
14
17
  export declare function buildStrategistAndCriticSection(agents: AvailableAgent[]): string;
@@ -1,5 +1,5 @@
1
1
  export type { AvailableAgent, AvailableTool, AvailableSkill, AvailableCategory, } from "./dynamic-agent-prompt-types";
2
2
  export { categorizeTools } from "./dynamic-agent-tool-categorization";
3
- export { buildAgentIdentitySection, buildKeyTriggersSection, buildToolSelectionTable, buildResearcherSection, buildDelegationTable, buildStrategistAndCriticSection, buildNonClaudePlannerSection, buildParallelDelegationSection, } from "./dynamic-agent-core-sections";
3
+ export { buildAgentIdentitySection, buildKeyTriggersSection, buildToolSelectionTable, buildResearcherSection, buildDelegationTable, buildHiaiIntegrationPrimerSection, buildStrategistAndCriticSection, buildNonClaudePlannerSection, buildParallelDelegationSection, } from "./dynamic-agent-core-sections";
4
4
  export { buildCategorySkillsDelegationGuide } from "./dynamic-agent-category-skills-guide";
5
5
  export { buildHardBlocksSection, buildAntiPatternsSection, buildHardRulesSection, buildToolCallFormatSection, buildUltraworkSection, buildAntiDuplicationSection, buildToolUsageRulesSection, } from "./dynamic-agent-policy-sections";
@@ -219,6 +219,7 @@ export declare const McpServerConfigSchema: z.ZodObject<{
219
219
  command: z.ZodOptional<z.ZodArray<z.ZodString>>;
220
220
  timeout: z.ZodOptional<z.ZodNumber>;
221
221
  environment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
222
+ pythonPath: z.ZodOptional<z.ZodString>;
222
223
  }, z.core.$strip>;
223
224
  export declare const LspServerConfigSchema: z.ZodObject<{
224
225
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -311,9 +312,6 @@ export declare const PermissionsConfigSchema: z.ZodObject<{
311
312
  }>>>;
312
313
  }, z.core.$strip>;
313
314
  export declare const AuthKeysSchema: z.ZodObject<{
314
- googleSearch: z.ZodOptional<z.ZodString>;
315
- openai: z.ZodOptional<z.ZodString>;
316
- openrouter: z.ZodOptional<z.ZodString>;
317
315
  stitch: z.ZodOptional<z.ZodString>;
318
316
  firecrawl: z.ZodOptional<z.ZodString>;
319
317
  context7: z.ZodOptional<z.ZodString>;
@@ -1304,6 +1302,7 @@ export declare const HiaiOpencodeConfigSchema: z.ZodObject<{
1304
1302
  command: z.ZodOptional<z.ZodArray<z.ZodString>>;
1305
1303
  timeout: z.ZodOptional<z.ZodNumber>;
1306
1304
  environment: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1305
+ pythonPath: z.ZodOptional<z.ZodString>;
1307
1306
  }, z.core.$strip>>>;
1308
1307
  lsp: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1309
1308
  enabled: z.ZodOptional<z.ZodBoolean>;
@@ -1396,9 +1395,6 @@ export declare const HiaiOpencodeConfigSchema: z.ZodObject<{
1396
1395
  }>>>;
1397
1396
  }, z.core.$strip>>;
1398
1397
  auth: z.ZodOptional<z.ZodObject<{
1399
- googleSearch: z.ZodOptional<z.ZodString>;
1400
- openai: z.ZodOptional<z.ZodString>;
1401
- openrouter: z.ZodOptional<z.ZodString>;
1402
1398
  stitch: z.ZodOptional<z.ZodString>;
1403
1399
  firecrawl: z.ZodOptional<z.ZodString>;
1404
1400
  context7: z.ZodOptional<z.ZodString>;
@@ -9,5 +9,6 @@ export declare const BuiltinCommandNameSchema: z.ZodEnum<{
9
9
  "stop-continuation": "stop-continuation";
10
10
  "remove-ai-slops": "remove-ai-slops";
11
11
  "mcp-status": "mcp-status";
12
+ doctor: "doctor";
12
13
  }>;
13
14
  export type BuiltinCommandName = z.infer<typeof BuiltinCommandNameSchema>;
@@ -26,6 +26,7 @@ export declare const HiaiOpenCodeConfigSchema: z.ZodObject<{
26
26
  "stop-continuation": "stop-continuation";
27
27
  "remove-ai-slops": "remove-ai-slops";
28
28
  "mcp-status": "mcp-status";
29
+ doctor: "doctor";
29
30
  }>>>;
30
31
  disabled_tools: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
32
  mcp_env_allowlist: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -4216,9 +4217,6 @@ export declare const HiaiOpenCodeConfigSchema: z.ZodObject<{
4216
4217
  timeout_ms: z.ZodDefault<z.ZodNumber>;
4217
4218
  }, z.core.$strip>>;
4218
4219
  auth: z.ZodOptional<z.ZodObject<{
4219
- googleSearch: z.ZodOptional<z.ZodString>;
4220
- openai: z.ZodOptional<z.ZodString>;
4221
- openrouter: z.ZodOptional<z.ZodString>;
4222
4220
  stitch: z.ZodOptional<z.ZodString>;
4223
4221
  firecrawl: z.ZodOptional<z.ZodString>;
4224
4222
  context7: z.ZodOptional<z.ZodString>;
@@ -72,6 +72,7 @@ export interface McpServerConfig {
72
72
  command?: string[];
73
73
  timeout?: number;
74
74
  environment?: Record<string, string>;
75
+ pythonPath?: string;
75
76
  }
76
77
  export interface LspServerConfig {
77
78
  enabled?: boolean;
@@ -103,9 +104,6 @@ export interface PermissionsConfig {
103
104
  deny_paths?: string[];
104
105
  }
105
106
  export interface AuthKeys {
106
- googleSearch?: string;
107
- openai?: string;
108
- openrouter?: string;
109
107
  stitch?: string;
110
108
  firecrawl?: string;
111
109
  context7?: string;
@@ -0,0 +1 @@
1
+ export declare const DOCTOR_TEMPLATE = "# Hiai OpenCode Doctor Command\n\n## Purpose\n\nUse /doctor to run the hiai-opencode install/runtime diagnostic and report actionable setup issues.\n\n## Execute\n\nRun:\n\n```bash\nhiai-opencode doctor\n```\n\nIf the binary is not on PATH, try the package-local fallback:\n\n```bash\nnode ./node_modules/@hiai-gg/hiai-opencode/assets/cli/hiai-opencode.mjs doctor\n```\n\n## Report\n\nSummarize:\n\n- config path\n- enabled and disabled MCP servers\n- missing env vars by name only\n- static `.mcp.json` freshness and whether it is managed by hiai-opencode\n- OpenCode Connect visibility for configured model providers\n- OpenCode plugin registration sanity (including `plugin: [\"list\"]` misconfiguration warning)\n- skill materialization status from skill registry\n- agent count and naming summary\n- LSP runtime availability\n- MemPalace python source and selected interpreter (env/config/auto)\n- MCP tool probes (real connect + tools/list) for stdio and basic endpoint probes for remote MCP\n\nRules:\n\n- Do not print API key values.\n- Do not ask for model provider env vars such as OPENROUTER_API_KEY or OPENAI_API_KEY; normal model auth belongs to OpenCode Connect.\n- If `opencode mcp list` is empty but doctor/mcp-status sees servers, explain the runtime-vs-static config distinction and run `hiai-opencode export-mcp .mcp.json` if the user wants static visibility.\n- Do not run package installs unless the user explicitly asks.\n";
@@ -1,5 +1,5 @@
1
1
  import type { CommandDefinition } from "../claude-code-command-loader";
2
- export type BuiltinCommandName = "init-deep" | "ralph-loop" | "cancel-ralph" | "ulw-loop" | "refactor" | "start-work" | "stop-continuation" | "handoff" | "remove-ai-slops" | "mcp-status";
2
+ export type BuiltinCommandName = "init-deep" | "ralph-loop" | "cancel-ralph" | "ulw-loop" | "refactor" | "start-work" | "stop-continuation" | "handoff" | "remove-ai-slops" | "mcp-status" | "doctor";
3
3
  export interface BuiltinCommandConfig {
4
4
  disabled_commands?: BuiltinCommandName[];
5
5
  }
@@ -0,0 +1,2 @@
1
+ import type { BuiltinSkill } from "../types";
2
+ export declare const hiaiOpencodeSetupSkill: BuiltinSkill;
@@ -5,3 +5,4 @@ export { gitMasterSkill } from "./git-master";
5
5
  export { devBrowserSkill } from "./dev-browser";
6
6
  export { reviewWorkSkill } from "./review-work";
7
7
  export { aiSlopRemoverSkill } from "./ai-slop-remover";
8
+ export { hiaiOpencodeSetupSkill } from "./hiai-opencode-setup";