@cairn-tool/cairn 3.0.0 → 3.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.
Files changed (59) hide show
  1. package/README.md +6 -3
  2. package/dist/agent/types.d.ts +2 -1
  3. package/dist/agent/types.js.map +1 -1
  4. package/dist/archive/run.d.ts +14 -7
  5. package/dist/archive/run.js +4 -1
  6. package/dist/archive/run.js.map +1 -1
  7. package/dist/archive/sets.d.ts +26 -1
  8. package/dist/archive/sets.js +108 -0
  9. package/dist/archive/sets.js.map +1 -1
  10. package/dist/cli.js +33 -0
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/archive.js +11 -5
  13. package/dist/commands/archive.js.map +1 -1
  14. package/dist/commands/jira.d.ts +17 -0
  15. package/dist/commands/jira.js +195 -0
  16. package/dist/commands/jira.js.map +1 -0
  17. package/dist/contract/registry.js +38 -1
  18. package/dist/contract/registry.js.map +1 -1
  19. package/dist/contract/schemas/index.js +2 -0
  20. package/dist/contract/schemas/index.js.map +1 -1
  21. package/dist/contract/schemas/jira.d.ts +2 -0
  22. package/dist/contract/schemas/jira.js +102 -0
  23. package/dist/contract/schemas/jira.js.map +1 -0
  24. package/dist/jira/adf/diagnostics.d.ts +77 -0
  25. package/dist/jira/adf/diagnostics.js +100 -0
  26. package/dist/jira/adf/diagnostics.js.map +1 -0
  27. package/dist/jira/adf/from-markdown.d.ts +6 -0
  28. package/dist/jira/adf/from-markdown.js +650 -0
  29. package/dist/jira/adf/from-markdown.js.map +1 -0
  30. package/dist/jira/adf/inspect.d.ts +11 -0
  31. package/dist/jira/adf/inspect.js +56 -0
  32. package/dist/jira/adf/inspect.js.map +1 -0
  33. package/dist/jira/adf/profile.d.ts +101 -0
  34. package/dist/jira/adf/profile.js +248 -0
  35. package/dist/jira/adf/profile.js.map +1 -0
  36. package/dist/jira/adf/read.d.ts +33 -0
  37. package/dist/jira/adf/read.js +250 -0
  38. package/dist/jira/adf/read.js.map +1 -0
  39. package/dist/jira/adf/serialize.d.ts +5 -0
  40. package/dist/jira/adf/serialize.js +54 -0
  41. package/dist/jira/adf/serialize.js.map +1 -0
  42. package/dist/jira/adf/to-markdown.d.ts +14 -0
  43. package/dist/jira/adf/to-markdown.js +512 -0
  44. package/dist/jira/adf/to-markdown.js.map +1 -0
  45. package/dist/jira/adf/types.d.ts +73 -0
  46. package/dist/jira/adf/types.js +2 -0
  47. package/dist/jira/adf/types.js.map +1 -0
  48. package/dist/jira/adf/validate.d.ts +7 -0
  49. package/dist/jira/adf/validate.js +182 -0
  50. package/dist/jira/adf/validate.js.map +1 -0
  51. package/dist/mapping-quality.d.ts +18 -0
  52. package/dist/mapping-quality.js +12 -0
  53. package/dist/mapping-quality.js.map +1 -0
  54. package/dist/usage/providers/cursor.d.ts +2 -0
  55. package/dist/usage/providers/cursor.js +570 -0
  56. package/dist/usage/providers/cursor.js.map +1 -0
  57. package/dist/usage/providers/index.js +2 -0
  58. package/dist/usage/providers/index.js.map +1 -1
  59. package/package.json +4 -1
@@ -0,0 +1,182 @@
1
+ import { CODES, DiagnosticSink } from "./diagnostics.js";
2
+ import { CONTENT_MODEL, FIDELITY, MARK_FIDELITY, PANEL_TYPES, accepts } from "./profile.js";
3
+ /**
4
+ * Structural validation against this tool's own content model.
5
+ *
6
+ * Deliberately not a wrapper around Atlassian's schema. That schema is a
7
+ * devDependency read only by `tests/unit/jira-adf-profile.test.ts`, which proves the
8
+ * model here agrees with it in both directions — so this reports the same
9
+ * legality answers without shipping someone else's document, and a node type the
10
+ * model does not know reports `AD100` rather than pretending to be Atlassian's
11
+ * validator. It is the same line `agent test --native` draws: every target
12
+ * profile declares `nativeValidator: null` and publishes the command to run
13
+ * yourself.
14
+ */
15
+ function attributeError(node, sink, trail, message) {
16
+ sink.add({
17
+ code: CODES.badAttribute,
18
+ quality: "unsupported",
19
+ severity: "error",
20
+ message,
21
+ node: node.type,
22
+ location: trail.join("/"),
23
+ });
24
+ }
25
+ function checkAttributes(node, sink, trail) {
26
+ switch (node.type) {
27
+ case "heading": {
28
+ const level = node.attrs?.level;
29
+ if (!Number.isInteger(level) || level < 1 || level > 6)
30
+ attributeError(node, sink, trail, `heading level must be an integer 1-6, got ${String(level)}`);
31
+ break;
32
+ }
33
+ case "panel": {
34
+ const kind = node.attrs?.panelType;
35
+ if (typeof kind !== "string" || !PANEL_TYPES.has(kind))
36
+ attributeError(node, sink, trail, `panelType must be one of ${[...PANEL_TYPES].join(", ")}, got ${String(kind)}`);
37
+ break;
38
+ }
39
+ case "taskList":
40
+ case "taskItem":
41
+ case "decisionList":
42
+ case "decisionItem": {
43
+ if (typeof node.attrs?.localId !== "string")
44
+ attributeError(node, sink, trail, `${node.type} requires a string localId`);
45
+ break;
46
+ }
47
+ case "media": {
48
+ const kind = node.attrs?.type;
49
+ if (kind === "external") {
50
+ if (typeof node.attrs?.url !== "string")
51
+ attributeError(node, sink, trail, "external media requires a url");
52
+ }
53
+ else if (kind === "file" || kind === "link") {
54
+ if (typeof node.attrs?.id !== "string")
55
+ attributeError(node, sink, trail, `${String(kind)} media requires an id`);
56
+ if (typeof node.attrs?.collection !== "string")
57
+ attributeError(node, sink, trail, `${String(kind)} media requires a collection`);
58
+ }
59
+ else {
60
+ attributeError(node, sink, trail, `media type must be external, file, or link, got ${String(kind)}`);
61
+ }
62
+ break;
63
+ }
64
+ case "text": {
65
+ // An empty text node is invalid ADF, which is why an empty paragraph is
66
+ // `content: []` rather than a paragraph holding empty text.
67
+ if (node.text === "")
68
+ attributeError(node, sink, trail, "a text node may not carry an empty string");
69
+ break;
70
+ }
71
+ default:
72
+ break;
73
+ }
74
+ }
75
+ function walk(node, sink, trail) {
76
+ const here = [...trail, node.type];
77
+ if (!FIDELITY[node.type]) {
78
+ sink.add({
79
+ code: CODES.unknownNode,
80
+ quality: "unsupported",
81
+ message: `Unrecognized ADF node type '${node.type}'`,
82
+ node: node.type,
83
+ location: trail.join("/"),
84
+ remediation: "This tool's content model does not know this node, so it cannot be validated or converted. Check for a newer cairn.",
85
+ });
86
+ return;
87
+ }
88
+ checkAttributes(node, sink, trail);
89
+ for (const mark of node.marks ?? []) {
90
+ if (MARK_FIDELITY[mark.type])
91
+ continue;
92
+ sink.add({
93
+ code: CODES.unknownMark,
94
+ quality: "unsupported",
95
+ message: `Unrecognized ADF mark '${mark.type}'`,
96
+ node: mark.type,
97
+ location: here.join("/"),
98
+ });
99
+ }
100
+ // Code block text carries no marks: the schema forbids it outright.
101
+ if (node.type === "codeBlock")
102
+ for (const child of node.content ?? [])
103
+ if (child.marks?.length)
104
+ sink.add({
105
+ code: CODES.illegalContent,
106
+ quality: "unsupported",
107
+ severity: "error",
108
+ message: "Text inside a code block may not carry marks",
109
+ node: "text",
110
+ location: here.join("/"),
111
+ });
112
+ const rule = CONTENT_MODEL[node.type];
113
+ const children = node.content ?? [];
114
+ if (rule) {
115
+ if (children.length < rule.minimum)
116
+ sink.add({
117
+ code: CODES.missingContent,
118
+ quality: "unsupported",
119
+ severity: "error",
120
+ message: `${node.type} requires at least ${rule.minimum} child, but has ${children.length}`,
121
+ node: node.type,
122
+ location: trail.join("/"),
123
+ });
124
+ if (rule.maximum !== undefined && children.length > rule.maximum)
125
+ sink.add({
126
+ code: CODES.illegalContent,
127
+ quality: "unsupported",
128
+ severity: "error",
129
+ message: `${node.type} allows at most ${rule.maximum} child, but has ${children.length}`,
130
+ node: node.type,
131
+ location: trail.join("/"),
132
+ });
133
+ for (const child of children)
134
+ if (!accepts(node.type, child.type))
135
+ sink.add({
136
+ code: CODES.illegalContent,
137
+ quality: "unsupported",
138
+ severity: "error",
139
+ message: `ADF does not allow ${child.type} inside ${node.type}`,
140
+ node: child.type,
141
+ location: here.join("/"),
142
+ });
143
+ }
144
+ for (const child of children)
145
+ walk(child, sink, here);
146
+ }
147
+ export function validateAdf(document) {
148
+ const sink = new DiagnosticSink();
149
+ const rule = CONTENT_MODEL.doc;
150
+ const children = document.content ?? [];
151
+ for (const child of children)
152
+ if (!accepts("doc", child.type) && FIDELITY[child.type])
153
+ sink.add({
154
+ code: CODES.illegalContent,
155
+ quality: "unsupported",
156
+ severity: "error",
157
+ message: `ADF does not allow ${child.type} at the top level of a document`,
158
+ node: child.type,
159
+ location: "doc",
160
+ });
161
+ if (children.length < rule.minimum)
162
+ sink.add({
163
+ code: CODES.missingContent,
164
+ quality: "unsupported",
165
+ severity: "error",
166
+ message: "A document requires content",
167
+ node: "doc",
168
+ location: "doc",
169
+ });
170
+ for (const child of children)
171
+ walk(child, sink, ["doc"]);
172
+ const diagnostics = sink.all();
173
+ const unknown = [
174
+ ...new Set(diagnostics
175
+ .filter((item) => item.code === CODES.unknownNode || item.code === CODES.unknownMark)
176
+ .map((item) => item.node ?? "")),
177
+ ]
178
+ .filter(Boolean)
179
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
180
+ return { diagnostics, unknown };
181
+ }
182
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/jira/adf/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * How faithfully a concept survived a mapping between two formats.
3
+ *
4
+ * Shared by the agent-bundle renderer and the ADF converters. It lives here
5
+ * rather than in either one because both diagnostic families derive severity
6
+ * from it by the same rule, and a second copy would let the two drift.
7
+ */
8
+ export type MappingQuality = "exact" | "approximate" | "unsupported";
9
+ export type DiagnosticSeverity = "notice" | "warning" | "error";
10
+ /**
11
+ * Derives severity from quality rather than choosing it per site.
12
+ *
13
+ * A caller that means "refuse" sets `severity: "error"` explicitly afterward,
14
+ * which is why an `unsupported` code can be either a warning (this feature does
15
+ * not cross over) or an error (this input is invalid): the quality describes the
16
+ * mapping, the severity describes the consequence.
17
+ */
18
+ export declare function severityFor(quality: MappingQuality): DiagnosticSeverity;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Derives severity from quality rather than choosing it per site.
3
+ *
4
+ * A caller that means "refuse" sets `severity: "error"` explicitly afterward,
5
+ * which is why an `unsupported` code can be either a warning (this feature does
6
+ * not cross over) or an error (this input is invalid): the quality describes the
7
+ * mapping, the severity describes the consequence.
8
+ */
9
+ export function severityFor(quality) {
10
+ return quality === "exact" ? "notice" : "warning";
11
+ }
12
+ //# sourceMappingURL=mapping-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping-quality.js","sourceRoot":"","sources":["../src/mapping-quality.ts"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAAuB;IACjD,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { UsageProvider } from "./types.js";
2
+ export declare const cursorProvider: UsageProvider;