@osovv/vv-opencode 0.25.4 → 0.25.5
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 +2 -2
- package/dist/commands/patch-provider.d.ts +11 -1
- package/dist/commands/patch-provider.js +12 -2
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/lib/vvoc-config.js +5 -5
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/plugins/hashline-edit/constants.js +8 -4
- package/dist/plugins/hashline-edit/constants.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-operations.js +94 -33
- package/dist/plugins/hashline-edit/edit-operations.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-text-normalization.js +3 -2
- package/dist/plugins/hashline-edit/edit-text-normalization.js.map +1 -1
- package/dist/plugins/hashline-edit/hash-computation.d.ts +2 -0
- package/dist/plugins/hashline-edit/hash-computation.js +21 -4
- package/dist/plugins/hashline-edit/hash-computation.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js +139 -28
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/hashline-edit/normalize-edits.js +4 -4
- package/dist/plugins/hashline-edit/normalize-edits.js.map +1 -1
- package/dist/plugins/hashline-edit/tool-description.d.ts +1 -1
- package/dist/plugins/hashline-edit/tool-description.js +8 -4
- package/dist/plugins/hashline-edit/tool-description.js.map +1 -1
- package/dist/plugins/hashline-edit/types.d.ts +1 -1
- package/dist/plugins/hashline-edit/validation.d.ts +2 -0
- package/dist/plugins/hashline-edit/validation.js +58 -25
- package/dist/plugins/hashline-edit/validation.js.map +1 -1
- package/dist/plugins/system-context-injection/index.js +3 -2
- package/dist/plugins/system-context-injection/index.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v1.json +1 -1
- package/schemas/vvoc/v2.json +1 -1
- package/schemas/vvoc/v3.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/plugins/hashline-edit/validation.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.3.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE: Parse and validate hashline references against the current file snapshot before edits are applied.
|
|
5
|
-
// SCOPE: Anchor normalization, line reference parsing, full-batch validation, mismatch diagnostics, and compatibility fallback for legacy hashes.
|
|
4
|
+
// PURPOSE: Parse and validate hashline references with optional context-anchored hashes against the current file snapshot before edits are applied.
|
|
5
|
+
// SCOPE: Anchor normalization, line reference parsing with optional anchor hash, full-batch validation with anchor-hash verification, mismatch diagnostics, and compatibility fallback for legacy hashes.
|
|
6
6
|
// DEPENDS: [src/plugins/hashline-edit/constants.ts, src/plugins/hashline-edit/hash-computation.ts]
|
|
7
7
|
// LINKS: [M-PLUGIN-HASHLINE-EDIT]
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -10,25 +10,42 @@
|
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
|
-
// LineRef - Parsed `{ line, hash }` structure for a normalized hashline anchor.
|
|
13
|
+
// LineRef - Parsed `{ line, hash, anchorHash? }` structure for a normalized hashline anchor.
|
|
14
14
|
// normalizeLineRef - Strip copied prefixes and inline content from a raw anchor string.
|
|
15
15
|
// parseLineRef - Parse a normalized hashline anchor and fail loudly on malformed references.
|
|
16
|
-
// validateLineRef - Validate a single anchor against the current file lines.
|
|
16
|
+
// validateLineRef - Validate a single anchor against the current file lines including context-anchored hash.
|
|
17
17
|
// validateLineRefs - Validate a batch of anchors and aggregate mismatches.
|
|
18
18
|
// HashlineMismatchError - Rich mismatch error that includes updated surrounding anchors.
|
|
19
19
|
// END_MODULE_MAP
|
|
20
|
+
//
|
|
21
|
+
// START_CHANGE_SUMMARY
|
|
22
|
+
// LAST_CHANGE: [v0.3.0 - Anchor normalization now preserves context-anchor hashes when refs contain spaces around both separators.]
|
|
23
|
+
// LAST_CHANGE: [v0.2.0 - Added optional context-anchored hash support to LineRef, isCompatibleLineHash, validateLineRef/validateLineRefs, mismatch formatting, and remap generation for collision-resistant anchors.]
|
|
24
|
+
// END_CHANGE_SUMMARY
|
|
20
25
|
import { HASHLINE_REF_PATTERN } from "./constants.js";
|
|
21
|
-
import { computeLegacyLineHash, computeLineHash } from "./hash-computation.js";
|
|
26
|
+
import { computeAnchorHash, computeLegacyLineHash, computeLineHash } from "./hash-computation.js";
|
|
22
27
|
const MISMATCH_CONTEXT = 2;
|
|
23
|
-
const LINE_REF_EXTRACT_PATTERN = /([0-9]+#[ZPMQVRWSNKTXJBYH]{2})/;
|
|
24
|
-
|
|
28
|
+
const LINE_REF_EXTRACT_PATTERN = /([0-9]+#[ZPMQVRWSNKTXJBYH]{2}(?:#[ZPMQVRWSNKTXJBYH]{2})?)/;
|
|
29
|
+
const ANCHOR_HASH_EXTRACT_RE = /#([ZPMQVRWSNKTXJBYH]{2})$/;
|
|
30
|
+
function isLineHashCompatible(line, content, hash) {
|
|
25
31
|
return computeLineHash(line, content) === hash || computeLegacyLineHash(line, content) === hash;
|
|
26
32
|
}
|
|
33
|
+
function isCompatibleLineHash(line, content, hash, prevContent, nextContent, anchorHash) {
|
|
34
|
+
if (!isLineHashCompatible(line, content, hash)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (anchorHash) {
|
|
38
|
+
const expected = computeAnchorHash(line, prevContent, content, nextContent);
|
|
39
|
+
if (expected !== anchorHash)
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
27
44
|
export function normalizeLineRef(ref) {
|
|
28
45
|
const originalTrimmed = ref.trim();
|
|
29
46
|
let trimmed = originalTrimmed;
|
|
30
47
|
trimmed = trimmed.replace(/^(?:>>>|[+-])\s*/, "");
|
|
31
|
-
trimmed = trimmed.replace(/\s*#\s
|
|
48
|
+
trimmed = trimmed.replace(/\s*#\s*/g, "#");
|
|
32
49
|
trimmed = trimmed.replace(/\|.*$/, "");
|
|
33
50
|
trimmed = trimmed.trim();
|
|
34
51
|
if (HASHLINE_REF_PATTERN.test(trimmed)) {
|
|
@@ -47,17 +64,19 @@ export function parseLineRef(ref) {
|
|
|
47
64
|
return {
|
|
48
65
|
line: Number.parseInt(match[1], 10),
|
|
49
66
|
hash: match[2],
|
|
67
|
+
anchorHash: match[3] || undefined,
|
|
50
68
|
};
|
|
51
69
|
}
|
|
52
70
|
const hashIndex = normalized.indexOf("#");
|
|
53
71
|
if (hashIndex > 0) {
|
|
54
72
|
const prefix = normalized.slice(0, hashIndex);
|
|
55
73
|
const suffix = normalized.slice(hashIndex + 1);
|
|
56
|
-
if (!/^\d+$/.test(prefix) &&
|
|
74
|
+
if (!/^\d+$/.test(prefix) &&
|
|
75
|
+
/^[ZPMQVRWSNKTXJBYH]{2}(?:#[ZPMQVRWSNKTXJBYH]{2})?$/.test(suffix)) {
|
|
57
76
|
throw new Error(`Invalid line reference: "${ref}". "${prefix}" is not a line number. Use the exact line number from the latest read output.`);
|
|
58
77
|
}
|
|
59
78
|
}
|
|
60
|
-
throw new Error(`Invalid line reference format: "${ref}". Expected format: "{line_number}#{hash_id}"`);
|
|
79
|
+
throw new Error(`Invalid line reference format: "${ref}". Expected format: "{line_number}#{hash_id}" or "{line_number}#{hash_id}#{anchor_hash}"`);
|
|
61
80
|
}
|
|
62
81
|
export class HashlineMismatchError extends Error {
|
|
63
82
|
mismatches;
|
|
@@ -71,7 +90,12 @@ export class HashlineMismatchError extends Error {
|
|
|
71
90
|
const remaps = new Map();
|
|
72
91
|
for (const mismatch of mismatches) {
|
|
73
92
|
const actual = computeLineHash(mismatch.line, fileLines[mismatch.line - 1] ?? "");
|
|
74
|
-
|
|
93
|
+
const actualAnchor = computeAnchorHash(mismatch.line, fileLines[mismatch.line - 2], fileLines[mismatch.line - 1] ?? "", fileLines[mismatch.line]);
|
|
94
|
+
const oldKey = mismatch.expectedAnchor
|
|
95
|
+
? `${mismatch.line}#${mismatch.expected}#${mismatch.expectedAnchor}`
|
|
96
|
+
: `${mismatch.line}#${mismatch.expected}`;
|
|
97
|
+
const newKey = `${mismatch.line}#${actual}#${actualAnchor}`;
|
|
98
|
+
remaps.set(oldKey, newKey);
|
|
75
99
|
}
|
|
76
100
|
this.remaps = remaps;
|
|
77
101
|
}
|
|
@@ -100,21 +124,26 @@ export class HashlineMismatchError extends Error {
|
|
|
100
124
|
previousLine = line;
|
|
101
125
|
const content = fileLines[line - 1] ?? "";
|
|
102
126
|
const hash = computeLineHash(line, content);
|
|
103
|
-
const
|
|
127
|
+
const anchor = computeAnchorHash(line, fileLines[line - 2], content, fileLines[line]);
|
|
128
|
+
const formatted = `${line}#${hash}#${anchor}|${content}`;
|
|
104
129
|
output.push(mismatchByLine.has(line) ? `>>> ${formatted}` : ` ${formatted}`);
|
|
105
130
|
}
|
|
106
131
|
return output.join("\n");
|
|
107
132
|
}
|
|
108
133
|
}
|
|
134
|
+
function extractHashFromRef(ref) {
|
|
135
|
+
const match = ref.trim().match(ANCHOR_HASH_EXTRACT_RE);
|
|
136
|
+
return match ? match[1] : null;
|
|
137
|
+
}
|
|
109
138
|
function suggestLineForHash(ref, lines) {
|
|
110
|
-
const
|
|
111
|
-
if (!
|
|
139
|
+
const hash = extractHashFromRef(ref);
|
|
140
|
+
if (!hash)
|
|
112
141
|
return null;
|
|
113
|
-
}
|
|
114
|
-
const hash = hashMatch[1];
|
|
115
142
|
for (let index = 0; index < lines.length; index += 1) {
|
|
116
|
-
if (
|
|
117
|
-
|
|
143
|
+
if (isLineHashCompatible(index + 1, lines[index] ?? "", hash)) {
|
|
144
|
+
const actual = computeLineHash(index + 1, lines[index] ?? "");
|
|
145
|
+
const anchor = computeAnchorHash(index + 1, lines[index - 1], lines[index] ?? "", lines[index + 1]);
|
|
146
|
+
return `Did you mean "${index + 1}#${actual}#${anchor}"?`;
|
|
118
147
|
}
|
|
119
148
|
}
|
|
120
149
|
return null;
|
|
@@ -132,25 +161,29 @@ function parseLineRefWithHint(ref, lines) {
|
|
|
132
161
|
}
|
|
133
162
|
}
|
|
134
163
|
export function validateLineRef(lines, ref) {
|
|
135
|
-
const { line, hash } = parseLineRefWithHint(ref, lines);
|
|
164
|
+
const { line, hash, anchorHash } = parseLineRefWithHint(ref, lines);
|
|
136
165
|
if (line < 1 || line > lines.length) {
|
|
137
166
|
throw new Error(`Line number ${line} out of bounds. File has ${lines.length} lines.`);
|
|
138
167
|
}
|
|
139
168
|
const content = lines[line - 1] ?? "";
|
|
140
|
-
|
|
141
|
-
|
|
169
|
+
const prevContent = line > 1 ? lines[line - 2] : undefined;
|
|
170
|
+
const nextContent = line < lines.length ? lines[line] : undefined;
|
|
171
|
+
if (!isCompatibleLineHash(line, content, hash, prevContent, nextContent, anchorHash)) {
|
|
172
|
+
throw new HashlineMismatchError([{ line, expected: hash, expectedAnchor: anchorHash }], lines);
|
|
142
173
|
}
|
|
143
174
|
}
|
|
144
175
|
export function validateLineRefs(lines, refs) {
|
|
145
176
|
const mismatches = [];
|
|
146
177
|
for (const ref of refs) {
|
|
147
|
-
const { line, hash } = parseLineRefWithHint(ref, lines);
|
|
178
|
+
const { line, hash, anchorHash } = parseLineRefWithHint(ref, lines);
|
|
148
179
|
if (line < 1 || line > lines.length) {
|
|
149
180
|
throw new Error(`Line number ${line} out of bounds (file has ${lines.length} lines)`);
|
|
150
181
|
}
|
|
151
182
|
const content = lines[line - 1] ?? "";
|
|
152
|
-
|
|
153
|
-
|
|
183
|
+
const prevContent = line > 1 ? lines[line - 2] : undefined;
|
|
184
|
+
const nextContent = line < lines.length ? lines[line] : undefined;
|
|
185
|
+
if (!isCompatibleLineHash(line, content, hash, prevContent, nextContent, anchorHash)) {
|
|
186
|
+
mismatches.push({ line, expected: hash, expectedAnchor: anchorHash });
|
|
154
187
|
}
|
|
155
188
|
}
|
|
156
189
|
if (mismatches.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/validation.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,iBAAiB;AACjB,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/validation.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,iBAAiB;AACjB,wBAAwB;AACxB,sJAAsJ;AACtJ,4MAA4M;AAC5M,qGAAqG;AACrG,oCAAoC;AACpC,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,+FAA+F;AAC/F,0FAA0F;AAC1F,+FAA+F;AAC/F,+GAA+G;AAC/G,6EAA6E;AAC7E,2FAA2F;AAC3F,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,sIAAsI;AACtI,wNAAwN;AACxN,qBAAqB;AAErB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAclG,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,wBAAwB,GAAG,2DAA2D,CAAC;AAC7F,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAE3D,SAAS,oBAAoB,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IACvE,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAClG,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAY,EACZ,OAAe,EACf,IAAY,EACZ,WAA+B,EAC/B,WAA+B,EAC/B,UAA8B;IAE9B,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5E,IAAI,QAAQ,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,eAAe,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,GAAG,eAAe,CAAC;IAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzB,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,CAAC,CAAE,CAAC;IACvB,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;YACpC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE;YACf,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAC/C,IACE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACrB,oDAAoD,CAAC,IAAI,CAAC,MAAM,CAAC,EACjE,CAAC;YACD,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,OAAO,MAAM,gFAAgF,CAC7H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,mCAAmC,GAAG,0FAA0F,CACjI,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAI3B;IACA;IAJV,MAAM,CAA8B;IAE7C,YACmB,UAA0B,EAC1B,SAAmB;QAEpC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAHjD,eAAU,GAAV,UAAU,CAAgB;QAC1B,cAAS,GAAT,SAAS,CAAU;QAGpC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,MAAM,YAAY,GAAG,iBAAiB,CACpC,QAAQ,CAAC,IAAI,EACb,SAAS,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAC5B,SAAS,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CACzB,CAAC;YACF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc;gBACpC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,cAAc,EAAE;gBACpE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,IAAI,MAAM,IAAI,YAAY,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,UAA0B,EAAE,SAAmB;QAClE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;QACvD,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;YAC1E,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC7C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,GAAG,UAAU,CAAC,MAAM,QAAQ,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,2GAA2G,CACjL,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;YAEpB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,KAAe;IACtD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,oBAAoB,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,iBAAiB,CAC9B,KAAK,GAAG,CAAC,EACT,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAChB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAClB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CACjB,CAAC;YACF,OAAO,iBAAiB,KAAK,GAAG,CAAC,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW,EAAE,KAAe;IACxD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,IAAI,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,GAAW;IAC1D,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,4BAA4B,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,qBAAqB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,IAAc;IAC9D,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,4BAA4B,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;YACrF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// FILE: src/plugins/system-context-injection/index.ts
|
|
2
|
-
// VERSION: 0.3.
|
|
2
|
+
// VERSION: 0.3.3
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
4
|
// PURPOSE: Inject reusable vvoc system context into primary chat sessions without polluting known subagent prompts.
|
|
5
5
|
// SCOPE: Main-session system instruction definitions, editing-workflow guidance, known subagent filtering, config-aware custom subagent tracking, and chat.message system prompt injection.
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
// END_MODULE_MAP
|
|
15
15
|
//
|
|
16
16
|
// START_CHANGE_SUMMARY
|
|
17
|
+
// LAST_CHANGE: [v0.3.3 - Updated editing workflow guidance to prefer exact context-anchored `line#hash#anchor` refs from read output.]
|
|
17
18
|
// LAST_CHANGE: [v0.3.2 - Added primary-session editing workflow guidance that prefers hashline-backed `edit` over shell rewrites and forbids `apply_patch` use.]
|
|
18
19
|
// LAST_CHANGE: [v0.3.1 - Narrowed explore subagent guidance to context-gathering only, prohibiting solution proposals, planning, or recommendations.]
|
|
19
20
|
// LAST_CHANGE: [v0.3.0 - Added standard trajectories, working-state, reroute, semantic continuity, assumption discipline, anti-drift, and project-overlay guidance for primary sessions.]
|
|
@@ -39,7 +40,7 @@ const MAIN_SESSION_SYSTEM_CONTEXTS = [
|
|
|
39
40
|
[
|
|
40
41
|
"<editing_workflow>",
|
|
41
42
|
"When editing files, prefer the `edit` tool over shell-based rewrites when it is available.",
|
|
42
|
-
"Read the file first, then use exact `line#hash`
|
|
43
|
+
"Read the file first, then use exact `line#hash#anchor` refs from the latest `read` output when present.",
|
|
43
44
|
"Do not use `apply_patch`; prefer the hashline-backed `edit` tool for file changes. Managed vvoc installs also disable `apply_patch` in OpenCode config.",
|
|
44
45
|
"Reserve `bash` for tests, builds, git, and other non-file-edit commands.",
|
|
45
46
|
"</editing_workflow>",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/system-context-injection/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,iBAAiB;AACjB,wBAAwB;AACxB,sHAAsH;AACtH,8LAA8L;AAC9L,8DAA8D;AAC9D,qEAAqE;AACrE,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,0HAA0H;AAC1H,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,mKAAmK;AACnK,wJAAwJ;AACxJ,4LAA4L;AAC5L,yKAAyK;AACzK,2HAA2H;AAC3H,qBAAqB;AAGrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;AAC3D,MAAM,wBAAwB,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAU,CAAC;AAC1E,MAAM,uBAAuB,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;AAE5E,MAAM,4BAA4B,GAAG;IACnC;QACE,+BAA+B;QAC/B,uMAAuM;QACvM,8EAA8E;QAC9E,2MAA2M;QAC3M,2HAA2H;QAC3H,iDAAiD;QACjD,oHAAoH;QACpH,sHAAsH;QACtH,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ;QACE,oBAAoB;QACpB,4FAA4F;QAC5F,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/system-context-injection/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/schemas/vvoc/v1.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.5/schemas/vvoc/v1.json",
|
|
4
4
|
"title": "vvoc config",
|
|
5
5
|
"description": "Canonical vvoc configuration document.",
|
|
6
6
|
"type": "object",
|
package/schemas/vvoc/v2.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.5/schemas/vvoc/v2.json",
|
|
4
4
|
"title": "vvoc config",
|
|
5
5
|
"description": "Canonical vvoc configuration document.",
|
|
6
6
|
"type": "object",
|
package/schemas/vvoc/v3.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.
|
|
3
|
+
"$id": "https://cdn.jsdelivr.net/npm/@osovv/vv-opencode@0.25.5/schemas/vvoc/v3.json",
|
|
4
4
|
"title": "vvoc config",
|
|
5
5
|
"description": "Canonical vvoc configuration document.",
|
|
6
6
|
"type": "object",
|