synorch 0.1.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 (105) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +56 -0
  4. package/dist/application/doctor-service.d.ts +24 -0
  5. package/dist/application/doctor-service.d.ts.map +1 -0
  6. package/dist/application/doctor-service.js +508 -0
  7. package/dist/application/doctor-service.js.map +1 -0
  8. package/dist/application/project-discovery.d.ts +23 -0
  9. package/dist/application/project-discovery.d.ts.map +1 -0
  10. package/dist/application/project-discovery.js +741 -0
  11. package/dist/application/project-discovery.js.map +1 -0
  12. package/dist/application/skill-resolver.d.ts +25 -0
  13. package/dist/application/skill-resolver.d.ts.map +1 -0
  14. package/dist/application/skill-resolver.js +90 -0
  15. package/dist/application/skill-resolver.js.map +1 -0
  16. package/dist/application/structure-service.d.ts +11 -0
  17. package/dist/application/structure-service.d.ts.map +1 -0
  18. package/dist/application/structure-service.js +116 -0
  19. package/dist/application/structure-service.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +170 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/domain/config.d.ts +210 -0
  25. package/dist/domain/config.d.ts.map +1 -0
  26. package/dist/domain/config.js +108 -0
  27. package/dist/domain/config.js.map +1 -0
  28. package/dist/domain/errors.d.ts +5 -0
  29. package/dist/domain/errors.d.ts.map +1 -0
  30. package/dist/domain/errors.js +9 -0
  31. package/dist/domain/errors.js.map +1 -0
  32. package/dist/domain/generation.d.ts +21 -0
  33. package/dist/domain/generation.d.ts.map +1 -0
  34. package/dist/domain/generation.js +2 -0
  35. package/dist/domain/generation.js.map +1 -0
  36. package/dist/domain/product.d.ts +3 -0
  37. package/dist/domain/product.d.ts.map +1 -0
  38. package/dist/domain/product.js +3 -0
  39. package/dist/domain/product.js.map +1 -0
  40. package/dist/domain/skill-packs.d.ts +39 -0
  41. package/dist/domain/skill-packs.d.ts.map +1 -0
  42. package/dist/domain/skill-packs.js +98 -0
  43. package/dist/domain/skill-packs.js.map +1 -0
  44. package/dist/domain/skill-sources.d.ts +20 -0
  45. package/dist/domain/skill-sources.d.ts.map +1 -0
  46. package/dist/domain/skill-sources.js +95 -0
  47. package/dist/domain/skill-sources.js.map +1 -0
  48. package/dist/infrastructure/bundled-skill-library.d.ts +10 -0
  49. package/dist/infrastructure/bundled-skill-library.d.ts.map +1 -0
  50. package/dist/infrastructure/bundled-skill-library.js +108 -0
  51. package/dist/infrastructure/bundled-skill-library.js.map +1 -0
  52. package/dist/infrastructure/file-system.d.ts +21 -0
  53. package/dist/infrastructure/file-system.d.ts.map +1 -0
  54. package/dist/infrastructure/file-system.js +72 -0
  55. package/dist/infrastructure/file-system.js.map +1 -0
  56. package/dist/infrastructure/serialization.d.ts +3 -0
  57. package/dist/infrastructure/serialization.d.ts.map +1 -0
  58. package/dist/infrastructure/serialization.js +11 -0
  59. package/dist/infrastructure/serialization.js.map +1 -0
  60. package/dist/templates/structure-templates.d.ts +4 -0
  61. package/dist/templates/structure-templates.d.ts.map +1 -0
  62. package/dist/templates/structure-templates.js +471 -0
  63. package/dist/templates/structure-templates.js.map +1 -0
  64. package/dist/templates/technology-skill-templates.d.ts +3 -0
  65. package/dist/templates/technology-skill-templates.d.ts.map +1 -0
  66. package/dist/templates/technology-skill-templates.js +73 -0
  67. package/dist/templates/technology-skill-templates.js.map +1 -0
  68. package/package.json +59 -0
  69. package/skill-sources/ingenium/NOTICE.md +11 -0
  70. package/skill-sources/ingenium/skills/db-schema-craft/SKILL.md +127 -0
  71. package/skill-sources/ingenium/skills/debug-detective/SKILL.md +67 -0
  72. package/skill-sources/ingenium/skills/design-system/SKILL.md +57 -0
  73. package/skill-sources/ingenium/skills/docs-sync/SKILL.md +68 -0
  74. package/skill-sources/ingenium/skills/dotnet-backend/SKILL.md +110 -0
  75. package/skill-sources/ingenium/skills/frontend-craft/SKILL.md +69 -0
  76. package/skill-sources/ingenium/skills/game-audio/SKILL.md +73 -0
  77. package/skill-sources/ingenium/skills/game-design/SKILL.md +92 -0
  78. package/skill-sources/ingenium/skills/godot-dev/SKILL.md +78 -0
  79. package/skill-sources/ingenium/skills/human-made-design/SKILL.md +73 -0
  80. package/skill-sources/ingenium/skills/java-backend/SKILL.md +98 -0
  81. package/skill-sources/ingenium/skills/jev/SKILL.md +150 -0
  82. package/skill-sources/ingenium/skills/motion-craft/SKILL.md +66 -0
  83. package/skill-sources/ingenium/skills/multiplayer-netcode/SKILL.md +63 -0
  84. package/skill-sources/ingenium/skills/node-backend/SKILL.md +113 -0
  85. package/skill-sources/ingenium/skills/node-backend/reference.md +144 -0
  86. package/skill-sources/ingenium/skills/perf-audit/SKILL.md +70 -0
  87. package/skill-sources/ingenium/skills/pixel-art-assets/SKILL.md +91 -0
  88. package/skill-sources/ingenium/skills/pixel-art-assets/scripts/px.py +169 -0
  89. package/skill-sources/ingenium/skills/pixel-game-dev/SKILL.md +79 -0
  90. package/skill-sources/ingenium/skills/project-onboard/SKILL.md +78 -0
  91. package/skill-sources/ingenium/skills/pwa-offline/SKILL.md +70 -0
  92. package/skill-sources/ingenium/skills/query-tuning/SKILL.md +137 -0
  93. package/skill-sources/ingenium/skills/react-modern/SKILL.md +92 -0
  94. package/skill-sources/ingenium/skills/refactor-safe/SKILL.md +63 -0
  95. package/skill-sources/ingenium/skills/release-prep/SKILL.md +57 -0
  96. package/skill-sources/ingenium/skills/safe-merge/SKILL.md +91 -0
  97. package/skill-sources/ingenium/skills/session-recap/SKILL.md +95 -0
  98. package/skill-sources/ingenium/skills/session-recap/scripts/extract_session.py +409 -0
  99. package/skill-sources/ingenium/skills/shader-vfx/SKILL.md +70 -0
  100. package/skill-sources/ingenium/skills/tailwind-v4-tokens/SKILL.md +165 -0
  101. package/skill-sources/ingenium/skills/task-conductor/SKILL.md +158 -0
  102. package/skill-sources/ingenium/skills/tauri-game-dev/SKILL.md +81 -0
  103. package/skill-sources/ingenium/skills/ui-ux-design/SKILL.md +96 -0
  104. package/skill-sources/ingenium/skills/vue-modern/SKILL.md +88 -0
  105. package/skill-sources/ingenium/skills/web-kickoff/SKILL.md +63 -0
@@ -0,0 +1,95 @@
1
+ export const SKILL_SOURCES = [
2
+ {
3
+ id: "ingenium",
4
+ name: "Ingenium",
5
+ repository: null,
6
+ revision: "local-snapshot-2026-09-20",
7
+ license: "Project-owned",
8
+ trust: "bundled",
9
+ notes: "Bundled from the project owner's Ingenium plugin skill library.",
10
+ },
11
+ {
12
+ id: "anthropic-skills",
13
+ name: "Anthropic Agent Skills",
14
+ repository: "https://github.com/anthropics/skills",
15
+ revision: "34040c9c568585f6929bedeaad110ad08f079624",
16
+ license: "Mixed: Apache-2.0 and source-available; inspect per skill",
17
+ trust: "reference-only",
18
+ notes: "Official format and implementation reference; content is not auto-imported.",
19
+ },
20
+ {
21
+ id: "superpowers",
22
+ name: "Superpowers",
23
+ repository: "https://github.com/obra/superpowers",
24
+ revision: "5bf4e78011075bcfc0dc295f0724994cd123ee71",
25
+ license: "MIT",
26
+ trust: "reference-only",
27
+ notes: "Mature engineering methodology; not auto-activated because it can overlap orchestration protocols.",
28
+ },
29
+ {
30
+ id: "microsoft-skills",
31
+ name: "Microsoft Agent Skills",
32
+ repository: "https://github.com/microsoft/skills",
33
+ revision: "14655200e871a89c013803b3aa4d88202cb03fc1",
34
+ license: "MIT",
35
+ trust: "reference-only",
36
+ notes: "Large Azure and Foundry catalog; import only when matching platform evidence exists.",
37
+ },
38
+ ];
39
+ const AUTOMATIC_SKILLS = {
40
+ "frontend-craft": [{ kind: "framework", values: ["react", "nextjs", "vue", "nuxt", "angular"] }],
41
+ "react-modern": [{ kind: "framework", values: ["react", "nextjs"] }],
42
+ "vue-modern": [{ kind: "framework", values: ["vue", "nuxt"] }],
43
+ "java-backend": [
44
+ { kind: "language", values: ["java"] },
45
+ { kind: "framework", values: ["spring-boot"] },
46
+ ],
47
+ "node-backend": [{ kind: "framework", values: ["express", "fastify", "nestjs"] }],
48
+ "db-schema-craft": [{ kind: "framework", values: ["jpa", "hibernate"] }],
49
+ "query-tuning": [{ kind: "framework", values: ["jpa", "hibernate"] }],
50
+ "tailwind-v4-tokens": [
51
+ { kind: "dependency", values: ["tailwindcss", "@tailwindcss/vite", "@tailwindcss/postcss"] },
52
+ ],
53
+ };
54
+ const INGENIUM_SKILL_IDS = [
55
+ "db-schema-craft",
56
+ "debug-detective",
57
+ "design-system",
58
+ "docs-sync",
59
+ "dotnet-backend",
60
+ "frontend-craft",
61
+ "game-audio",
62
+ "game-design",
63
+ "godot-dev",
64
+ "human-made-design",
65
+ "java-backend",
66
+ "jev",
67
+ "motion-craft",
68
+ "multiplayer-netcode",
69
+ "node-backend",
70
+ "perf-audit",
71
+ "pixel-art-assets",
72
+ "pixel-game-dev",
73
+ "project-onboard",
74
+ "pwa-offline",
75
+ "query-tuning",
76
+ "react-modern",
77
+ "refactor-safe",
78
+ "release-prep",
79
+ "safe-merge",
80
+ "session-recap",
81
+ "shader-vfx",
82
+ "tailwind-v4-tokens",
83
+ "task-conductor",
84
+ "tauri-game-dev",
85
+ "ui-ux-design",
86
+ "vue-modern",
87
+ "web-kickoff",
88
+ ];
89
+ export const BUNDLED_SKILLS = INGENIUM_SKILL_IDS.map((id) => ({
90
+ id,
91
+ sourceId: "ingenium",
92
+ activation: AUTOMATIC_SKILLS[id] === undefined ? "on-demand" : "automatic",
93
+ triggers: AUTOMATIC_SKILLS[id] ?? [],
94
+ }));
95
+ //# sourceMappingURL=skill-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-sources.js","sourceRoot":"","sources":["../../src/domain/skill-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface BundledSkillFile {
2
+ readonly content: string;
3
+ readonly relativePath: string;
4
+ }
5
+ export interface BundledSkillPool {
6
+ readonly catalogContent: string;
7
+ readonly files: readonly BundledSkillFile[];
8
+ }
9
+ export declare function loadBundledSkillPool(): Promise<BundledSkillPool>;
10
+ //# sourceMappingURL=bundled-skill-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-skill-library.d.ts","sourceRoot":"","sources":["../../src/infrastructure/bundled-skill-library.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC7C;AASD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA8CtE"}
@@ -0,0 +1,108 @@
1
+ import { readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { BUNDLED_SKILLS, SKILL_SOURCES } from "../domain/skill-sources.js";
5
+ import { parseYaml, stringifyYaml } from "./serialization.js";
6
+ const SOURCE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "skill-sources");
7
+ export async function loadBundledSkillPool() {
8
+ const files = [];
9
+ const catalogSkills = [];
10
+ for (const skill of BUNDLED_SKILLS) {
11
+ const sourceDirectory = safeBundledPath(skill.sourceId, "skills", skill.id);
12
+ const skillFiles = await readSkillDirectory(sourceDirectory);
13
+ const entrypoint = skillFiles.find((file) => file.relativePath === "SKILL.md");
14
+ if (entrypoint === undefined) {
15
+ throw new Error(`Bundled skill '${skill.sourceId}/${skill.id}' has no SKILL.md.`);
16
+ }
17
+ const description = readSkillDescription(entrypoint.content, skill.id);
18
+ const targetRoot = `.ai/skills/library/${skill.sourceId}/${skill.id}`;
19
+ for (const file of skillFiles) {
20
+ files.push({
21
+ content: file.content,
22
+ relativePath: `${targetRoot}/${file.relativePath}`,
23
+ });
24
+ }
25
+ catalogSkills.push({
26
+ id: skill.id,
27
+ source_id: skill.sourceId,
28
+ activation: skill.activation,
29
+ relative_path: `${targetRoot}/SKILL.md`,
30
+ description,
31
+ });
32
+ }
33
+ return {
34
+ files: files.sort((left, right) => left.relativePath.localeCompare(right.relativePath)),
35
+ catalogContent: stringifyYaml({
36
+ schema_version: 1,
37
+ sources: SKILL_SOURCES.map((source) => ({
38
+ id: source.id,
39
+ name: source.name,
40
+ repository: source.repository,
41
+ revision: source.revision,
42
+ license: source.license,
43
+ trust: source.trust,
44
+ notes: source.notes,
45
+ })),
46
+ skills: catalogSkills.sort((left, right) => String(left["id"]).localeCompare(String(right["id"]))),
47
+ }),
48
+ };
49
+ }
50
+ async function readSkillDirectory(directory) {
51
+ const queue = [
52
+ { absolute: directory, relative: "" },
53
+ ];
54
+ const files = [];
55
+ while (queue.length > 0) {
56
+ const current = queue.shift();
57
+ if (current === undefined)
58
+ break;
59
+ const entries = await readdir(current.absolute, { withFileTypes: true });
60
+ entries.sort((left, right) => left.name.localeCompare(right.name));
61
+ for (const entry of entries) {
62
+ if (entry.isSymbolicLink()) {
63
+ throw new Error(`Bundled skill contains a symbolic link: ${entry.name}`);
64
+ }
65
+ const absolute = path.join(current.absolute, entry.name);
66
+ const relative = normalizePath(path.join(current.relative, entry.name));
67
+ if (entry.isDirectory()) {
68
+ queue.push({ absolute, relative });
69
+ }
70
+ else if (entry.isFile()) {
71
+ files.push({ relativePath: relative, content: await readFile(absolute, "utf8") });
72
+ }
73
+ }
74
+ }
75
+ return files;
76
+ }
77
+ function readSkillDescription(content, skillId) {
78
+ const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(content);
79
+ if (match?.[1] === undefined) {
80
+ throw new Error(`Bundled skill '${skillId}' has invalid frontmatter.`);
81
+ }
82
+ const parsed = parseYaml(match[1]);
83
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
84
+ throw new Error(`Bundled skill '${skillId}' frontmatter must be an object.`);
85
+ }
86
+ const description = parsed["description"];
87
+ if (typeof description !== "string" || description.trim().length === 0) {
88
+ throw new Error(`Bundled skill '${skillId}' has no description.`);
89
+ }
90
+ return description.trim();
91
+ }
92
+ function safeBundledPath(...segments) {
93
+ for (const segment of segments) {
94
+ if (!/^[a-z0-9.-]+$/.test(segment)) {
95
+ throw new Error(`Unsafe bundled skill path segment: ${segment}`);
96
+ }
97
+ }
98
+ const resolved = path.resolve(SOURCE_ROOT, ...segments);
99
+ const boundary = path.relative(SOURCE_ROOT, resolved);
100
+ if (boundary === ".." || boundary.startsWith(`..${path.sep}`) || path.isAbsolute(boundary)) {
101
+ throw new Error(`Bundled skill path escapes source root: ${resolved}`);
102
+ }
103
+ return resolved;
104
+ }
105
+ function normalizePath(value) {
106
+ return value.replaceAll("\\", "/");
107
+ }
108
+ //# sourceMappingURL=bundled-skill-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-skill-library.js","sourceRoot":"","sources":["../../src/infrastructure/bundled-skill-library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface DirectoryEntry {
2
+ readonly name: string;
3
+ readonly isDirectory: boolean;
4
+ }
5
+ export interface FileSystem {
6
+ assertPathWithinRoot(rootPath: string, targetPath: string): Promise<void>;
7
+ exists(filePath: string): Promise<boolean>;
8
+ isDirectory(filePath: string): Promise<boolean>;
9
+ readText(filePath: string): Promise<string>;
10
+ writeText(filePath: string, content: string): Promise<void>;
11
+ list(directoryPath: string): Promise<readonly DirectoryEntry[]>;
12
+ }
13
+ export declare class NodeFileSystem implements FileSystem {
14
+ assertPathWithinRoot(rootPath: string, targetPath: string): Promise<void>;
15
+ exists(filePath: string): Promise<boolean>;
16
+ isDirectory(filePath: string): Promise<boolean>;
17
+ readText(filePath: string): Promise<string>;
18
+ writeText(filePath: string, content: string): Promise<void>;
19
+ list(directoryPath: string): Promise<readonly DirectoryEntry[]>;
20
+ }
21
+ //# sourceMappingURL=file-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/infrastructure/file-system.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;CACjE;AAED,qBAAa,cAAe,YAAW,UAAU;IAClC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBzE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;CAO7E"}
@@ -0,0 +1,72 @@
1
+ import { lstat, mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export class NodeFileSystem {
4
+ async assertPathWithinRoot(rootPath, targetPath) {
5
+ const lexicalRoot = path.resolve(rootPath);
6
+ const lexicalTarget = path.resolve(targetPath);
7
+ assertContainedPath(lexicalRoot, lexicalTarget);
8
+ const canonicalRoot = await realpath(lexicalRoot);
9
+ const relativeTarget = path.relative(lexicalRoot, lexicalTarget);
10
+ let currentPath = lexicalRoot;
11
+ for (const segment of relativeTarget.split(path.sep).filter((value) => value.length > 0)) {
12
+ currentPath = path.join(currentPath, segment);
13
+ try {
14
+ await lstat(currentPath);
15
+ }
16
+ catch (error) {
17
+ if (isMissingFileError(error))
18
+ break;
19
+ throw error;
20
+ }
21
+ const canonicalPath = await realpath(currentPath);
22
+ assertContainedPath(canonicalRoot, canonicalPath);
23
+ }
24
+ }
25
+ async exists(filePath) {
26
+ try {
27
+ await stat(filePath);
28
+ return true;
29
+ }
30
+ catch (error) {
31
+ if (isMissingFileError(error)) {
32
+ return false;
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+ async isDirectory(filePath) {
38
+ try {
39
+ return (await stat(filePath)).isDirectory();
40
+ }
41
+ catch (error) {
42
+ if (isMissingFileError(error)) {
43
+ return false;
44
+ }
45
+ throw error;
46
+ }
47
+ }
48
+ readText(filePath) {
49
+ return readFile(filePath, "utf8");
50
+ }
51
+ async writeText(filePath, content) {
52
+ await mkdir(path.dirname(filePath), { recursive: true });
53
+ await writeFile(filePath, content, "utf8");
54
+ }
55
+ async list(directoryPath) {
56
+ const entries = await readdir(directoryPath, { withFileTypes: true });
57
+ return entries.map((entry) => ({
58
+ name: entry.name,
59
+ isDirectory: entry.isDirectory(),
60
+ }));
61
+ }
62
+ }
63
+ function assertContainedPath(rootPath, targetPath) {
64
+ const relative = path.relative(rootPath, targetPath);
65
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
66
+ throw new Error(`Path escapes root through a symbolic link or junction: ${targetPath}`);
67
+ }
68
+ }
69
+ function isMissingFileError(error) {
70
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
71
+ }
72
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/infrastructure/file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function parseYaml(content: string): unknown;
2
+ export declare function stringifyYaml(value: unknown): string;
3
+ //# sourceMappingURL=serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/infrastructure/serialization.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKpD"}
@@ -0,0 +1,11 @@
1
+ import { parse, stringify } from "yaml";
2
+ export function parseYaml(content) {
3
+ return parse(content);
4
+ }
5
+ export function stringifyYaml(value) {
6
+ return stringify(value, {
7
+ indent: 2,
8
+ lineWidth: 0,
9
+ });
10
+ }
11
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/infrastructure/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAExC,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,SAAS,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FileDefinition } from "../domain/generation.ts";
2
+ import type { StructureScope } from "../domain/config.ts";
3
+ export declare function createStructureFiles(scope: StructureScope): readonly FileDefinition[];
4
+ //# sourceMappingURL=structure-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-templates.d.ts","sourceRoot":"","sources":["../../src/templates/structure-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,cAAc,EAAE,CAyDrF"}