@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
package/dist/cli.js ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { Command } from "commander";
4
+ import { scan } from "./commands/scan.js";
5
+ import { view } from "./commands/view.js";
6
+ import { mcp } from "./commands/mcp.js";
7
+ import { hook } from "./commands/hook.js";
8
+ import { publish } from "./commands/publish.js";
9
+ import { login } from "./commands/login.js";
10
+ import { update } from "./commands/update.js";
11
+ import { maybeNotifyUpdate } from "./core/version.js";
12
+ const require = createRequire(import.meta.url);
13
+ const pkg = require("../package.json");
14
+ const program = new Command();
15
+ program
16
+ .name("alkahest")
17
+ .description("Screen-graph CLI that reverse-engineers a product from code (static analysis → product map)")
18
+ .version(pkg.version);
19
+ program
20
+ .command("scan")
21
+ .description("Analyze a project → .alkahest/map.json + index.html (incremental by default)")
22
+ .argument("[path]", "project path to analyze", ".")
23
+ .option("--full", "ignore the baseline and rescan everything", false)
24
+ .option("--open", "open the dashboard right after scanning", false)
25
+ .action(async (path, opts) => {
26
+ await scan(path, opts);
27
+ await maybeNotifyUpdate();
28
+ });
29
+ program
30
+ .command("view")
31
+ .description("open the .alkahest/ dashboard via a local server")
32
+ .argument("[path]", "project path", ".")
33
+ .action((path) => view(path));
34
+ program
35
+ .command("login")
36
+ .description("save your personal publish token (from the web app) so 'publish' can authenticate")
37
+ .option("--token <token>", "alk_… token from the web app (Account → Create token)")
38
+ .option("--api <url>", "API base URL (or env ALKAHEST_API_URL)")
39
+ .action((opts) => login(opts));
40
+ program
41
+ .command("publish")
42
+ .description("upload .alkahest/map.json to the hosted viewer → shareable link (no login to view)")
43
+ .argument("[path]", "project path", ".")
44
+ .option("--api <url>", "API base URL (or env ALKAHEST_API_URL)")
45
+ .option("--name <name>", "project name (first publish only)")
46
+ .action(async (path, opts) => {
47
+ await publish(path, opts);
48
+ await maybeNotifyUpdate();
49
+ });
50
+ program
51
+ .command("mcp")
52
+ .description("run the MCP server over stdio (agents query the product map; no key)")
53
+ .action(() => mcp());
54
+ program
55
+ .command("hook")
56
+ .description("install/remove git hooks — run scan on commit/merge (diff-driven refresh)")
57
+ .argument("<action>", "install | uninstall")
58
+ .action((action) => hook(action));
59
+ program
60
+ .command("update")
61
+ .description("update alkahest to the latest GitHub release (--check: only report)")
62
+ .option("--check", "only report current vs latest, don't change anything", false)
63
+ .action((opts) => update(opts));
64
+ program.parseAsync().catch((err) => {
65
+ console.error(err instanceof Error ? err.message : err);
66
+ process.exitCode = 1;
67
+ });
68
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function hook(action: string): Promise<void>;
@@ -0,0 +1,64 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, statSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ /**
4
+ * Install/remove a git hook that auto-refreshes the product map on diffs (ALKAHEST.md §10).
5
+ * Incremental logic lives in `scan`; this hook only triggers it — the two are separate.
6
+ */
7
+ const HOOKS = ["post-commit", "post-merge"];
8
+ const START = "# >>> alkahest >>>";
9
+ const END = "# <<< alkahest <<<";
10
+ const BLOCK = `${START}\n` +
11
+ `# Auto-refresh the product map on diffs (ALKAHEST.md §10). Remove: alkahest hook uninstall\n` +
12
+ `alkahest scan >/dev/null 2>&1 || npx --no-install alkahest scan >/dev/null 2>&1 || true\n` +
13
+ `${END}\n`;
14
+ export async function hook(action) {
15
+ const root = resolve(".");
16
+ const gitPath = join(root, ".git");
17
+ if (!existsSync(gitPath)) {
18
+ console.log("[alkahest] not a git repository (no .git).");
19
+ return;
20
+ }
21
+ if (!statSync(gitPath).isDirectory()) {
22
+ console.log("[alkahest] .git is a file (worktree/submodule) — install the hook manually.");
23
+ return;
24
+ }
25
+ const hooksDir = join(gitPath, "hooks");
26
+ mkdirSync(hooksDir, { recursive: true });
27
+ if (action === "install") {
28
+ for (const h of HOOKS)
29
+ installOne(join(hooksDir, h));
30
+ console.log(`[alkahest] git hooks installed: ${HOOKS.join(", ")} → runs 'alkahest scan' (incremental) on commit/merge`);
31
+ }
32
+ else if (action === "uninstall") {
33
+ for (const h of HOOKS)
34
+ uninstallOne(join(hooksDir, h));
35
+ console.log(`[alkahest] git hooks removed: ${HOOKS.join(", ")}`);
36
+ }
37
+ else {
38
+ console.log("usage: alkahest hook <install|uninstall>");
39
+ }
40
+ }
41
+ function installOne(file) {
42
+ let content = existsSync(file) ? readFileSync(file, "utf8") : "#!/bin/sh\n";
43
+ if (content.includes(START))
44
+ return; // already installed (idempotent)
45
+ if (!content.startsWith("#!"))
46
+ content = "#!/bin/sh\n" + content;
47
+ if (!content.endsWith("\n"))
48
+ content += "\n";
49
+ writeFileSync(file, content + "\n" + BLOCK);
50
+ chmodSync(file, 0o755);
51
+ }
52
+ function uninstallOne(file) {
53
+ if (!existsSync(file))
54
+ return;
55
+ const content = readFileSync(file, "utf8");
56
+ const re = new RegExp(`\\n?${escapeRe(START)}[\\s\\S]*?${escapeRe(END)}\\n?`, "g");
57
+ const next = content.replace(re, "\n");
58
+ if (next !== content)
59
+ writeFileSync(file, next);
60
+ }
61
+ function escapeRe(s) {
62
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
63
+ }
64
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Save a personal publish token so `alkahest publish` can authenticate as you.
3
+ * Get the token from the web app (Account → Create token) after signing in with GitHub.
4
+ */
5
+ export interface LoginOptions {
6
+ /** The alk_… token from the web app. If omitted, we print instructions. */
7
+ token?: string;
8
+ /** API base URL (or env ALKAHEST_API_URL). */
9
+ api?: string;
10
+ }
11
+ export declare function login(options: LoginOptions): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import { loadCredentials, resolveApiUrl, saveCredentials } from "../core/credentials.js";
2
+ export async function login(options) {
3
+ const creds = loadCredentials();
4
+ const apiUrl = resolveApiUrl(options.api, creds);
5
+ if (!options.token) {
6
+ console.log("[alkahest] login — paste a token from the web app:");
7
+ console.log(" 1. Open the Alkahest web app and sign in with GitHub");
8
+ console.log(" 2. Account → Create token, copy the alk_… value");
9
+ console.log(" 3. Run: alkahest login --token alk_xxxxx" + (apiUrl ? "" : " --api <url>"));
10
+ process.exitCode = 1;
11
+ return;
12
+ }
13
+ if (!options.token.startsWith("alk_")) {
14
+ console.error("[alkahest] that doesn't look like a token (expected alk_…).");
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ creds.token = options.token;
19
+ if (apiUrl)
20
+ creds.apiUrl = apiUrl;
21
+ saveCredentials(creds);
22
+ console.log("[alkahest] logged in. Token saved to ~/.alkahest/credentials.json");
23
+ if (!apiUrl) {
24
+ console.log(" note: no API URL set — pass --api <url> or set ALKAHEST_API_URL before publishing.");
25
+ }
26
+ }
27
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAazF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAqB;IAC/C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,4CAA4C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAClC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Run the Alkahest MCP server over stdio (ALKAHEST.md §7, agent mode).
3
+ * Connect from an agent's MCP config via `command: "alkahest", args: ["mcp"]`.
4
+ * stdout is reserved for JSON-RPC, so never console.log here.
5
+ */
6
+ export declare function mcp(): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { buildServer } from "../mcp/server.js";
3
+ /**
4
+ * Run the Alkahest MCP server over stdio (ALKAHEST.md §7, agent mode).
5
+ * Connect from an agent's MCP config via `command: "alkahest", args: ["mcp"]`.
6
+ * stdout is reserved for JSON-RPC, so never console.log here.
7
+ */
8
+ export async function mcp() {
9
+ const server = buildServer();
10
+ await server.connect(new StdioServerTransport());
11
+ // After connecting, the process stays alive while stdio is open.
12
+ }
13
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,iEAAiE;AACnE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Upload `<projectRoot>/.alkahest/map.json` to the hosted viewer so non-developers
3
+ * can open the product map at a shareable link — no install, no login to view.
4
+ * Only map.json is uploaded; source code never leaves the machine.
5
+ *
6
+ * Auth is a personal token from `alkahest login` (or the ALKAHEST_TOKEN env).
7
+ * First publish of a project auto-creates it under your account; the returned slug
8
+ * is remembered per project path so later publishes update the same link.
9
+ *
10
+ * The actual work lives in core/publish.ts (shared with the MCP `publish` tool); this
11
+ * command only maps the result to console output and an exit code.
12
+ */
13
+ export interface PublishOptions {
14
+ /** API base URL (or env ALKAHEST_API_URL). */
15
+ api?: string;
16
+ /** Project name shown in the URL/dashboard (first publish only; defaults to folder name). */
17
+ name?: string;
18
+ }
19
+ export declare function publish(path: string, options: PublishOptions): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import { publishMap } from "../core/publish.js";
2
+ export async function publish(path, options) {
3
+ const res = await publishMap(path, { ...options, source: "cli" });
4
+ if (!res.ok) {
5
+ if (res.code === "no_map") {
6
+ console.error(`[alkahest] no .alkahest/map.json found — run 'alkahest scan' first.`);
7
+ }
8
+ else if (res.code === "plan_limit") {
9
+ console.error(`[alkahest] ✗ Publish blocked — ${res.message}`);
10
+ console.error(" Upgrade to Pro, or 'alkahest view' still works locally for free.");
11
+ }
12
+ else if (res.code === "invalid_token") {
13
+ console.error("[alkahest] ✗ Token invalid or revoked. Run 'alkahest login' again.");
14
+ }
15
+ else if (res.code === "client_too_old") {
16
+ console.error(`[alkahest] ✗ ${res.message}`);
17
+ }
18
+ else {
19
+ console.error(`[alkahest] publish failed: ${res.message}`);
20
+ }
21
+ process.exitCode = 1;
22
+ return;
23
+ }
24
+ console.log(`[alkahest] published ${res.slug}`);
25
+ console.log(` → ${res.viewerUrl ?? res.mapUrl}`);
26
+ }
27
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAqBhD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,OAAuB;IACjE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACtF,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACtF,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ScanOptions {
2
+ /** Ignore the baseline and rescan everything (ALKAHEST.md §10) */
3
+ full: boolean;
4
+ /** Open the dashboard right after scanning */
5
+ open: boolean;
6
+ }
7
+ /**
8
+ * Analyze → `.alkahest/map.json` + `index.html` (ALKAHEST.md §4).
9
+ * The core pipeline lives in runScan; this only adds logging and open.
10
+ */
11
+ export declare function scan(path: string, options: ScanOptions): Promise<void>;
@@ -0,0 +1,29 @@
1
+ import { relative, resolve } from "node:path";
2
+ import { runScan } from "../core/pipeline.js";
3
+ import { serveDashboard } from "../core/serve.js";
4
+ /**
5
+ * Analyze → `.alkahest/map.json` + `index.html` (ALKAHEST.md §4).
6
+ * The core pipeline lives in runScan; this only adds logging and open.
7
+ */
8
+ export async function scan(path, options) {
9
+ const projectRoot = resolve(path);
10
+ const result = runScan(projectRoot, { full: options.full });
11
+ if (!result) {
12
+ console.log(`[alkahest] ${projectRoot}: no screens found.`);
13
+ console.log(" └─ Phase 1 supports only Next app-router (page.* under app/ or src/app/).");
14
+ return;
15
+ }
16
+ const { map, outFile, stats } = result;
17
+ console.log(`[alkahest] scan: ${projectRoot}`);
18
+ const mode = stats.incremental ? `incremental (reused ${stats.reused} / reparsed ${stats.reparsed})` : "full";
19
+ console.log(` framework=${map.meta.framework} router=${map.meta.router} screens=${map.screens.length} · ${mode}`);
20
+ const unresolvedNav = map.transitions.filter((t) => t.to === null).length;
21
+ const unresolvedCall = map.calls.filter((c) => c.to === null).length;
22
+ console.log(` → ${relative(projectRoot, outFile) || outFile} (+ index.html)`);
23
+ console.log(` screens=${map.screens.length} resources=${map.resources.length} ` +
24
+ `transitions=${map.transitions.length}(unresolved ${unresolvedNav}) ` +
25
+ `calls=${map.calls.length}(unresolved ${unresolvedCall})`);
26
+ if (options.open)
27
+ await serveDashboard(projectRoot);
28
+ }
29
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,OAAoB;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,qBAAqB,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,uBAAuB,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9G,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,SAAS,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAEnH,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,OAAO,iBAAiB,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CACT,aAAa,GAAG,CAAC,OAAO,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG;QAClE,eAAe,GAAG,CAAC,WAAW,CAAC,MAAM,eAAe,aAAa,IAAI;QACrE,SAAS,GAAG,CAAC,KAAK,CAAC,MAAM,eAAe,cAAc,GAAG,CAC5D,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Update the installed alkahest to the latest version.
3
+ *
4
+ * Version source is GitHub Releases (no npm) — see core/version.ts. The update mechanism
5
+ * adapts to the install:
6
+ * - git checkout (`git clone` + `npm link`): `git pull` + reinstall in place (`npm install`
7
+ * re-runs the `prepare` build), so the linked `alkahest` updates.
8
+ * - anything else (e.g. `npm i -g github:…`, which strips .git): print the reinstall command.
9
+ *
10
+ * `--check` only reports current-vs-latest and changes nothing.
11
+ */
12
+ export interface UpdateOptions {
13
+ check?: boolean;
14
+ }
15
+ export declare function update(options?: UpdateOptions): Promise<void>;
@@ -0,0 +1,41 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ import { dirname, join } from "node:path";
5
+ import { checkForUpdate, repoSlug } from "../core/version.js";
6
+ export async function update(options = {}) {
7
+ const require = createRequire(import.meta.url);
8
+ const pkgRoot = dirname(require.resolve("../../package.json"));
9
+ const { current, latest, behind } = await checkForUpdate();
10
+ console.log(`[alkahest] current version ${current}`);
11
+ if (latest && !behind) {
12
+ console.log(`[alkahest] already up to date (latest release ${latest}).`);
13
+ return;
14
+ }
15
+ if (latest)
16
+ console.log(`[alkahest] update available: ${current} → ${latest}`);
17
+ else
18
+ console.log(`[alkahest] (no published GitHub release to compare against — will pull latest source.)`);
19
+ if (options.check)
20
+ return; // report-only
21
+ if (!existsSync(join(pkgRoot, ".git"))) {
22
+ console.log("[alkahest] this install isn't a git checkout — update by reinstalling:");
23
+ console.log(` npm install -g github:${repoSlug()}`);
24
+ return;
25
+ }
26
+ const run = (cmd, args) => execFileSync(cmd, args, { cwd: pkgRoot, stdio: "inherit" });
27
+ try {
28
+ console.log("[alkahest] git pull…");
29
+ run("git", ["pull", "--ff-only"]);
30
+ console.log("[alkahest] npm install (rebuilds via prepare)…");
31
+ run("npm", ["install"]);
32
+ }
33
+ catch (err) {
34
+ console.error("[alkahest] update failed: " + (err instanceof Error ? err.message : String(err)));
35
+ console.error(` resolve it by hand in ${pkgRoot} (e.g. check 'git status'), then re-run.`);
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ console.log("[alkahest] done — restart the MCP server / reopen your tools to pick up the new version.");
40
+ }
41
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiB9D,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAyB,EAAE;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE/D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,iDAAiD,MAAM,IAAI,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;;QAC1E,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;IAE3G,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,CAAC,cAAc;IAEzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACzG,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,0CAA0C,CAAC,CAAC;QAC5F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;AAC1G,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Serve the `.alkahest/` dashboard over a local server to explore the
3
+ * screen-flow / call graph (ALKAHEST.md §5). Regenerates index.html from
4
+ * map.json each time so the latest template is applied.
5
+ */
6
+ export declare function view(path: string): Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { emitDashboard, OUTPUT_DIR } from "../core/emit.js";
4
+ import { serveDashboard } from "../core/serve.js";
5
+ /**
6
+ * Serve the `.alkahest/` dashboard over a local server to explore the
7
+ * screen-flow / call graph (ALKAHEST.md §5). Regenerates index.html from
8
+ * map.json each time so the latest template is applied.
9
+ */
10
+ export async function view(path) {
11
+ const projectRoot = resolve(path);
12
+ const mapPath = join(projectRoot, OUTPUT_DIR, "map.json");
13
+ if (!existsSync(mapPath)) {
14
+ console.log(`[alkahest] ${mapPath} not found — run 'alkahest scan' first.`);
15
+ return;
16
+ }
17
+ const map = JSON.parse(readFileSync(mapPath, "utf8"));
18
+ emitDashboard(projectRoot, map);
19
+ await serveDashboard(projectRoot);
20
+ }
21
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAY;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,yCAAyC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAe,CAAC;IACpE,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FrameworkAdapter } from "./types.js";
2
+ export declare const angularAdapter: FrameworkAdapter;