rolebox 0.1.2 → 0.3.1

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
@@ -1,11 +1,10 @@
1
1
  # rolebox
2
2
 
3
- Define custom AI agent roles for [opencode](https://github.com/nicholasgriffintn/opencode) via YAML. Each role gets its own prompt, model, skills, and permissions. No code required.
3
+ Define custom AI agent roles for [opencode](https://github.com/nicholasgriffintn/opencode) via YAML. Each role gets its own prompt, model, skills, functions, and permissions. No code required.
4
4
 
5
- ## Quick start
5
+ ## Install
6
6
 
7
7
  ```bash
8
- # Install
9
8
  cd ~/.config/opencode && npm install rolebox
10
9
  ```
11
10
 
@@ -17,7 +16,7 @@ Add to `opencode.jsonc`:
17
16
  }
18
17
  ```
19
18
 
20
- Create a role:
19
+ ## Create a role
21
20
 
22
21
  ```bash
23
22
  mkdir -p ~/.config/opencode/rolebox/copywriter
@@ -33,24 +32,124 @@ prompt: |
33
32
 
34
33
  Restart opencode. The role appears in your agent list.
35
34
 
36
- ## Directory structure
35
+ ## Functions
36
+
37
+ Functions are composable behavior modules that users activate at runtime with `|name|` syntax. They inject additional instructions into the system prompt on demand.
38
+
39
+ Every role ships with two built-in functions (`plan` and `execute`) by default. Users activate them by prefixing their message:
37
40
 
38
41
  ```
39
- ~/.config/opencode/
40
- ├── opencode.jsonc
41
- ├── rolebox/
42
- │ ├── copywriter/
43
- │ │ └── role.yaml
44
- │ ├── ai-designer/
45
- │ │ ├── role.yaml
46
- │ │ └── skills/
47
- │ │ ├── visual-design.md
48
- │ │ └── interaction-patterns/
49
- │ │ └── SKILL.md
50
- │ └── ...
51
- └── skills/ # Global opencode skills
42
+ |plan| redesign the auth module
43
+ |execute| implement the refactoring we discussed
44
+ |plan|execute| add pagination to the API
45
+ ```
46
+
47
+ ### How it works
48
+
49
+ 1. User types `|plan| do something` → parser strips `|plan|`, activates the function for this session
50
+ 2. On every subsequent turn, the function's instructions are injected into the system prompt
51
+ 3. Functions persist for the session once activated
52
+
53
+ ### Writing custom functions
54
+
55
+ Create a markdown file with YAML frontmatter:
56
+
57
+ ```markdown
58
+ ---
59
+ name: review
60
+ description: Code review mode with configurable focus
61
+ params:
62
+ focus: correctness
63
+ severity: normal
64
+ ---
65
+
66
+ You are reviewing code with focus on **{focus}** at **{severity}** level.
67
+
68
+ Check for:
69
+ - Logic errors and edge cases
70
+ - Performance implications
71
+ - Consistency with existing patterns
72
+ ```
73
+
74
+ ### Parameterized functions
75
+
76
+ Functions accept parameters via two syntax styles:
77
+
78
+ **Positional** (maps to param declaration order):
79
+ ```
80
+ |review:security,strict| check the auth module
81
+ ```
82
+
83
+ **Key-value** (explicit naming):
84
+ ```
85
+ |review focus=security severity=strict| check the auth module
86
+ ```
87
+
88
+ **Mixed** (some with args, some without):
89
+ ```
90
+ |plan|review:security| analyze this PR
91
+ ```
92
+
93
+ Parameters that aren't provided fall back to their declared default values. Functions without a `params` block ignore any passed arguments.
94
+
95
+ ### Resolution priority
96
+
97
+ 1. `{roleDir}/functions/{name}.md` — role-local override
98
+ 2. `~/.config/opencode/functions/{name}.md` — global user-defined
99
+ 3. Built-in (`plan`, `execute`) — shipped with rolebox
100
+
101
+ ### Configuring functions per role
102
+
103
+ ```yaml
104
+ # Use only specific functions (replaces the default plan+execute)
105
+ functions:
106
+ - plan
107
+ - review
108
+ - my-custom-fn
109
+
110
+ # Disable specific defaults
111
+ disable_functions:
112
+ - execute
113
+ ```
114
+
115
+ ### Built-in functions
116
+
117
+ **plan** — Instructs the agent to investigate the codebase with tools (Read, Grep, Glob, LSP) before planning. Produces a structured plan with verification strategy. Waits for user approval before executing.
118
+
119
+ **execute** — Instructs the agent to implement step by step with tool-based verification (lsp_diagnostics, build, tests) after each change. Handles failures with a two-attempt escalation policy.
120
+
121
+ ## Skills
122
+
123
+ Skills are on-demand knowledge modules the agent loads via the `skill` tool when needed. Unlike functions (which are always-on once activated), skills are pulled in contextually.
124
+
125
+ ```markdown
126
+ ---
127
+ name: review-checklist
128
+ description: Comprehensive code review checklist
129
+ ---
130
+
131
+ When reviewing code, check:
132
+ - Error handling completeness
133
+ - Input validation
134
+ - ...
52
135
  ```
53
136
 
137
+ ### Resolution order
138
+
139
+ 1. `{roleDir}/skills/{name}/SKILL.md` (role-local, directory)
140
+ 2. `{roleDir}/skills/{name}.md` (role-local, single file)
141
+ 3. `~/.config/opencode/skills/{name}/SKILL.md` (global, directory)
142
+ 4. `~/.config/opencode/skills/{name}.md` (global, single file)
143
+
144
+ ### Skill vs Function
145
+
146
+ | | Skill | Function |
147
+ |---|---|---|
148
+ | Activation | Agent decides via `skill` tool | User activates with `\|name\|` syntax |
149
+ | Lifetime | Single use per invocation | Persists for the session |
150
+ | Purpose | Reference knowledge | Behavior modification |
151
+ | Injection | On-demand into context | Always in system prompt while active |
152
+
54
153
  ## Configuration reference
55
154
 
56
155
  ### role.yaml
@@ -77,6 +176,14 @@ skills: # From rolebox/{role}/skills/
77
176
  opencode_skills: # From ~/.config/opencode/skills/
78
177
  - humanizer
79
178
 
179
+ # Functions
180
+ functions: # Available functions (default: [plan, execute])
181
+ - plan
182
+ - execute
183
+ - my-custom-fn
184
+ disable_functions: # Remove specific defaults
185
+ - execute
186
+
80
187
  # Permissions
81
188
  permission:
82
189
  allow:
@@ -98,70 +205,85 @@ prompt: |
98
205
  You work for {env:COMPANY_NAME}...
99
206
  ```
100
207
 
101
- ## Skills
102
-
103
- Skills use standard opencode SKILL.md format with YAML frontmatter:
104
-
105
- ```markdown
106
- ---
107
- name: my-skill
108
- description: What this skill does
109
- ---
208
+ ## Directory structure
110
209
 
111
- Skill instructions here...
210
+ ```
211
+ ~/.config/opencode/
212
+ ├── opencode.jsonc
213
+ ├── rolebox/
214
+ │ ├── copywriter/
215
+ │ │ └── role.yaml
216
+ │ ├── code-reviewer/
217
+ │ │ ├── role.yaml
218
+ │ │ ├── skills/
219
+ │ │ │ └── review-checklist.md
220
+ │ │ └── functions/
221
+ │ │ └── plan.md # Role-local override of built-in plan
222
+ │ └── ...
223
+ ├── functions/ # Global user-defined functions
224
+ │ └── my-custom-fn.md
225
+ └── skills/ # Global opencode skills
112
226
  ```
113
227
 
114
- ### Resolution order (first match wins)
115
-
116
- 1. `{roleDir}/skills/{name}/SKILL.md` (role-local, directory format)
117
- 2. `{roleDir}/skills/{name}.md` (role-local, single file)
118
- 3. `~/.config/opencode/skills/{name}/SKILL.md` (global, directory format)
119
- 4. `~/.config/opencode/skills/{name}.md` (global, single file)
120
-
121
- ### How skills work at runtime
122
-
123
- Rolebox syncs role-local skills into `~/.config/opencode/skills/` at startup. The role's prompt gets an `<available_skills>` XML block listing skill names and descriptions. The model calls the `skill` tool when it needs specialized instructions.
228
+ ## Examples
124
229
 
125
- ### Example: multi-skill role
230
+ ### Code reviewer with custom plan function
126
231
 
127
232
  ```yaml
128
- name: AI Designer
129
- description: Professional UI/UX designer producing design specification documents.
130
- mode: primary
233
+ # rolebox/code-reviewer/role.yaml
234
+ name: Code Reviewer
235
+ description: Expert code reviewer
236
+ model: gpt-4
237
+ mode: subagent
238
+ temperature: 0.2
131
239
  prompt: |
132
- You are a professional UI/UX designer...
240
+ You are an expert code reviewer. Review for correctness,
241
+ performance, and readability. Be specific and actionable.
133
242
  skills:
134
- - ai-designer-core
135
- - ai-designer-visual
136
- - ai-designer-interaction
137
- - ai-designer-psychology
138
- - ai-designer-research
139
- - ai-designer-system
140
- - ai-designer-antipatterns
243
+ - review-checklist
244
+ functions:
245
+ - plan
246
+ permission:
247
+ allow: [Read, Grep, Glob]
141
248
  ```
142
249
 
143
- ## Startup sequence
250
+ ### Parameterized review function
251
+
252
+ ```markdown
253
+ <!-- rolebox/code-reviewer/functions/review.md -->
254
+ ---
255
+ name: review
256
+ description: Configurable code review
257
+ params:
258
+ focus: correctness
259
+ depth: normal
260
+ ---
144
261
 
145
- 1. Scans `~/.config/opencode/rolebox/*/role.yaml`
146
- 2. Parses YAML, resolves `{env:*}` variables, loads `prompt_file` if specified
147
- 3. Resolves skill references to SKILL.md files
148
- 4. Registers each role as an opencode agent
149
- 5. Syncs skills to `~/.config/opencode/skills/`
150
- 6. Syncs agent .md files to `~/.claude/agents/` for compatibility
262
+ Review this code with focus on **{focus}**.
263
+
264
+ Depth level: **{depth}**
265
+ - normal: flag clear issues, suggest improvements
266
+ - deep: trace all code paths, verify edge cases, check error propagation
267
+ - surface: only obvious bugs and style issues
268
+ ```
269
+
270
+ Usage: `|review:security,deep| check the new auth endpoints`
151
271
 
152
272
  ## Compatibility
153
273
 
154
- Works alongside oh-my-openagent. If both are installed, rolebox roles appear in the agent list and skills are discoverable by the skill tool. No conflicts.
274
+ Works alongside oh-my-openagent. Rolebox roles appear in the agent list and skills are discoverable by the skill tool. No conflicts.
155
275
 
156
276
  ## Error handling
157
277
 
158
- Invalid YAML or missing files won't crash opencode. The broken role is skipped, other roles load normally. Missing skills produce a warning but don't block the role.
278
+ - Invalid YAML or missing files won't crash opencode. The broken role is skipped.
279
+ - Missing skills produce a warning but don't block the role.
280
+ - Missing functions are silently skipped.
281
+ - Invalid function activation syntax (uppercase, mid-sentence pipes) is left untouched in the message.
159
282
 
160
283
  ## Limitations
161
284
 
162
- - No role inheritance
163
285
  - No hot-reload (restart opencode to pick up changes)
164
- - No model existence validation
286
+ - No role inheritance
165
287
  - No runtime role switching
166
- - No MCP server integration
167
- - No conditional skills based on project context
288
+ - Functions persist for the entire session (no per-message deactivation yet)
289
+ - No conditional functions based on project context
@@ -0,0 +1,24 @@
1
+ /**
2
+ * A parsed function activation entry — name plus optional arguments.
3
+ */
4
+ export interface FunctionCall {
5
+ name: string;
6
+ args: Record<string, string>;
7
+ }
8
+ /**
9
+ * Parse `|fn|` function activation syntax from user messages.
10
+ *
11
+ * Only matches `|fn|` patterns at the very start of the text.
12
+ * Mid-sentence `|fn|` is NOT activation and is left untouched.
13
+ *
14
+ * Supports parameterized activation:
15
+ * - Positional: |review:security,strict| → mapped to param order in frontmatter
16
+ * - Key-value: |review focus=security severity=strict|
17
+ * - Mixed: |plan| |review:security| → plan has no args, review has one
18
+ */
19
+ export declare function parseFunctionActivation(text: string): {
20
+ functions: string[];
21
+ calls: FunctionCall[];
22
+ cleanedText: string;
23
+ };
24
+ //# sourceMappingURL=function-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-parser.d.ts","sourceRoot":"","sources":["../src/function-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG;IACrD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CA+BA"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Parse `|fn|` function activation syntax from user messages.
3
+ *
4
+ * Only matches `|fn|` patterns at the very start of the text.
5
+ * Mid-sentence `|fn|` is NOT activation and is left untouched.
6
+ *
7
+ * Supports parameterized activation:
8
+ * - Positional: |review:security,strict| → mapped to param order in frontmatter
9
+ * - Key-value: |review focus=security severity=strict|
10
+ * - Mixed: |plan| |review:security| → plan has no args, review has one
11
+ */
12
+ export function parseFunctionActivation(text) {
13
+ // Matches consecutive |fn| or |fn:args| or |fn key=val| patterns at the start.
14
+ // The inner content between pipes can contain: letters, digits, hyphens, colons,
15
+ // equals, commas, spaces (for key=val pairs), underscores, dots, slashes.
16
+ const fullPattern = /^\|[a-z][a-z0-9-]*(?:[: ][^|]*)?\|(?:\|?[a-z][a-z0-9-]*(?:[: ][^|]*)?\|)*/;
17
+ const match = text.match(fullPattern);
18
+ if (!match) {
19
+ return { functions: [], calls: [], cleanedText: text };
20
+ }
21
+ const matched = match[0];
22
+ const cleanedText = text.slice(matched.length).trimStart();
23
+ // Split into individual function segments.
24
+ // Each segment is between pipes: |segment1|segment2| or |segment1||segment2|
25
+ const segments = matched.split("|").filter(Boolean);
26
+ const functions = [];
27
+ const calls = [];
28
+ for (const segment of segments) {
29
+ const call = parseSingleCall(segment);
30
+ if (call) {
31
+ functions.push(call.name);
32
+ calls.push(call);
33
+ }
34
+ }
35
+ return { functions, calls, cleanedText };
36
+ }
37
+ /**
38
+ * Parse a single function segment like "review:security,strict"
39
+ * or "review focus=security severity=strict" into a FunctionCall.
40
+ */
41
+ function parseSingleCall(segment) {
42
+ // Try colon syntax first: "name:arg1,arg2"
43
+ const colonIdx = segment.indexOf(":");
44
+ const spaceIdx = segment.indexOf(" ");
45
+ if (colonIdx > 0 && (spaceIdx < 0 || colonIdx < spaceIdx)) {
46
+ const name = segment.slice(0, colonIdx);
47
+ if (!isValidName(name))
48
+ return null;
49
+ const argsStr = segment.slice(colonIdx + 1);
50
+ const positional = argsStr.split(",").map((s) => s.trim()).filter(Boolean);
51
+ const args = {};
52
+ for (let i = 0; i < positional.length; i++) {
53
+ args[`_${i}`] = positional[i];
54
+ }
55
+ return { name, args };
56
+ }
57
+ // Try key=value syntax: "name key1=val1 key2=val2"
58
+ if (spaceIdx > 0) {
59
+ const name = segment.slice(0, spaceIdx);
60
+ if (!isValidName(name))
61
+ return null;
62
+ const rest = segment.slice(spaceIdx + 1).trim();
63
+ const args = parseKeyValueArgs(rest);
64
+ return { name, args };
65
+ }
66
+ // Plain name, no args
67
+ if (!isValidName(segment))
68
+ return null;
69
+ return { name: segment, args: {} };
70
+ }
71
+ /**
72
+ * Parse "key1=val1 key2=val2" into a Record.
73
+ */
74
+ function parseKeyValueArgs(str) {
75
+ const args = {};
76
+ // Match key=value pairs. Value can be quoted or unquoted.
77
+ const pattern = /([a-z][a-z0-9_-]*)=(?:"([^"]*)"|(\S+))/g;
78
+ let m;
79
+ while ((m = pattern.exec(str)) !== null) {
80
+ args[m[1]] = m[2] ?? m[3];
81
+ }
82
+ return args;
83
+ }
84
+ function isValidName(s) {
85
+ return /^[a-z][a-z0-9-]*$/.test(s);
86
+ }
87
+ //# sourceMappingURL=function-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-parser.js","sourceRoot":"","sources":["../src/function-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { FunctionMetadata, ResolvedFunction } from "./types";
2
+ import type { FunctionCall } from "./function-parser";
3
+ /**
4
+ * Resolve function names to their file locations using Bun.file().exists().
5
+ *
6
+ * For each function name, three candidate locations are checked in priority
7
+ * order. The first existing file wins. Functions whose body is empty after
8
+ * frontmatter are skipped. Functions that cannot be found in any location
9
+ * are silently skipped (a warning is logged).
10
+ *
11
+ * Resolution priority:
12
+ * 1. {roleDir}/functions/{name}.md (role-local)
13
+ * 2. {globalFunctionsDir}/{name}.md (global)
14
+ * 3. {builtinDir}/{name}.md (built-in)
15
+ */
16
+ export declare function resolveFunctions(names: string[], roleDir: string, globalFunctionsDir: string, builtinDir: string): Promise<ResolvedFunction[]>;
17
+ /**
18
+ * Apply parameter substitution to a function's content.
19
+ *
20
+ * Replaces `{param_name}` placeholders with values from the activation call.
21
+ * Positional args (from colon syntax) are mapped to param declaration order.
22
+ * Missing params fall back to their declared default values.
23
+ * Unresolved placeholders (no value, no default) are left as-is.
24
+ */
25
+ export declare function applyParams(fn: ResolvedFunction, call: FunctionCall): string;
26
+ /**
27
+ * Read a function file and extract its frontmatter metadata and body content.
28
+ *
29
+ * @throws If the file cannot be read.
30
+ */
31
+ export declare function loadFunctionContent(filePath: string): Promise<{
32
+ metadata: FunctionMetadata;
33
+ content: string;
34
+ }>;
35
+ //# sourceMappingURL=function-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-resolver.d.ts","sourceRoot":"","sources":["../src/function-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmD7B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,gBAAgB,EACpB,IAAI,EAAE,YAAY,GACjB,MAAM,CA+BR;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB1D"}
@@ -0,0 +1,115 @@
1
+ import { parseFrontmatter } from "./skill-resolver";
2
+ /**
3
+ * Resolve function names to their file locations using Bun.file().exists().
4
+ *
5
+ * For each function name, three candidate locations are checked in priority
6
+ * order. The first existing file wins. Functions whose body is empty after
7
+ * frontmatter are skipped. Functions that cannot be found in any location
8
+ * are silently skipped (a warning is logged).
9
+ *
10
+ * Resolution priority:
11
+ * 1. {roleDir}/functions/{name}.md (role-local)
12
+ * 2. {globalFunctionsDir}/{name}.md (global)
13
+ * 3. {builtinDir}/{name}.md (built-in)
14
+ */
15
+ export async function resolveFunctions(names, roleDir, globalFunctionsDir, builtinDir) {
16
+ const resolved = [];
17
+ for (const name of names) {
18
+ const candidates = [
19
+ { source: "role-local", path: `${roleDir}/functions/${name}.md` },
20
+ { source: "global", path: `${globalFunctionsDir}/${name}.md` },
21
+ { source: "built-in", path: `${builtinDir}/${name}.md` },
22
+ ];
23
+ let matched = false;
24
+ for (const candidate of candidates) {
25
+ if (!(await Bun.file(candidate.path).exists())) {
26
+ continue;
27
+ }
28
+ let content;
29
+ try {
30
+ content = await Bun.file(candidate.path).text();
31
+ }
32
+ catch {
33
+ continue;
34
+ }
35
+ const { metadata, body } = parseFrontmatter(content);
36
+ if (body.trim() === "") {
37
+ continue;
38
+ }
39
+ resolved.push({
40
+ name: metadata.name ?? name,
41
+ description: metadata.description ?? "",
42
+ content: body,
43
+ filePath: candidate.path,
44
+ source: candidate.source,
45
+ params: metadata.params,
46
+ });
47
+ matched = true;
48
+ break;
49
+ }
50
+ if (!matched) {
51
+ console.warn(`Function "${name}" not found in any of the searched locations.`);
52
+ }
53
+ }
54
+ return resolved;
55
+ }
56
+ /**
57
+ * Apply parameter substitution to a function's content.
58
+ *
59
+ * Replaces `{param_name}` placeholders with values from the activation call.
60
+ * Positional args (from colon syntax) are mapped to param declaration order.
61
+ * Missing params fall back to their declared default values.
62
+ * Unresolved placeholders (no value, no default) are left as-is.
63
+ */
64
+ export function applyParams(fn, call) {
65
+ if (!fn.params || Object.keys(fn.params).length === 0) {
66
+ return fn.content;
67
+ }
68
+ const paramNames = Object.keys(fn.params);
69
+ const resolved = {};
70
+ // Map positional args (_0, _1, ...) to declared param order
71
+ for (let i = 0; i < paramNames.length; i++) {
72
+ const paramName = paramNames[i];
73
+ if (call.args[paramName] !== undefined) {
74
+ // Named arg takes priority
75
+ resolved[paramName] = call.args[paramName];
76
+ }
77
+ else if (call.args[`_${i}`] !== undefined) {
78
+ // Positional arg by index
79
+ resolved[paramName] = call.args[`_${i}`];
80
+ }
81
+ else {
82
+ // Fall back to default from frontmatter
83
+ resolved[paramName] = fn.params[paramName];
84
+ }
85
+ }
86
+ let content = fn.content;
87
+ for (const [key, value] of Object.entries(resolved)) {
88
+ if (value !== undefined && value !== "") {
89
+ content = content.replaceAll(`{${key}}`, value);
90
+ }
91
+ }
92
+ return content;
93
+ }
94
+ /**
95
+ * Read a function file and extract its frontmatter metadata and body content.
96
+ *
97
+ * @throws If the file cannot be read.
98
+ */
99
+ export async function loadFunctionContent(filePath) {
100
+ const file = Bun.file(filePath);
101
+ if (!(await file.exists())) {
102
+ throw new Error(`Function file not found at "${filePath}". ` +
103
+ `The file may have been deleted.`);
104
+ }
105
+ const content = await file.text();
106
+ const { metadata, body } = parseFrontmatter(content);
107
+ return {
108
+ metadata: {
109
+ name: metadata.name,
110
+ description: metadata.description ?? "",
111
+ },
112
+ content: body,
113
+ };
114
+ }
115
+ //# sourceMappingURL=function-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-resolver.js","sourceRoot":"","sources":["../src/function-resolver.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,13 @@
1
1
  import type { Plugin } from "@opencode-ai/plugin";
2
+ import type { ResolvedFunction } from "./types";
2
3
  /**
3
- * OpenCode plugin for rolebox define custom agent roles via YAML
4
- * configuration files with custom prompts, models, skills, and permissions.
4
+ * Map of roleId ResolvedFunction[] built at startup.
5
+ * Exported so tests and hooks can query role-level function resolution.
5
6
  */
6
- declare const RoleboxPlugin: Plugin;
7
- export default RoleboxPlugin;
7
+ export declare const roleFunctionsMap: Map<string, ResolvedFunction[]>;
8
+ declare const _default: {
9
+ id: string;
10
+ server: Plugin;
11
+ };
12
+ export default _default;
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AA2OlD;;;GAGG;AACH,QAAA,MAAM,aAAa,EAAE,MAqCpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAYlD,OAAO,KAAK,EAA2C,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,iCAAwC,CAAC;;;;;AAyVtE,wBAGE"}
package/dist/index.js CHANGED
@@ -1,9 +1,20 @@
1
1
  import path from "node:path";
2
2
  import os from "node:os";
3
3
  import { writeFileSync, readFileSync, mkdirSync, rmdirSync, readdirSync, unlinkSync, symlinkSync, lstatSync, existsSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
4
7
  import { discoverRoles } from "./role-loader";
5
8
  import { resolveSkills } from "./skill-resolver";
6
- import { buildAgentPrompt } from "./prompt-builder";
9
+ import { resolveFunctions, applyParams } from "./function-resolver";
10
+ import { parseFunctionActivation } from "./function-parser";
11
+ import { functionSessionState } from "./session-state";
12
+ import { buildAgentPrompt, buildFunctionBlock } from "./prompt-builder";
13
+ /**
14
+ * Map of roleId → ResolvedFunction[] built at startup.
15
+ * Exported so tests and hooks can query role-level function resolution.
16
+ */
17
+ export const roleFunctionsMap = new Map();
7
18
  /**
8
19
  * Resolve all discovered roles into ResolvedRole objects.
9
20
  *
@@ -11,13 +22,14 @@ import { buildAgentPrompt } from "./prompt-builder";
11
22
  * 1. Gather both role-local skills (skills[]) and opencode-global skills
12
23
  * (opencode_skills[]) into a single name list.
13
24
  * 2. Resolve those names to file paths via the 4-candidate priority system.
14
- * 3. Build the final agent prompt with <available_skills> XML block.
15
- * 4. Return a ResolvedRole object for each successfully-resolved role.
25
+ * 3. Gather function names, filter disabled ones, and resolve function files.
26
+ * 4. Build the final agent prompt with <available_skills> XML block.
27
+ * 5. Return a ResolvedRole object for each successfully-resolved role.
16
28
  *
17
29
  * Errors from individual role resolution are caught and the failing role is
18
30
  * silently skipped (the returned array omits it).
19
31
  */
20
- async function resolveAllRoles(roles, roleboxDir, globalSkillsDir) {
32
+ async function resolveAllRoles(roles, roleboxDir, globalSkillsDir, configDir) {
21
33
  const resolved = [];
22
34
  for (const [roleId, config] of roles) {
23
35
  try {
@@ -30,8 +42,17 @@ async function resolveAllRoles(roles, roleboxDir, globalSkillsDir) {
30
42
  if (allSkillNames.length > 0) {
31
43
  skills = await resolveSkills(allSkillNames, roleDir, globalSkillsDir);
32
44
  }
45
+ const globalFunctionsDir = path.join(configDir, "functions");
46
+ const builtinDir = path.join(__dirname, "..", "functions");
47
+ const functionNames = config.functions ?? ["plan", "execute"];
48
+ const enabledFunctions = functionNames.filter((fn) => !(config.disable_functions ?? []).includes(fn));
49
+ let functions = [];
50
+ if (enabledFunctions.length > 0) {
51
+ functions = await resolveFunctions(enabledFunctions, roleDir, globalFunctionsDir, builtinDir);
52
+ }
33
53
  const prompt = buildAgentPrompt(config, skills);
34
- resolved.push({ id: roleId, config, prompt, skills });
54
+ resolved.push({ id: roleId, config, prompt, skills, functions });
55
+ roleFunctionsMap.set(roleId, functions);
35
56
  }
36
57
  catch {
37
58
  // Silently skip roles that fail during resolution.
@@ -243,7 +264,7 @@ const RoleboxPlugin = async (ctx) => {
243
264
  // Returns an empty Map when the directory does not exist or is empty.
244
265
  const roles = await discoverRoles(roleboxDir);
245
266
  // Resolve skills and build final prompts for every discovered role.
246
- const resolvedRoles = await resolveAllRoles(roles, roleboxDir, globalSkillsDir);
267
+ const resolvedRoles = await resolveAllRoles(roles, roleboxDir, globalSkillsDir, configDir);
247
268
  // Sync agent files to ~/.claude/agents/ for oh-my-openagent compatibility.
248
269
  syncAgentFiles(resolvedRoles);
249
270
  // Sync role skills as symlinks into ~/.config/opencode/skills/ so that
@@ -257,7 +278,61 @@ const RoleboxPlugin = async (ctx) => {
257
278
  config.agent[resolved.id] = agentConfig;
258
279
  }
259
280
  },
281
+ "chat.message": async (input, output) => {
282
+ const textPartIndex = output.parts.findIndex((p) => p.type === "text" && "text" in p);
283
+ if (textPartIndex === -1)
284
+ return;
285
+ const part = output.parts[textPartIndex];
286
+ const { functions: parsedFunctions, calls, cleanedText } = parseFunctionActivation(part.text);
287
+ if (parsedFunctions.length === 0)
288
+ return;
289
+ part.text = cleanedText;
290
+ const roleId = input.agent;
291
+ const roleFunctions = roleId ? roleFunctionsMap.get(roleId) : null;
292
+ if (roleFunctions) {
293
+ const validNames = new Set(roleFunctions.map((f) => f.name));
294
+ const validFunctions = parsedFunctions.filter((fn) => validNames.has(fn));
295
+ const validCalls = calls.filter((c) => validNames.has(c.name));
296
+ functionSessionState.activate(input.sessionID, validFunctions, validCalls);
297
+ }
298
+ else {
299
+ functionSessionState.activate(input.sessionID, parsedFunctions, calls);
300
+ }
301
+ },
302
+ "experimental.chat.system.transform": async (input, output) => {
303
+ if (!input.sessionID)
304
+ return;
305
+ const activeNames = functionSessionState.getActive(input.sessionID);
306
+ if (activeNames.size === 0)
307
+ return;
308
+ const allFunctions = [];
309
+ for (const funcs of roleFunctionsMap.values()) {
310
+ allFunctions.push(...funcs);
311
+ }
312
+ const seen = new Set();
313
+ const activeFunctions = [];
314
+ for (const fn of allFunctions) {
315
+ if (activeNames.has(fn.name) && !seen.has(fn.name)) {
316
+ // Apply parameter substitution if the function was called with args
317
+ const call = functionSessionState.getCall(input.sessionID, fn.name);
318
+ if (call && fn.params && Object.keys(call.args).length > 0) {
319
+ activeFunctions.push({ ...fn, content: applyParams(fn, call) });
320
+ }
321
+ else {
322
+ activeFunctions.push(fn);
323
+ }
324
+ seen.add(fn.name);
325
+ }
326
+ }
327
+ if (activeFunctions.length === 0)
328
+ return;
329
+ const block = buildFunctionBlock(activeFunctions);
330
+ output.system.push(block);
331
+ },
260
332
  };
261
333
  };
262
- export default RoleboxPlugin;
334
+ export default {
335
+ id: "rolebox",
336
+ server: RoleboxPlugin,
337
+ };
263
338
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { RoleConfig, ResolvedSkill } from "./types";
1
+ import type { RoleConfig, ResolvedFunction, ResolvedSkill } from "./types";
2
2
  /**
3
3
  * Build the final system prompt for a role.
4
4
  *
@@ -10,4 +10,11 @@ import type { RoleConfig, ResolvedSkill } from "./types";
10
10
  * without any XML wrapping.
11
11
  */
12
12
  export declare function buildAgentPrompt(role: RoleConfig, skills: ResolvedSkill[]): string;
13
+ /**
14
+ * Build an XML block listing active functions for system prompt injection.
15
+ *
16
+ * Each function's content is wrapped in CDATA to prevent XML parsing issues.
17
+ * Returns empty string when the functions array is empty.
18
+ */
19
+ export declare function buildFunctionBlock(functions: ResolvedFunction[]): string;
13
20
  //# sourceMappingURL=prompt-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,aAAa,EAAE,GACtB,MAAM,CAsBR"}
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE3E;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,aAAa,EAAE,GACtB,MAAM,CAsBR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAsBxE"}
@@ -26,4 +26,28 @@ Skills provide specialized instructions. Use the skill tool to load when task ma
26
26
  ${skillBlocks}
27
27
  </available_skills>`;
28
28
  }
29
+ /**
30
+ * Build an XML block listing active functions for system prompt injection.
31
+ *
32
+ * Each function's content is wrapped in CDATA to prevent XML parsing issues.
33
+ * Returns empty string when the functions array is empty.
34
+ */
35
+ export function buildFunctionBlock(functions) {
36
+ if (functions.length === 0) {
37
+ return "";
38
+ }
39
+ const blocks = functions
40
+ .map((fn) => ` <function>
41
+ <name>${fn.name}</name>
42
+ <description>${fn.description}</description>
43
+ <instructions><![CDATA[
44
+ ${fn.content}
45
+ ]]></instructions>
46
+ </function>`)
47
+ .join("\n");
48
+ return `<active_functions>
49
+ These functions are currently active for this session. Follow their instructions.
50
+ ${blocks}
51
+ </active_functions>`;
52
+ }
29
53
  //# sourceMappingURL=prompt-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,MAAuB;IAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ;YACI,CAAC,CAAC,IAAI;mBACC,CAAC,CAAC,WAAW;aACnB,CAAC,CAAC,KAAK;WACT,CACN;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,IAAI,CAAC,MAAM;;;;EAIrB,WAAW;oBACO,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAgB,EAChB,MAAuB;IAEvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ;YACI,CAAC,CAAC,IAAI;mBACC,CAAC,CAAC,WAAW;aACnB,CAAC,CAAC,KAAK;WACT,CACN;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,IAAI,CAAC,MAAM;;;;EAIrB,WAAW;oBACO,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAA6B;IAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS;SACrB,GAAG,CACF,CAAC,EAAE,EAAE,EAAE,CACL;YACI,EAAE,CAAC,IAAI;mBACA,EAAE,CAAC,WAAW;;EAE/B,EAAE,CAAC,OAAO;;cAEE,CACT;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;EAEP,MAAM;oBACY,CAAC;AACrB,CAAC"}
@@ -132,6 +132,12 @@ async function loadOneRole(yamlPath, roleId) {
132
132
  ...(typeof resolved.top_p === "number"
133
133
  ? { top_p: resolved.top_p }
134
134
  : {}),
135
+ ...(Array.isArray(resolved.functions)
136
+ ? { functions: resolved.functions }
137
+ : {}),
138
+ ...(Array.isArray(resolved.disable_functions)
139
+ ? { disable_functions: resolved.disable_functions }
140
+ : {}),
135
141
  };
136
142
  return config;
137
143
  }
@@ -1 +1 @@
1
- {"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../src/role-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,MAAM,WAAW,CAAC;AAC9B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGpE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB;IAElB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YACpC,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;YAC1D,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,iCAAiC,CACnE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,WAAW,CACxB,QAAgB,EAChB,MAAc;IAEd,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,qBAC/B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,oCAAoC,CACtE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,oCAAoC,CACtE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,mBAAmB,GAAG,CAAC,WAAW,aAAa,CACjF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CACV,2BAA2B,MAAM,2CAA2C,CAC7E,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAA4B,CAAC;IAEpE,MAAM,MAAM,GAAe;QACzB,IAAI,EAAE,QAAQ,CAAC,IAAc;QAC7B,WAAW,EAAG,QAAQ,CAAC,WAAsB,IAAI,EAAE;QACnD,MAAM;QACN,GAAG,CAAC,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ;YAC1C,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;YACpC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACnC,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtD,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAsC,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;YACpC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;YACtC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;YAC/B,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAkB,EAAE;YACzC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YACzC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,eAA2B,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;YACxE,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAsC,EAAE;YACjE,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;YAC9D,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAgC,EAAE;YACtD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ;YAC1C,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;YACpC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;YAC3B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../src/role-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FunctionCall } from "./function-parser";
2
+ export declare class FunctionSessionState {
3
+ private sessions;
4
+ private callArgs;
5
+ activate(sessionID: string, functionNames: string[], calls?: FunctionCall[]): void;
6
+ getActive(sessionID: string): Set<string>;
7
+ getCall(sessionID: string, functionName: string): FunctionCall | undefined;
8
+ isActive(sessionID: string, functionName: string): boolean;
9
+ clear(sessionID: string): void;
10
+ }
11
+ export declare const functionSessionState: FunctionSessionState;
12
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,QAAQ,CAAqD;IAErE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI;IAoBlF,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAIzC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI1E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAI1D,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAI/B;AAED,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export class FunctionSessionState {
2
+ sessions = new Map();
3
+ callArgs = new Map();
4
+ activate(sessionID, functionNames, calls) {
5
+ if (!this.sessions.has(sessionID)) {
6
+ this.sessions.set(sessionID, new Set());
7
+ }
8
+ const active = this.sessions.get(sessionID);
9
+ for (const name of functionNames) {
10
+ active.add(name);
11
+ }
12
+ if (calls && calls.length > 0) {
13
+ if (!this.callArgs.has(sessionID)) {
14
+ this.callArgs.set(sessionID, new Map());
15
+ }
16
+ const argsMap = this.callArgs.get(sessionID);
17
+ for (const call of calls) {
18
+ argsMap.set(call.name, call);
19
+ }
20
+ }
21
+ }
22
+ getActive(sessionID) {
23
+ return this.sessions.get(sessionID) ?? new Set();
24
+ }
25
+ getCall(sessionID, functionName) {
26
+ return this.callArgs.get(sessionID)?.get(functionName);
27
+ }
28
+ isActive(sessionID, functionName) {
29
+ return this.sessions.get(sessionID)?.has(functionName) ?? false;
30
+ }
31
+ clear(sessionID) {
32
+ this.sessions.delete(sessionID);
33
+ this.callArgs.delete(sessionID);
34
+ }
35
+ }
36
+ export const functionSessionState = new FunctionSessionState();
37
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IACvB,QAAQ,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC/C,QAAQ,GAA2C,IAAI,GAAG,EAAE,CAAC;IAErE,QAAQ,CAAC,SAAiB,EAAE,aAAuB,EAAE,KAAsB;QACzE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,YAAoB;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,QAAQ,CAAC,SAAiB,EAAE,YAAoB;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
package/dist/types.d.ts CHANGED
@@ -42,6 +42,10 @@ export interface RoleConfig {
42
42
  temperature?: number;
43
43
  /** Top-p nucleus sampling parameter (0.0 - 1.0) */
44
44
  top_p?: number;
45
+ /** Names of functions this role supports */
46
+ functions?: string[];
47
+ /** Names of default functions to disable */
48
+ disable_functions?: string[];
45
49
  }
46
50
  /**
47
51
  * A resolved skill reference after locating the corresponding SKILL.md file
@@ -57,6 +61,24 @@ export interface ResolvedSkill {
57
61
  /** Absolute filesystem path to the SKILL.md file */
58
62
  filePath: string;
59
63
  }
64
+ /**
65
+ * A resolved function reference after locating the corresponding function file
66
+ * in either the role's local functions directory or a global functions directory.
67
+ */
68
+ export interface ResolvedFunction {
69
+ /** Function name */
70
+ name: string;
71
+ /** Human-readable description */
72
+ description: string;
73
+ /** Raw function content (the actual system message / tool definition) */
74
+ content: string;
75
+ /** Absolute filesystem path to the function file */
76
+ filePath: string;
77
+ /** Source indicating where the function was found */
78
+ source: "role-local" | "global" | "built-in";
79
+ /** Parameter declarations from frontmatter (name → default value) */
80
+ params?: Record<string, string>;
81
+ }
60
82
  /**
61
83
  * A fully resolved role with all configuration materialized.
62
84
  * Environment variables have been substituted, prompt_file content has been
@@ -72,6 +94,8 @@ export interface ResolvedRole {
72
94
  prompt: string;
73
95
  /** Resolved skill references */
74
96
  skills: ResolvedSkill[];
97
+ /** Resolved function references */
98
+ functions: ResolvedFunction[];
75
99
  }
76
100
  /**
77
101
  * YAML frontmatter metadata parsed from SKILL.md files.
@@ -91,4 +115,16 @@ export interface SkillMetadata {
91
115
  /** Allowed tools, either as a comma-separated string or an array */
92
116
  "allowed-tools"?: string | string[];
93
117
  }
118
+ /**
119
+ * YAML frontmatter metadata parsed from function files.
120
+ * Fields follow a simpler subset of the skill frontmatter schema.
121
+ */
122
+ export interface FunctionMetadata {
123
+ /** Function name */
124
+ name?: string;
125
+ /** Human-readable description */
126
+ description?: string;
127
+ /** Parameter declarations: name → default value or description */
128
+ params?: Record<string, string>;
129
+ }
94
130
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;IACtC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,MAAM,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: plan
3
+ description: Code review planning mode — analyze PRs and structure review plans
4
+ ---
5
+
6
+ You are a code reviewer in PLANNING mode. Before writing a review, create a structured plan.
7
+
8
+ ## Review Planning Process
9
+
10
+ 1. **Understand the Change**: Identify what the PR/modification is trying to accomplish. What problem does it solve?
11
+
12
+ 2. **Scope the Review**: Determine which files and areas need focused attention:
13
+ - New functionality vs. refactoring
14
+ - Core logic vs. peripheral changes
15
+ - Public API vs. internal implementation
16
+
17
+ 3. **Identify Risk Areas**: Flag files that warrant closer inspection:
18
+ - Security-sensitive changes (auth, input handling, data access)
19
+ - Performance-critical paths
20
+ - Public API or interface changes
21
+ - Complex logic with many branches
22
+
23
+ 4. **Plan the Review Order**: Structure your review to be efficient:
24
+ - Start with the overall approach/architecture
25
+ - Then dive into specific files by risk level
26
+ - End with style, naming, and documentation
27
+
28
+ 5. **Present Your Plan**: Outline what you'll examine and in what order.
29
+
30
+ Present the plan before executing the review.
@@ -17,6 +17,8 @@ prompt: |
17
17
  Always provide specific, actionable feedback.
18
18
  skills:
19
19
  - review-checklist
20
+ functions:
21
+ - plan
20
22
  permission:
21
23
  allow:
22
24
  - Read
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: execute
3
+ description: Execution mode — implement step by step with tool-based verification after each change
4
+ ---
5
+
6
+ You are now in EXECUTION mode. You have a plan (explicit or implied). Implement it systematically.
7
+
8
+ ## Process
9
+
10
+ ### 1. Work Step by Step
11
+
12
+ For each step:
13
+
14
+ - Complete it fully before moving on
15
+ - Don't skip ahead or combine unrelated steps
16
+ - If the plan proves wrong mid-execution, stop. State what changed. Propose revision.
17
+
18
+ ### 2. Verify After Each Change
19
+
20
+ After every file edit or meaningful action, verify with your tools:
21
+
22
+ - **lsp_diagnostics** on changed files — no new errors introduced
23
+ - **Bash** to run build/test commands if the project has them
24
+ - **Read** the changed file to confirm the edit landed correctly
25
+ - **Grep** to check you didn't break other callers or references
26
+
27
+ Do not assume success. Run the check. If a step has no verifiable output, state what you couldn't confirm.
28
+
29
+ ### 3. Report Progress
30
+
31
+ After each step, one to three sentences:
32
+
33
+ - What you did
34
+ - Whether verification passed
35
+ - What's next
36
+
37
+ Don't repeat the plan. Don't narrate your thinking. Just report results.
38
+
39
+ ### 4. Handle Failures
40
+
41
+ When something breaks:
42
+
43
+ 1. Read the actual error output. Don't guess.
44
+ 2. Fix the root cause (not the symptom). Re-verify.
45
+ 3. If two attempts fail on the same issue: stop. Report what you tried, what you think is wrong, and what options remain.
46
+
47
+ Never shotgun-debug. Never suppress errors to make them go away.
48
+
49
+ ### 5. Finish Clean
50
+
51
+ When done:
52
+
53
+ - Run a final verification pass (build, test, lsp_diagnostics on all changed files)
54
+ - List what was accomplished
55
+ - Note anything deferred or worth watching
56
+ - Tell the user how to verify themselves if relevant
57
+
58
+ ## Guidelines
59
+
60
+ - Precision > speed. Right the first time beats fast-then-fix.
61
+ - Stay in scope. Notice unrelated issues? Note them, don't fix them.
62
+ - Minimal changes. Don't refactor while implementing. Don't "improve" adjacent code.
63
+ - Be direct about failure. "X broke because Y" > hedging.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: plan
3
+ description: Strategic planning mode — investigate the codebase, then create a structured plan before execution
4
+ ---
5
+
6
+ You are now in PLANNING mode. Do not make changes yet. Investigate first, then plan.
7
+
8
+ ## Process
9
+
10
+ ### 1. Investigate Before Planning
11
+
12
+ Use your tools to understand the current state before proposing changes:
13
+
14
+ - **Read** files that will be affected. Don't guess at their contents.
15
+ - **Grep/Glob** to find related patterns, usages, and dependencies.
16
+ - **LSP** to check type relationships and references if relevant.
17
+ - **Bash** to inspect project structure, dependencies, build config.
18
+
19
+ Do not plan based on assumptions. If you haven't read the file, you don't know what's in it.
20
+
21
+ ### 2. Analyze the Request
22
+
23
+ With investigation complete, identify:
24
+
25
+ - The actual goal (not just the surface request)
26
+ - Constraints: backward compatibility, performance, existing patterns, test coverage
27
+ - What's implied but not stated
28
+ - Whether the existing codebase already has conventions for this kind of change
29
+
30
+ ### 3. Break Down the Work
31
+
32
+ Decompose into discrete steps. Each step must be:
33
+
34
+ - Specific enough to verify (name the file, the function, the expected behavior)
35
+ - Ordered by dependency
36
+ - Scoped to one concern (don't mix refactoring with new features)
37
+
38
+ Bad: "handle edge cases." Good: "add null check in parseConfig() for missing `port` field, return default 3000."
39
+
40
+ ### 4. Identify Risks
41
+
42
+ For each non-trivial step:
43
+
44
+ - What could break? (other callers, tests, types)
45
+ - What assumptions are you making about the codebase?
46
+ - What would you need to verify after making the change?
47
+
48
+ ### 5. Present the Plan
49
+
50
+ **Goal**: One sentence.
51
+
52
+ **Steps**:
53
+ 1. Step — what you'll do, which files, complexity estimate
54
+ 2. ...
55
+
56
+ **Verification**: How you'll confirm it works (which tests to run, what to check with LSP, what to build).
57
+
58
+ **Open questions**: Anything blocking.
59
+
60
+ ### 6. Wait for Approval
61
+
62
+ Present the plan. Do not start executing until the user confirms or the task is trivially obvious.
63
+
64
+ ## Guidelines
65
+
66
+ - Fewer steps > many micro-steps. Aim for 3–8 steps, not 20.
67
+ - Be honest about what you don't know. "I need to read X first" is valid.
68
+ - If multiple approaches exist, recommend one with a brief reason. Don't present an essay of trade-offs.
69
+ - Scale the plan to the task. A typo fix needs one line, not five sections.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rolebox",
3
- "version": "0.1.2",
3
+ "version": "0.3.1",
4
4
  "description": "OpenCode plugin — define custom AI agent roles via YAML with per-role prompts, models, skills, and permissions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,7 +14,8 @@
14
14
  },
15
15
  "files": [
16
16
  "dist",
17
- "examples"
17
+ "examples",
18
+ "functions"
18
19
  ],
19
20
  "scripts": {
20
21
  "build": "tsc",