rolebox 0.1.1 → 0.3.0
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 +185 -63
- package/dist/function-parser.d.ts +24 -0
- package/dist/function-parser.d.ts.map +1 -0
- package/dist/function-parser.js +87 -0
- package/dist/function-parser.js.map +1 -0
- package/dist/function-resolver.d.ts +35 -0
- package/dist/function-resolver.d.ts.map +1 -0
- package/dist/function-resolver.js +115 -0
- package/dist/function-resolver.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -8
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +8 -1
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +24 -0
- package/dist/prompt-builder.js.map +1 -1
- package/dist/role-loader.js +6 -0
- package/dist/role-loader.js.map +1 -1
- package/dist/session-state.d.ts +12 -0
- package/dist/session-state.d.ts.map +1 -0
- package/dist/session-state.js +37 -0
- package/dist/session-state.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -1
- package/examples/code-reviewer/functions/plan.md +30 -0
- package/examples/code-reviewer/role.yaml +2 -0
- package/functions/execute.md +63 -0
- package/functions/plan.md +69 -0
- package/package.json +3 -2
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
|
-
##
|
|
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
|
-
##
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
230
|
+
### Code reviewer with custom plan function
|
|
126
231
|
|
|
127
232
|
```yaml
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
|
240
|
+
You are an expert code reviewer. Review for correctness,
|
|
241
|
+
performance, and readability. Be specific and actionable.
|
|
133
242
|
skills:
|
|
134
|
-
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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.
|
|
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
|
|
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
|
|
286
|
+
- No role inheritance
|
|
165
287
|
- No runtime role switching
|
|
166
|
-
-
|
|
167
|
-
- No conditional
|
|
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,4 +1,10 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
import type { ResolvedFunction } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Map of roleId → ResolvedFunction[] built at startup.
|
|
5
|
+
* Exported so tests and hooks can query role-level function resolution.
|
|
6
|
+
*/
|
|
7
|
+
export declare const roleFunctionsMap: Map<string, ResolvedFunction[]>;
|
|
2
8
|
/**
|
|
3
9
|
* OpenCode plugin for rolebox — define custom agent roles via YAML
|
|
4
10
|
* configuration files with custom prompts, models, skills, and permissions.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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;AAsPtE;;;GAGG;AACH,QAAA,MAAM,aAAa,EAAE,MA6FpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
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 {
|
|
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.
|
|
15
|
-
* 4.
|
|
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.
|
|
@@ -231,13 +252,19 @@ function syncSkillSymlinks(resolvedRoles, globalSkillsDir) {
|
|
|
231
252
|
* configuration files with custom prompts, models, skills, and permissions.
|
|
232
253
|
*/
|
|
233
254
|
const RoleboxPlugin = async (ctx) => {
|
|
234
|
-
const
|
|
235
|
-
|
|
255
|
+
const configDir = getOpencodeConfigDir();
|
|
256
|
+
// Prefer ctx.directory/rolebox if it exists (e.g. when ctx.directory IS the
|
|
257
|
+
// config dir), otherwise fall back to the well-known config location.
|
|
258
|
+
const ctxRoleboxDir = path.join(ctx.directory, "rolebox");
|
|
259
|
+
const roleboxDir = existsSync(ctxRoleboxDir)
|
|
260
|
+
? ctxRoleboxDir
|
|
261
|
+
: path.join(configDir, "rolebox");
|
|
262
|
+
const globalSkillsDir = path.join(configDir, "skills");
|
|
236
263
|
// Discover all roles from the rolebox directory.
|
|
237
264
|
// Returns an empty Map when the directory does not exist or is empty.
|
|
238
265
|
const roles = await discoverRoles(roleboxDir);
|
|
239
266
|
// Resolve skills and build final prompts for every discovered role.
|
|
240
|
-
const resolvedRoles = await resolveAllRoles(roles, roleboxDir, globalSkillsDir);
|
|
267
|
+
const resolvedRoles = await resolveAllRoles(roles, roleboxDir, globalSkillsDir, configDir);
|
|
241
268
|
// Sync agent files to ~/.claude/agents/ for oh-my-openagent compatibility.
|
|
242
269
|
syncAgentFiles(resolvedRoles);
|
|
243
270
|
// Sync role skills as symlinks into ~/.config/opencode/skills/ so that
|
|
@@ -251,6 +278,57 @@ const RoleboxPlugin = async (ctx) => {
|
|
|
251
278
|
config.agent[resolved.id] = agentConfig;
|
|
252
279
|
}
|
|
253
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
|
+
},
|
|
254
332
|
};
|
|
255
333
|
};
|
|
256
334
|
export default RoleboxPlugin;
|
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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"}
|
package/dist/prompt-builder.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/prompt-builder.js
CHANGED
|
@@ -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"}
|
package/dist/role-loader.js
CHANGED
|
@@ -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
|
}
|
package/dist/role-loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-loader.js","sourceRoot":"","sources":["../src/role-loader.ts"],"names":[],"mappings":"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"}
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
|
@@ -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.
|
|
3
|
+
"version": "0.3.0",
|
|
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",
|