opencode-irf 0.0.8 → 0.0.10-next.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/LICENSE +21 -0
- package/README.md +9 -0
- package/dist/irf.d.ts.map +1 -1
- package/dist/irf.js +110 -58
- package/dist/irf.js.map +1 -1
- package/dist/src/append.d.ts +23 -0
- package/dist/src/append.d.ts.map +1 -0
- package/dist/src/append.js +57 -0
- package/dist/src/append.js.map +1 -0
- package/dist/src/discover.d.ts.map +1 -1
- package/dist/src/discover.js +1 -2
- package/dist/src/discover.js.map +1 -1
- package/dist/src/opencode/notify.d.ts +10 -0
- package/dist/src/opencode/notify.d.ts.map +1 -0
- package/dist/src/opencode/notify.js +14 -0
- package/dist/src/opencode/notify.js.map +1 -0
- package/dist/src/resolve.d.ts +4 -0
- package/dist/src/resolve.d.ts.map +1 -0
- package/dist/src/resolve.js +19 -0
- package/dist/src/resolve.js.map +1 -0
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +13 -13
- package/dist/src/session.js.map +1 -1
- package/dist/src/utils/compare.d.ts +7 -2
- package/dist/src/utils/compare.d.ts.map +1 -1
- package/dist/src/utils/compare.js +80 -38
- package/dist/src/utils/compare.js.map +1 -1
- package/package.json +10 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Dustin Dowell
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
An OpenCode plugin that converts unstructured instruction text into structured, consistent rules using speech act theory and deontic logic.
|
|
4
4
|
|
|
5
|
+
<img width="612" height="256" alt="image" src="https://github.com/user-attachments/assets/51edf4b5-831a-4e13-96de-8cad453ea13e" />
|
|
6
|
+
|
|
5
7
|
## Quick Start
|
|
6
8
|
|
|
7
9
|
Once installed, just tell OpenCode what you want:
|
|
@@ -88,6 +90,13 @@ irf-rewrite --files fixtures/testing.md # single file, balanced mode
|
|
|
88
90
|
irf-rewrite --files a.md,b.md --mode verbose # multiple files, verbose output
|
|
89
91
|
```
|
|
90
92
|
|
|
93
|
+
### Parameters
|
|
94
|
+
|
|
95
|
+
| Parameter | Type | Required | Description |
|
|
96
|
+
| --- | --- | --- | --- |
|
|
97
|
+
| `mode` | string | No | Output format: verbose, balanced, or concise (default: balanced) |
|
|
98
|
+
| `files` | string | No | Comma-separated file paths to process instead of discovering from opencode.json |
|
|
99
|
+
|
|
91
100
|
## Theoretical Foundation
|
|
92
101
|
|
|
93
102
|
IRF is grounded in [speech act theory](https://en.wikipedia.org/wiki/Speech_act) and [deontic logic](https://en.wikipedia.org/wiki/Deontic_logic).
|
package/dist/irf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"irf.d.ts","sourceRoot":"","sources":["../irf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"irf.d.ts","sourceRoot":"","sources":["../irf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAoCjD,QAAA,MAAM,MAAM,EAAE,MAuLb,CAAA;AAED,eAAe,MAAM,CAAA"}
|
package/dist/irf.js
CHANGED
|
@@ -1,55 +1,43 @@
|
|
|
1
1
|
import { tool } from '@opencode-ai/plugin';
|
|
2
|
-
import {
|
|
2
|
+
import { basename } from 'node:path';
|
|
3
|
+
import { appendRules } from "./src/append.js";
|
|
4
|
+
import { sendResult } from "./src/opencode/notify.js";
|
|
3
5
|
import { processFile } from "./src/process.js";
|
|
4
6
|
import { isFormatMode } from "./src/prompt.js";
|
|
7
|
+
import { resolveFiles } from "./src/resolve.js";
|
|
5
8
|
import { detectModel, promptWithRetry } from "./src/session.js";
|
|
6
9
|
import { buildTable } from "./src/utils/compare.js";
|
|
7
10
|
import { safeAsync } from "./src/utils/safe.js";
|
|
8
|
-
// resolve instruction files from explicit paths or opencode.json discovery
|
|
9
|
-
const resolveFiles = async (directory, filesArg) => {
|
|
10
|
-
if (filesArg) {
|
|
11
|
-
const paths = filesArg.split(',').map((p) => p.trim()).filter((p) => p.length > 0);
|
|
12
|
-
if (paths.length === 0) {
|
|
13
|
-
return { data: null, error: 'No valid file paths provided' };
|
|
14
|
-
}
|
|
15
|
-
return { data: await readFilePaths(directory, paths), error: null };
|
|
16
|
-
}
|
|
17
|
-
return await discover(directory);
|
|
18
|
-
};
|
|
19
11
|
const ERROR_LABELS = {
|
|
20
12
|
readError: 'Read failed',
|
|
21
13
|
parseError: 'Parse failed',
|
|
22
14
|
formatError: 'Format failed',
|
|
23
15
|
writeError: 'Write failed',
|
|
24
16
|
};
|
|
25
|
-
|
|
26
|
-
const formatFileResult = (result) => {
|
|
17
|
+
const toTableRow = (result) => {
|
|
27
18
|
if (result.status === 'success') {
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (comparisons.length === 0) {
|
|
35
|
-
return;
|
|
19
|
+
return {
|
|
20
|
+
file: basename(result.path),
|
|
21
|
+
status: 'Success',
|
|
22
|
+
rules: result.rulesCount,
|
|
23
|
+
comparison: result.comparison,
|
|
24
|
+
};
|
|
36
25
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
lines.push('');
|
|
43
|
-
lines.push('IMPORTANT: Show the comparison table above to the user exactly as-is.');
|
|
26
|
+
const label = ERROR_LABELS[result.status] || result.status;
|
|
27
|
+
return {
|
|
28
|
+
file: basename(result.path),
|
|
29
|
+
status: label,
|
|
30
|
+
};
|
|
44
31
|
};
|
|
45
|
-
// deno-lint-ignore require-await
|
|
46
32
|
const plugin = async ({ directory, client }) => {
|
|
47
33
|
return {
|
|
48
34
|
tool: {
|
|
49
35
|
'irf-rewrite': tool({
|
|
50
36
|
description: [
|
|
51
|
-
'Discover instruction files from opencode.json, parse them into structured rules,
|
|
52
|
-
'
|
|
37
|
+
'Discover instruction files from opencode.json, parse them into structured rules,',
|
|
38
|
+
'format them into human-readable rules, and write the formatted rules back to the original files.',
|
|
39
|
+
'Accepts an optional mode: verbose (full Rule/Reason pairs),',
|
|
40
|
+
'balanced (LLM decides which rules need reasons), or concise (bullet list, no reasons).',
|
|
53
41
|
'Defaults to balanced.',
|
|
54
42
|
'Accepts an optional files parameter to process specific files instead of running discovery.',
|
|
55
43
|
].join(' '),
|
|
@@ -66,61 +54,125 @@ const plugin = async ({ directory, client }) => {
|
|
|
66
54
|
if (resolved.error !== null) {
|
|
67
55
|
return resolved.error;
|
|
68
56
|
}
|
|
69
|
-
const files = resolved.data;
|
|
70
57
|
// detect model from current session
|
|
71
58
|
const model = await detectModel(client, context.sessionID);
|
|
72
59
|
if (!model) {
|
|
73
60
|
return 'Could not detect current model. Send a message first, then call irf-rewrite.';
|
|
74
61
|
}
|
|
75
62
|
// create a session for internal LLM calls
|
|
76
|
-
const sessionResult = await client.session.create({
|
|
77
|
-
body: {
|
|
78
|
-
title: 'IRF Parse',
|
|
79
|
-
},
|
|
80
|
-
});
|
|
63
|
+
const sessionResult = await client.session.create({ body: { title: 'IRF Parse' } });
|
|
81
64
|
if (!sessionResult.data) {
|
|
82
65
|
return 'Failed to create internal session';
|
|
83
66
|
}
|
|
84
67
|
const sessionId = sessionResult.data.id;
|
|
85
68
|
// close over session details so processFile only needs a prompt callback
|
|
86
|
-
const prompt = (text, schema) => promptWithRetry({
|
|
69
|
+
const prompt = (text, schema) => (promptWithRetry({
|
|
87
70
|
client,
|
|
88
71
|
sessionId,
|
|
89
72
|
initialPrompt: text,
|
|
90
73
|
schema,
|
|
91
74
|
model,
|
|
92
|
-
});
|
|
75
|
+
}));
|
|
93
76
|
// process files sequentially; parallel prompting through a shared
|
|
94
77
|
// session may cause ordering issues depending on SDK behavior
|
|
95
|
-
const
|
|
96
|
-
const
|
|
97
|
-
for (const file of files) {
|
|
78
|
+
const fileResults = [];
|
|
79
|
+
for (const file of resolved.data) {
|
|
98
80
|
// bail if the tool call was cancelled
|
|
99
81
|
if (context.abort.aborted) {
|
|
100
|
-
results.push('Cancelled');
|
|
101
82
|
break;
|
|
102
83
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
84
|
+
fileResults.push(await processFile({ file, prompt, mode }));
|
|
85
|
+
}
|
|
86
|
+
// clean up the internal session
|
|
87
|
+
await safeAsync(() => client.session.delete({ path: { id: sessionId } }));
|
|
88
|
+
const table = buildTable(fileResults.map(toTableRow));
|
|
89
|
+
if (table.length > 0) {
|
|
90
|
+
await sendResult({
|
|
91
|
+
client,
|
|
92
|
+
sessionID: context.sessionID,
|
|
93
|
+
text: table,
|
|
107
94
|
});
|
|
108
|
-
|
|
109
|
-
|
|
95
|
+
}
|
|
96
|
+
return table;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
return 'irf-rewrite error: ' + msg;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
'irf-add': tool({
|
|
105
|
+
description: [
|
|
106
|
+
'Parse unstructured input into structured rules, format them,',
|
|
107
|
+
'and append to the end of an instruction file without rewriting existing content.',
|
|
108
|
+
'Accepts an optional mode: verbose (full Rule/Reason pairs),',
|
|
109
|
+
'balanced (LLM decides which rules need reasons), or concise (bullet list, no reasons).',
|
|
110
|
+
'Defaults to balanced.',
|
|
111
|
+
'Accepts an optional file parameter to specify the target file.',
|
|
112
|
+
'If no file is specified, appends to the first discovered instruction file.',
|
|
113
|
+
].join(' '),
|
|
114
|
+
args: {
|
|
115
|
+
input: tool.schema.string().describe('Unstructured text describing the rule(s) to add'),
|
|
116
|
+
file: tool.schema.string().optional().describe('File path to append to. If omitted, uses the first discovered instruction file.'),
|
|
117
|
+
mode: tool.schema.string().optional().describe('Output format: verbose, balanced, or concise (default: balanced)'),
|
|
118
|
+
},
|
|
119
|
+
async execute(args, context) {
|
|
120
|
+
const mode = isFormatMode(args.mode) ? args.mode : 'balanced';
|
|
121
|
+
try {
|
|
122
|
+
// resolve target file path
|
|
123
|
+
let filePath = args.file;
|
|
124
|
+
if (!filePath) {
|
|
125
|
+
const resolved = await resolveFiles(directory);
|
|
126
|
+
if (resolved.error !== null) {
|
|
127
|
+
return resolved.error;
|
|
128
|
+
}
|
|
129
|
+
const first = resolved.data[0];
|
|
130
|
+
if (!first) {
|
|
131
|
+
return 'No instruction files found in opencode.json';
|
|
110
132
|
}
|
|
111
|
-
|
|
133
|
+
filePath = first.path;
|
|
112
134
|
}
|
|
113
|
-
//
|
|
114
|
-
await
|
|
115
|
-
|
|
135
|
+
// detect model from current session
|
|
136
|
+
const model = await detectModel(client, context.sessionID);
|
|
137
|
+
if (!model) {
|
|
138
|
+
return 'Could not detect current model. Send a message first, then call irf-add.';
|
|
139
|
+
}
|
|
140
|
+
// create a session for internal LLM calls
|
|
141
|
+
const sessionResult = await client.session.create({ body: { title: 'IRF Add' } });
|
|
142
|
+
if (!sessionResult.data) {
|
|
143
|
+
return 'Failed to create internal session';
|
|
144
|
+
}
|
|
145
|
+
const sessionId = sessionResult.data.id;
|
|
146
|
+
const prompt = (text, schema) => (promptWithRetry({
|
|
147
|
+
client,
|
|
148
|
+
sessionId,
|
|
149
|
+
initialPrompt: text,
|
|
150
|
+
schema,
|
|
151
|
+
model,
|
|
116
152
|
}));
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
153
|
+
const result = await appendRules({
|
|
154
|
+
input: args.input,
|
|
155
|
+
filePath,
|
|
156
|
+
directory,
|
|
157
|
+
prompt,
|
|
158
|
+
mode,
|
|
159
|
+
});
|
|
160
|
+
// clean up the internal session
|
|
161
|
+
await safeAsync(() => client.session.delete({ path: { id: sessionId } }));
|
|
162
|
+
if (result.status !== 'success') {
|
|
163
|
+
return result.status + ': ' + result.error;
|
|
164
|
+
}
|
|
165
|
+
const msg = 'Added ' + result.rulesCount + ' rule(s) to ' + result.path;
|
|
166
|
+
await sendResult({
|
|
167
|
+
client,
|
|
168
|
+
sessionID: context.sessionID,
|
|
169
|
+
text: msg,
|
|
170
|
+
});
|
|
171
|
+
return msg;
|
|
120
172
|
}
|
|
121
173
|
catch (err) {
|
|
122
174
|
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
-
return 'irf-
|
|
175
|
+
return 'irf-add error: ' + msg;
|
|
124
176
|
}
|
|
125
177
|
},
|
|
126
178
|
}),
|
package/dist/irf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"irf.js","sourceRoot":"","sources":["../irf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"irf.js","sourceRoot":"","sources":["../irf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PromptFn } from './process';
|
|
2
|
+
import { type FormatMode } from './prompt';
|
|
3
|
+
type AppendResultSuccess = {
|
|
4
|
+
status: 'success';
|
|
5
|
+
path: string;
|
|
6
|
+
rulesCount: number;
|
|
7
|
+
};
|
|
8
|
+
type AppendResultError = {
|
|
9
|
+
status: 'parseError' | 'formatError' | 'readError' | 'writeError';
|
|
10
|
+
path: string;
|
|
11
|
+
error: string;
|
|
12
|
+
};
|
|
13
|
+
type AppendResult = AppendResultSuccess | AppendResultError;
|
|
14
|
+
type AppendRulesOptions = {
|
|
15
|
+
input: string;
|
|
16
|
+
filePath: string;
|
|
17
|
+
directory: string;
|
|
18
|
+
prompt: PromptFn;
|
|
19
|
+
mode?: FormatMode;
|
|
20
|
+
};
|
|
21
|
+
export declare const appendRules: (options: AppendRulesOptions) => Promise<AppendResult>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=append.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../../src/append.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AAI/E,KAAK,mBAAmB,GAAG;IACzB,MAAM,EAAE,SAAS,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,CAAA;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAA;AAE3D,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,QAAQ,CAAA;IAChB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB,CAAA;AAGD,eAAO,MAAM,WAAW,GAAU,SAAS,kBAAkB,KAAG,OAAO,CAAC,YAAY,CAuDnF,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { buildFormatPrompt, buildParsePrompt } from './prompt';
|
|
4
|
+
import { FormatResponseSchema, ParseResponseSchema } from './schema';
|
|
5
|
+
import { safeAsync } from './utils/safe';
|
|
6
|
+
// parse unstructured input, format it, and append to end of file
|
|
7
|
+
export const appendRules = async (options) => {
|
|
8
|
+
const mode = options.mode ?? 'balanced';
|
|
9
|
+
const fullPath = resolve(options.directory, options.filePath);
|
|
10
|
+
// read existing file content
|
|
11
|
+
const existing = await safeAsync(() => readFile(fullPath, 'utf-8'));
|
|
12
|
+
if (existing.error !== null) {
|
|
13
|
+
return {
|
|
14
|
+
status: 'readError',
|
|
15
|
+
path: options.filePath,
|
|
16
|
+
error: existing.error.message,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// step 1: parse input -> structured rules
|
|
20
|
+
const parseResult = await options.prompt(buildParsePrompt(options.input), ParseResponseSchema);
|
|
21
|
+
if (parseResult.error !== null) {
|
|
22
|
+
return {
|
|
23
|
+
status: 'parseError',
|
|
24
|
+
path: options.filePath,
|
|
25
|
+
error: String(parseResult.error),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// step 2: format structured rules -> human-readable rules
|
|
29
|
+
const formatPrompt = buildFormatPrompt(JSON.stringify(parseResult.data), mode);
|
|
30
|
+
const formatResult = await options.prompt(formatPrompt, FormatResponseSchema);
|
|
31
|
+
if (formatResult.error !== null) {
|
|
32
|
+
return {
|
|
33
|
+
status: 'formatError',
|
|
34
|
+
path: options.filePath,
|
|
35
|
+
error: String(formatResult.error),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// step 3: append formatted rules to end of file
|
|
39
|
+
const joiner = mode === 'concise' ? '\n' : '\n\n';
|
|
40
|
+
const newRules = formatResult.data.rules.join(joiner);
|
|
41
|
+
const separator = existing.data.endsWith('\n') ? '\n' : '\n\n';
|
|
42
|
+
const content = existing.data + separator + newRules + '\n';
|
|
43
|
+
const { error: writeError } = await safeAsync(() => writeFile(fullPath, content, 'utf-8'));
|
|
44
|
+
if (writeError) {
|
|
45
|
+
return {
|
|
46
|
+
status: 'writeError',
|
|
47
|
+
path: options.filePath,
|
|
48
|
+
error: writeError.message,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
status: 'success',
|
|
53
|
+
path: options.filePath,
|
|
54
|
+
rulesCount: formatResult.data.rules.length,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=append.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"append.js","sourceRoot":"","sources":["../../src/append.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,cAAc,CAAA;AAE3D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,cAAc,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,cAAc,CAAA;AAE3D,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,KAAK,cAAc,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;AA6E/C,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,EAAE,OAAO,MAAM,EAAE,KAAG,OAAO,CAAC,eAAe,EAAE,CAGjG,CAAA;AAED,eAAO,MAAM,QAAQ,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,cAAc,CAsBxE,CAAA"}
|
package/dist/src/discover.js
CHANGED
|
@@ -83,9 +83,8 @@ export const discover = async (directory) => {
|
|
|
83
83
|
error: 'No instruction files found matching patterns: ' + patterns.join(', '),
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
const results = await readFiles(files);
|
|
87
86
|
return {
|
|
88
|
-
data:
|
|
87
|
+
data: await readFiles(files),
|
|
89
88
|
error: null,
|
|
90
89
|
};
|
|
91
90
|
};
|
package/dist/src/discover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAe,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAW3D,MAAM,UAAU,GAAG,KAAK,EAAE,SAAiB,EAAyB,EAAE;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;IACnD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5E,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,iBAAiB,GAAG,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO;SAC7D,CAAA;IACH,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACxE,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,kBAAkB,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO;SACnE,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/E,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,mCAAmC,GAAG,UAAU;SACxD,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAA;IACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,gDAAgD,GAAG,UAAU;SACrE,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,SAAiB,EAAE,QAAkB,EAAE,EAAE;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EAAE,KAAe,EAAE,EAAE;IAC1C,MAAM,OAAO,GAAsB,EAAE,CAAA;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;QACtE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YAC/D,SAAQ;QACV,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,oGAAoG;AACpG,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAe,EAA8B,EAAE;IACpG,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;IACxD,OAAO,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAiB,EAA2B,EAAE;IAC3E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAA;IAC1C,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAA;IAC5B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,gDAAgD,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9E,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC;QAC5B,KAAK,EAAE,IAAI;KACZ,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PluginInput } from '@opencode-ai/plugin';
|
|
2
|
+
type Client = PluginInput['client'];
|
|
3
|
+
type SendResultOptions = {
|
|
4
|
+
client: Client;
|
|
5
|
+
sessionID: string;
|
|
6
|
+
text: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const sendResult: (options: SendResultOptions) => Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/opencode/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,KAAK,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;AAEnC,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAYzE,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const sendResult = async (options) => {
|
|
2
|
+
await options.client.session.prompt({
|
|
3
|
+
path: { id: options.sessionID },
|
|
4
|
+
body: {
|
|
5
|
+
noReply: true,
|
|
6
|
+
parts: [{
|
|
7
|
+
type: 'text',
|
|
8
|
+
text: options.text,
|
|
9
|
+
ignored: true,
|
|
10
|
+
}],
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/opencode/notify.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,OAA0B,EAAiB,EAAE;IAC5E,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE;QAC/B,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;oBACN,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO,EAAE,IAAI;iBACd,CAAC;SACH;KACF,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,eAAO,MAAM,YAAY,GAAU,WAAW,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAiB1G,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { discover, readFilePaths } from "./discover.js";
|
|
2
|
+
// resolve instruction files from explicit paths or opencode.json discovery
|
|
3
|
+
export const resolveFiles = async (directory, filesArg) => {
|
|
4
|
+
if (filesArg) {
|
|
5
|
+
const paths = filesArg.split(',').map((p) => p.trim()).filter((p) => p.length > 0);
|
|
6
|
+
if (paths.length === 0) {
|
|
7
|
+
return {
|
|
8
|
+
data: null,
|
|
9
|
+
error: 'No valid file paths provided',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
data: await readFilePaths(directory, paths),
|
|
14
|
+
error: null,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return await discover(directory);
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAIvD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,SAAiB,EAAE,QAAiB,EAAsC,EAAE;IAC7G,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,8BAA8B;aACtC,CAAA;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC;YAC3C,KAAK,EAAE,IAAI;SACZ,CAAA;IACH,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAA;AAClC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAG5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAGD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAgBD,eAAO,MAAM,WAAW,GAAI,OAAO,IAAI,EAAE,KAAG,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAG5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAGD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAgBD,eAAO,MAAM,WAAW,GAAI,OAAO,IAAI,EAAE,KAAG,MAK3C,CAAA;AAGD,eAAO,MAAM,WAAW,GAAU,QAAQ,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CA2B9G,CAAA;AAED,KAAK,sBAAsB,CAAC,CAAC,IAAI;IAC/B,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,KAAK,EAAE,WAAW,CAAA;CACnB,CAAA;AAGD,eAAO,MAAM,eAAe,GAAU,CAAC,EAAE,SAAS,sBAAsB,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CA0E9F,CAAA"}
|
package/dist/src/session.js
CHANGED
|
@@ -14,15 +14,12 @@ const isMessageEntryArray = (v) => Array.isArray(v) && v.every(isMessageEntry);
|
|
|
14
14
|
export const extractText = (parts) => {
|
|
15
15
|
return parts
|
|
16
16
|
.filter((p) => p.type === 'text' && p.text)
|
|
17
|
-
// fallback needed because TS cannot narrow through .filter()
|
|
18
17
|
.map((p) => p.text || '')
|
|
19
18
|
.join('');
|
|
20
19
|
};
|
|
21
20
|
// detect model from the calling session's most recent assistant message
|
|
22
21
|
export const detectModel = async (client, sessionId) => {
|
|
23
|
-
const messagesResult = await client.session.messages({
|
|
24
|
-
path: { id: sessionId },
|
|
25
|
-
});
|
|
22
|
+
const messagesResult = await client.session.messages({ path: { id: sessionId } });
|
|
26
23
|
if (!messagesResult.data) {
|
|
27
24
|
return null;
|
|
28
25
|
}
|
|
@@ -31,7 +28,11 @@ export const detectModel = async (client, sessionId) => {
|
|
|
31
28
|
return null;
|
|
32
29
|
}
|
|
33
30
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
34
|
-
const
|
|
31
|
+
const message = messages[i];
|
|
32
|
+
if (!message) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const info = message.info;
|
|
35
36
|
if (info.role === 'assistant' && info.providerID && info.modelID) {
|
|
36
37
|
return {
|
|
37
38
|
providerID: info.providerID,
|
|
@@ -43,19 +44,18 @@ export const detectModel = async (client, sessionId) => {
|
|
|
43
44
|
};
|
|
44
45
|
// prompt the LLM and validate the response, retrying on failure
|
|
45
46
|
export const promptWithRetry = async (options) => {
|
|
46
|
-
|
|
47
|
-
let prompt = initialPrompt;
|
|
47
|
+
let prompt = options.initialPrompt;
|
|
48
48
|
let lastError = '';
|
|
49
49
|
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
50
|
-
const response = await client.session.prompt({
|
|
51
|
-
path: { id: sessionId },
|
|
50
|
+
const response = await options.client.session.prompt({
|
|
51
|
+
path: { id: options.sessionId },
|
|
52
52
|
body: {
|
|
53
53
|
parts: [{ type: 'text', text: prompt }],
|
|
54
54
|
tools: {},
|
|
55
|
-
model,
|
|
55
|
+
model: options.model,
|
|
56
56
|
},
|
|
57
57
|
});
|
|
58
|
-
// no response data means a transport/API failure
|
|
58
|
+
// no response data means a transport/API failure, not retryable
|
|
59
59
|
if (!response.data) {
|
|
60
60
|
return {
|
|
61
61
|
data: null,
|
|
@@ -83,7 +83,7 @@ export const promptWithRetry = async (options) => {
|
|
|
83
83
|
error: 'Unexpected response shape: missing parts (attempt ' + (attempt + 1) + ')',
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
// empty text is a model issue
|
|
86
|
+
// empty text is a model issue, retryable
|
|
87
87
|
const text = extractText(parts);
|
|
88
88
|
if (!text) {
|
|
89
89
|
lastError = 'Empty response';
|
|
@@ -92,7 +92,7 @@ export const promptWithRetry = async (options) => {
|
|
|
92
92
|
}
|
|
93
93
|
// validate against schema
|
|
94
94
|
const cleaned = stripCodeFences(text);
|
|
95
|
-
const validation = validateJson(cleaned, schema);
|
|
95
|
+
const validation = validateJson(cleaned, options.schema);
|
|
96
96
|
if (validation.error) {
|
|
97
97
|
const errorMsg = formatValidationError(validation);
|
|
98
98
|
lastError = errorMsg + ' | raw: ' + cleaned.slice(0, 200);
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAoB,MAAM,yBAAyB,CAAA;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEtE,MAAM,WAAW,GAAG,CAAC,CAAA;AAkBrB,gDAAgD;AAChD,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACvH,MAAM,MAAM,GAAG,CAAC,CAAU,EAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AACnF,MAAM,WAAW,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AACpF,MAAM,aAAa,GAAG,CAAC,CAAU,EAAoB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AACjG,MAAM,cAAc,GAAG,CAAC,CAAU,EAAqB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AACtH,MAAM,mBAAmB,GAAG,CAAC,CAAU,EAAuB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;AAE5G,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;IACnD,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@ export type ComparisonResult = {
|
|
|
6
6
|
percentChange: number;
|
|
7
7
|
};
|
|
8
8
|
export declare const compareBytes: (file: string, original: string, generated: string) => ComparisonResult;
|
|
9
|
-
export declare const formatRow: (result: ComparisonResult) => string;
|
|
10
9
|
export type ComparisonSummary = {
|
|
11
10
|
totalOriginal: number;
|
|
12
11
|
totalGenerated: number;
|
|
@@ -14,5 +13,11 @@ export type ComparisonSummary = {
|
|
|
14
13
|
totalPercentChange: number;
|
|
15
14
|
};
|
|
16
15
|
export declare const summarize: (results: ComparisonResult[]) => ComparisonSummary;
|
|
17
|
-
export
|
|
16
|
+
export type TableRow = {
|
|
17
|
+
file: string;
|
|
18
|
+
status: string;
|
|
19
|
+
rules?: number;
|
|
20
|
+
comparison?: ComparisonResult;
|
|
21
|
+
};
|
|
22
|
+
export declare const buildTable: (rows: TableRow[]) => string;
|
|
18
23
|
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/utils/compare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/utils/compare.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAGD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,gBAahF,CAAA;AAQD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAGD,eAAO,MAAM,SAAS,GAAI,SAAS,gBAAgB,EAAE,KAAG,iBAYvD,CAAA;AAqBD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAC9B,CAAA;AAGD,eAAO,MAAM,UAAU,GAAI,MAAM,QAAQ,EAAE,KAAG,MAwE7C,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Table from 'cli-table3';
|
|
1
2
|
// compare byte sizes of two strings and return diff stats
|
|
2
3
|
export const compareBytes = (file, original, generated) => {
|
|
3
4
|
const originalBytes = new TextEncoder().encode(original).length;
|
|
@@ -14,20 +15,8 @@ export const compareBytes = (file, original, generated) => {
|
|
|
14
15
|
};
|
|
15
16
|
// format a percent change string with direction indicator
|
|
16
17
|
const formatChange = (difference, percentChange) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
return '+' + Math.abs(percentChange).toFixed(1) + '%';
|
|
21
|
-
};
|
|
22
|
-
// format a single comparison result as a table row
|
|
23
|
-
// uses ASCII indicators (+/-) for consistent monospace alignment
|
|
24
|
-
export const formatRow = (result) => {
|
|
25
|
-
const changeStr = formatChange(result.difference, result.percentChange);
|
|
26
|
-
return (result.file.padEnd(25)
|
|
27
|
-
+ result.originalBytes.toString().padStart(10)
|
|
28
|
-
+ result.generatedBytes.toString().padStart(12)
|
|
29
|
-
+ result.difference.toString().padStart(8)
|
|
30
|
-
+ changeStr.padStart(10));
|
|
18
|
+
const prefix = difference > 0 ? '\u2212' : '+';
|
|
19
|
+
return prefix + Math.abs(percentChange).toFixed(1) + '%';
|
|
31
20
|
};
|
|
32
21
|
// summarize an array of comparison results into totals
|
|
33
22
|
export const summarize = (results) => {
|
|
@@ -42,33 +31,86 @@ export const summarize = (results) => {
|
|
|
42
31
|
totalPercentChange,
|
|
43
32
|
};
|
|
44
33
|
};
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
// no-border chars config for cli-table3
|
|
35
|
+
const NO_BORDERS = {
|
|
36
|
+
'top': '',
|
|
37
|
+
'top-mid': '',
|
|
38
|
+
'top-left': '',
|
|
39
|
+
'top-right': '',
|
|
40
|
+
'bottom': '',
|
|
41
|
+
'bottom-mid': '',
|
|
42
|
+
'bottom-left': '',
|
|
43
|
+
'bottom-right': '',
|
|
44
|
+
'left': '',
|
|
45
|
+
'left-mid': '',
|
|
46
|
+
'mid': '',
|
|
47
|
+
'mid-mid': '',
|
|
48
|
+
'right': '',
|
|
49
|
+
'right-mid': '',
|
|
50
|
+
'middle': ' ',
|
|
51
|
+
};
|
|
52
|
+
// build a results table as a string
|
|
53
|
+
export const buildTable = (rows) => {
|
|
54
|
+
if (rows.length === 0) {
|
|
48
55
|
return '';
|
|
49
56
|
}
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
const table = new Table({
|
|
58
|
+
head: ['File', 'Status', 'Rules', 'Original', 'Generated', 'Diff', 'Change'],
|
|
59
|
+
chars: NO_BORDERS,
|
|
60
|
+
style: {
|
|
61
|
+
head: [],
|
|
62
|
+
border: [],
|
|
63
|
+
'padding-left': 0,
|
|
64
|
+
'padding-right': 0,
|
|
65
|
+
},
|
|
66
|
+
colAligns: ['left', 'left', 'right', 'right', 'right', 'right', 'right'],
|
|
67
|
+
});
|
|
68
|
+
const sorted = [...rows].sort((a, b) => {
|
|
69
|
+
const aDiff = a.comparison ? Math.abs(a.comparison.difference) : 0;
|
|
70
|
+
const bDiff = b.comparison ? Math.abs(b.comparison.difference) : 0;
|
|
71
|
+
return bDiff - aDiff;
|
|
72
|
+
});
|
|
73
|
+
for (const row of sorted) {
|
|
74
|
+
const c = row.comparison;
|
|
75
|
+
table.push([
|
|
76
|
+
row.file,
|
|
77
|
+
row.status,
|
|
78
|
+
row.rules !== undefined ? row.rules : '',
|
|
79
|
+
c ? c.originalBytes : '',
|
|
80
|
+
c ? c.generatedBytes : '',
|
|
81
|
+
c ? c.difference : '',
|
|
82
|
+
c ? formatChange(c.difference, c.percentChange) : '',
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
const comparisons = [];
|
|
86
|
+
for (const row of rows) {
|
|
87
|
+
if (row.comparison !== undefined) {
|
|
88
|
+
comparisons.push(row.comparison);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const totals = summarize(comparisons);
|
|
92
|
+
const totalRules = rows.reduce((sum, r) => sum + (r.rules !== undefined ? r.rules : 0), 0);
|
|
93
|
+
table.push([
|
|
94
|
+
'TOTAL',
|
|
95
|
+
'',
|
|
96
|
+
totalRules > 0 ? totalRules : '',
|
|
97
|
+
totals.totalOriginal > 0 ? totals.totalOriginal : '',
|
|
98
|
+
totals.totalGenerated > 0 ? totals.totalGenerated : '',
|
|
99
|
+
totals.totalDifference !== 0 ? totals.totalDifference : '',
|
|
100
|
+
totals.totalOriginal > 0 ? formatChange(totals.totalDifference, totals.totalPercentChange) : '',
|
|
101
|
+
]);
|
|
102
|
+
// insert separator lines after header and before TOTAL
|
|
103
|
+
const lines = table.toString().split('\n');
|
|
104
|
+
const width = lines.reduce((max, line) => Math.max(max, line.length), 0);
|
|
105
|
+
const separator = '\u2500'.repeat(width);
|
|
106
|
+
lines.splice(1, 0, separator);
|
|
107
|
+
lines.splice(lines.length - 1, 0, separator);
|
|
108
|
+
if (totals.totalOriginal === 0) {
|
|
109
|
+
return lines.join('\n');
|
|
59
110
|
}
|
|
60
|
-
const
|
|
61
|
-
lines.push(separator);
|
|
62
|
-
const totalChangeStr = formatChange(totals.totalDifference, totals.totalPercentChange);
|
|
63
|
-
lines.push('TOTAL'.padEnd(25)
|
|
64
|
-
+ totals.totalOriginal.toString().padStart(10)
|
|
65
|
-
+ totals.totalGenerated.toString().padStart(12)
|
|
66
|
-
+ totals.totalDifference.toString().padStart(8)
|
|
67
|
-
+ totalChangeStr.padStart(10));
|
|
68
|
-
lines.push('');
|
|
69
|
-
lines.push((totals.totalDifference > 0 ? 'SAVED ' : 'INCREASED ')
|
|
111
|
+
const summary = (totals.totalDifference > 0 ? 'SAVED ' : 'INCREASED ')
|
|
70
112
|
+ Math.abs(totals.totalDifference) + ' bytes ('
|
|
71
|
-
+ Math.abs(totals.totalPercentChange).toFixed(1) + '%)'
|
|
72
|
-
return lines.join('\n');
|
|
113
|
+
+ Math.abs(totals.totalPercentChange).toFixed(1) + '%)';
|
|
114
|
+
return lines.join('\n') + '\n\n' + summary;
|
|
73
115
|
};
|
|
74
116
|
//# sourceMappingURL=compare.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/utils/compare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/utils/compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAA;AAU9B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,SAAiB,EAAoB,EAAE;IAClG,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAA;IAC/D,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAA;IACjE,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,CAAA;IACjD,MAAM,aAAa,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,GAAG,CAAA;IAElF,OAAO;QACL,IAAI;QACJ,aAAa;QACb,cAAc;QACd,UAAU;QACV,aAAa;KACd,CAAA;AACH,CAAC,CAAA;AAED,0DAA0D;AAC1D,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,aAAqB,EAAU,EAAE;IACzE,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAA;IAC9C,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;AAC1D,CAAC,CAAA;AASD,uDAAuD;AACvD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAA2B,EAAqB,EAAE;IAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;IAC1E,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;IAC5E,MAAM,eAAe,GAAG,aAAa,GAAG,cAAc,CAAA;IACtD,MAAM,kBAAkB,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,aAAa,CAAC,GAAG,GAAG,CAAA;IAE5F,OAAO;QACL,aAAa;QACb,cAAc;QACd,eAAe;QACf,kBAAkB;KACnB,CAAA;AACH,CAAC,CAAA;AAED,wCAAwC;AACxC,MAAM,UAAU,GAA2B;IACzC,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,EAAE;IACd,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI;CACf,CAAA;AASD,oCAAoC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAgB,EAAU,EAAE;IACrD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC5E,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE;YACL,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;YACV,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;SACnB;QACD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC;KACzE,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAClE,OAAO,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAA;QACxB,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,CAAC,IAAI;YACR,GAAG,CAAC,MAAM;YACV,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACxC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;YACxB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;YACzB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;YACrB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;SACrD,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,WAAW,GAAuB,EAAE,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE1F,KAAK,CAAC,IAAI,CAAC;QACT,OAAO;QACP,EAAE;QACF,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;QAChC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;QACpD,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QACtD,MAAM,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;QAC1D,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE;KAChG,CAAC,CAAA;IAEF,uDAAuD;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACxC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IAE5C,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;UAClE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,UAAU;UAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAEzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,CAAA;AAC5C,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-irf",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10-next.1",
|
|
4
4
|
"description": "OpenCode plugin that converts unstructured instructions into structured rules using speech act theory and deontic logic.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"opencode",
|
|
@@ -12,16 +12,16 @@
|
|
|
12
12
|
"speech-act-theory",
|
|
13
13
|
"deontic-logic"
|
|
14
14
|
],
|
|
15
|
-
"homepage": "https://github.com/whaaaley/irf#readme",
|
|
15
|
+
"homepage": "https://github.com/whaaaley/opencode-irf#readme",
|
|
16
16
|
"bugs": {
|
|
17
|
-
"url": "https://github.com/whaaaley/irf/issues"
|
|
17
|
+
"url": "https://github.com/whaaaley/opencode-irf/issues"
|
|
18
18
|
},
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/whaaaley/irf.git"
|
|
21
|
+
"url": "git+https://github.com/whaaaley/opencode-irf.git"
|
|
22
22
|
},
|
|
23
23
|
"license": "MIT",
|
|
24
|
-
"author": "Dustin
|
|
24
|
+
"author": "Dustin Dowell",
|
|
25
25
|
"type": "module",
|
|
26
26
|
"exports": {
|
|
27
27
|
".": {
|
|
@@ -39,14 +39,18 @@
|
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "npm run clean && tsc",
|
|
41
41
|
"clean": "rm -rf dist",
|
|
42
|
+
"test": "bun test",
|
|
43
|
+
"fmt": "bun run dprint fmt",
|
|
42
44
|
"prepublishOnly": "npm run build"
|
|
43
45
|
},
|
|
44
46
|
"dependencies": {
|
|
47
|
+
"cli-table3": "^0.6.5",
|
|
45
48
|
"zod": "4.1.8"
|
|
46
49
|
},
|
|
47
50
|
"devDependencies": {
|
|
48
51
|
"@opencode-ai/plugin": "1.1.12",
|
|
49
|
-
"@types/
|
|
52
|
+
"@types/bun": "latest",
|
|
53
|
+
"dprint": "^0.49.1",
|
|
50
54
|
"typescript": "5.9.3"
|
|
51
55
|
},
|
|
52
56
|
"peerDependencies": {
|