@cr8rcho/alkahest 0.1.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 (130) hide show
  1. package/README.ko.md +208 -0
  2. package/README.md +208 -0
  3. package/dist/assets/dashboard.html +647 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +68 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/hook.d.ts +1 -0
  8. package/dist/commands/hook.js +64 -0
  9. package/dist/commands/hook.js.map +1 -0
  10. package/dist/commands/login.d.ts +11 -0
  11. package/dist/commands/login.js +27 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/mcp.d.ts +6 -0
  14. package/dist/commands/mcp.js +13 -0
  15. package/dist/commands/mcp.js.map +1 -0
  16. package/dist/commands/publish.d.ts +19 -0
  17. package/dist/commands/publish.js +27 -0
  18. package/dist/commands/publish.js.map +1 -0
  19. package/dist/commands/scan.d.ts +11 -0
  20. package/dist/commands/scan.js +29 -0
  21. package/dist/commands/scan.js.map +1 -0
  22. package/dist/commands/update.d.ts +15 -0
  23. package/dist/commands/update.js +41 -0
  24. package/dist/commands/update.js.map +1 -0
  25. package/dist/commands/view.d.ts +6 -0
  26. package/dist/commands/view.js +21 -0
  27. package/dist/commands/view.js.map +1 -0
  28. package/dist/core/adapters/angular.d.ts +2 -0
  29. package/dist/core/adapters/angular.js +305 -0
  30. package/dist/core/adapters/angular.js.map +1 -0
  31. package/dist/core/adapters/astro.d.ts +3 -0
  32. package/dist/core/adapters/astro.js +140 -0
  33. package/dist/core/adapters/astro.js.map +1 -0
  34. package/dist/core/adapters/compose.d.ts +2 -0
  35. package/dist/core/adapters/compose.js +195 -0
  36. package/dist/core/adapters/compose.js.map +1 -0
  37. package/dist/core/adapters/django.d.ts +2 -0
  38. package/dist/core/adapters/django.js +314 -0
  39. package/dist/core/adapters/django.js.map +1 -0
  40. package/dist/core/adapters/expo-router.d.ts +2 -0
  41. package/dist/core/adapters/expo-router.js +60 -0
  42. package/dist/core/adapters/expo-router.js.map +1 -0
  43. package/dist/core/adapters/flask.d.ts +2 -0
  44. package/dist/core/adapters/flask.js +249 -0
  45. package/dist/core/adapters/flask.js.map +1 -0
  46. package/dist/core/adapters/flutter.d.ts +2 -0
  47. package/dist/core/adapters/flutter.js +232 -0
  48. package/dist/core/adapters/flutter.js.map +1 -0
  49. package/dist/core/adapters/index.d.ts +19 -0
  50. package/dist/core/adapters/index.js +59 -0
  51. package/dist/core/adapters/index.js.map +1 -0
  52. package/dist/core/adapters/next-app.d.ts +2 -0
  53. package/dist/core/adapters/next-app.js +62 -0
  54. package/dist/core/adapters/next-app.js.map +1 -0
  55. package/dist/core/adapters/next-pages.d.ts +2 -0
  56. package/dist/core/adapters/next-pages.js +70 -0
  57. package/dist/core/adapters/next-pages.js.map +1 -0
  58. package/dist/core/adapters/nuxt.d.ts +2 -0
  59. package/dist/core/adapters/nuxt.js +59 -0
  60. package/dist/core/adapters/nuxt.js.map +1 -0
  61. package/dist/core/adapters/rails.d.ts +2 -0
  62. package/dist/core/adapters/rails.js +275 -0
  63. package/dist/core/adapters/rails.js.map +1 -0
  64. package/dist/core/adapters/react-jsx.d.ts +68 -0
  65. package/dist/core/adapters/react-jsx.js +355 -0
  66. package/dist/core/adapters/react-jsx.js.map +1 -0
  67. package/dist/core/adapters/react-navigation.d.ts +2 -0
  68. package/dist/core/adapters/react-navigation.js +153 -0
  69. package/dist/core/adapters/react-navigation.js.map +1 -0
  70. package/dist/core/adapters/react-router.d.ts +2 -0
  71. package/dist/core/adapters/react-router.js +249 -0
  72. package/dist/core/adapters/react-router.js.map +1 -0
  73. package/dist/core/adapters/remix.d.ts +2 -0
  74. package/dist/core/adapters/remix.js +109 -0
  75. package/dist/core/adapters/remix.js.map +1 -0
  76. package/dist/core/adapters/static-html.d.ts +2 -0
  77. package/dist/core/adapters/static-html.js +157 -0
  78. package/dist/core/adapters/static-html.js.map +1 -0
  79. package/dist/core/adapters/sveltekit.d.ts +2 -0
  80. package/dist/core/adapters/sveltekit.js +151 -0
  81. package/dist/core/adapters/sveltekit.js.map +1 -0
  82. package/dist/core/adapters/swiftui.d.ts +2 -0
  83. package/dist/core/adapters/swiftui.js +216 -0
  84. package/dist/core/adapters/swiftui.js.map +1 -0
  85. package/dist/core/adapters/types.d.ts +65 -0
  86. package/dist/core/adapters/types.js +2 -0
  87. package/dist/core/adapters/types.js.map +1 -0
  88. package/dist/core/adapters/uikit.d.ts +2 -0
  89. package/dist/core/adapters/uikit.js +178 -0
  90. package/dist/core/adapters/uikit.js.map +1 -0
  91. package/dist/core/adapters/vue-router.d.ts +2 -0
  92. package/dist/core/adapters/vue-router.js +224 -0
  93. package/dist/core/adapters/vue-router.js.map +1 -0
  94. package/dist/core/adapters/vue-sfc.d.ts +28 -0
  95. package/dist/core/adapters/vue-sfc.js +132 -0
  96. package/dist/core/adapters/vue-sfc.js.map +1 -0
  97. package/dist/core/credentials.d.ts +24 -0
  98. package/dist/core/credentials.js +30 -0
  99. package/dist/core/credentials.js.map +1 -0
  100. package/dist/core/dashboard.d.ts +9 -0
  101. package/dist/core/dashboard.js +20 -0
  102. package/dist/core/dashboard.js.map +1 -0
  103. package/dist/core/emit.d.ts +7 -0
  104. package/dist/core/emit.js +23 -0
  105. package/dist/core/emit.js.map +1 -0
  106. package/dist/core/hash.d.ts +2 -0
  107. package/dist/core/hash.js +6 -0
  108. package/dist/core/hash.js.map +1 -0
  109. package/dist/core/pipeline.d.ts +25 -0
  110. package/dist/core/pipeline.js +122 -0
  111. package/dist/core/pipeline.js.map +1 -0
  112. package/dist/core/publish.d.ts +31 -0
  113. package/dist/core/publish.js +87 -0
  114. package/dist/core/publish.js.map +1 -0
  115. package/dist/core/resolve.d.ts +42 -0
  116. package/dist/core/resolve.js +128 -0
  117. package/dist/core/resolve.js.map +1 -0
  118. package/dist/core/serve.d.ts +5 -0
  119. package/dist/core/serve.js +52 -0
  120. package/dist/core/serve.js.map +1 -0
  121. package/dist/core/types.d.ts +117 -0
  122. package/dist/core/types.js +9 -0
  123. package/dist/core/types.js.map +1 -0
  124. package/dist/core/version.d.ts +23 -0
  125. package/dist/core/version.js +102 -0
  126. package/dist/core/version.js.map +1 -0
  127. package/dist/mcp/server.d.ts +7 -0
  128. package/dist/mcp/server.js +224 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uikit.js","sourceRoot":"","sources":["../../../src/core/adapters/uikit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FrameworkAdapter } from "./types.js";
2
+ export declare const vueRouterAdapter: FrameworkAdapter;
@@ -0,0 +1,224 @@
1
+ import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
2
+ import { join, relative, sep, dirname } from "node:path";
3
+ import { Project, Node, SyntaxKind, ts } from "ts-morph";
4
+ import { parseVueSfc, safeReadVue, titleFromRoute, resolveVueFile } from "./vue-sfc.js";
5
+ /**
6
+ * Vue Router adapter (plain Vue 3 SPA + vue-router). Routes are *declared* in a TS/JS config
7
+ * (`createRouter({ routes: [...] })` or an exported `routes` array), not file-based. discover()
8
+ * parses that config with ts-morph, maps each route to the `.vue` component it renders (static
9
+ * import or `() => import('…')`), resolves it to a file; parse() runs the shared SFC parser.
10
+ *
11
+ * Screen id = full route path ("/users/:id"); nested children join through parent paths.
12
+ * Entry = "/". Excludes Nuxt (its own file-based adapter runs first).
13
+ */
14
+ const SOURCE_RE = /\.(ts|js|mts|cts)$/;
15
+ const CONFIG_HINT = /createRouter|routes\s*:|VueRouter/;
16
+ function srcRootOf(projectRoot) {
17
+ const src = join(projectRoot, "src");
18
+ return existsSync(src) && statSync(src).isDirectory() ? src : projectRoot;
19
+ }
20
+ function hasVueRouterDep(projectRoot) {
21
+ try {
22
+ const pkg = JSON.parse(readFileSync(join(projectRoot, "package.json"), "utf8"));
23
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
24
+ return "vue-router" in deps && !("nuxt" in deps);
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ let _project = null;
31
+ function project() {
32
+ if (!_project)
33
+ _project = new Project({
34
+ useInMemoryFileSystem: false,
35
+ skipAddingFilesFromTsConfig: true,
36
+ compilerOptions: { allowJs: true, jsx: ts.JsxEmit.React },
37
+ });
38
+ return _project;
39
+ }
40
+ function sourceFileFor(absPath) {
41
+ return project().getSourceFile(absPath) ?? project().addSourceFileAtPath(absPath);
42
+ }
43
+ export const vueRouterAdapter = {
44
+ id: "vue",
45
+ router: "vue-router",
46
+ detect(projectRoot) {
47
+ return hasVueRouterDep(projectRoot);
48
+ },
49
+ discover(projectRoot) {
50
+ const root = srcRootOf(projectRoot);
51
+ const aliasRoot = root;
52
+ const byRoute = new Map();
53
+ walkSource(root, (file) => {
54
+ const src = safeRead(file);
55
+ if (!CONFIG_HINT.test(src))
56
+ return; // cheap pre-filter
57
+ const sf = sourceFileFor(file);
58
+ const entries = routesFromConfig(sf);
59
+ if (entries.length === 0)
60
+ return;
61
+ const imports = importSpecs(sf);
62
+ const configDir = dirname(file);
63
+ for (const { route, spec } of entries) {
64
+ if (byRoute.has(route))
65
+ continue; // first declaration wins
66
+ const moduleSpec = spec ?? null;
67
+ const abs = moduleSpec ? resolveVueFile(configDir, moduleSpec, aliasRoot) : null;
68
+ if (!abs)
69
+ continue; // can't open the component → skip
70
+ byRoute.set(route, {
71
+ absPath: abs,
72
+ relPath: relative(projectRoot, abs).split(sep).join("/"),
73
+ id: route,
74
+ route,
75
+ title: titleFromRoute(route),
76
+ isEntry: route === "/",
77
+ });
78
+ }
79
+ });
80
+ return [...byRoute.values()].sort((a, b) => a.route.localeCompare(b.route));
81
+ },
82
+ parse(file) {
83
+ return parseVueSfc(safeReadVue(file.absPath));
84
+ },
85
+ };
86
+ // ---------- route extraction (ts-morph) ----------
87
+ /**
88
+ * Walk every route array in the file → flattened routes. Handles the common shapes:
89
+ * - inline `routes: [...]` property
90
+ * - `const routes = [...]` then `createRouter({ routes })` (shorthand) — the most common form
91
+ * - `createRouter({ routes: [...] })`
92
+ */
93
+ function routesFromConfig(sf) {
94
+ const out = [];
95
+ const imports = importSpecs(sf);
96
+ const seen = new Set();
97
+ const handleArray = (arr) => {
98
+ if (arr && Node.isArrayLiteralExpression(arr) && !seen.has(arr)) {
99
+ seen.add(arr);
100
+ walkRouteArray(arr, "/", out, imports);
101
+ }
102
+ };
103
+ // (a) inline `routes: [...]` property assignment
104
+ for (const pa of sf.getDescendantsOfKind(SyntaxKind.PropertyAssignment)) {
105
+ if (pa.getName() === "routes")
106
+ handleArray(pa.getInitializer());
107
+ }
108
+ // (b) `const routes = [...]` variable declaration (referenced via shorthand or by name)
109
+ for (const decl of sf.getDescendantsOfKind(SyntaxKind.VariableDeclaration)) {
110
+ if (decl.getName() === "routes")
111
+ handleArray(decl.getInitializer());
112
+ }
113
+ return out;
114
+ }
115
+ function walkRouteArray(arr, parentPath, out, imports) {
116
+ if (!Node.isArrayLiteralExpression(arr))
117
+ return;
118
+ for (const el of arr.getElements()) {
119
+ if (Node.isObjectLiteralExpression(el))
120
+ walkRouteObject(el, parentPath, out, imports);
121
+ }
122
+ }
123
+ function walkRouteObject(obj, parentPath, out, imports) {
124
+ const pathVal = stringProp(obj, "path");
125
+ const route = joinRoute(parentPath, pathVal);
126
+ const spec = componentSpec(obj, imports);
127
+ if (spec || pathVal != null)
128
+ out.push({ route, spec });
129
+ const childrenProp = obj.getProperty("children");
130
+ if (childrenProp && Node.isPropertyAssignment(childrenProp)) {
131
+ const init = childrenProp.getInitializer();
132
+ if (init)
133
+ walkRouteArray(init, route, out, imports);
134
+ }
135
+ }
136
+ /** `component: Home` (import) or `component: () => import('./X.vue')` → the .vue module specifier. */
137
+ function componentSpec(obj, imports) {
138
+ const comp = obj.getProperty("component");
139
+ if (comp && Node.isPropertyAssignment(comp)) {
140
+ const init = comp.getInitializer();
141
+ if (!init)
142
+ return null;
143
+ if (Node.isIdentifier(init))
144
+ return imports.get(init.getText()) ?? null; // static import
145
+ const dyn = dynamicImportSpecifier(init); // () => import('…')
146
+ if (dyn)
147
+ return dyn;
148
+ }
149
+ return null;
150
+ }
151
+ // ---------- helpers ----------
152
+ /** import name → module specifier (default + named static imports). */
153
+ function importSpecs(sf) {
154
+ const map = new Map();
155
+ for (const imp of sf.getImportDeclarations()) {
156
+ const spec = imp.getModuleSpecifierValue();
157
+ const def = imp.getDefaultImport();
158
+ if (def)
159
+ map.set(def.getText(), spec);
160
+ for (const n of imp.getNamedImports())
161
+ map.set(n.getName(), spec);
162
+ }
163
+ return map;
164
+ }
165
+ function dynamicImportSpecifier(node) {
166
+ if (!node)
167
+ return null;
168
+ for (const ce of node.getDescendantsOfKind(SyntaxKind.CallExpression)) {
169
+ if (ce.getExpression().getKind() === SyntaxKind.ImportKeyword) {
170
+ const a = ce.getArguments()[0];
171
+ if (a && Node.isStringLiteral(a))
172
+ return a.getLiteralValue();
173
+ }
174
+ }
175
+ return null;
176
+ }
177
+ function stringProp(obj, name) {
178
+ const prop = obj.getProperty(name);
179
+ if (prop && Node.isPropertyAssignment(prop)) {
180
+ const init = prop.getInitializer();
181
+ if (init && Node.isStringLiteral(init))
182
+ return init.getLiteralValue();
183
+ }
184
+ return null;
185
+ }
186
+ function joinRoute(parent, child) {
187
+ if (child == null || child === "")
188
+ return parent || "/";
189
+ if (child.startsWith("/"))
190
+ return normalize(child);
191
+ const base = parent === "/" ? "" : parent;
192
+ return normalize(base + "/" + child);
193
+ }
194
+ function normalize(route) {
195
+ const r = ("/" + route).replace(/\/{2,}/g, "/");
196
+ return r.length > 1 ? r.replace(/\/+$/, "") : "/";
197
+ }
198
+ function walkSource(dir, onFile) {
199
+ let entries;
200
+ try {
201
+ entries = readdirSync(dir, { withFileTypes: true });
202
+ }
203
+ catch {
204
+ return;
205
+ }
206
+ for (const entry of entries) {
207
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
208
+ continue;
209
+ const full = join(dir, entry.name);
210
+ if (entry.isDirectory())
211
+ walkSource(full, onFile);
212
+ else if (SOURCE_RE.test(entry.name))
213
+ onFile(full);
214
+ }
215
+ }
216
+ function safeRead(file) {
217
+ try {
218
+ return readFileSync(file, "utf8");
219
+ }
220
+ catch {
221
+ return "";
222
+ }
223
+ }
224
+ //# sourceMappingURL=vue-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-router.js","sourceRoot":"","sources":["../../../src/core/adapters/vue-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { RawScreen } from "./types.js";
2
+ /**
3
+ * Shared Vue Single-File-Component parsing for the Vue-family adapters (nuxt, vue-router).
4
+ * Vue can't reuse the React JSX parser — an SFC is `<template>` + `<script>` blocks, not JSX —
5
+ * so this is a zero-dependency line/regex scan in the SwiftUI adapter's style. Only file→screen
6
+ * discovery differs per adapter; the SFC signal extraction below is shared.
7
+ *
8
+ * Mapping:
9
+ * - nav (template): <router-link to> / <NuxtLink to> / <a href>
10
+ * - nav (script): router.push/replace(...) / navigateTo("…") (Nuxt) / <Navigate>-less
11
+ * - call (script): fetch / useFetch / useAsyncData / $fetch / axios
12
+ * - feature (template): <button>, <input|textarea|select>, <form>, v-for (list)
13
+ */
14
+ export interface SfcBlocks {
15
+ template: string;
16
+ script: string;
17
+ }
18
+ /** Extract the outer <template> and <script> blocks of an SFC (first of each). */
19
+ export declare function splitSfc(src: string): SfcBlocks;
20
+ /** Parse one SFC's source into raw nav/call/feature signals. `componentTags` (PascalCase) → contains candidates. */
21
+ export declare function parseVueSfc(src: string): RawScreen;
22
+ /** Last path segment → Title Case, unwrapping dynamic `[id]`/`:id`. */
23
+ export declare function titleFromRoute(route: string): string;
24
+ /** Recursively visit every `.vue` file under `dir`, skipping node_modules and dotfiles. */
25
+ export declare function walkVue(dir: string, onFile: (file: string) => void): void;
26
+ export declare function safeReadVue(file: string): string;
27
+ /** Resolve a relative `.vue` import specifier (from `fromDir`) to a file on disk, or null. */
28
+ export declare function resolveVueFile(fromDir: string, spec: string | undefined, aliasRoot: string): string | null;
@@ -0,0 +1,132 @@
1
+ import { readdirSync, readFileSync, existsSync, statSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ /** Extract the outer <template> and <script> blocks of an SFC (first of each). */
4
+ export function splitSfc(src) {
5
+ return { template: blockBody(src, "template"), script: blockBody(src, "script") };
6
+ }
7
+ /** Body of the first `<tag …>…</tag>` block, empty string if absent. */
8
+ function blockBody(src, tag) {
9
+ const open = new RegExp(`<${tag}(?:\\s[^>]*)?>`, "i").exec(src);
10
+ if (!open)
11
+ return "";
12
+ const start = open.index + open[0].length;
13
+ const end = src.toLowerCase().indexOf(`</${tag}>`, start);
14
+ return end === -1 ? src.slice(start) : src.slice(start, end);
15
+ }
16
+ // ---------- signal extraction ----------
17
+ const FEATURE_RULES = [
18
+ { re: /<button\b[^>]*>([^<]*)/i, kind: "button", label: (m) => m[1].trim() || "Button" },
19
+ { re: /<(?:input|textarea|select)\b[^>]*\bplaceholder=["']([^"']*)["']/i, kind: "input", label: (m) => m[1] || "Input" },
20
+ { re: /<(?:input|textarea|select)\b/i, kind: "input", label: () => "Input" },
21
+ { re: /<form\b/i, kind: "form", label: () => "Form" },
22
+ { re: /\bv-for\b/i, kind: "list", label: () => "List" },
23
+ ];
24
+ /** Parse one SFC's source into raw nav/call/feature signals. `componentTags` (PascalCase) → contains candidates. */
25
+ export function parseVueSfc(src) {
26
+ const { template, script } = splitSfc(src);
27
+ const navs = [];
28
+ const calls = [];
29
+ const features = [];
30
+ const components = new Set();
31
+ // ----- template: navigation links + features + child components -----
32
+ let lineNo = 0;
33
+ const templateStart = src.split(/\r?\n/).findIndex((l) => /<template/i.test(l));
34
+ for (const rawLine of template.split(/\r?\n/)) {
35
+ lineNo++;
36
+ const line = rawLine.trim();
37
+ const absLine = (templateStart >= 0 ? templateStart + 1 : 0) + lineNo;
38
+ // <router-link to="…"> / <NuxtLink to="…"> / <a href="…"> (also :to bound to a string literal)
39
+ const linkMatch = line.match(/<(?:router-link|NuxtLink)\b[^>]*?\s:?to=["']([^"']+)["']/i) ||
40
+ line.match(/<a\b[^>]*?\shref=["'](\/[^"']*)["']/i);
41
+ if (linkMatch) {
42
+ const isAnchor = /^<a\b/i.test(line);
43
+ navs.push({ target: linkMatch[1], raw: snippet(line), trigger: isAnchor ? "<a href>" : "<router-link to>", line: absLine });
44
+ }
45
+ for (const rule of FEATURE_RULES) {
46
+ const m = line.match(rule.re);
47
+ if (m)
48
+ features.push({ kind: rule.kind, label: rule.label(m), detail: m[0].trim().slice(0, 40), line: absLine });
49
+ }
50
+ // child component usage: <PascalCase ...> or <kebab-case> mapped loosely → contains candidates
51
+ for (const cm of line.matchAll(/<([A-Z]\w*)\b/g))
52
+ components.add(cm[1]);
53
+ }
54
+ // ----- script: programmatic nav + data calls -----
55
+ let sLine = 0;
56
+ const scriptStart = src.split(/\r?\n/).findIndex((l) => /<script/i.test(l));
57
+ for (const rawLine of script.split(/\r?\n/)) {
58
+ sLine++;
59
+ const line = rawLine.trim();
60
+ const absLine = (scriptStart >= 0 ? scriptStart + 1 : 0) + sLine;
61
+ // router.push("/x") / router.replace("/x") / navigateTo("/x") (Nuxt) — string-literal targets
62
+ const navMatch = line.match(/\b(?:router|this\.\$router)\.(push|replace)\s*\(\s*["']([^"']+)["']/) ||
63
+ line.match(/\bnavigateTo\s*\(\s*["']([^"']+)["']/);
64
+ if (navMatch) {
65
+ const target = navMatch[2] ?? navMatch[1];
66
+ const trigger = navMatch[2] ? `router.${navMatch[1]}` : "navigateTo()";
67
+ navs.push({ target, raw: snippet(line), trigger, line: absLine });
68
+ }
69
+ // data calls: fetch / $fetch / useFetch / useAsyncData / axios — string-literal URL when present
70
+ const callMatch = line.match(/\b(\$fetch|fetch|useFetch|useAsyncData|axios(?:\.\w+)?)\s*\(\s*["']([^"']+)["']/);
71
+ if (callMatch) {
72
+ calls.push({ url: callMatch[2], raw: snippet(line), trigger: callMatch[1], line: absLine });
73
+ }
74
+ else {
75
+ const bare = line.match(/\b(useFetch|useAsyncData)\s*\(/);
76
+ if (bare)
77
+ calls.push({ url: null, raw: snippet(line), trigger: bare[1], line: absLine });
78
+ }
79
+ }
80
+ return { navs, calls, features, components: [...components].sort(), contains: [] };
81
+ }
82
+ function snippet(text) {
83
+ const flat = text.replace(/\s+/g, " ").trim();
84
+ return flat.length > 80 ? flat.slice(0, 77) + "..." : flat;
85
+ }
86
+ /** Last path segment → Title Case, unwrapping dynamic `[id]`/`:id`. */
87
+ export function titleFromRoute(route) {
88
+ if (route === "/" || route === "")
89
+ return "Home";
90
+ const last = route.split("/").filter(Boolean).pop() ?? route;
91
+ return last
92
+ .replace(/^\[(\.\.\.)?(.+?)\]$/, "$2") // [id] / [...all] → id / all
93
+ .replace(/^:(.+)$/, "$1") // :id → id
94
+ .replace(/[-_]/g, " ")
95
+ .replace(/\b\w/g, (c) => c.toUpperCase());
96
+ }
97
+ // ---------- shared fs helpers ----------
98
+ /** Recursively visit every `.vue` file under `dir`, skipping node_modules and dotfiles. */
99
+ export function walkVue(dir, onFile) {
100
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
101
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
102
+ continue;
103
+ const full = join(dir, entry.name);
104
+ if (entry.isDirectory())
105
+ walkVue(full, onFile);
106
+ else if (entry.name.endsWith(".vue"))
107
+ onFile(full);
108
+ }
109
+ }
110
+ export function safeReadVue(file) {
111
+ try {
112
+ return readFileSync(file, "utf8");
113
+ }
114
+ catch {
115
+ return "";
116
+ }
117
+ }
118
+ /** Resolve a relative `.vue` import specifier (from `fromDir`) to a file on disk, or null. */
119
+ export function resolveVueFile(fromDir, spec, aliasRoot) {
120
+ if (!spec)
121
+ return null;
122
+ let base;
123
+ if (spec.startsWith("@/") || spec.startsWith("~/"))
124
+ base = resolve(aliasRoot, spec.slice(2)); // @/ and ~/ → src root
125
+ else if (spec.startsWith("."))
126
+ base = resolve(fromDir, spec);
127
+ else
128
+ return null;
129
+ const candidates = spec.endsWith(".vue") ? [base] : [base + ".vue", join(base, "index.vue")];
130
+ return candidates.find((c) => existsSync(c) && statSync(c).isFile()) ?? null;
131
+ }
132
+ //# sourceMappingURL=vue-sfc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-sfc.js","sourceRoot":"","sources":["../../../src/core/adapters/vue-sfc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Local credentials for the hosted service (never committed — lives in $HOME).
3
+ * One user token covers all projects; each project remembers only its slug.
4
+ */
5
+ export interface Credentials {
6
+ /** API base URL, e.g. https://<ref>.supabase.co/functions/v1 */
7
+ apiUrl?: string;
8
+ /** Personal publish token (alk_...) from `alkahest login`. */
9
+ token?: string;
10
+ /** Per-project state, keyed by absolute project path. */
11
+ projects?: Record<string, {
12
+ slug: string;
13
+ }>;
14
+ }
15
+ export declare function loadCredentials(): Credentials;
16
+ export declare function saveCredentials(creds: Credentials): void;
17
+ /** API base URL resolved from flag → saved creds → env. */
18
+ export declare function resolveApiUrl(flag: string | undefined, creds: Credentials): string;
19
+ /**
20
+ * Publish token resolved from arg → saved creds → env.
21
+ * The env fallback (ALKAHEST_TOKEN) lets the MCP server authenticate from its config
22
+ * without a prior `alkahest login`, mirroring resolveApiUrl's ALKAHEST_API_URL fallback.
23
+ */
24
+ export declare function resolveToken(arg: string | undefined, creds: Credentials): string;
@@ -0,0 +1,30 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const CRED_DIR = join(homedir(), ".alkahest");
5
+ const CRED_FILE = join(CRED_DIR, "credentials.json");
6
+ export function loadCredentials() {
7
+ try {
8
+ return JSON.parse(readFileSync(CRED_FILE, "utf8"));
9
+ }
10
+ catch {
11
+ return {};
12
+ }
13
+ }
14
+ export function saveCredentials(creds) {
15
+ mkdirSync(CRED_DIR, { recursive: true });
16
+ writeFileSync(CRED_FILE, JSON.stringify(creds, null, 2) + "\n");
17
+ }
18
+ /** API base URL resolved from flag → saved creds → env. */
19
+ export function resolveApiUrl(flag, creds) {
20
+ return (flag || creds.apiUrl || process.env.ALKAHEST_API_URL || "").replace(/\/+$/, "");
21
+ }
22
+ /**
23
+ * Publish token resolved from arg → saved creds → env.
24
+ * The env fallback (ALKAHEST_TOKEN) lets the MCP server authenticate from its config
25
+ * without a prior `alkahest login`, mirroring resolveApiUrl's ALKAHEST_API_URL fallback.
26
+ */
27
+ export function resolveToken(arg, creds) {
28
+ return (arg || creds.token || process.env.ALKAHEST_TOKEN || "").trim();
29
+ }
30
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/core/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAelC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAErD,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAgB,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,IAAwB,EAAE,KAAkB;IACxE,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAuB,EAAE,KAAkB;IACtE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACzE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ProductMap } from "./types.js";
2
+ /** Self-contained HTML string with the ProductMap inlined. No external dependencies/network. */
3
+ export declare function renderDashboard(map: ProductMap): string;
4
+ /**
5
+ * Dashboard shell with no data inlined — for the hosted viewer (Vercel).
6
+ * At runtime it fetches the map from a sibling `map.json` or `?src=<url>`,
7
+ * so the same HTML serves any project. See dashboard.html's loadMap().
8
+ */
9
+ export declare function renderShell(): string;
@@ -0,0 +1,20 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ /** Self-contained dashboard template (asset). Copied to dist/assets at build time (scripts/copy-assets.mjs). */
5
+ const TEMPLATE = readFileSync(join(dirname(fileURLToPath(import.meta.url)), "..", "assets", "dashboard.html"), "utf8");
6
+ const PLACEHOLDER = "/*__ALKAHEST_MAP__*/";
7
+ /** Self-contained HTML string with the ProductMap inlined. No external dependencies/network. */
8
+ export function renderDashboard(map) {
9
+ const json = JSON.stringify(map).replace(/</g, "\\u003c"); // prevent </script> injection
10
+ return TEMPLATE.replace(PLACEHOLDER, () => json);
11
+ }
12
+ /**
13
+ * Dashboard shell with no data inlined — for the hosted viewer (Vercel).
14
+ * At runtime it fetches the map from a sibling `map.json` or `?src=<url>`,
15
+ * so the same HTML serves any project. See dashboard.html's loadMap().
16
+ */
17
+ export function renderShell() {
18
+ return TEMPLATE.replace(PLACEHOLDER, "");
19
+ }
20
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/core/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,gHAAgH;AAChH,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;AAEvH,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAE3C,gGAAgG;AAChG,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,8BAA8B;IACzF,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProductMap } from "./types.js";
2
+ /** Output folder name (ALKAHEST.md §5). */
3
+ export declare const OUTPUT_DIR = ".alkahest";
4
+ /** Serializes the ProductMap to `<projectRoot>/.alkahest/map.json`. Returns the path. */
5
+ export declare function emitMap(projectRoot: string, map: ProductMap): string;
6
+ /** Generates the self-contained dashboard at `<projectRoot>/.alkahest/index.html`. Returns the path. */
7
+ export declare function emitDashboard(projectRoot: string, map: ProductMap): string;
@@ -0,0 +1,23 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { renderDashboard } from "./dashboard.js";
4
+ /** Output folder name (ALKAHEST.md §5). */
5
+ export const OUTPUT_DIR = ".alkahest";
6
+ function ensureDir(projectRoot) {
7
+ const dir = join(projectRoot, OUTPUT_DIR);
8
+ mkdirSync(dir, { recursive: true });
9
+ return dir;
10
+ }
11
+ /** Serializes the ProductMap to `<projectRoot>/.alkahest/map.json`. Returns the path. */
12
+ export function emitMap(projectRoot, map) {
13
+ const file = join(ensureDir(projectRoot), "map.json");
14
+ writeFileSync(file, JSON.stringify(map, null, 2) + "\n");
15
+ return file;
16
+ }
17
+ /** Generates the self-contained dashboard at `<projectRoot>/.alkahest/index.html`. Returns the path. */
18
+ export function emitDashboard(projectRoot, map) {
19
+ const file = join(ensureDir(projectRoot), "index.html");
20
+ writeFileSync(file, renderDashboard(map));
21
+ return file;
22
+ }
23
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/core/emit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAEtC,SAAS,SAAS,CAAC,WAAmB;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,OAAO,CAAC,WAAmB,EAAE,GAAe;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;IACtD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,GAAe;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;IACxD,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** File content hash — baseline for incremental updates (ALKAHEST.md §9). Truncated short, used only for identity. */
2
+ export declare function hashContent(content: string): string;
@@ -0,0 +1,6 @@
1
+ import { createHash } from "node:crypto";
2
+ /** File content hash — baseline for incremental updates (ALKAHEST.md §9). Truncated short, used only for identity. */
3
+ export function hashContent(content) {
4
+ return createHash("sha256").update(content).digest("hex").slice(0, 12);
5
+ }
6
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/core/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,sHAAsH;AACtH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ProductMap } from "./types.js";
2
+ export interface ScanOptions {
3
+ /** Ignore the baseline (map.json) and do a full rescan (ALKAHEST.md §10) */
4
+ full?: boolean;
5
+ }
6
+ export interface ScanResult {
7
+ map: ProductMap;
8
+ outFile: string;
9
+ stats: {
10
+ reused: number;
11
+ reparsed: number;
12
+ total: number;
13
+ incremental: boolean;
14
+ };
15
+ }
16
+ /**
17
+ * Core pipeline detect→discover→parse→resolve→emit (no console output).
18
+ * Framework is auto-selected via adapters (ALKAHEST.md §8). Incremental by default (§10).
19
+ * Null if no screens are found. Shared by the CLI (scan) and the MCP server.
20
+ */
21
+ export declare function runScan(projectRoot: string, options?: ScanOptions): ScanResult | null;
22
+ /** Reads an existing `.alkahest/map.json` (null if absent). */
23
+ export declare function loadMap(projectRoot: string): ProductMap | null;
24
+ /** Reads map.json if present, otherwise scans on the fly. Null if both fail. */
25
+ export declare function loadOrScan(projectRoot: string): ProductMap | null;