opencode-irf 0.0.9 → 0.0.10

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 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;AAsDjD,QAAA,MAAM,MAAM,EAAE,MAkGb,CAAA;AAED,eAAe,MAAM,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 { discover, readFilePaths } from "./src/discover.js";
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
- // format a file result into a markdown status line
26
- const formatFileResult = (result) => {
17
+ const toTableRow = (result) => {
27
18
  if (result.status === 'success') {
28
- return '**' + result.path + '**: ' + result.rulesCount + ' rules written';
29
- }
30
- return '**' + result.path + '**: ' + ERROR_LABELS[result.status] + ' - ' + result.error;
31
- };
32
- // append comparison table section to output lines
33
- const appendComparisonTable = (lines, comparisons) => {
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
- lines.push('');
38
- lines.push('## Comparison');
39
- lines.push('```');
40
- lines.push(buildTable(comparisons));
41
- lines.push('```');
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, format them into human-readable rules, and write the formatted rules back to the original files.',
52
- 'Accepts an optional mode: verbose (full Rule/Reason pairs), balanced (LLM decides which rules need reasons), or concise (bullet list, no reasons).',
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 results = [];
96
- const comparisons = [];
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
- const fileResult = await processFile({
104
- file,
105
- prompt,
106
- mode,
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
- if (fileResult.status === 'success') {
109
- comparisons.push(fileResult.comparison);
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
- results.push(formatFileResult(fileResult));
133
+ filePath = first.path;
112
134
  }
113
- // clean up the internal session
114
- await safeAsync(() => client.session.delete({
115
- path: { id: sessionId },
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
- // build comparison table
118
- appendComparisonTable(results, comparisons);
119
- return results.join('\n');
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-rewrite error: ' + msg;
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":"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"}
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;AA4E/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,CAwBxE,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"}
@@ -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: results,
87
+ data: await readFiles(files),
89
88
  error: null,
90
89
  };
91
90
  };
@@ -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":"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"}
@@ -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,4 @@
1
+ import type { InstructionFile } from './discover.ts';
2
+ import type { Result } from './utils/safe.ts';
3
+ export declare const resolveFiles: (directory: string, filesArg?: string) => Promise<Result<InstructionFile[]>>;
4
+ //# sourceMappingURL=resolve.d.ts.map
@@ -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,MAM3C,CAAA;AAGD,eAAO,MAAM,WAAW,GAAU,QAAQ,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAuB9G,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"}
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"}
@@ -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 info = messages[i].info;
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
- const { client, sessionId, initialPrompt, schema, model } = options;
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 not retryable
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 retryable
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);
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
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 declare const buildTable: (results: ComparisonResult[]) => string;
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":"AAAA,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;AAYD,eAAO,MAAM,SAAS,GAAI,QAAQ,gBAAgB,KAAG,MAUpD,CAAA;AAED,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;AAGD,eAAO,MAAM,UAAU,GAAI,SAAS,gBAAgB,EAAE,KAAG,MAqCxD,CAAA"}
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
- if (difference > 0) {
18
- return '\u2212' + percentChange.toFixed(1) + '%';
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
- // build a full comparison table as a string
46
- export const buildTable = (results) => {
47
- if (results.length === 0) {
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 lines = [];
51
- const header = 'File'.padEnd(25) + 'Original'.padStart(10)
52
- + 'Generated'.padStart(12) + 'Diff'.padStart(8) + 'Change'.padStart(10);
53
- const separator = '\u2500'.repeat(65);
54
- lines.push(header);
55
- lines.push(separator);
56
- const sorted = [...results].sort((a, b) => Math.abs(b.difference) - Math.abs(a.difference));
57
- for (const result of sorted) {
58
- lines.push(formatRow(result));
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 totals = summarize(results);
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":"AAQA,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,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;IAClD,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;AACvD,CAAC,CAAA;AAED,mDAAmD;AACnD,iEAAiE;AACjE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAwB,EAAU,EAAE;IAC5D,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;IAEvE,OAAO,CACL,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;UACpB,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;UAC5C,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;UAC7C,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;UACxC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CACzB,CAAA;AACH,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,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAA2B,EAAU,EAAE;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;UACtD,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAErC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAErB,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;IAC3F,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAEjC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAA;IACtF,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;UACd,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;UAC5C,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;UAC7C,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;UAC7C,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAChC,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CACR,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;UAClD,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,CAC1D,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAA"}
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../../src/utils/compare.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-irf",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
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",
@@ -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/node": "^25.1.0",
52
+ "@types/bun": "latest",
53
+ "dprint": "^0.49.1",
50
54
  "typescript": "5.9.3"
51
55
  },
52
56
  "peerDependencies": {