@ranger-testing/opencode-plugin 0.0.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 +32 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +184 -0
- package/build/index.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Ranger OpenCode Plugin
|
|
2
|
+
|
|
3
|
+
Ranger hooks for OpenCode sessions. Use this plugin to track features and run browser verification from OpenCode.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
1. Install the Ranger CLI.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @ranger-testing/ranger-cli
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. Run setup from your project root.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
ranger setup --opencode
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This writes `opencode.json` with the plugin entry and completes authentication.
|
|
20
|
+
|
|
21
|
+
3. Start OpenCode and run the `ranger_enable` tool to enable hooks.
|
|
22
|
+
|
|
23
|
+
## Manual config
|
|
24
|
+
|
|
25
|
+
If you prefer to edit the config yourself, add this to `opencode.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"$schema": "https://opencode.ai/config.json",
|
|
30
|
+
"plugin": ["@ranger-testing/opencode-plugin"]
|
|
31
|
+
}
|
|
32
|
+
```
|
package/build/index.d.ts
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { tool } from '@opencode-ai/plugin/tool';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const resolveRangerCommand = () => {
|
|
6
|
+
try {
|
|
7
|
+
const pkgPath = require.resolve('@ranger-testing/ranger-cli/package.json');
|
|
8
|
+
return path.join(path.dirname(pkgPath), 'build', 'cli.js');
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return 'ranger';
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const rangerCommand = resolveRangerCommand();
|
|
15
|
+
async function runHook($, name, sessionId, onError) {
|
|
16
|
+
try {
|
|
17
|
+
const result = await $ `${rangerCommand} hook --name=${name} --session-id=${sessionId}`
|
|
18
|
+
.quiet()
|
|
19
|
+
.text();
|
|
20
|
+
return result.trim();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
onError?.(name, error);
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function runEnable($, sessionId) {
|
|
28
|
+
try {
|
|
29
|
+
const result = await $ `${rangerCommand} hook enable --session-id=${sessionId}`
|
|
30
|
+
.quiet()
|
|
31
|
+
.text();
|
|
32
|
+
return { ok: true, output: result.trim() };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
output: 'Failed to enable Ranger. Make sure @ranger-testing/ranger-cli ' +
|
|
38
|
+
'is installed.',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function runDisable($, sessionId) {
|
|
43
|
+
try {
|
|
44
|
+
const result = await $ `${rangerCommand} hook disable --session-id=${sessionId}`
|
|
45
|
+
.quiet()
|
|
46
|
+
.text();
|
|
47
|
+
return { ok: true, output: result.trim() };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { ok: false, output: 'Failed to disable Ranger.' };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export const RangerPlugin = async ({ $ }) => {
|
|
54
|
+
let enabled = false;
|
|
55
|
+
let currentSessionId = '';
|
|
56
|
+
let lastEditEventAt = 0;
|
|
57
|
+
let lastEditHookOutput = null;
|
|
58
|
+
let hookErrorLogged = false;
|
|
59
|
+
const editDedupeWindowMs = 2000;
|
|
60
|
+
const logHookError = (name, error) => {
|
|
61
|
+
if (hookErrorLogged)
|
|
62
|
+
return;
|
|
63
|
+
hookErrorLogged = true;
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
console.warn(`[ranger] hook "${name}" failed: ${message}`);
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
tool: {
|
|
69
|
+
ranger_enable: tool({
|
|
70
|
+
description: 'Enable Ranger feature tracking hooks for this session. ' +
|
|
71
|
+
'Call this when the user asks to enable ranger or use the /ranger workflow.',
|
|
72
|
+
args: {},
|
|
73
|
+
async execute(_args, ctx) {
|
|
74
|
+
const sid = ctx.sessionID || currentSessionId;
|
|
75
|
+
if (!sid)
|
|
76
|
+
return 'No session ID available.';
|
|
77
|
+
const result = await runEnable($, sid);
|
|
78
|
+
if (result.ok) {
|
|
79
|
+
enabled = true;
|
|
80
|
+
currentSessionId = sid;
|
|
81
|
+
}
|
|
82
|
+
return result.output || 'Ranger enabled.';
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
ranger_disable: tool({
|
|
86
|
+
description: 'Disable Ranger feature tracking hooks for this session. ' +
|
|
87
|
+
'Call this when the user asks to disable ranger.',
|
|
88
|
+
args: {},
|
|
89
|
+
async execute(_args, ctx) {
|
|
90
|
+
const sid = ctx.sessionID || currentSessionId;
|
|
91
|
+
if (!sid)
|
|
92
|
+
return 'No session ID available.';
|
|
93
|
+
const result = await runDisable($, sid);
|
|
94
|
+
if (result.ok)
|
|
95
|
+
enabled = false;
|
|
96
|
+
return result.output || 'Ranger disabled.';
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
},
|
|
100
|
+
event: async ({ event }) => {
|
|
101
|
+
switch (event.type) {
|
|
102
|
+
case 'session.created': {
|
|
103
|
+
currentSessionId = event.properties.info.id;
|
|
104
|
+
lastEditEventAt = 0;
|
|
105
|
+
lastEditHookOutput = null;
|
|
106
|
+
hookErrorLogged = false;
|
|
107
|
+
try {
|
|
108
|
+
const result = await $ `${rangerCommand} hook --name=session-start --session-id=${currentSessionId}`
|
|
109
|
+
.quiet()
|
|
110
|
+
.nothrow()
|
|
111
|
+
.text();
|
|
112
|
+
enabled = result.length > 0;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
enabled = false;
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'session.idle':
|
|
120
|
+
if (!enabled || !currentSessionId)
|
|
121
|
+
return;
|
|
122
|
+
await runHook($, 'stop', currentSessionId, logHookError);
|
|
123
|
+
await runHook($, 'session-end', currentSessionId, logHookError);
|
|
124
|
+
enabled = false;
|
|
125
|
+
currentSessionId = '';
|
|
126
|
+
lastEditEventAt = 0;
|
|
127
|
+
lastEditHookOutput = null;
|
|
128
|
+
break;
|
|
129
|
+
case 'file.edited':
|
|
130
|
+
if (!enabled || !currentSessionId)
|
|
131
|
+
return;
|
|
132
|
+
lastEditEventAt = Date.now();
|
|
133
|
+
lastEditHookOutput = await runHook($, 'post-edit', currentSessionId, logHookError);
|
|
134
|
+
await runHook($, 'plan-reminder', currentSessionId, logHookError);
|
|
135
|
+
break;
|
|
136
|
+
case 'message.updated':
|
|
137
|
+
if (!enabled || !currentSessionId)
|
|
138
|
+
return;
|
|
139
|
+
await runHook($, 'plan-reminder', currentSessionId, logHookError);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
'experimental.session.compacting': async ({ sessionID }, output) => {
|
|
144
|
+
if (!enabled)
|
|
145
|
+
return;
|
|
146
|
+
const sid = sessionID || currentSessionId;
|
|
147
|
+
if (!sid)
|
|
148
|
+
return;
|
|
149
|
+
const context = await runHook($, 'pre-compact', sid, logHookError);
|
|
150
|
+
if (context) {
|
|
151
|
+
output.context.push(context);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
'tool.execute.after': async ({ tool: toolName, sessionID }, output) => {
|
|
155
|
+
if (!enabled)
|
|
156
|
+
return;
|
|
157
|
+
const sid = sessionID || currentSessionId;
|
|
158
|
+
if (!sid)
|
|
159
|
+
return;
|
|
160
|
+
const editTools = ['file_edit', 'edit', 'write', 'multi_edit'];
|
|
161
|
+
if (editTools.includes(toolName)) {
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
const isRecentEditEvent = lastEditEventAt > 0 &&
|
|
164
|
+
now - lastEditEventAt < editDedupeWindowMs;
|
|
165
|
+
const hookOutput = isRecentEditEvent
|
|
166
|
+
? lastEditHookOutput || ''
|
|
167
|
+
: await runHook($, 'post-edit', sid, logHookError);
|
|
168
|
+
if (!isRecentEditEvent) {
|
|
169
|
+
await runHook($, 'plan-reminder', sid, logHookError);
|
|
170
|
+
}
|
|
171
|
+
lastEditEventAt = 0;
|
|
172
|
+
lastEditHookOutput = null;
|
|
173
|
+
if (hookOutput) {
|
|
174
|
+
output.output = [output.output, hookOutput]
|
|
175
|
+
.filter(Boolean)
|
|
176
|
+
.join('\n');
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
await runHook($, 'plan-reminder', sid, logHookError);
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ranger-testing/opencode-plugin",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Ranger plugin for OpenCode - feature tracking hooks for AI coding sessions",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./build/index.js",
|
|
7
|
+
"types": "./build/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./build/index.js",
|
|
11
|
+
"types": "./build/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"build"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@ranger-testing/ranger-cli": "^2.0.6"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@opencode-ai/plugin": ">=1.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@opencode-ai/plugin": "^1.1.50",
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"typescript": "^5.0.0"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"opencode",
|
|
34
|
+
"opencode-plugin",
|
|
35
|
+
"ranger",
|
|
36
|
+
"testing",
|
|
37
|
+
"qa"
|
|
38
|
+
],
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "https://github.com/ranger-testing/trailhead",
|
|
43
|
+
"directory": "opencode-plugin"
|
|
44
|
+
}
|
|
45
|
+
}
|