kirograph 0.12.2 → 0.13.1

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 (92) hide show
  1. package/README.md +197 -87
  2. package/dist/architecture/layers/index.js +9 -1
  3. package/dist/architecture/layers/index.js.map +2 -2
  4. package/dist/architecture/layers/ocaml.js +105 -0
  5. package/dist/architecture/layers/ocaml.js.map +7 -0
  6. package/dist/architecture/layers/scala.js +120 -0
  7. package/dist/architecture/layers/scala.js.map +7 -0
  8. package/dist/architecture/layers/solidity.js +105 -0
  9. package/dist/architecture/layers/solidity.js.map +7 -0
  10. package/dist/architecture/layers/vue.js +111 -0
  11. package/dist/architecture/layers/vue.js.map +7 -0
  12. package/dist/architecture/manifest/elm.js +91 -0
  13. package/dist/architecture/manifest/elm.js.map +7 -0
  14. package/dist/architecture/manifest/index.js +13 -2
  15. package/dist/architecture/manifest/index.js.map +2 -2
  16. package/dist/architecture/manifest/ocaml.js +166 -0
  17. package/dist/architecture/manifest/ocaml.js.map +7 -0
  18. package/dist/architecture/manifest/scala.js +117 -0
  19. package/dist/architecture/manifest/scala.js.map +7 -0
  20. package/dist/bin/commands/caveman.js +12 -0
  21. package/dist/bin/commands/caveman.js.map +2 -2
  22. package/dist/bin/commands/help.js +6 -4
  23. package/dist/bin/commands/help.js.map +2 -2
  24. package/dist/bin/commands/install.js +8 -2
  25. package/dist/bin/commands/install.js.map +2 -2
  26. package/dist/bin/commands/serve.js +2 -2
  27. package/dist/bin/commands/serve.js.map +2 -2
  28. package/dist/bin/commands/uninit.js +65 -41
  29. package/dist/bin/commands/uninit.js.map +2 -2
  30. package/dist/bin/installer/cli-agent.js +5 -25
  31. package/dist/bin/installer/cli-agent.js.map +2 -2
  32. package/dist/bin/installer/common.js +154 -0
  33. package/dist/bin/installer/common.js.map +7 -0
  34. package/dist/bin/installer/hooks.js +21 -1
  35. package/dist/bin/installer/hooks.js.map +2 -2
  36. package/dist/bin/installer/index.js +99 -86
  37. package/dist/bin/installer/index.js.map +2 -2
  38. package/dist/bin/installer/instructions.js +60 -0
  39. package/dist/bin/installer/instructions.js.map +7 -0
  40. package/dist/bin/installer/mcp.js +6 -36
  41. package/dist/bin/installer/mcp.js.map +2 -2
  42. package/dist/bin/installer/targets/claude.js +79 -0
  43. package/dist/bin/installer/targets/claude.js.map +7 -0
  44. package/dist/bin/installer/targets/codex.js +77 -0
  45. package/dist/bin/installer/targets/codex.js.map +7 -0
  46. package/dist/bin/installer/targets/index.js +57 -0
  47. package/dist/bin/installer/targets/index.js.map +7 -0
  48. package/dist/bin/installer/targets/kiro.js +61 -0
  49. package/dist/bin/installer/targets/kiro.js.map +7 -0
  50. package/dist/bin/kirograph.js +1 -1
  51. package/dist/extraction/extractor.js +65 -2
  52. package/dist/extraction/extractor.js.map +2 -2
  53. package/dist/extraction/grammars.js +22 -0
  54. package/dist/extraction/grammars.js.map +2 -2
  55. package/dist/extraction/languages.js +39 -1
  56. package/dist/extraction/languages.js.map +2 -2
  57. package/dist/extraction/wasm/tree-sitter-hcl.wasm +0 -0
  58. package/dist/extraction/wasm/tree-sitter-scss.wasm +0 -0
  59. package/dist/frameworks/amplify.js +175 -0
  60. package/dist/frameworks/amplify.js.map +7 -0
  61. package/dist/frameworks/angular.js +132 -0
  62. package/dist/frameworks/angular.js.map +7 -0
  63. package/dist/frameworks/ansible.js +151 -0
  64. package/dist/frameworks/ansible.js.map +7 -0
  65. package/dist/frameworks/cloudformation.js +148 -0
  66. package/dist/frameworks/cloudformation.js.map +7 -0
  67. package/dist/frameworks/docker.js +149 -0
  68. package/dist/frameworks/docker.js.map +7 -0
  69. package/dist/frameworks/iac.js +401 -0
  70. package/dist/frameworks/iac.js.map +7 -0
  71. package/dist/frameworks/index.js +81 -3
  72. package/dist/frameworks/index.js.map +3 -3
  73. package/dist/frameworks/kubernetes.js +176 -0
  74. package/dist/frameworks/kubernetes.js.map +7 -0
  75. package/dist/frameworks/pulumi.js +93 -0
  76. package/dist/frameworks/pulumi.js.map +7 -0
  77. package/dist/frameworks/scala.js +124 -0
  78. package/dist/frameworks/scala.js.map +7 -0
  79. package/dist/frameworks/solidity.js +93 -0
  80. package/dist/frameworks/solidity.js.map +7 -0
  81. package/dist/frameworks/terraform.js +278 -0
  82. package/dist/frameworks/terraform.js.map +7 -0
  83. package/dist/frameworks/vue.js +163 -0
  84. package/dist/frameworks/vue.js.map +7 -0
  85. package/dist/graph/queries.js +1 -1
  86. package/dist/graph/queries.js.map +1 -1
  87. package/dist/mcp/tool-names.js +48 -0
  88. package/dist/mcp/tool-names.js.map +7 -0
  89. package/dist/mcp/tools.js +3 -0
  90. package/dist/mcp/tools.js.map +2 -2
  91. package/dist/types.js.map +2 -2
  92. package/package.json +2 -2
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var elm_exports = {};
30
+ __export(elm_exports, {
31
+ elmParser: () => elmParser
32
+ });
33
+ module.exports = __toCommonJS(elm_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ const elmParser = {
37
+ name: "elm",
38
+ manifestFiles: ["elm.json"],
39
+ language: "elm",
40
+ canParse(manifestPath) {
41
+ return path.basename(manifestPath) === "elm.json";
42
+ },
43
+ async parse(manifestPath, projectRoot) {
44
+ let content;
45
+ try {
46
+ content = fs.readFileSync(manifestPath, "utf8");
47
+ } catch {
48
+ return [];
49
+ }
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(content);
53
+ } catch {
54
+ return [];
55
+ }
56
+ const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\/g, "/") || ".";
57
+ const relManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
58
+ const type = parsed["type"];
59
+ const externalDeps = [];
60
+ if (type === "application") {
61
+ const deps = parsed["dependencies"];
62
+ if (deps?.direct) {
63
+ externalDeps.push(...Object.keys(deps.direct));
64
+ }
65
+ } else if (type === "package") {
66
+ const deps = parsed["dependencies"];
67
+ if (deps) {
68
+ externalDeps.push(...Object.keys(deps));
69
+ }
70
+ }
71
+ const name = parsed["name"] ?? path.basename(path.dirname(manifestPath));
72
+ const version = parsed["version"];
73
+ return [{
74
+ id: `pkg:elm:${relDir}`,
75
+ name,
76
+ path: relDir,
77
+ source: "manifest",
78
+ language: "elm",
79
+ manifestPath: relManifest,
80
+ version,
81
+ externalDeps,
82
+ metadata: { type: type ?? "unknown" },
83
+ updatedAt: Date.now()
84
+ }];
85
+ }
86
+ };
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ elmParser
90
+ });
91
+ //# sourceMappingURL=elm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/architecture/manifest/elm.ts"],
4
+ "sourcesContent": ["/**\n * Elm elm.json manifest parser.\n * Handles both application and package elm.json files.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ManifestParser, ArchPackage } from '../types';\n\nexport const elmParser: ManifestParser = {\n name: 'elm',\n manifestFiles: ['elm.json'],\n language: 'elm',\n\n canParse(manifestPath: string): boolean {\n return path.basename(manifestPath) === 'elm.json';\n },\n\n async parse(manifestPath: string, projectRoot: string): Promise<ArchPackage[]> {\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch {\n return [];\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content);\n } catch {\n return [];\n }\n\n const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\\\/g, '/') || '.';\n const relManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n\n const type = parsed['type'] as string | undefined;\n const externalDeps: string[] = [];\n\n if (type === 'application') {\n // Application: dependencies are in dependencies.direct and dependencies.indirect\n const deps = parsed['dependencies'] as Record<string, Record<string, string>> | undefined;\n if (deps?.direct) {\n externalDeps.push(...Object.keys(deps.direct));\n }\n } else if (type === 'package') {\n // Package: dependencies are a flat object\n const deps = parsed['dependencies'] as Record<string, string> | undefined;\n if (deps) {\n externalDeps.push(...Object.keys(deps));\n }\n }\n\n // Package name: for packages it's in \"name\", for applications use directory name\n const name = (parsed['name'] as string) ?? path.basename(path.dirname(manifestPath));\n const version = parsed['version'] as string | undefined;\n\n return [{\n id: `pkg:elm:${relDir}`,\n name,\n path: relDir,\n source: 'manifest',\n language: 'elm',\n manifestPath: relManifest,\n version,\n externalDeps,\n metadata: { type: type ?? 'unknown' },\n updatedAt: Date.now(),\n }];\n },\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAoB;AACpB,WAAsB;AAGf,MAAM,YAA4B;AAAA,EACvC,MAAM;AAAA,EACN,eAAe,CAAC,UAAU;AAAA,EAC1B,UAAU;AAAA,EAEV,SAAS,cAA+B;AACtC,WAAO,KAAK,SAAS,YAAY,MAAM;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,cAAsB,aAA6C;AAC7E,QAAI;AACJ,QAAI;AACF,gBAAU,GAAG,aAAa,cAAc,MAAM;AAAA,IAChD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,KAAK,SAAS,aAAa,KAAK,QAAQ,YAAY,CAAC,EAAE,QAAQ,OAAO,GAAG,KAAK;AAC7F,UAAM,cAAc,KAAK,SAAS,aAAa,YAAY,EAAE,QAAQ,OAAO,GAAG;AAE/E,UAAM,OAAO,OAAO,MAAM;AAC1B,UAAM,eAAyB,CAAC;AAEhC,QAAI,SAAS,eAAe;AAE1B,YAAM,OAAO,OAAO,cAAc;AAClC,UAAI,MAAM,QAAQ;AAChB,qBAAa,KAAK,GAAG,OAAO,KAAK,KAAK,MAAM,CAAC;AAAA,MAC/C;AAAA,IACF,WAAW,SAAS,WAAW;AAE7B,YAAM,OAAO,OAAO,cAAc;AAClC,UAAI,MAAM;AACR,qBAAa,KAAK,GAAG,OAAO,KAAK,IAAI,CAAC;AAAA,MACxC;AAAA,IACF;AAGA,UAAM,OAAQ,OAAO,MAAM,KAAgB,KAAK,SAAS,KAAK,QAAQ,YAAY,CAAC;AACnF,UAAM,UAAU,OAAO,SAAS;AAEhC,WAAO,CAAC;AAAA,MACN,IAAI,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA,UAAU,EAAE,MAAM,QAAQ,UAAU;AAAA,MACpC,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -43,6 +43,9 @@ var import_python = require("./python");
43
43
  var import_maven = require("./maven");
44
44
  var import_gradle = require("./gradle");
45
45
  var import_csproj = require("./csproj");
46
+ var import_scala = require("./scala");
47
+ var import_ocaml = require("./ocaml");
48
+ var import_elm = require("./elm");
46
49
  const MANIFEST_PARSERS = [
47
50
  import_npm.npmParser,
48
51
  import_go.goParser,
@@ -50,7 +53,10 @@ const MANIFEST_PARSERS = [
50
53
  import_python.pythonParser,
51
54
  import_maven.mavenParser,
52
55
  import_gradle.gradleParser,
53
- import_csproj.csprojParser
56
+ import_csproj.csprojParser,
57
+ import_scala.sbtParser,
58
+ import_ocaml.ocamlParser,
59
+ import_elm.elmParser
54
60
  ];
55
61
  const MANIFEST_FILENAMES = new Set(
56
62
  MANIFEST_PARSERS.flatMap((p) => p.manifestFiles)
@@ -67,7 +73,12 @@ const SKIP_DIRS = /* @__PURE__ */ new Set([
67
73
  "vendor",
68
74
  ".cache",
69
75
  "coverage",
70
- ".nyc_output"
76
+ ".nyc_output",
77
+ "_build",
78
+ "_opam",
79
+ "elm-stuff",
80
+ "zig-cache",
81
+ "zig-out"
71
82
  ]);
72
83
  function getAllManifestParsers() {
73
84
  return MANIFEST_PARSERS;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/architecture/manifest/index.ts"],
4
- "sourcesContent": ["/**\n * Manifest Parser Registry\n *\n * Discovers and dispatches manifest parsers. Each parser handles one or more\n * manifest file types. The registry walks the project looking for manifest files\n * and assigns them to the correct parser.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ManifestParser, ArchPackage } from '../types';\nimport { npmParser } from './npm';\nimport { goParser } from './go';\nimport { cargoParser } from './cargo';\nimport { pythonParser } from './python';\nimport { mavenParser } from './maven';\nimport { gradleParser } from './gradle';\nimport { csprojParser } from './csproj';\n\n// All registered manifest parsers, in priority order\nconst MANIFEST_PARSERS: ManifestParser[] = [\n npmParser,\n goParser,\n cargoParser,\n pythonParser,\n mavenParser,\n gradleParser,\n csprojParser,\n];\n\n// All manifest filenames we care about (for fast lookup during directory walk)\nconst MANIFEST_FILENAMES = new Set(\n MANIFEST_PARSERS.flatMap(p => p.manifestFiles)\n);\n\n// Directories to never descend into when scanning for manifests\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'target', '.gradle', '__pycache__',\n '.kirograph', 'vendor', '.cache', 'coverage', '.nyc_output',\n]);\n\nexport function getAllManifestParsers(): ManifestParser[] {\n return MANIFEST_PARSERS;\n}\n\nexport function getManifestParser(name: string): ManifestParser | undefined {\n return MANIFEST_PARSERS.find(p => p.name === name);\n}\n\nexport function registerManifestParser(parser: ManifestParser): void {\n const idx = MANIFEST_PARSERS.findIndex(p => p.name === parser.name);\n if (idx >= 0) MANIFEST_PARSERS[idx] = parser;\n else MANIFEST_PARSERS.push(parser);\n}\n\n/**\n * Walk projectRoot looking for manifest files, parse each, deduplicate, and\n * return all detected packages. Packages from manifests take priority; the\n * deduplication ensures that a workspace root pom.xml and a sub-module\n * pom.xml don't produce overlapping directory mappings.\n */\nexport async function parseAllManifests(projectRoot: string): Promise<ArchPackage[]> {\n const manifestPaths = _findManifests(projectRoot);\n const all: ArchPackage[] = [];\n const seenIds = new Set<string>();\n\n for (const manifestPath of manifestPaths) {\n const parser = MANIFEST_PARSERS.find(p => p.canParse(manifestPath));\n if (!parser) continue;\n try {\n const pkgs = await parser.parse(manifestPath, projectRoot);\n for (const pkg of pkgs) {\n if (!seenIds.has(pkg.id)) {\n seenIds.add(pkg.id);\n all.push(pkg);\n }\n }\n } catch {\n // Ignore parse errors for individual manifests\n }\n }\n\n return all;\n}\n\nfunction _findManifests(dir: string, results: string[] = []): string[] {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name)) {\n _findManifests(path.join(dir, entry.name), results);\n }\n } else if (entry.isFile()) {\n // Check exact filename or extension match\n if (MANIFEST_FILENAMES.has(entry.name) || entry.name.endsWith('.csproj')) {\n results.push(path.join(dir, entry.name));\n }\n }\n }\n\n return results;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAoB;AACpB,WAAsB;AAEtB,iBAA0B;AAC1B,gBAAyB;AACzB,mBAA4B;AAC5B,oBAA6B;AAC7B,mBAA4B;AAC5B,oBAA6B;AAC7B,oBAA6B;AAG7B,MAAM,mBAAqC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,qBAAqB,IAAI;AAAA,EAC7B,iBAAiB,QAAQ,OAAK,EAAE,aAAa;AAC/C;AAGA,MAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAW;AAAA,EAC9D;AAAA,EAAc;AAAA,EAAU;AAAA,EAAU;AAAA,EAAY;AAChD,CAAC;AAEM,SAAS,wBAA0C;AACxD,SAAO;AACT;AAEO,SAAS,kBAAkB,MAA0C;AAC1E,SAAO,iBAAiB,KAAK,OAAK,EAAE,SAAS,IAAI;AACnD;AAEO,SAAS,uBAAuB,QAA8B;AACnE,QAAM,MAAM,iBAAiB,UAAU,OAAK,EAAE,SAAS,OAAO,IAAI;AAClE,MAAI,OAAO,EAAG,kBAAiB,GAAG,IAAI;AAAA,MACjC,kBAAiB,KAAK,MAAM;AACnC;AAQA,eAAsB,kBAAkB,aAA6C;AACnF,QAAM,gBAAgB,eAAe,WAAW;AAChD,QAAM,MAAqB,CAAC;AAC5B,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,gBAAgB,eAAe;AACxC,UAAM,SAAS,iBAAiB,KAAK,OAAK,EAAE,SAAS,YAAY,CAAC;AAClE,QAAI,CAAC,OAAQ;AACb,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,MAAM,cAAc,WAAW;AACzD,iBAAW,OAAO,MAAM;AACtB,YAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG;AACxB,kBAAQ,IAAI,IAAI,EAAE;AAClB,cAAI,KAAK,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,UAAoB,CAAC,GAAa;AACrE,MAAI;AACJ,MAAI;AACF,cAAU,GAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,GAAG;AACvB,UAAI,CAAC,UAAU,IAAI,MAAM,IAAI,GAAG;AAC9B,uBAAe,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,OAAO;AAAA,MACpD;AAAA,IACF,WAAW,MAAM,OAAO,GAAG;AAEzB,UAAI,mBAAmB,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,SAAS,GAAG;AACxE,gBAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * Manifest Parser Registry\n *\n * Discovers and dispatches manifest parsers. Each parser handles one or more\n * manifest file types. The registry walks the project looking for manifest files\n * and assigns them to the correct parser.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ManifestParser, ArchPackage } from '../types';\nimport { npmParser } from './npm';\nimport { goParser } from './go';\nimport { cargoParser } from './cargo';\nimport { pythonParser } from './python';\nimport { mavenParser } from './maven';\nimport { gradleParser } from './gradle';\nimport { csprojParser } from './csproj';\nimport { sbtParser } from './scala';\nimport { ocamlParser } from './ocaml';\nimport { elmParser } from './elm';\n\n// All registered manifest parsers, in priority order\nconst MANIFEST_PARSERS: ManifestParser[] = [\n npmParser,\n goParser,\n cargoParser,\n pythonParser,\n mavenParser,\n gradleParser,\n csprojParser,\n sbtParser,\n ocamlParser,\n elmParser,\n];\n\n// All manifest filenames we care about (for fast lookup during directory walk)\nconst MANIFEST_FILENAMES = new Set(\n MANIFEST_PARSERS.flatMap(p => p.manifestFiles)\n);\n\n// Directories to never descend into when scanning for manifests\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'target', '.gradle', '__pycache__',\n '.kirograph', 'vendor', '.cache', 'coverage', '.nyc_output', '_build', '_opam',\n 'elm-stuff', 'zig-cache', 'zig-out',\n]);\n\nexport function getAllManifestParsers(): ManifestParser[] {\n return MANIFEST_PARSERS;\n}\n\nexport function getManifestParser(name: string): ManifestParser | undefined {\n return MANIFEST_PARSERS.find(p => p.name === name);\n}\n\nexport function registerManifestParser(parser: ManifestParser): void {\n const idx = MANIFEST_PARSERS.findIndex(p => p.name === parser.name);\n if (idx >= 0) MANIFEST_PARSERS[idx] = parser;\n else MANIFEST_PARSERS.push(parser);\n}\n\n/**\n * Walk projectRoot looking for manifest files, parse each, deduplicate, and\n * return all detected packages. Packages from manifests take priority; the\n * deduplication ensures that a workspace root pom.xml and a sub-module\n * pom.xml don't produce overlapping directory mappings.\n */\nexport async function parseAllManifests(projectRoot: string): Promise<ArchPackage[]> {\n const manifestPaths = _findManifests(projectRoot);\n const all: ArchPackage[] = [];\n const seenIds = new Set<string>();\n\n for (const manifestPath of manifestPaths) {\n const parser = MANIFEST_PARSERS.find(p => p.canParse(manifestPath));\n if (!parser) continue;\n try {\n const pkgs = await parser.parse(manifestPath, projectRoot);\n for (const pkg of pkgs) {\n if (!seenIds.has(pkg.id)) {\n seenIds.add(pkg.id);\n all.push(pkg);\n }\n }\n } catch {\n // Ignore parse errors for individual manifests\n }\n }\n\n return all;\n}\n\nfunction _findManifests(dir: string, results: string[] = []): string[] {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name)) {\n _findManifests(path.join(dir, entry.name), results);\n }\n } else if (entry.isFile()) {\n // Check exact filename or extension match\n if (MANIFEST_FILENAMES.has(entry.name) || entry.name.endsWith('.csproj')) {\n results.push(path.join(dir, entry.name));\n }\n }\n }\n\n return results;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAoB;AACpB,WAAsB;AAEtB,iBAA0B;AAC1B,gBAAyB;AACzB,mBAA4B;AAC5B,oBAA6B;AAC7B,mBAA4B;AAC5B,oBAA6B;AAC7B,oBAA6B;AAC7B,mBAA0B;AAC1B,mBAA4B;AAC5B,iBAA0B;AAG1B,MAAM,mBAAqC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,MAAM,qBAAqB,IAAI;AAAA,EAC7B,iBAAiB,QAAQ,OAAK,EAAE,aAAa;AAC/C;AAGA,MAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAW;AAAA,EAC9D;AAAA,EAAc;AAAA,EAAU;AAAA,EAAU;AAAA,EAAY;AAAA,EAAe;AAAA,EAAU;AAAA,EACvE;AAAA,EAAa;AAAA,EAAa;AAC5B,CAAC;AAEM,SAAS,wBAA0C;AACxD,SAAO;AACT;AAEO,SAAS,kBAAkB,MAA0C;AAC1E,SAAO,iBAAiB,KAAK,OAAK,EAAE,SAAS,IAAI;AACnD;AAEO,SAAS,uBAAuB,QAA8B;AACnE,QAAM,MAAM,iBAAiB,UAAU,OAAK,EAAE,SAAS,OAAO,IAAI;AAClE,MAAI,OAAO,EAAG,kBAAiB,GAAG,IAAI;AAAA,MACjC,kBAAiB,KAAK,MAAM;AACnC;AAQA,eAAsB,kBAAkB,aAA6C;AACnF,QAAM,gBAAgB,eAAe,WAAW;AAChD,QAAM,MAAqB,CAAC;AAC5B,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,gBAAgB,eAAe;AACxC,UAAM,SAAS,iBAAiB,KAAK,OAAK,EAAE,SAAS,YAAY,CAAC;AAClE,QAAI,CAAC,OAAQ;AACb,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,MAAM,cAAc,WAAW;AACzD,iBAAW,OAAO,MAAM;AACtB,YAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,GAAG;AACxB,kBAAQ,IAAI,IAAI,EAAE;AAClB,cAAI,KAAK,GAAG;AAAA,QACd;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,KAAa,UAAoB,CAAC,GAAa;AACrE,MAAI;AACJ,MAAI;AACF,cAAU,GAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,YAAY,GAAG;AACvB,UAAI,CAAC,UAAU,IAAI,MAAM,IAAI,GAAG;AAC9B,uBAAe,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,OAAO;AAAA,MACpD;AAAA,IACF,WAAW,MAAM,OAAO,GAAG;AAEzB,UAAI,mBAAmB,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,SAAS,SAAS,GAAG;AACxE,gBAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var ocaml_exports = {};
30
+ __export(ocaml_exports, {
31
+ ocamlParser: () => ocamlParser
32
+ });
33
+ module.exports = __toCommonJS(ocaml_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ const ocamlParser = {
37
+ name: "ocaml",
38
+ manifestFiles: ["dune-project"],
39
+ language: "ocaml",
40
+ canParse(manifestPath) {
41
+ const base = path.basename(manifestPath);
42
+ return base === "dune-project" || base.endsWith(".opam");
43
+ },
44
+ async parse(manifestPath, projectRoot) {
45
+ let content;
46
+ try {
47
+ content = fs.readFileSync(manifestPath, "utf8");
48
+ } catch {
49
+ return [];
50
+ }
51
+ const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\/g, "/") || ".";
52
+ const relManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
53
+ const base = path.basename(manifestPath);
54
+ if (base === "dune-project") {
55
+ return parseDuneProject(content, relDir, relManifest, projectRoot, manifestPath);
56
+ }
57
+ return parseOpam(content, base, relDir, relManifest);
58
+ }
59
+ };
60
+ function parseDuneProject(content, relDir, relManifest, projectRoot, manifestPath) {
61
+ const packages = [];
62
+ const nameMatch = content.match(/\(name\s+([^\s)]+)\)/);
63
+ const name = nameMatch ? nameMatch[1] : path.basename(path.dirname(manifestPath));
64
+ const versionMatch = content.match(/\(version\s+([^\s)]+)\)/);
65
+ const version = versionMatch ? versionMatch[1] : void 0;
66
+ const externalDeps = [];
67
+ const dependsMatch = content.match(/\(depends([\s\S]*?)\)(?:\s*\(|$)/);
68
+ if (dependsMatch) {
69
+ const depPattern = /\(([a-zA-Z0-9_-]+)[\s)]/g;
70
+ const bareDep = /^\s+([a-zA-Z0-9_-]+)\s*$/gm;
71
+ let m;
72
+ while ((m = depPattern.exec(dependsMatch[1])) !== null) {
73
+ if (m[1] !== "and" && m[1] !== "or") externalDeps.push(m[1]);
74
+ }
75
+ while ((m = bareDep.exec(dependsMatch[1])) !== null) {
76
+ externalDeps.push(m[1]);
77
+ }
78
+ }
79
+ packages.push({
80
+ id: `pkg:ocaml:${relDir}`,
81
+ name,
82
+ path: relDir,
83
+ source: "manifest",
84
+ language: "ocaml",
85
+ manifestPath: relManifest,
86
+ version,
87
+ externalDeps,
88
+ updatedAt: Date.now()
89
+ });
90
+ const duneDir = path.dirname(path.join(projectRoot, relManifest));
91
+ const subDirs = findDuneLibraries(duneDir, projectRoot);
92
+ for (const sub of subDirs) {
93
+ if (sub.path !== relDir) {
94
+ packages.push({
95
+ id: `pkg:ocaml:${sub.path}`,
96
+ name: sub.name,
97
+ path: sub.path,
98
+ source: "manifest",
99
+ language: "ocaml",
100
+ manifestPath: relManifest,
101
+ updatedAt: Date.now()
102
+ });
103
+ }
104
+ }
105
+ return packages;
106
+ }
107
+ function parseOpam(content, filename, relDir, relManifest) {
108
+ const name = filename.replace(".opam", "");
109
+ const versionMatch = content.match(/^version:\s*"([^"]+)"/m);
110
+ const version = versionMatch ? versionMatch[1] : void 0;
111
+ const externalDeps = [];
112
+ const dependsMatch = content.match(/^depends:\s*\[([\s\S]*?)\]/m);
113
+ if (dependsMatch) {
114
+ const depPattern = /"([a-zA-Z0-9_-]+)"/g;
115
+ let m;
116
+ while ((m = depPattern.exec(dependsMatch[1])) !== null) {
117
+ externalDeps.push(m[1]);
118
+ }
119
+ }
120
+ return [{
121
+ id: `pkg:ocaml:${relDir}:${name}`,
122
+ name,
123
+ path: relDir,
124
+ source: "manifest",
125
+ language: "ocaml",
126
+ manifestPath: relManifest,
127
+ version,
128
+ externalDeps,
129
+ updatedAt: Date.now()
130
+ }];
131
+ }
132
+ function findDuneLibraries(dir, projectRoot) {
133
+ const results = [];
134
+ const skipDirs = /* @__PURE__ */ new Set(["_build", ".git", "node_modules", "_opam"]);
135
+ function walk(currentDir) {
136
+ let entries;
137
+ try {
138
+ entries = fs.readdirSync(currentDir, { withFileTypes: true });
139
+ } catch {
140
+ return;
141
+ }
142
+ for (const entry of entries) {
143
+ if (entry.isDirectory() && !skipDirs.has(entry.name)) {
144
+ walk(path.join(currentDir, entry.name));
145
+ } else if (entry.isFile() && entry.name === "dune") {
146
+ const dunePath = path.join(currentDir, "dune");
147
+ try {
148
+ const duneContent = fs.readFileSync(dunePath, "utf8");
149
+ const libMatch = duneContent.match(/\(library[\s\S]*?\(name\s+([^\s)]+)\)/);
150
+ if (libMatch) {
151
+ const relPath = path.relative(projectRoot, currentDir).replace(/\\/g, "/");
152
+ results.push({ name: libMatch[1], path: relPath });
153
+ }
154
+ } catch {
155
+ }
156
+ }
157
+ }
158
+ }
159
+ walk(dir);
160
+ return results;
161
+ }
162
+ // Annotate the CommonJS export names for ESM import in node:
163
+ 0 && (module.exports = {
164
+ ocamlParser
165
+ });
166
+ //# sourceMappingURL=ocaml.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/architecture/manifest/ocaml.ts"],
4
+ "sourcesContent": ["/**\n * OCaml manifest parser.\n * Handles dune-project and .opam files.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ManifestParser, ArchPackage } from '../types';\n\nexport const ocamlParser: ManifestParser = {\n name: 'ocaml',\n manifestFiles: ['dune-project'],\n language: 'ocaml',\n\n canParse(manifestPath: string): boolean {\n const base = path.basename(manifestPath);\n return base === 'dune-project' || base.endsWith('.opam');\n },\n\n async parse(manifestPath: string, projectRoot: string): Promise<ArchPackage[]> {\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch {\n return [];\n }\n\n const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\\\/g, '/') || '.';\n const relManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n const base = path.basename(manifestPath);\n\n if (base === 'dune-project') {\n return parseDuneProject(content, relDir, relManifest, projectRoot, manifestPath);\n }\n\n // .opam file\n return parseOpam(content, base, relDir, relManifest);\n },\n};\n\nfunction parseDuneProject(\n content: string,\n relDir: string,\n relManifest: string,\n projectRoot: string,\n manifestPath: string\n): ArchPackage[] {\n const packages: ArchPackage[] = [];\n\n // Extract project name: (name my-project)\n const nameMatch = content.match(/\\(name\\s+([^\\s)]+)\\)/);\n const name = nameMatch ? nameMatch[1]! : path.basename(path.dirname(manifestPath));\n\n // Extract version: (version 1.0.0)\n const versionMatch = content.match(/\\(version\\s+([^\\s)]+)\\)/);\n const version = versionMatch ? versionMatch[1] : undefined;\n\n // Extract dependencies from (depends ...) block\n const externalDeps: string[] = [];\n const dependsMatch = content.match(/\\(depends([\\s\\S]*?)\\)(?:\\s*\\(|$)/);\n if (dependsMatch) {\n // Each dep is either a bare name or (name (>= version))\n const depPattern = /\\(([a-zA-Z0-9_-]+)[\\s)]/g;\n const bareDep = /^\\s+([a-zA-Z0-9_-]+)\\s*$/gm;\n let m: RegExpExecArray | null;\n while ((m = depPattern.exec(dependsMatch[1])) !== null) {\n if (m[1] !== 'and' && m[1] !== 'or') externalDeps.push(m[1]);\n }\n while ((m = bareDep.exec(dependsMatch[1])) !== null) {\n externalDeps.push(m[1]);\n }\n }\n\n packages.push({\n id: `pkg:ocaml:${relDir}`,\n name,\n path: relDir,\n source: 'manifest',\n language: 'ocaml',\n manifestPath: relManifest,\n version,\n externalDeps,\n updatedAt: Date.now(),\n });\n\n // Look for sub-libraries defined in dune files\n const duneDir = path.dirname(path.join(projectRoot, relManifest));\n const subDirs = findDuneLibraries(duneDir, projectRoot);\n for (const sub of subDirs) {\n if (sub.path !== relDir) {\n packages.push({\n id: `pkg:ocaml:${sub.path}`,\n name: sub.name,\n path: sub.path,\n source: 'manifest',\n language: 'ocaml',\n manifestPath: relManifest,\n updatedAt: Date.now(),\n });\n }\n }\n\n return packages;\n}\n\nfunction parseOpam(content: string, filename: string, relDir: string, relManifest: string): ArchPackage[] {\n const name = filename.replace('.opam', '');\n const versionMatch = content.match(/^version:\\s*\"([^\"]+)\"/m);\n const version = versionMatch ? versionMatch[1] : undefined;\n\n const externalDeps: string[] = [];\n const dependsMatch = content.match(/^depends:\\s*\\[([\\s\\S]*?)\\]/m);\n if (dependsMatch) {\n const depPattern = /\"([a-zA-Z0-9_-]+)\"/g;\n let m: RegExpExecArray | null;\n while ((m = depPattern.exec(dependsMatch[1])) !== null) {\n externalDeps.push(m[1]);\n }\n }\n\n return [{\n id: `pkg:ocaml:${relDir}:${name}`,\n name,\n path: relDir,\n source: 'manifest',\n language: 'ocaml',\n manifestPath: relManifest,\n version,\n externalDeps,\n updatedAt: Date.now(),\n }];\n}\n\nfunction findDuneLibraries(dir: string, projectRoot: string): Array<{ name: string; path: string }> {\n const results: Array<{ name: string; path: string }> = [];\n const skipDirs = new Set(['_build', '.git', 'node_modules', '_opam']);\n\n function walk(currentDir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory() && !skipDirs.has(entry.name)) {\n walk(path.join(currentDir, entry.name));\n } else if (entry.isFile() && entry.name === 'dune') {\n const dunePath = path.join(currentDir, 'dune');\n try {\n const duneContent = fs.readFileSync(dunePath, 'utf8');\n const libMatch = duneContent.match(/\\(library[\\s\\S]*?\\(name\\s+([^\\s)]+)\\)/);\n if (libMatch) {\n const relPath = path.relative(projectRoot, currentDir).replace(/\\\\/g, '/');\n results.push({ name: libMatch[1]!, path: relPath });\n }\n } catch { /* ignore */ }\n }\n }\n }\n\n walk(dir);\n return results;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var scala_exports = {};
30
+ __export(scala_exports, {
31
+ sbtParser: () => sbtParser
32
+ });
33
+ module.exports = __toCommonJS(scala_exports);
34
+ var fs = __toESM(require("fs"));
35
+ var path = __toESM(require("path"));
36
+ const sbtParser = {
37
+ name: "sbt",
38
+ manifestFiles: ["build.sbt"],
39
+ language: "scala",
40
+ canParse(manifestPath) {
41
+ return path.basename(manifestPath) === "build.sbt";
42
+ },
43
+ async parse(manifestPath, projectRoot) {
44
+ let content;
45
+ try {
46
+ content = fs.readFileSync(manifestPath, "utf8");
47
+ } catch {
48
+ return [];
49
+ }
50
+ const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\/g, "/") || ".";
51
+ const relManifest = path.relative(projectRoot, manifestPath).replace(/\\/g, "/");
52
+ const packages = [];
53
+ const nameMatch = content.match(/name\s*:=\s*"([^"]+)"/);
54
+ const versionMatch = content.match(/version\s*:=\s*"([^"]+)"/);
55
+ const name = nameMatch ? nameMatch[1] : path.basename(path.dirname(manifestPath));
56
+ const version = versionMatch ? versionMatch[1] : void 0;
57
+ const externalDeps = [];
58
+ const depPattern = /"([^"]+)"\s*%%?\s*"([^"]+)"\s*%\s*"([^"]+)"/g;
59
+ let depMatch;
60
+ while ((depMatch = depPattern.exec(content)) !== null) {
61
+ externalDeps.push(`${depMatch[1]}:${depMatch[2]}`);
62
+ }
63
+ const subProjectPattern = /lazy\s+val\s+(\w+)\s*=\s*(?:\(?\s*project\s*(?:\.in\s*\(\s*file\s*\(\s*"([^"]+)"\s*\))?|project\s+in\s+file\s*\(\s*"([^"]+)"\s*\))/g;
64
+ let subMatch;
65
+ const subProjects = [];
66
+ while ((subMatch = subProjectPattern.exec(content)) !== null) {
67
+ const subName = subMatch[1];
68
+ const subDir = subMatch[2] || subMatch[3] || subName;
69
+ subProjects.push({ name: subName, dir: subDir });
70
+ }
71
+ if (subProjects.length > 0) {
72
+ for (const sub of subProjects) {
73
+ const subPath = relDir === "." ? sub.dir : `${relDir}/${sub.dir}`;
74
+ packages.push({
75
+ id: `pkg:sbt:${subPath}`,
76
+ name: sub.name,
77
+ path: subPath,
78
+ source: "manifest",
79
+ language: "scala",
80
+ manifestPath: relManifest,
81
+ version,
82
+ updatedAt: Date.now()
83
+ });
84
+ }
85
+ packages.push({
86
+ id: `pkg:sbt:${relDir}`,
87
+ name,
88
+ path: relDir,
89
+ source: "manifest",
90
+ language: "scala",
91
+ manifestPath: relManifest,
92
+ version,
93
+ externalDeps,
94
+ metadata: { subProjects: subProjects.map((s) => s.name) },
95
+ updatedAt: Date.now()
96
+ });
97
+ } else {
98
+ packages.push({
99
+ id: `pkg:sbt:${relDir}`,
100
+ name,
101
+ path: relDir,
102
+ source: "manifest",
103
+ language: "scala",
104
+ manifestPath: relManifest,
105
+ version,
106
+ externalDeps,
107
+ updatedAt: Date.now()
108
+ });
109
+ }
110
+ return packages;
111
+ }
112
+ };
113
+ // Annotate the CommonJS export names for ESM import in node:
114
+ 0 && (module.exports = {
115
+ sbtParser
116
+ });
117
+ //# sourceMappingURL=scala.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/architecture/manifest/scala.ts"],
4
+ "sourcesContent": ["/**\n * Scala build.sbt manifest parser.\n * Handles single-project and multi-module SBT builds.\n */\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { ManifestParser, ArchPackage } from '../types';\n\nexport const sbtParser: ManifestParser = {\n name: 'sbt',\n manifestFiles: ['build.sbt'],\n language: 'scala',\n\n canParse(manifestPath: string): boolean {\n return path.basename(manifestPath) === 'build.sbt';\n },\n\n async parse(manifestPath: string, projectRoot: string): Promise<ArchPackage[]> {\n let content: string;\n try {\n content = fs.readFileSync(manifestPath, 'utf8');\n } catch {\n return [];\n }\n\n const relDir = path.relative(projectRoot, path.dirname(manifestPath)).replace(/\\\\/g, '/') || '.';\n const relManifest = path.relative(projectRoot, manifestPath).replace(/\\\\/g, '/');\n const packages: ArchPackage[] = [];\n\n // Extract project name\n const nameMatch = content.match(/name\\s*:=\\s*\"([^\"]+)\"/);\n const versionMatch = content.match(/version\\s*:=\\s*\"([^\"]+)\"/);\n const name = nameMatch ? nameMatch[1] : path.basename(path.dirname(manifestPath));\n const version = versionMatch ? versionMatch[1] : undefined;\n\n // Extract library dependencies\n const externalDeps: string[] = [];\n const depPattern = /\"([^\"]+)\"\\s*%%?\\s*\"([^\"]+)\"\\s*%\\s*\"([^\"]+)\"/g;\n let depMatch: RegExpExecArray | null;\n while ((depMatch = depPattern.exec(content)) !== null) {\n externalDeps.push(`${depMatch[1]}:${depMatch[2]}`);\n }\n\n // Detect sub-projects (lazy val xxx = project.in(file(\"yyy\")))\n const subProjectPattern = /lazy\\s+val\\s+(\\w+)\\s*=\\s*(?:\\(?\\s*project\\s*(?:\\.in\\s*\\(\\s*file\\s*\\(\\s*\"([^\"]+)\"\\s*\\))?|project\\s+in\\s+file\\s*\\(\\s*\"([^\"]+)\"\\s*\\))/g;\n let subMatch: RegExpExecArray | null;\n const subProjects: Array<{ name: string; dir: string }> = [];\n\n while ((subMatch = subProjectPattern.exec(content)) !== null) {\n const subName = subMatch[1];\n const subDir = subMatch[2] || subMatch[3] || subName;\n subProjects.push({ name: subName!, dir: subDir! });\n }\n\n if (subProjects.length > 0) {\n // Multi-module project: create a package per sub-project\n for (const sub of subProjects) {\n const subPath = relDir === '.' ? sub.dir : `${relDir}/${sub.dir}`;\n packages.push({\n id: `pkg:sbt:${subPath}`,\n name: sub.name,\n path: subPath,\n source: 'manifest',\n language: 'scala',\n manifestPath: relManifest,\n version,\n updatedAt: Date.now(),\n });\n }\n // Also add the root project\n packages.push({\n id: `pkg:sbt:${relDir}`,\n name: name!,\n path: relDir,\n source: 'manifest',\n language: 'scala',\n manifestPath: relManifest,\n version,\n externalDeps,\n metadata: { subProjects: subProjects.map(s => s.name) },\n updatedAt: Date.now(),\n });\n } else {\n // Single project\n packages.push({\n id: `pkg:sbt:${relDir}`,\n name: name!,\n path: relDir,\n source: 'manifest',\n language: 'scala',\n manifestPath: relManifest,\n version,\n externalDeps,\n updatedAt: Date.now(),\n });\n }\n\n return packages;\n },\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAoB;AACpB,WAAsB;AAGf,MAAM,YAA4B;AAAA,EACvC,MAAM;AAAA,EACN,eAAe,CAAC,WAAW;AAAA,EAC3B,UAAU;AAAA,EAEV,SAAS,cAA+B;AACtC,WAAO,KAAK,SAAS,YAAY,MAAM;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,cAAsB,aAA6C;AAC7E,QAAI;AACJ,QAAI;AACF,gBAAU,GAAG,aAAa,cAAc,MAAM;AAAA,IAChD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,KAAK,SAAS,aAAa,KAAK,QAAQ,YAAY,CAAC,EAAE,QAAQ,OAAO,GAAG,KAAK;AAC7F,UAAM,cAAc,KAAK,SAAS,aAAa,YAAY,EAAE,QAAQ,OAAO,GAAG;AAC/E,UAAM,WAA0B,CAAC;AAGjC,UAAM,YAAY,QAAQ,MAAM,uBAAuB;AACvD,UAAM,eAAe,QAAQ,MAAM,0BAA0B;AAC7D,UAAM,OAAO,YAAY,UAAU,CAAC,IAAI,KAAK,SAAS,KAAK,QAAQ,YAAY,CAAC;AAChF,UAAM,UAAU,eAAe,aAAa,CAAC,IAAI;AAGjD,UAAM,eAAyB,CAAC;AAChC,UAAM,aAAa;AACnB,QAAI;AACJ,YAAQ,WAAW,WAAW,KAAK,OAAO,OAAO,MAAM;AACrD,mBAAa,KAAK,GAAG,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE;AAAA,IACnD;AAGA,UAAM,oBAAoB;AAC1B,QAAI;AACJ,UAAM,cAAoD,CAAC;AAE3D,YAAQ,WAAW,kBAAkB,KAAK,OAAO,OAAO,MAAM;AAC5D,YAAM,UAAU,SAAS,CAAC;AAC1B,YAAM,SAAS,SAAS,CAAC,KAAK,SAAS,CAAC,KAAK;AAC7C,kBAAY,KAAK,EAAE,MAAM,SAAU,KAAK,OAAQ,CAAC;AAAA,IACnD;AAEA,QAAI,YAAY,SAAS,GAAG;AAE1B,iBAAW,OAAO,aAAa;AAC7B,cAAM,UAAU,WAAW,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG;AAC/D,iBAAS,KAAK;AAAA,UACZ,IAAI,WAAW,OAAO;AAAA,UACtB,MAAM,IAAI;AAAA,UACV,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,cAAc;AAAA,UACd;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAEA,eAAS,KAAK;AAAA,QACZ,IAAI,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,UAAU,EAAE,aAAa,YAAY,IAAI,OAAK,EAAE,IAAI,EAAE;AAAA,QACtD,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH,OAAO;AAEL,eAAS,KAAK;AAAA,QACZ,IAAI,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -37,6 +37,8 @@ var import_config = require("../../config");
37
37
  var import_caveman = require("../installer/caveman");
38
38
  var import_steering = require("../installer/steering");
39
39
  var import_cli_agent = require("../installer/cli-agent");
40
+ var import_common = require("../installer/common");
41
+ var import_instructions = require("../installer/instructions");
40
42
  var import_ui = require("../ui");
41
43
  const JOKES = [
42
44
  "Ugh. Words hard. Code easy.",
@@ -105,6 +107,16 @@ function register(program) {
105
107
  if (fs.existsSync(agentPath)) {
106
108
  (0, import_cli_agent.writeCliAgent)(kiroDir);
107
109
  }
110
+ for (const file of ["claude.md", "codex.md"]) {
111
+ const instructionsPath = path.join(cwd, ".kirograph", file);
112
+ if (fs.existsSync(instructionsPath)) {
113
+ fs.writeFileSync(instructionsPath, (0, import_instructions.buildAgentInstructions)(normalized));
114
+ }
115
+ }
116
+ const agentsPath = path.join(cwd, "AGENTS.md");
117
+ if (fs.existsSync(agentsPath) && fs.readFileSync(agentsPath, "utf8").includes("<!-- kirograph:codex:start -->")) {
118
+ (0, import_common.upsertGeneratedBlock)(agentsPath, "codex", "## KiroGraph", (0, import_instructions.buildAgentInstructions)(normalized));
119
+ }
108
120
  console.log();
109
121
  if (normalized === "off") {
110
122
  console.log(` ${import_ui.green}\u2713${import_ui.reset} Caveman mode ${import_ui.violet}${import_ui.bold}off${import_ui.reset}${import_ui.dim} \u2014 agent will respond normally from next session.${import_ui.reset}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/caveman.ts"],
4
- "sourcesContent": ["/**\n * kg caveman [off|lite|full|ultra] \u2014 set caveman mode for this project\n * kg caveman \u2014 show current mode\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { loadConfig, updateConfig } from '../../config';\nimport { CAVEMAN_RULES, CavemanMode } from '../installer/caveman';\nimport { writeSteering } from '../installer/steering';\nimport { writeCliAgent } from '../installer/cli-agent';\nimport { bold, dim, green, reset, violet } from '../ui';\n\nconst JOKES = [\n 'Ugh. Words hard. Code easy.',\n 'Caveman not need article. Caveman have rock.',\n 'Why say lot word when few word do trick?',\n 'Token saved = mammoth fed.',\n 'Caveman compress speech. Caveman also compress mammoth.',\n 'Me not lazy. Me efficient.',\n 'Short answer good answer. Long answer... ugh.',\n 'Caveman invent fire. Caveman invent brief response.',\n 'No filler word. Only meat.',\n 'Grunt once. Mean much.',\n];\n\nfunction joke(): string {\n const line = JOKES[Math.floor(Math.random() * JOKES.length)];\n return `\\n ${violet}\uD83E\uDEA8 ${line}${reset}`;\n}\n\nconst MODES: Array<{ name: string; desc: string }> = [\n { name: 'off', desc: 'normal responses' },\n { name: 'lite', desc: 'compact, no filler, full sentences' },\n { name: 'full', desc: 'fragments, no articles, short synonyms' },\n { name: 'ultra', desc: 'maximum compression, abbreviations, \u2192 for causality' },\n];\n\nexport function register(program: Command): void {\n program\n .command('caveman [mode]')\n .description('Set caveman communication style for the Kiro agent (off | lite | full | ultra)')\n .action(async (mode: string | undefined) => {\n const cwd = process.cwd();\n\n // No mode argument: show current status\n if (!mode) {\n let current = 'off';\n try {\n const config = await loadConfig(cwd);\n current = config.cavemanMode ?? 'off';\n } catch { /* no .kirograph/ */ }\n\n console.log();\n console.log(` ${dim}Caveman mode${reset} ${violet}${bold}${current}${reset}`);\n console.log();\n console.log(` ${dim}Available modes:${reset}`);\n for (const m of MODES) {\n const active = m.name === current;\n const marker = active ? `${green}\u25CF${reset}` : `${dim}\u25CB${reset}`;\n const nameStr = active ? `${violet}${bold}${m.name}${reset}` : `${dim}${m.name}${reset}`;\n const nameW = m.name.length;\n const pad = ' '.repeat(6 - nameW);\n console.log(` ${marker} ${nameStr}${pad}${dim}${m.desc}${reset}`);\n }\n console.log();\n console.log(` ${dim}Change:${reset} kg caveman ${dim}<mode>${reset}`);\n console.log(joke());\n console.log();\n return;\n }\n\n const normalized = mode.toLowerCase();\n const valid = MODES.map(m => m.name);\n if (!valid.includes(normalized)) {\n console.error(` ${dim}Unknown mode:${reset} ${normalized}${dim}. Choose from: off, lite, full, ultra${reset}`);\n process.exit(1);\n }\n\n await updateConfig(cwd, { cavemanMode: normalized as CavemanMode | 'off' });\n\n const kiroDir = path.join(cwd, '.kiro');\n\n // Regenerate steering file if .kiro/steering/kirograph.md exists\n const steeringPath = path.join(kiroDir, 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n writeSteering(kiroDir, normalized as CavemanMode | 'off');\n }\n\n // Regenerate CLI agent config if .kiro/agents/kirograph.json exists\n const agentPath = path.join(kiroDir, 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n writeCliAgent(kiroDir);\n }\n\n console.log();\n if (normalized === 'off') {\n console.log(` ${green}\u2713${reset} Caveman mode ${violet}${bold}off${reset}${dim} \u2014 agent will respond normally from next session.${reset}`);\n console.log(joke());\n } else {\n console.log(` ${green}\u2713${reset} Caveman mode set to ${violet}${bold}${normalized}${reset}`);\n console.log(` ${dim}Takes effect on next agent session.${reset}`);\n console.log();\n console.log(` ${dim}Rules preview:${reset}`);\n console.log();\n for (const line of CAVEMAN_RULES[normalized].split('\\n')) {\n if (line.startsWith('## ')) {\n console.log(` ${violet}${bold}${line.slice(3)}${reset}`);\n } else if (line === '') {\n console.log();\n } else {\n console.log(` ${dim}${line}${reset}`);\n }\n }\n console.log(joke());\n }\n console.log();\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * kg caveman [off|lite|full|ultra] \u2014 set caveman mode for this project\n * kg caveman \u2014 show current mode\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { loadConfig, updateConfig } from '../../config';\nimport { CAVEMAN_RULES, CavemanMode } from '../installer/caveman';\nimport { writeSteering } from '../installer/steering';\nimport { writeCliAgent } from '../installer/cli-agent';\nimport { upsertGeneratedBlock } from '../installer/common';\nimport { buildAgentInstructions } from '../installer/instructions';\nimport { bold, dim, green, reset, violet } from '../ui';\n\nconst JOKES = [\n 'Ugh. Words hard. Code easy.',\n 'Caveman not need article. Caveman have rock.',\n 'Why say lot word when few word do trick?',\n 'Token saved = mammoth fed.',\n 'Caveman compress speech. Caveman also compress mammoth.',\n 'Me not lazy. Me efficient.',\n 'Short answer good answer. Long answer... ugh.',\n 'Caveman invent fire. Caveman invent brief response.',\n 'No filler word. Only meat.',\n 'Grunt once. Mean much.',\n];\n\nfunction joke(): string {\n const line = JOKES[Math.floor(Math.random() * JOKES.length)];\n return `\\n ${violet}\uD83E\uDEA8 ${line}${reset}`;\n}\n\nconst MODES: Array<{ name: string; desc: string }> = [\n { name: 'off', desc: 'normal responses' },\n { name: 'lite', desc: 'compact, no filler, full sentences' },\n { name: 'full', desc: 'fragments, no articles, short synonyms' },\n { name: 'ultra', desc: 'maximum compression, abbreviations, \u2192 for causality' },\n];\n\nexport function register(program: Command): void {\n program\n .command('caveman [mode]')\n .description('Set caveman communication style for the Kiro agent (off | lite | full | ultra)')\n .action(async (mode: string | undefined) => {\n const cwd = process.cwd();\n\n // No mode argument: show current status\n if (!mode) {\n let current = 'off';\n try {\n const config = await loadConfig(cwd);\n current = config.cavemanMode ?? 'off';\n } catch { /* no .kirograph/ */ }\n\n console.log();\n console.log(` ${dim}Caveman mode${reset} ${violet}${bold}${current}${reset}`);\n console.log();\n console.log(` ${dim}Available modes:${reset}`);\n for (const m of MODES) {\n const active = m.name === current;\n const marker = active ? `${green}\u25CF${reset}` : `${dim}\u25CB${reset}`;\n const nameStr = active ? `${violet}${bold}${m.name}${reset}` : `${dim}${m.name}${reset}`;\n const nameW = m.name.length;\n const pad = ' '.repeat(6 - nameW);\n console.log(` ${marker} ${nameStr}${pad}${dim}${m.desc}${reset}`);\n }\n console.log();\n console.log(` ${dim}Change:${reset} kg caveman ${dim}<mode>${reset}`);\n console.log(joke());\n console.log();\n return;\n }\n\n const normalized = mode.toLowerCase();\n const valid = MODES.map(m => m.name);\n if (!valid.includes(normalized)) {\n console.error(` ${dim}Unknown mode:${reset} ${normalized}${dim}. Choose from: off, lite, full, ultra${reset}`);\n process.exit(1);\n }\n\n await updateConfig(cwd, { cavemanMode: normalized as CavemanMode | 'off' });\n\n const kiroDir = path.join(cwd, '.kiro');\n\n // Regenerate steering file if .kiro/steering/kirograph.md exists\n const steeringPath = path.join(kiroDir, 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n writeSteering(kiroDir, normalized as CavemanMode | 'off');\n }\n\n // Regenerate CLI agent config if .kiro/agents/kirograph.json exists\n const agentPath = path.join(kiroDir, 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n writeCliAgent(kiroDir);\n }\n\n for (const file of ['claude.md', 'codex.md']) {\n const instructionsPath = path.join(cwd, '.kirograph', file);\n if (fs.existsSync(instructionsPath)) {\n fs.writeFileSync(instructionsPath, buildAgentInstructions(normalized as CavemanMode | 'off'));\n }\n }\n const agentsPath = path.join(cwd, 'AGENTS.md');\n if (fs.existsSync(agentsPath) && fs.readFileSync(agentsPath, 'utf8').includes('<!-- kirograph:codex:start -->')) {\n upsertGeneratedBlock(agentsPath, 'codex', '## KiroGraph', buildAgentInstructions(normalized as CavemanMode | 'off'));\n }\n\n console.log();\n if (normalized === 'off') {\n console.log(` ${green}\u2713${reset} Caveman mode ${violet}${bold}off${reset}${dim} \u2014 agent will respond normally from next session.${reset}`);\n console.log(joke());\n } else {\n console.log(` ${green}\u2713${reset} Caveman mode set to ${violet}${bold}${normalized}${reset}`);\n console.log(` ${dim}Takes effect on next agent session.${reset}`);\n console.log();\n console.log(` ${dim}Rules preview:${reset}`);\n console.log();\n for (const line of CAVEMAN_RULES[normalized].split('\\n')) {\n if (line.startsWith('## ')) {\n console.log(` ${violet}${bold}${line.slice(3)}${reset}`);\n } else if (line === '') {\n console.log();\n } else {\n console.log(` ${dim}${line}${reset}`);\n }\n }\n console.log(joke());\n }\n console.log();\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -39,10 +39,10 @@ function printColoredHelp() {
39
39
  {
40
40
  title: "\u{1F527} Workspace Setup",
41
41
  commands: [
42
- { name: "install", desc: "Wire up MCP + hooks + steering for the current Kiro workspace" },
42
+ { name: "install", desc: "Wire up MCP/instructions for an agent workspace", opts: ["--target <t> kiro | claude | codex"] },
43
43
  { name: "init", args: "[path]", desc: "Initialize KiroGraph in a project", opts: ["-i, --index Index immediately after init"] },
44
- { name: "uninit", args: "[path]", desc: "Remove KiroGraph from a project", opts: ["--force Skip confirmation"] },
45
- { name: "uninstall", args: "[path]", desc: "Alias for uninit", opts: ["--force Skip confirmation"] }
44
+ { name: "uninit", args: "[path]", desc: "Remove KiroGraph from a project", opts: ["--force Skip confirmation", "--target <t> kiro | claude | codex | all"] },
45
+ { name: "uninstall", args: "[path]", desc: "Alias for uninit", opts: ["--force Skip confirmation", "--target <t> kiro | claude | codex | all"] }
46
46
  ]
47
47
  },
48
48
  {
@@ -141,7 +141,9 @@ ${c.bold}${c.paleLavender}USAGE${c.reset}`);
141
141
  {
142
142
  title: "\u{1F527} Setup & indexing",
143
143
  examples: [
144
- ["kirograph install", "Wire up MCP + hooks + steering for the current workspace"],
144
+ ["kirograph install", "Wire up Kiro MCP + hooks + steering for the current workspace"],
145
+ ["kirograph install --target claude", "Wire up Claude Code MCP + project memory"],
146
+ ["kirograph install --target codex", "Install Codex project instructions and print MCP config"],
145
147
  ["kirograph init --index", "Init and immediately index the project"],
146
148
  ["kirograph sync", "Incremental sync of changed files"]
147
149
  ]