@kozou/core 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCommentTags.d.ts","sourceRoot":"","sources":["../src/parseCommentTags.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseCommentTags.d.ts","sourceRoot":"","sources":["../src/parseCommentTags.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAuFrD,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B,CAAC;AAaF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,aAAa,CAiHtE"}
|
package/dist/parseCommentTags.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
// `@policy:`, `@example:`). See Kozou v0.1 design spec §10.1 for the
|
|
3
3
|
// tag vocabulary and §7.3.6 for the `exampleQueries` MCP surface.
|
|
4
4
|
//
|
|
5
|
+
// Tags are recognized at line start only (after optional leading
|
|
6
|
+
// whitespace). A known tag written mid-line is NOT parsed — the text
|
|
7
|
+
// stays in `body` verbatim — and emits a warning so the leak into
|
|
8
|
+
// OpenAPI / MCP descriptions is not silent.
|
|
9
|
+
//
|
|
5
10
|
// `@ai:`, `@policy:`, and `@example:` are multi-line: the tag line
|
|
6
11
|
// carries the first value (may be empty), and indented continuation
|
|
7
12
|
// lines extend it. A blank line, a non-indented line, or the next
|
|
@@ -35,6 +40,64 @@ const KNOWN_TAGS = new Set(['ai', 'widget', 'policy', 'example']);
|
|
|
35
40
|
// uses single, non-overlapping `\s*` groups, so matching stays linear.
|
|
36
41
|
const TAG_RE = /^\s*@([a-zA-Z_][a-zA-Z0-9_]*)\s*:(.*)$/;
|
|
37
42
|
const INDENT_RE = /^[ \t]/;
|
|
43
|
+
const LINE_WS_RE = /\s/;
|
|
44
|
+
function isIdentStart(code) {
|
|
45
|
+
return ((code >= 97 && code <= 122) || // a-z
|
|
46
|
+
(code >= 65 && code <= 90) || // A-Z
|
|
47
|
+
code === 95 // _
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
function isIdentChar(code) {
|
|
51
|
+
return isIdentStart(code) || (code >= 48 && code <= 57); // + 0-9
|
|
52
|
+
}
|
|
53
|
+
// Manual scan for `<identifier>\s*:` at a given offset — the tag-token
|
|
54
|
+
// shape TAG_RE recognizes, without a regex. This sits on the COMMENT
|
|
55
|
+
// dataflow path, where CodeQL flags closure-adjacent regex shapes as
|
|
56
|
+
// polynomial-ReDoS (the established workaround in this package is a
|
|
57
|
+
// linear character scan). Returns the identifier, or null.
|
|
58
|
+
function tagTokenAt(line, start) {
|
|
59
|
+
let i = start;
|
|
60
|
+
if (i >= line.length || !isIdentStart(line.charCodeAt(i)))
|
|
61
|
+
return null;
|
|
62
|
+
i += 1;
|
|
63
|
+
while (i < line.length && isIdentChar(line.charCodeAt(i)))
|
|
64
|
+
i += 1;
|
|
65
|
+
const token = line.slice(start, i);
|
|
66
|
+
while (i < line.length && LINE_WS_RE.test(line[i]))
|
|
67
|
+
i += 1;
|
|
68
|
+
return i < line.length && line[i] === ':' ? token : null;
|
|
69
|
+
}
|
|
70
|
+
// Tags are recognized at line start only. A *known* tag written mid-line
|
|
71
|
+
// is the silent-leak case from the field: it is neither parsed nor
|
|
72
|
+
// removed, so the literal tag text flows into `body` (and tag values) and
|
|
73
|
+
// from there into OpenAPI / MCP descriptions. Detect it so the loop can
|
|
74
|
+
// warn (the same courtesy the invalid-value and unknown-tag paths already
|
|
75
|
+
// extend). Single pass: `seenContent` tracks whether any non-whitespace
|
|
76
|
+
// precedes the current position, so a line-start `@` (TAG_RE territory)
|
|
77
|
+
// never trips it, and no prefix is re-scanned per `@`. Email-style text
|
|
78
|
+
// (`user@example.com`) does not trip this: the token must be followed by
|
|
79
|
+
// a colon. Unknown tokens (`@todo:`) stay silent — mid-line prose is the
|
|
80
|
+
// normal place to mention such things.
|
|
81
|
+
function midlineKnownTag(line) {
|
|
82
|
+
let seenContent = false;
|
|
83
|
+
for (let i = 0; i < line.length; i += 1) {
|
|
84
|
+
const ch = line[i];
|
|
85
|
+
if (ch === '@' && seenContent) {
|
|
86
|
+
const token = tagTokenAt(line, i + 1);
|
|
87
|
+
if (token !== null && KNOWN_TAGS.has(token.toLowerCase())) {
|
|
88
|
+
return `@${token}:`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!seenContent && !LINE_WS_RE.test(ch))
|
|
92
|
+
seenContent = true;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
function warnMidlineTag(token) {
|
|
97
|
+
console.warn(`[@kozou/core] parseCommentTags: mid-line "${token}" is not parsed ` +
|
|
98
|
+
'(tags are recognized at line start only; the text stays in the ' +
|
|
99
|
+
'description verbatim)');
|
|
100
|
+
}
|
|
38
101
|
function isWidgetType(value) {
|
|
39
102
|
return KNOWN_WIDGETS.has(value);
|
|
40
103
|
}
|
|
@@ -87,6 +150,9 @@ export function parseCommentTags(comment) {
|
|
|
87
150
|
line.trim().length > 0 &&
|
|
88
151
|
INDENT_RE.test(line) &&
|
|
89
152
|
!TAG_RE.test(line)) {
|
|
153
|
+
const midline = midlineKnownTag(line);
|
|
154
|
+
if (midline !== null)
|
|
155
|
+
warnMidlineTag(midline);
|
|
90
156
|
pending.lines.push(line.trim());
|
|
91
157
|
bodyLines.push(line);
|
|
92
158
|
continue;
|
|
@@ -94,6 +160,15 @@ export function parseCommentTags(comment) {
|
|
|
94
160
|
// Anything else ends the block; re-process this line below.
|
|
95
161
|
flushPending();
|
|
96
162
|
}
|
|
163
|
+
// Warn for a known tag stranded mid-line — on body lines and inside
|
|
164
|
+
// tag-line values alike (`@ai: note @policy: x` captures the literal
|
|
165
|
+
// `@policy: x` into the value; `@example: desc @widget: y` surfaces it
|
|
166
|
+
// in the example description). Example-block SQL never reaches here:
|
|
167
|
+
// the block collector above absorbs indented/blank lines without
|
|
168
|
+
// warning, since SQL legitimately contains `@…` text.
|
|
169
|
+
const midline = midlineKnownTag(line);
|
|
170
|
+
if (midline !== null)
|
|
171
|
+
warnMidlineTag(midline);
|
|
97
172
|
const match = TAG_RE.exec(line);
|
|
98
173
|
if (!match) {
|
|
99
174
|
bodyLines.push(line);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCommentTags.js","sourceRoot":"","sources":["../src/parseCommentTags.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,qEAAqE;AACrE,kEAAkE;AAClE,EAAE;AACF,mEAAmE;AACnE,oEAAoE;AACpE,kEAAkE;AAClE,gCAAgC;AAChC,mEAAmE;AACnE,kEAAkE;AAClE,oEAAoE;AACpE,mEAAmE;AACnE,wEAAwE;AACxE,uEAAuE;AACvE,mEAAmE;AACnE,iCAAiC;AAIjC,MAAM,aAAa,GAA4B,IAAI,GAAG,CAAa;IACjE,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,aAAa;IACb,iBAAiB;IACjB,MAAM;IACN,WAAW;IACX,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAClE,sEAAsE;AACtE,yEAAyE;AACzE,wEAAwE;AACxE,uEAAuE;AACvE,MAAM,MAAM,GAAG,wCAAwC,CAAC;AACxD,MAAM,SAAS,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"parseCommentTags.js","sourceRoot":"","sources":["../src/parseCommentTags.ts"],"names":[],"mappings":"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"}
|