kataster 0.0.0-stage → 0.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 (162) hide show
  1. package/.claude/agents/acceptance-tester.md +53 -0
  2. package/.claude/agents/code-reviewer.md +56 -0
  3. package/.claude/agents/domain-architect.md +40 -0
  4. package/.claude/agents/lead-dev.md +50 -0
  5. package/.claude/agents/product-owner.md +39 -0
  6. package/.claude/agents/repo-analyst.md +78 -0
  7. package/.claude/agents/requirements-engineer.md +44 -0
  8. package/.claude/agents/ux-designer.md +64 -0
  9. package/.claude/hooks/bash-guard.ts +92 -0
  10. package/.claude/hooks/code-check.ts +37 -0
  11. package/.claude/hooks/path-guard.ts +34 -0
  12. package/.claude/hooks/path-rules.ts +66 -0
  13. package/.claude/hooks/project-check.ts +108 -0
  14. package/.claude/hooks/protect-files.ts +55 -0
  15. package/.claude/hooks/session-start.ts +213 -0
  16. package/.claude/hooks/stop-gate.ts +56 -0
  17. package/.claude/hooks/validate-docs.ts +58 -0
  18. package/.claude/lib/architecture.ts +736 -0
  19. package/.claude/lib/backlog-github.ts +454 -0
  20. package/.claude/lib/backlog-jira.ts +347 -0
  21. package/.claude/lib/backlog-sync.ts +42 -0
  22. package/.claude/lib/backlog.ts +396 -0
  23. package/.claude/lib/bazel.ts +212 -0
  24. package/.claude/lib/config.ts +122 -0
  25. package/.claude/lib/discovery.ts +821 -0
  26. package/.claude/lib/engineering.ts +406 -0
  27. package/.claude/lib/nx.ts +129 -0
  28. package/.claude/lib/repo.ts +1194 -0
  29. package/.claude/lib/toolgraph.ts +74 -0
  30. package/.claude/lib/turbo.ts +166 -0
  31. package/.claude/package-lock.json +427 -0
  32. package/.claude/package.json +21 -0
  33. package/.claude/settings.json +82 -0
  34. package/.claude/skills/adopt/SKILL.md +283 -0
  35. package/.claude/skills/adopt/scripts/boundary-check.ts +156 -0
  36. package/.claude/skills/adopt/scripts/package-doc.ts +71 -0
  37. package/.claude/skills/adopt/scripts/repo-map.ts +123 -0
  38. package/.claude/skills/adopt/scripts/rule-doc.ts +80 -0
  39. package/.claude/skills/architect/ADR-FORMAT.md +97 -0
  40. package/.claude/skills/architect/SKILL.md +64 -0
  41. package/.claude/skills/architect/TECH-STACK.md +21 -0
  42. package/.claude/skills/backlog/SKILL.md +198 -0
  43. package/.claude/skills/backlog/scripts/backlog-pull.ts +45 -0
  44. package/.claude/skills/backlog/scripts/backlog-push.ts +38 -0
  45. package/.claude/skills/backlog/scripts/backlog-status.ts +32 -0
  46. package/.claude/skills/backlog/scripts/jira-import.ts +40 -0
  47. package/.claude/skills/backlog/scripts/jira-plan.ts +26 -0
  48. package/.claude/skills/backlog/scripts/jira-record.ts +41 -0
  49. package/.claude/skills/bootstrap/SKILL.md +119 -0
  50. package/.claude/skills/codebase-design/DEEPENING.md +37 -0
  51. package/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
  52. package/.claude/skills/codebase-design/SKILL.md +114 -0
  53. package/.claude/skills/domain-model/CONTEXT-FORMAT.md +47 -0
  54. package/.claude/skills/domain-model/SKILL.md +64 -0
  55. package/.claude/skills/domain-model/templates/data-model.md +29 -0
  56. package/.claude/skills/engineering-conventions/SKILL.md +31 -0
  57. package/.claude/skills/event-storming/SKILL.md +44 -0
  58. package/.claude/skills/event-storming/schema/events.schema.json +124 -0
  59. package/.claude/skills/event-storming/scripts/render-event-storming.ts +11 -0
  60. package/.claude/skills/event-storming/scripts/validate-events.ts +11 -0
  61. package/.claude/skills/event-storming/templates/events.example.yaml +91 -0
  62. package/.claude/skills/feature/SKILL.md +86 -0
  63. package/.claude/skills/feature/scripts/intake.ts +356 -0
  64. package/.claude/skills/grill-me/SKILL.md +7 -0
  65. package/.claude/skills/grill-with-docs/SKILL.md +7 -0
  66. package/.claude/skills/grilling/SKILL.md +30 -0
  67. package/.claude/skills/groom-backlog/SKILL.md +93 -0
  68. package/.claude/skills/groom-backlog/scripts/backlog-health.ts +238 -0
  69. package/.claude/skills/implement/SKILL.md +129 -0
  70. package/.claude/skills/implement/scripts/affected.ts +245 -0
  71. package/.claude/skills/implement/scripts/check-commands.ts +37 -0
  72. package/.claude/skills/implement/scripts/check-language.ts +15 -0
  73. package/.claude/skills/implement/scripts/check-scenarios.ts +59 -0
  74. package/.claude/skills/implement/scripts/next-story.ts +23 -0
  75. package/.claude/skills/implement/scripts/story-context.ts +135 -0
  76. package/.claude/skills/implement/scripts/story-status.ts +47 -0
  77. package/.claude/skills/implement/scripts/verify.ts +92 -0
  78. package/.claude/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
  79. package/.claude/skills/improve-codebase-architecture/SKILL.md +71 -0
  80. package/.claude/skills/retro/SKILL.md +53 -0
  81. package/.claude/skills/review-stories/SKILL.md +31 -0
  82. package/.claude/skills/shape/SKILL.md +193 -0
  83. package/.claude/skills/tdd/SKILL.md +38 -0
  84. package/.claude/skills/tdd/mocking.md +59 -0
  85. package/.claude/skills/tdd/tests.md +77 -0
  86. package/.claude/skills/user-stories/SKILL.md +138 -0
  87. package/.claude/skills/user-stories/schema/story.schema.json +39 -0
  88. package/.claude/skills/user-stories/scripts/render-backlog.ts +4 -0
  89. package/.claude/skills/user-stories/scripts/validate-stories.ts +13 -0
  90. package/.claude/skills/user-stories/templates/story-template.md +38 -0
  91. package/.claude/skills/ux-design/SKILL.md +107 -0
  92. package/.claude/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
  93. package/.claude/skills/writing-for-agents/SKILL.md +81 -0
  94. package/.claude/tsconfig.json +15 -0
  95. package/.opencode/agents/acceptance-tester.md +64 -0
  96. package/.opencode/agents/code-reviewer.md +69 -0
  97. package/.opencode/agents/domain-architect.md +59 -0
  98. package/.opencode/agents/lead-dev.md +67 -0
  99. package/.opencode/agents/product-owner.md +59 -0
  100. package/.opencode/agents/repo-analyst.md +86 -0
  101. package/.opencode/agents/requirements-engineer.md +58 -0
  102. package/.opencode/agents/ux-designer.md +83 -0
  103. package/.opencode/commands/adopt.md +7 -0
  104. package/.opencode/commands/backlog-sync.md +7 -0
  105. package/.opencode/commands/bootstrap.md +7 -0
  106. package/.opencode/commands/event-storming.md +7 -0
  107. package/.opencode/commands/feature.md +7 -0
  108. package/.opencode/commands/grill-me.md +7 -0
  109. package/.opencode/commands/grill-with-docs.md +7 -0
  110. package/.opencode/commands/groom-backlog.md +7 -0
  111. package/.opencode/commands/implement.md +7 -0
  112. package/.opencode/commands/improve-codebase-architecture.md +7 -0
  113. package/.opencode/commands/retro.md +7 -0
  114. package/.opencode/commands/review-stories.md +7 -0
  115. package/.opencode/commands/shape.md +7 -0
  116. package/.opencode/opencode.jsonc +15 -0
  117. package/.opencode/plugins/kataster/index.ts +283 -0
  118. package/AGENTS.md +21 -0
  119. package/CHANGELOG.md +82 -0
  120. package/LICENSE +21 -0
  121. package/README.md +324 -2
  122. package/bin/kataster.mjs +7 -0
  123. package/extras/skills/shadcn/SKILL.md +277 -0
  124. package/extras/skills/shadcn/agents/openai.yml +5 -0
  125. package/extras/skills/shadcn/assets/shadcn-small.png +0 -0
  126. package/extras/skills/shadcn/assets/shadcn.png +0 -0
  127. package/extras/skills/shadcn/cli.md +290 -0
  128. package/extras/skills/shadcn/customization.md +209 -0
  129. package/extras/skills/shadcn/evals/evals.json +77 -0
  130. package/extras/skills/shadcn/mcp.md +105 -0
  131. package/extras/skills/shadcn/registry.md +277 -0
  132. package/extras/skills/shadcn/rules/base-vs-radix.md +306 -0
  133. package/extras/skills/shadcn/rules/chat.md +250 -0
  134. package/extras/skills/shadcn/rules/composition.md +213 -0
  135. package/extras/skills/shadcn/rules/forms.md +192 -0
  136. package/extras/skills/shadcn/rules/icons.md +101 -0
  137. package/extras/skills/shadcn/rules/styling.md +185 -0
  138. package/guide/README.md +9 -0
  139. package/guide/brownfield.md +242 -0
  140. package/guide/concepts.md +109 -0
  141. package/guide/greenfield.md +84 -0
  142. package/guide/install.md +144 -0
  143. package/guide/release.md +62 -0
  144. package/package.json +56 -4
  145. package/src/cli.mjs +302 -0
  146. package/src/detect.mjs +237 -0
  147. package/src/install.mjs +427 -0
  148. package/src/repo.mjs +129 -0
  149. package/src/util.mjs +110 -0
  150. package/templates/CONTEXT.md +21 -0
  151. package/templates/conventions.md +63 -0
  152. package/templates/docs/adr/README.md +7 -0
  153. package/templates/docs/architecture/data-model.md +31 -0
  154. package/templates/docs/domain/context-map.md +21 -0
  155. package/templates/docs/domain/events.yaml +23 -0
  156. package/templates/docs/product/initiatives/README.md +41 -0
  157. package/templates/docs/product/ux-guidelines.md +27 -0
  158. package/templates/docs/product/vision.md +36 -0
  159. package/templates/docs/reviews/.gitkeep +0 -0
  160. package/templates/docs/stories/OPEN_QUESTIONS.md +8 -0
  161. package/templates/docs/stories/README.md +26 -0
  162. package/templates/docs/workflow.md +135 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Build-tool graphs.
3
+ *
4
+ * The manifest graph in `repo.ts` answers "who declares a dependency on whom". The build tool knows more:
5
+ * Turborepo has a task graph, Nx its project graph, Bazel the `deps` of every package. `repo-map.ts` asks
6
+ * the tool once and stores the answer as an optional `toolGraph`; `affected.ts` uses it for the fast test
7
+ * loop, while the manifest graph stays the source of truth.
8
+ *
9
+ * Every adapter is optional. No binary, no answer, no problem: the map falls back to manifests and the
10
+ * workflow never depends on a build tool being installed.
11
+ *
12
+ * Edge direction: `{ from, to }` means **from depends on to** – the same direction as `internalDeps`.
13
+ *
14
+ * Node >= 22.18, erasable TypeScript only, no runtime dependency.
15
+ */
16
+ import { readBazelGraph } from "./bazel.ts";
17
+ import { queryNxGraph } from "./nx.ts";
18
+ import { queryTurboGraph } from "./turbo.ts";
19
+
20
+ export type GraphSource = "turbo" | "nx" | "bazel";
21
+
22
+ export interface ToolGraph {
23
+ source: GraphSource;
24
+ /** The task/target the graph was queried for (Turbo). Nx and Bazel graphs are target-agnostic. */
25
+ task?: string;
26
+ /** Package names as they appear in `repo-map.packages`. */
27
+ packages: string[];
28
+ edges: { from: string; to: string }[];
29
+ /** Package name → the build tool's own project label, used to emit that tool's native command. */
30
+ projectNames?: Record<string, string>;
31
+ }
32
+
33
+ /** The minimum a graph adapter needs to know about a package. */
34
+ export interface GraphPackage {
35
+ name: string;
36
+ path: string;
37
+ }
38
+
39
+ const LABELS: Record<string, string> = { turbo: "Turborepo", nx: "Nx", bazel: "Bazel" };
40
+
41
+ export function graphLabel(graph: ToolGraph): string {
42
+ return LABELS[graph.source] ?? graph.source;
43
+ }
44
+
45
+ /** Human label for a tooling kind, or undefined when that tool has no graph adapter. */
46
+ export function graphToolLabel(kind: string): string | undefined {
47
+ return LABELS[kind];
48
+ }
49
+
50
+ /** How the graph was obtained – quoted in the generated repository map. */
51
+ export function graphOrigin(graph: ToolGraph): string {
52
+ switch (graph.source) {
53
+ case "turbo":
54
+ return `turbo run ${graph.task ?? "build"} --dry=json`;
55
+ case "nx":
56
+ return "nx graph --file=<temp>";
57
+ case "bazel":
58
+ return "deps attributes in BUILD/BUILD.bazel";
59
+ }
60
+ }
61
+
62
+ /** One entry point for every adapter. Returns undefined when the tool is absent or does not answer. */
63
+ export function queryToolGraph(root: string, kind: string, packages: GraphPackage[]): ToolGraph | undefined {
64
+ switch (kind) {
65
+ case "turbo":
66
+ return queryTurboGraph(root);
67
+ case "nx":
68
+ return queryNxGraph(root, packages);
69
+ case "bazel":
70
+ return readBazelGraph(root, packages);
71
+ default:
72
+ return undefined;
73
+ }
74
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Turborepo adapter.
3
+ *
4
+ * Turborepo already knows the package graph and the task graph. Instead of re-implementing it, `repo-map.ts`
5
+ * asks it once with `turbo run <task> --dry=json` (dry: no task runs) and stores the result as an optional
6
+ * `toolGraph` next to the manifest graph. If Turbo is not installed, the command fails, or it times out, the
7
+ * map falls back to manifests – the workflow never depends on the tool being present.
8
+ *
9
+ * `affected.ts` uses the graph for the fast test loop; Turbo itself still gets the final `--filter` command.
10
+ *
11
+ * Node >= 22.18, erasable TypeScript only, no runtime dependency.
12
+ */
13
+ import { spawnSync } from "node:child_process";
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import type { ToolGraph } from "./toolgraph.ts";
17
+
18
+ interface TurboTask {
19
+ package?: string;
20
+ taskId?: string;
21
+ dependencies?: unknown;
22
+ }
23
+
24
+ const isObject = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === "object" && !Array.isArray(v);
25
+ const list = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === "string") : []);
26
+
27
+ function readText(path: string): string | undefined {
28
+ try {
29
+ return readFileSync(path, "utf8");
30
+ } catch {
31
+ return undefined;
32
+ }
33
+ }
34
+
35
+ /** Minimal JSONC support: turbo.json is JSON, but some repositories keep comments in it. */
36
+ function parseJsonc(text: string): unknown {
37
+ let out = "";
38
+ let inString = false;
39
+ let quote = "";
40
+ for (let i = 0; i < text.length; i += 1) {
41
+ const c = text[i];
42
+ const next = text[i + 1];
43
+ if (inString) {
44
+ out += c;
45
+ if (c === "\\") {
46
+ out += next ?? "";
47
+ i += 1;
48
+ } else if (c === quote) {
49
+ inString = false;
50
+ }
51
+ continue;
52
+ }
53
+ if (c === '"') {
54
+ inString = true;
55
+ quote = c;
56
+ out += c;
57
+ continue;
58
+ }
59
+ if (c === "/" && next === "/") {
60
+ while (i < text.length && text[i] !== "\n") i += 1;
61
+ out += "\n";
62
+ continue;
63
+ }
64
+ if (c === "/" && next === "*") {
65
+ i += 2;
66
+ while (i < text.length && !(text[i] === "*" && text[i + 1] === "/")) i += 1;
67
+ i += 1;
68
+ continue;
69
+ }
70
+ out += c;
71
+ }
72
+ try {
73
+ return JSON.parse(out.replace(/,\s*([}\]])/g, "$1"));
74
+ } catch {
75
+ return undefined;
76
+ }
77
+ }
78
+
79
+ /** The task to ask Turbo about: build, else test, else lint, else the first configured task. */
80
+ export function turboTaskNames(root: string): string[] {
81
+ const text = readText(join(root, "turbo.json"));
82
+ if (text === undefined) return [];
83
+ const config = parseJsonc(text);
84
+ if (!isObject(config)) return [];
85
+ const block = isObject(config.tasks) ? config.tasks : isObject(config.pipeline) ? config.pipeline : {};
86
+ return Object.keys(block).filter((key) => !key.startsWith("$")).sort();
87
+ }
88
+
89
+ export function pickTurboTask(root: string): string | undefined {
90
+ const tasks = turboTaskNames(root);
91
+ for (const wanted of ["build", "test", "lint", "typecheck"]) if (tasks.includes(wanted)) return wanted;
92
+ return tasks[0];
93
+ }
94
+
95
+ export function turboBinary(root: string): string | undefined {
96
+ const name = process.platform === "win32" ? "turbo.cmd" : "turbo";
97
+ for (const candidate of [join(root, "node_modules", ".bin", name), join(root, "node_modules", ".bin", "turbo")]) {
98
+ if (existsSync(candidate)) return candidate;
99
+ }
100
+ return undefined;
101
+ }
102
+
103
+ function packageOfTask(task: TurboTask): string | undefined {
104
+ if (typeof task.package === "string" && task.package) return task.package;
105
+ if (typeof task.taskId === "string") return task.taskId.split("#")[0];
106
+ return undefined;
107
+ }
108
+
109
+ /** Parses the `--dry=json` output. Kept pure so it can be tested without a Turbo installation. */
110
+ export function parseTurboDry(data: unknown, task: string): ToolGraph | undefined {
111
+ if (!isObject(data)) return undefined;
112
+ const tasks: TurboTask[] = Array.isArray(data.tasks)
113
+ ? data.tasks.filter(isObject) as TurboTask[]
114
+ : isObject(data.tasks)
115
+ ? Object.values(data.tasks).filter(isObject) as TurboTask[]
116
+ : [];
117
+ if (!tasks.length) return undefined;
118
+
119
+ const packages = new Set<string>();
120
+ const edges = new Map<string, { from: string; to: string }>();
121
+ for (const item of tasks) {
122
+ const from = packageOfTask(item);
123
+ if (!from) continue;
124
+ packages.add(from);
125
+ for (const dep of list(item.dependencies)) {
126
+ if (!dep.includes("#")) continue; // unresolved task pattern such as "^build"
127
+ const to = dep.split("#")[0];
128
+ if (!to || to === from) continue;
129
+ packages.add(to);
130
+ edges.set(`${from}>${to}`, { from, to });
131
+ }
132
+ }
133
+ if (!packages.size) return undefined;
134
+ return {
135
+ source: "turbo",
136
+ task,
137
+ packages: [...packages].sort(),
138
+ edges: [...edges.values()].sort((a, b) => `${a.from}>${a.to}`.localeCompare(`${b.from}>${b.to}`)),
139
+ };
140
+ }
141
+
142
+ /** Ask Turbo for its graph. Returns undefined when Turbo is absent, fails, or does not answer in time. */
143
+ export function queryTurboGraph(root: string): ToolGraph | undefined {
144
+ const binary = turboBinary(root);
145
+ const task = pickTurboTask(root);
146
+ if (!binary || !task) return undefined;
147
+
148
+ const result = spawnSync(binary, ["run", task, "--dry=json"], {
149
+ cwd: root,
150
+ encoding: "utf8",
151
+ stdio: ["ignore", "pipe", "pipe"],
152
+ timeout: 20_000,
153
+ env: { ...process.env, TURBO_TELEMETRY_DISABLED: "1" },
154
+ });
155
+ if (result.status !== 0 || !result.stdout) return undefined;
156
+
157
+ const text = result.stdout.trim();
158
+ const start = text.indexOf("{");
159
+ const end = text.lastIndexOf("}");
160
+ if (start === -1 || end <= start) return undefined;
161
+ try {
162
+ return parseTurboDry(JSON.parse(text.slice(start, end + 1)), task);
163
+ } catch {
164
+ return undefined;
165
+ }
166
+ }
@@ -0,0 +1,427 @@
1
+ {
2
+ "name": "kataster-tooling",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "name": "kataster-tooling",
8
+ "dependencies": {
9
+ "yaml": "^2.9.1"
10
+ },
11
+ "devDependencies": {
12
+ "@types/node": "^24.19.2",
13
+ "typescript": "^7.0.2"
14
+ },
15
+ "engines": {
16
+ "node": ">=22.18"
17
+ }
18
+ },
19
+ "node_modules/@types/node": {
20
+ "version": "24.19.2",
21
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz",
22
+ "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==",
23
+ "dev": true,
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "undici-types": ">=7.24.0 <7.24.7"
27
+ }
28
+ },
29
+ "node_modules/@typescript/typescript-aix-ppc64": {
30
+ "version": "7.0.2",
31
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz",
32
+ "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==",
33
+ "cpu": [
34
+ "ppc64"
35
+ ],
36
+ "dev": true,
37
+ "license": "Apache-2.0",
38
+ "optional": true,
39
+ "os": [
40
+ "aix"
41
+ ],
42
+ "engines": {
43
+ "node": ">=16.20.0"
44
+ }
45
+ },
46
+ "node_modules/@typescript/typescript-darwin-arm64": {
47
+ "version": "7.0.2",
48
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz",
49
+ "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==",
50
+ "cpu": [
51
+ "arm64"
52
+ ],
53
+ "dev": true,
54
+ "license": "Apache-2.0",
55
+ "optional": true,
56
+ "os": [
57
+ "darwin"
58
+ ],
59
+ "engines": {
60
+ "node": ">=16.20.0"
61
+ }
62
+ },
63
+ "node_modules/@typescript/typescript-darwin-x64": {
64
+ "version": "7.0.2",
65
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz",
66
+ "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==",
67
+ "cpu": [
68
+ "x64"
69
+ ],
70
+ "dev": true,
71
+ "license": "Apache-2.0",
72
+ "optional": true,
73
+ "os": [
74
+ "darwin"
75
+ ],
76
+ "engines": {
77
+ "node": ">=16.20.0"
78
+ }
79
+ },
80
+ "node_modules/@typescript/typescript-freebsd-arm64": {
81
+ "version": "7.0.2",
82
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz",
83
+ "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==",
84
+ "cpu": [
85
+ "arm64"
86
+ ],
87
+ "dev": true,
88
+ "license": "Apache-2.0",
89
+ "optional": true,
90
+ "os": [
91
+ "freebsd"
92
+ ],
93
+ "engines": {
94
+ "node": ">=16.20.0"
95
+ }
96
+ },
97
+ "node_modules/@typescript/typescript-freebsd-x64": {
98
+ "version": "7.0.2",
99
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz",
100
+ "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==",
101
+ "cpu": [
102
+ "x64"
103
+ ],
104
+ "dev": true,
105
+ "license": "Apache-2.0",
106
+ "optional": true,
107
+ "os": [
108
+ "freebsd"
109
+ ],
110
+ "engines": {
111
+ "node": ">=16.20.0"
112
+ }
113
+ },
114
+ "node_modules/@typescript/typescript-linux-arm": {
115
+ "version": "7.0.2",
116
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz",
117
+ "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==",
118
+ "cpu": [
119
+ "arm"
120
+ ],
121
+ "dev": true,
122
+ "license": "Apache-2.0",
123
+ "optional": true,
124
+ "os": [
125
+ "linux"
126
+ ],
127
+ "engines": {
128
+ "node": ">=16.20.0"
129
+ }
130
+ },
131
+ "node_modules/@typescript/typescript-linux-arm64": {
132
+ "version": "7.0.2",
133
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz",
134
+ "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==",
135
+ "cpu": [
136
+ "arm64"
137
+ ],
138
+ "dev": true,
139
+ "license": "Apache-2.0",
140
+ "optional": true,
141
+ "os": [
142
+ "linux"
143
+ ],
144
+ "engines": {
145
+ "node": ">=16.20.0"
146
+ }
147
+ },
148
+ "node_modules/@typescript/typescript-linux-loong64": {
149
+ "version": "7.0.2",
150
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz",
151
+ "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==",
152
+ "cpu": [
153
+ "loong64"
154
+ ],
155
+ "dev": true,
156
+ "license": "Apache-2.0",
157
+ "optional": true,
158
+ "os": [
159
+ "linux"
160
+ ],
161
+ "engines": {
162
+ "node": ">=16.20.0"
163
+ }
164
+ },
165
+ "node_modules/@typescript/typescript-linux-mips64el": {
166
+ "version": "7.0.2",
167
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz",
168
+ "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==",
169
+ "cpu": [
170
+ "mips64el"
171
+ ],
172
+ "dev": true,
173
+ "license": "Apache-2.0",
174
+ "optional": true,
175
+ "os": [
176
+ "linux"
177
+ ],
178
+ "engines": {
179
+ "node": ">=16.20.0"
180
+ }
181
+ },
182
+ "node_modules/@typescript/typescript-linux-ppc64": {
183
+ "version": "7.0.2",
184
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz",
185
+ "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==",
186
+ "cpu": [
187
+ "ppc64"
188
+ ],
189
+ "dev": true,
190
+ "license": "Apache-2.0",
191
+ "optional": true,
192
+ "os": [
193
+ "linux"
194
+ ],
195
+ "engines": {
196
+ "node": ">=16.20.0"
197
+ }
198
+ },
199
+ "node_modules/@typescript/typescript-linux-riscv64": {
200
+ "version": "7.0.2",
201
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz",
202
+ "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==",
203
+ "cpu": [
204
+ "riscv64"
205
+ ],
206
+ "dev": true,
207
+ "license": "Apache-2.0",
208
+ "optional": true,
209
+ "os": [
210
+ "linux"
211
+ ],
212
+ "engines": {
213
+ "node": ">=16.20.0"
214
+ }
215
+ },
216
+ "node_modules/@typescript/typescript-linux-s390x": {
217
+ "version": "7.0.2",
218
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz",
219
+ "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==",
220
+ "cpu": [
221
+ "s390x"
222
+ ],
223
+ "dev": true,
224
+ "license": "Apache-2.0",
225
+ "optional": true,
226
+ "os": [
227
+ "linux"
228
+ ],
229
+ "engines": {
230
+ "node": ">=16.20.0"
231
+ }
232
+ },
233
+ "node_modules/@typescript/typescript-linux-x64": {
234
+ "version": "7.0.2",
235
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz",
236
+ "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==",
237
+ "cpu": [
238
+ "x64"
239
+ ],
240
+ "dev": true,
241
+ "license": "Apache-2.0",
242
+ "optional": true,
243
+ "os": [
244
+ "linux"
245
+ ],
246
+ "engines": {
247
+ "node": ">=16.20.0"
248
+ }
249
+ },
250
+ "node_modules/@typescript/typescript-netbsd-arm64": {
251
+ "version": "7.0.2",
252
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz",
253
+ "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==",
254
+ "cpu": [
255
+ "arm64"
256
+ ],
257
+ "dev": true,
258
+ "license": "Apache-2.0",
259
+ "optional": true,
260
+ "os": [
261
+ "netbsd"
262
+ ],
263
+ "engines": {
264
+ "node": ">=16.20.0"
265
+ }
266
+ },
267
+ "node_modules/@typescript/typescript-netbsd-x64": {
268
+ "version": "7.0.2",
269
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz",
270
+ "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==",
271
+ "cpu": [
272
+ "x64"
273
+ ],
274
+ "dev": true,
275
+ "license": "Apache-2.0",
276
+ "optional": true,
277
+ "os": [
278
+ "netbsd"
279
+ ],
280
+ "engines": {
281
+ "node": ">=16.20.0"
282
+ }
283
+ },
284
+ "node_modules/@typescript/typescript-openbsd-arm64": {
285
+ "version": "7.0.2",
286
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz",
287
+ "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==",
288
+ "cpu": [
289
+ "arm64"
290
+ ],
291
+ "dev": true,
292
+ "license": "Apache-2.0",
293
+ "optional": true,
294
+ "os": [
295
+ "openbsd"
296
+ ],
297
+ "engines": {
298
+ "node": ">=16.20.0"
299
+ }
300
+ },
301
+ "node_modules/@typescript/typescript-openbsd-x64": {
302
+ "version": "7.0.2",
303
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz",
304
+ "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==",
305
+ "cpu": [
306
+ "x64"
307
+ ],
308
+ "dev": true,
309
+ "license": "Apache-2.0",
310
+ "optional": true,
311
+ "os": [
312
+ "openbsd"
313
+ ],
314
+ "engines": {
315
+ "node": ">=16.20.0"
316
+ }
317
+ },
318
+ "node_modules/@typescript/typescript-sunos-x64": {
319
+ "version": "7.0.2",
320
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz",
321
+ "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==",
322
+ "cpu": [
323
+ "x64"
324
+ ],
325
+ "dev": true,
326
+ "license": "Apache-2.0",
327
+ "optional": true,
328
+ "os": [
329
+ "sunos"
330
+ ],
331
+ "engines": {
332
+ "node": ">=16.20.0"
333
+ }
334
+ },
335
+ "node_modules/@typescript/typescript-win32-arm64": {
336
+ "version": "7.0.2",
337
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz",
338
+ "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==",
339
+ "cpu": [
340
+ "arm64"
341
+ ],
342
+ "dev": true,
343
+ "license": "Apache-2.0",
344
+ "optional": true,
345
+ "os": [
346
+ "win32"
347
+ ],
348
+ "engines": {
349
+ "node": ">=16.20.0"
350
+ }
351
+ },
352
+ "node_modules/@typescript/typescript-win32-x64": {
353
+ "version": "7.0.2",
354
+ "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz",
355
+ "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==",
356
+ "cpu": [
357
+ "x64"
358
+ ],
359
+ "dev": true,
360
+ "license": "Apache-2.0",
361
+ "optional": true,
362
+ "os": [
363
+ "win32"
364
+ ],
365
+ "engines": {
366
+ "node": ">=16.20.0"
367
+ }
368
+ },
369
+ "node_modules/typescript": {
370
+ "version": "7.0.2",
371
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz",
372
+ "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==",
373
+ "dev": true,
374
+ "license": "Apache-2.0",
375
+ "bin": {
376
+ "tsc": "bin/tsc"
377
+ },
378
+ "engines": {
379
+ "node": ">=16.20.0"
380
+ },
381
+ "optionalDependencies": {
382
+ "@typescript/typescript-aix-ppc64": "7.0.2",
383
+ "@typescript/typescript-darwin-arm64": "7.0.2",
384
+ "@typescript/typescript-darwin-x64": "7.0.2",
385
+ "@typescript/typescript-freebsd-arm64": "7.0.2",
386
+ "@typescript/typescript-freebsd-x64": "7.0.2",
387
+ "@typescript/typescript-linux-arm": "7.0.2",
388
+ "@typescript/typescript-linux-arm64": "7.0.2",
389
+ "@typescript/typescript-linux-loong64": "7.0.2",
390
+ "@typescript/typescript-linux-mips64el": "7.0.2",
391
+ "@typescript/typescript-linux-ppc64": "7.0.2",
392
+ "@typescript/typescript-linux-riscv64": "7.0.2",
393
+ "@typescript/typescript-linux-s390x": "7.0.2",
394
+ "@typescript/typescript-linux-x64": "7.0.2",
395
+ "@typescript/typescript-netbsd-arm64": "7.0.2",
396
+ "@typescript/typescript-netbsd-x64": "7.0.2",
397
+ "@typescript/typescript-openbsd-arm64": "7.0.2",
398
+ "@typescript/typescript-openbsd-x64": "7.0.2",
399
+ "@typescript/typescript-sunos-x64": "7.0.2",
400
+ "@typescript/typescript-win32-arm64": "7.0.2",
401
+ "@typescript/typescript-win32-x64": "7.0.2"
402
+ }
403
+ },
404
+ "node_modules/undici-types": {
405
+ "version": "7.24.6",
406
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
407
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
408
+ "dev": true,
409
+ "license": "MIT"
410
+ },
411
+ "node_modules/yaml": {
412
+ "version": "2.9.1",
413
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz",
414
+ "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==",
415
+ "license": "ISC",
416
+ "bin": {
417
+ "yaml": "bin.mjs"
418
+ },
419
+ "engines": {
420
+ "node": ">= 14.6"
421
+ },
422
+ "funding": {
423
+ "url": "https://github.com/sponsors/eemeli"
424
+ }
425
+ }
426
+ }
427
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "kataster-tooling",
3
+ "private": true,
4
+ "description": "Validators, renderers and hooks for the Kataster discovery workflow",
5
+ "type": "module",
6
+ "engines": {
7
+ "node": ">=22.18"
8
+ },
9
+ "scripts": {
10
+ "validate": "node skills/event-storming/scripts/validate-events.ts && node skills/user-stories/scripts/validate-stories.ts",
11
+ "render": "node skills/event-storming/scripts/render-event-storming.ts && node skills/user-stories/scripts/render-backlog.ts",
12
+ "typecheck": "tsc -p ."
13
+ },
14
+ "dependencies": {
15
+ "yaml": "^2.9.1"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "^24.19.2",
19
+ "typescript": "^7.0.2"
20
+ }
21
+ }