archmantic 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +172 -0
- package/dist/agent.d.ts +20 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +239 -0
- package/dist/agent.js.map +1 -0
- package/dist/analyze/datamodel.d.ts +9 -0
- package/dist/analyze/datamodel.d.ts.map +1 -0
- package/dist/analyze/datamodel.js +19 -0
- package/dist/analyze/datamodel.js.map +1 -0
- package/dist/analyze/derive.d.ts +21 -0
- package/dist/analyze/derive.d.ts.map +1 -0
- package/dist/analyze/derive.js +211 -0
- package/dist/analyze/derive.js.map +1 -0
- package/dist/analyze/drizzle.d.ts +3 -0
- package/dist/analyze/drizzle.d.ts.map +1 -0
- package/dist/analyze/drizzle.js +83 -0
- package/dist/analyze/drizzle.js.map +1 -0
- package/dist/analyze/endpoints.d.ts +3 -0
- package/dist/analyze/endpoints.d.ts.map +1 -0
- package/dist/analyze/endpoints.js +167 -0
- package/dist/analyze/endpoints.js.map +1 -0
- package/dist/analyze/fs-util.d.ts +3 -0
- package/dist/analyze/fs-util.d.ts.map +1 -0
- package/dist/analyze/fs-util.js +44 -0
- package/dist/analyze/fs-util.js.map +1 -0
- package/dist/analyze/incremental.d.ts +12 -0
- package/dist/analyze/incremental.d.ts.map +1 -0
- package/dist/analyze/incremental.js +102 -0
- package/dist/analyze/incremental.js.map +1 -0
- package/dist/analyze/index.d.ts +5 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +49 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/parse-util.d.ts +10 -0
- package/dist/analyze/parse-util.d.ts.map +1 -0
- package/dist/analyze/parse-util.js +47 -0
- package/dist/analyze/parse-util.js.map +1 -0
- package/dist/analyze/prisma.d.ts +4 -0
- package/dist/analyze/prisma.d.ts.map +1 -0
- package/dist/analyze/prisma.js +97 -0
- package/dist/analyze/prisma.js.map +1 -0
- package/dist/analyze/sql.d.ts +3 -0
- package/dist/analyze/sql.d.ts.map +1 -0
- package/dist/analyze/sql.js +110 -0
- package/dist/analyze/sql.js.map +1 -0
- package/dist/analyze/stack.d.ts +4 -0
- package/dist/analyze/stack.d.ts.map +1 -0
- package/dist/analyze/stack.js +94 -0
- package/dist/analyze/stack.js.map +1 -0
- package/dist/analyze/tier0.d.ts +7 -0
- package/dist/analyze/tier0.d.ts.map +1 -0
- package/dist/analyze/tier0.js +57 -0
- package/dist/analyze/tier0.js.map +1 -0
- package/dist/analyze/tier1.d.ts +13 -0
- package/dist/analyze/tier1.d.ts.map +1 -0
- package/dist/analyze/tier1.js +144 -0
- package/dist/analyze/tier1.js.map +1 -0
- package/dist/analyze/tier2.d.ts +14 -0
- package/dist/analyze/tier2.d.ts.map +1 -0
- package/dist/analyze/tier2.js +231 -0
- package/dist/analyze/tier2.js.map +1 -0
- package/dist/analyze/walk.d.ts +3 -0
- package/dist/analyze/walk.d.ts.map +1 -0
- package/dist/analyze/walk.js +50 -0
- package/dist/analyze/walk.js.map +1 -0
- package/dist/auth.d.ts +12 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +61 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +787 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/api.d.ts +20 -0
- package/dist/cloud/api.d.ts.map +1 -0
- package/dist/cloud/api.js +81 -0
- package/dist/cloud/api.js.map +1 -0
- package/dist/cloud/index.d.ts +4 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +20 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/store.d.ts +34 -0
- package/dist/cloud/store.d.ts.map +1 -0
- package/dist/cloud/store.js +137 -0
- package/dist/cloud/store.js.map +1 -0
- package/dist/diff/history.d.ts +9 -0
- package/dist/diff/history.d.ts.map +1 -0
- package/dist/diff/history.js +44 -0
- package/dist/diff/history.js.map +1 -0
- package/dist/diff/index.d.ts +5 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +26 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/model-diff.d.ts +44 -0
- package/dist/diff/model-diff.d.ts.map +1 -0
- package/dist/diff/model-diff.js +153 -0
- package/dist/diff/model-diff.js.map +1 -0
- package/dist/diff/snapshot.d.ts +8 -0
- package/dist/diff/snapshot.d.ts.map +1 -0
- package/dist/diff/snapshot.js +50 -0
- package/dist/diff/snapshot.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +44 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/naming.d.ts +12 -0
- package/dist/ir/naming.d.ts.map +1 -0
- package/dist/ir/naming.js +31 -0
- package/dist/ir/naming.js.map +1 -0
- package/dist/ir/types.d.ts +149 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +72 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/mcp/bench.d.ts +25 -0
- package/dist/mcp/bench.d.ts.map +1 -0
- package/dist/mcp/bench.js +115 -0
- package/dist/mcp/bench.js.map +1 -0
- package/dist/mcp/queries.d.ts +22 -0
- package/dist/mcp/queries.d.ts.map +1 -0
- package/dist/mcp/queries.js +147 -0
- package/dist/mcp/queries.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +147 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/usage.d.ts +23 -0
- package/dist/mcp/usage.d.ts.map +1 -0
- package/dist/mcp/usage.js +125 -0
- package/dist/mcp/usage.js.map +1 -0
- package/dist/project/bpmn-parse.d.ts +17 -0
- package/dist/project/bpmn-parse.d.ts.map +1 -0
- package/dist/project/bpmn-parse.js +60 -0
- package/dist/project/bpmn-parse.js.map +1 -0
- package/dist/project/bpmn.d.ts +11 -0
- package/dist/project/bpmn.d.ts.map +1 -0
- package/dist/project/bpmn.js +89 -0
- package/dist/project/bpmn.js.map +1 -0
- package/dist/project/capability.d.ts +16 -0
- package/dist/project/capability.d.ts.map +1 -0
- package/dist/project/capability.js +38 -0
- package/dist/project/capability.js.map +1 -0
- package/dist/project/erd.d.ts +17 -0
- package/dist/project/erd.d.ts.map +1 -0
- package/dist/project/erd.js +0 -0
- package/dist/project/erd.js.map +1 -0
- package/dist/project/html.d.ts +12 -0
- package/dist/project/html.d.ts.map +1 -0
- package/dist/project/html.js +166 -0
- package/dist/project/html.js.map +1 -0
- package/dist/project/index.d.ts +19 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +113 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/mermaid.d.ts +20 -0
- package/dist/project/mermaid.d.ts.map +1 -0
- package/dist/project/mermaid.js +89 -0
- package/dist/project/mermaid.js.map +1 -0
- package/dist/project/spec.d.ts +69 -0
- package/dist/project/spec.d.ts.map +1 -0
- package/dist/project/spec.js +164 -0
- package/dist/project/spec.js.map +1 -0
- package/dist/project/trust.d.ts +35 -0
- package/dist/project/trust.d.ts.map +1 -0
- package/dist/project/trust.js +48 -0
- package/dist/project/trust.js.map +1 -0
- package/dist/system.d.ts +61 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +161 -0
- package/dist/system.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STRUCTURAL_CONFIDENCE = void 0;
|
|
4
|
+
exports.componentFor = componentFor;
|
|
5
|
+
exports.tier0 = tier0;
|
|
6
|
+
/**
|
|
7
|
+
* Tier 0 — cheapest analysis: repo structure + manifests.
|
|
8
|
+
* Produces the internal System + one Component per source file, each grounded
|
|
9
|
+
* with provenance. No code parsing yet (that's Tier 1).
|
|
10
|
+
*/
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const types_js_1 = require("../ir/types.js");
|
|
14
|
+
/** Confidence for deterministic structural facts (Tier 0/1). */
|
|
15
|
+
exports.STRUCTURAL_CONFIDENCE = 0.95;
|
|
16
|
+
/** One Component per source file (reused by Tier 0 and the incremental updater). */
|
|
17
|
+
function componentFor(rel, systemId) {
|
|
18
|
+
return {
|
|
19
|
+
id: `comp:${rel}`,
|
|
20
|
+
name: rel,
|
|
21
|
+
kind: "module",
|
|
22
|
+
systemId,
|
|
23
|
+
provenance: [{ source: "code", ref: `${rel}:1`, confidence: exports.STRUCTURAL_CONFIDENCE }],
|
|
24
|
+
confidence: exports.STRUCTURAL_CONFIDENCE,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function tier0(root, sourceFiles) {
|
|
28
|
+
const pkgPath = (0, node_path_1.join)(root, "package.json");
|
|
29
|
+
const hasPkg = (0, node_fs_1.existsSync)(pkgPath);
|
|
30
|
+
let pkg = {};
|
|
31
|
+
if (hasPkg) {
|
|
32
|
+
try {
|
|
33
|
+
pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* leave pkg empty on malformed package.json */
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const projectName = pkg.name ?? (0, node_path_1.basename)(root);
|
|
40
|
+
const model = (0, types_js_1.createEmptyModel)(projectName);
|
|
41
|
+
const systemId = `sys:${projectName}`;
|
|
42
|
+
model.systems.push({
|
|
43
|
+
id: systemId,
|
|
44
|
+
name: projectName,
|
|
45
|
+
kind: "internal",
|
|
46
|
+
description: pkg.description ?? (hasPkg ? "Project root" : "Project root (inferred from folder name)"),
|
|
47
|
+
provenance: [
|
|
48
|
+
{ source: "repo", ref: hasPkg ? "package.json:1" : ".", confidence: exports.STRUCTURAL_CONFIDENCE },
|
|
49
|
+
],
|
|
50
|
+
confidence: exports.STRUCTURAL_CONFIDENCE,
|
|
51
|
+
});
|
|
52
|
+
for (const rel of sourceFiles) {
|
|
53
|
+
model.components.push(componentFor(rel, systemId));
|
|
54
|
+
}
|
|
55
|
+
return model;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tier0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier0.js","sourceRoot":"","sources":["../../src/analyze/tier0.ts"],"names":[],"mappings":";;;AAaA,oCASC;AAOD,sBAgCC;AA7DD;;;;GAIG;AACH,qCAAmD;AACnD,yCAA2C;AAC3C,6CAA0F;AAE1F,gEAAgE;AACnD,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,oFAAoF;AACpF,SAAgB,YAAY,CAAC,GAAW,EAAE,QAAgB;IACxD,OAAO;QACL,EAAE,EAAE,QAAQ,GAAG,EAAE;QACjB,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,QAAQ;QACd,QAAQ;QACR,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,UAAU,EAAE,6BAAqB,EAAE,CAAC;QACpF,UAAU,EAAE,6BAAqB;KAClC,CAAC;AACJ,CAAC;AAOD,SAAgB,KAAK,CAAC,IAAY,EAAE,WAAqB;IACvD,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC;IACnC,IAAI,GAAG,GAAgB,EAAE,CAAC;IAC1B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAgB,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,IAAI,IAAA,oBAAQ,EAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,2BAAgB,EAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,WAAW,EAAE,CAAC;IAEtC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,0CAA0C,CAAC;QACtG,UAAU,EAAE;YACV,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,6BAAqB,EAAE;SAC5F;QACD,UAAU,EAAE,6BAAqB;KAClC,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ArchitectureModel, type Relation, type System } from "../ir/types.js";
|
|
2
|
+
/** Build the System node for an external dependency (bare or `node:` specifier). */
|
|
3
|
+
export declare function buildExternalSystem(name: string, builtin: boolean): System;
|
|
4
|
+
export interface FileEdges {
|
|
5
|
+
/** Outgoing depends_on relations from this file. */
|
|
6
|
+
edges: Relation[];
|
|
7
|
+
/** External systems this file references (deduped within the file). */
|
|
8
|
+
externals: System[];
|
|
9
|
+
}
|
|
10
|
+
/** Extract one file's outgoing import edges + referenced external systems. */
|
|
11
|
+
export declare function extractFileEdges(root: string, rel: string, fileSet: Set<string>): FileEdges;
|
|
12
|
+
export declare function tier1(root: string, sourceFiles: string[], model: ArchitectureModel): void;
|
|
13
|
+
//# sourceMappingURL=tier1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier1.d.ts","sourceRoot":"","sources":["../../src/analyze/tier1.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAmBrG,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAS1E;AAiBD,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,uEAAuE;IACvE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CA4D3F;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAUzF"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildExternalSystem = buildExternalSystem;
|
|
7
|
+
exports.extractFileEdges = extractFileEdges;
|
|
8
|
+
exports.tier1 = tier1;
|
|
9
|
+
/**
|
|
10
|
+
* Tier 1 — deterministic static analysis (TS/JS).
|
|
11
|
+
*
|
|
12
|
+
* v1 uses the TypeScript compiler API (we already depend on `typescript`) rather
|
|
13
|
+
* than tree-sitter: more accurate for TS/JS, zero extra deps. tree-sitter is
|
|
14
|
+
* introduced when we add other languages (post-MVP).
|
|
15
|
+
*
|
|
16
|
+
* Extracts module-level import/re-export edges → `depends_on` relations, each
|
|
17
|
+
* grounded with `file:line` provenance. Internal imports resolve to Components;
|
|
18
|
+
* bare/builtin imports become external Systems. The per-file extractor
|
|
19
|
+
* (`extractFileEdges`) is reused by the incremental updater (M6).
|
|
20
|
+
*/
|
|
21
|
+
const node_fs_1 = require("node:fs");
|
|
22
|
+
const node_path_1 = require("node:path");
|
|
23
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
24
|
+
const tier0_js_1 = require("./tier0.js");
|
|
25
|
+
const NODE_BUILTINS = new Set([
|
|
26
|
+
"fs", "path", "os", "http", "https", "crypto", "events", "stream", "util",
|
|
27
|
+
"url", "child_process", "net", "tls", "zlib", "buffer", "process", "assert",
|
|
28
|
+
"readline", "worker_threads", "dns", "module",
|
|
29
|
+
]);
|
|
30
|
+
function scriptKindFor(rel) {
|
|
31
|
+
if (rel.endsWith(".tsx"))
|
|
32
|
+
return typescript_1.default.ScriptKind.TSX;
|
|
33
|
+
if (rel.endsWith(".ts"))
|
|
34
|
+
return typescript_1.default.ScriptKind.TS;
|
|
35
|
+
if (rel.endsWith(".jsx"))
|
|
36
|
+
return typescript_1.default.ScriptKind.JSX;
|
|
37
|
+
return typescript_1.default.ScriptKind.JS;
|
|
38
|
+
}
|
|
39
|
+
const compId = (rel) => `comp:${rel}`;
|
|
40
|
+
const isBuiltin = (pkg) => NODE_BUILTINS.has(pkg);
|
|
41
|
+
/** Build the System node for an external dependency (bare or `node:` specifier). */
|
|
42
|
+
function buildExternalSystem(name, builtin) {
|
|
43
|
+
return {
|
|
44
|
+
id: `sys:ext:${name}`,
|
|
45
|
+
name,
|
|
46
|
+
kind: "external",
|
|
47
|
+
description: builtin ? "Node.js runtime/builtin module" : "External dependency",
|
|
48
|
+
provenance: [{ source: "code", ref: name, confidence: tier0_js_1.STRUCTURAL_CONFIDENCE }],
|
|
49
|
+
confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Resolve a relative import specifier to a known source file (component). */
|
|
53
|
+
function resolveInternal(importerRel, spec, fileSet) {
|
|
54
|
+
const base = (0, node_path_1.join)((0, node_path_1.dirname)(importerRel), spec).split("\\").join("/");
|
|
55
|
+
// NodeNext/ESM imports carry a `.js`-family extension that maps to the `.ts`
|
|
56
|
+
// source on disk (`./walk.js` → `walk.ts`); also try the extensionless stem.
|
|
57
|
+
const stem = base.replace(/\.(js|jsx|mjs|cjs)$/, "");
|
|
58
|
+
const candidates = [
|
|
59
|
+
base,
|
|
60
|
+
`${stem}.ts`, `${stem}.tsx`, `${stem}.js`, `${stem}.jsx`, `${stem}.mjs`, `${stem}.cjs`,
|
|
61
|
+
`${stem}/index.ts`, `${stem}/index.tsx`, `${stem}/index.js`,
|
|
62
|
+
];
|
|
63
|
+
for (const c of candidates)
|
|
64
|
+
if (fileSet.has(c))
|
|
65
|
+
return c;
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/** Extract one file's outgoing import edges + referenced external systems. */
|
|
69
|
+
function extractFileEdges(root, rel, fileSet) {
|
|
70
|
+
const edges = new Map();
|
|
71
|
+
const externals = new Map();
|
|
72
|
+
const fromId = compId(rel);
|
|
73
|
+
let text;
|
|
74
|
+
try {
|
|
75
|
+
text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { edges: [], externals: [] };
|
|
79
|
+
}
|
|
80
|
+
const sf = typescript_1.default.createSourceFile(rel, text, typescript_1.default.ScriptTarget.Latest, true, scriptKindFor(rel));
|
|
81
|
+
const addRelation = (toId, prov) => {
|
|
82
|
+
const existing = edges.get(toId);
|
|
83
|
+
if (existing) {
|
|
84
|
+
existing.provenance.push(prov);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
edges.set(toId, {
|
|
88
|
+
id: `rel:${fromId}=>${toId}`,
|
|
89
|
+
name: `${fromId} → ${toId}`,
|
|
90
|
+
kind: "depends_on",
|
|
91
|
+
from: fromId,
|
|
92
|
+
to: toId,
|
|
93
|
+
provenance: [prov],
|
|
94
|
+
confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const ensureExternal = (name, builtin) => {
|
|
98
|
+
const sys = buildExternalSystem(name, builtin);
|
|
99
|
+
if (!externals.has(sys.id))
|
|
100
|
+
externals.set(sys.id, sys);
|
|
101
|
+
return sys.id;
|
|
102
|
+
};
|
|
103
|
+
const handle = (spec, node) => {
|
|
104
|
+
const line = sf.getLineAndCharacterOfPosition(node.getStart(sf)).line + 1;
|
|
105
|
+
const prov = { source: "code", ref: `${rel}:${line}`, confidence: tier0_js_1.STRUCTURAL_CONFIDENCE };
|
|
106
|
+
if (spec.startsWith(".")) {
|
|
107
|
+
const target = resolveInternal(rel, spec, fileSet);
|
|
108
|
+
if (target)
|
|
109
|
+
addRelation(compId(target), prov);
|
|
110
|
+
// unresolved relative imports (e.g. ../package.json) are skipped in v1
|
|
111
|
+
}
|
|
112
|
+
else if (spec.startsWith("node:")) {
|
|
113
|
+
addRelation(ensureExternal(spec, true), prov);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
const pkg = spec.startsWith("@") ? spec.split("/").slice(0, 2).join("/") : spec.split("/")[0];
|
|
117
|
+
addRelation(ensureExternal(pkg, isBuiltin(pkg)), prov);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
sf.forEachChild((node) => {
|
|
121
|
+
if (typescript_1.default.isImportDeclaration(node) && typescript_1.default.isStringLiteral(node.moduleSpecifier)) {
|
|
122
|
+
handle(node.moduleSpecifier.text, node);
|
|
123
|
+
}
|
|
124
|
+
else if (typescript_1.default.isExportDeclaration(node) && node.moduleSpecifier && typescript_1.default.isStringLiteral(node.moduleSpecifier)) {
|
|
125
|
+
handle(node.moduleSpecifier.text, node);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return { edges: [...edges.values()], externals: [...externals.values()] };
|
|
129
|
+
}
|
|
130
|
+
function tier1(root, sourceFiles, model) {
|
|
131
|
+
const fileSet = new Set(sourceFiles);
|
|
132
|
+
const externals = new Map();
|
|
133
|
+
for (const rel of sourceFiles) {
|
|
134
|
+
const { edges, externals: exts } = extractFileEdges(root, rel, fileSet);
|
|
135
|
+
for (const e of edges)
|
|
136
|
+
model.relations.push(e);
|
|
137
|
+
for (const s of exts)
|
|
138
|
+
if (!externals.has(s.id))
|
|
139
|
+
externals.set(s.id, s);
|
|
140
|
+
}
|
|
141
|
+
for (const s of externals.values())
|
|
142
|
+
model.systems.push(s);
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=tier1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier1.js","sourceRoot":"","sources":["../../src/analyze/tier1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ArchitectureModel } from "../ir/types.js";
|
|
2
|
+
export interface Tier2Result {
|
|
3
|
+
ran: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
capabilitiesRefined: number;
|
|
6
|
+
componentsRefined: number;
|
|
7
|
+
processRefined: boolean;
|
|
8
|
+
calls: number;
|
|
9
|
+
inputTokens: number;
|
|
10
|
+
outputTokens: number;
|
|
11
|
+
estCostUsd: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function tier2(root: string, model: ArchitectureModel): Promise<Tier2Result>;
|
|
14
|
+
//# sourceMappingURL=tier2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier2.d.ts","sourceRoot":"","sources":["../../src/analyze/tier2.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAexD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AA+BD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkMxF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.tier2 = tier2;
|
|
7
|
+
/**
|
|
8
|
+
* Tier 2 — LLM semantic pass (SA-quality prose). Opt-in, BYOK, gated on
|
|
9
|
+
* ANTHROPIC_API_KEY. See docs/ARCHITECTURE.md §7.
|
|
10
|
+
*
|
|
11
|
+
* Model tiering (locked): Haiku 4.5 for high-volume capability/component
|
|
12
|
+
* summaries; Opus 4.8 for flow/process synthesis.
|
|
13
|
+
*
|
|
14
|
+
* Provenance invariant: the LLM only *refines prose and raises confidence* on
|
|
15
|
+
* elements that the deterministic tiers already grounded with `file:line`. It
|
|
16
|
+
* never invents new elements, edges, or capabilities — so every element stays
|
|
17
|
+
* traceable to code. Each refined element gets a provenance entry recording
|
|
18
|
+
* which model touched it.
|
|
19
|
+
*/
|
|
20
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
21
|
+
const node_fs_1 = require("node:fs");
|
|
22
|
+
const node_path_1 = require("node:path");
|
|
23
|
+
const auth_js_1 = require("../auth.js");
|
|
24
|
+
const HAIKU = "claude-haiku-4-5";
|
|
25
|
+
const OPUS = "claude-opus-4-8";
|
|
26
|
+
/** Confidence we assign once an element's prose is LLM-refined (high band). */
|
|
27
|
+
const LLM_CONFIDENCE = 0.85;
|
|
28
|
+
/** USD per 1M tokens, [input, output]. Cached 2026-05; for the est-cost report. */
|
|
29
|
+
const PRICING = {
|
|
30
|
+
[HAIKU]: [1.0, 5.0],
|
|
31
|
+
[OPUS]: [5.0, 25.0],
|
|
32
|
+
};
|
|
33
|
+
const emptyResult = (reason) => ({
|
|
34
|
+
ran: false,
|
|
35
|
+
reason,
|
|
36
|
+
capabilitiesRefined: 0,
|
|
37
|
+
componentsRefined: 0,
|
|
38
|
+
processRefined: false,
|
|
39
|
+
calls: 0,
|
|
40
|
+
inputTokens: 0,
|
|
41
|
+
outputTokens: 0,
|
|
42
|
+
estCostUsd: 0,
|
|
43
|
+
});
|
|
44
|
+
/** Read one source line (1-based) for the LLM's grounding context. */
|
|
45
|
+
function lineAt(root, ref, cache) {
|
|
46
|
+
const m = /^(.*):(\d+)$/.exec(ref);
|
|
47
|
+
if (!m)
|
|
48
|
+
return "";
|
|
49
|
+
const [, rel, lineStr] = m;
|
|
50
|
+
let lines = cache.get(rel);
|
|
51
|
+
if (!lines) {
|
|
52
|
+
try {
|
|
53
|
+
lines = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8").split("\n");
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
lines = [];
|
|
57
|
+
}
|
|
58
|
+
cache.set(rel, lines);
|
|
59
|
+
}
|
|
60
|
+
return (lines[Number(lineStr) - 1] ?? "").trim();
|
|
61
|
+
}
|
|
62
|
+
async function tier2(root, model) {
|
|
63
|
+
if (!(0, auth_js_1.hasAnthropicCredentials)()) {
|
|
64
|
+
return emptyResult(`${auth_js_1.NO_CREDENTIAL_HINT} (Tier-2 LLM pass skipped)`);
|
|
65
|
+
}
|
|
66
|
+
// SDK resolves ANTHROPIC_API_KEY, else ANTHROPIC_AUTH_TOKEN (OAuth via ant login).
|
|
67
|
+
const client = new sdk_1.default();
|
|
68
|
+
const result = { ...emptyResult(""), ran: true, reason: undefined };
|
|
69
|
+
const fileCache = new Map();
|
|
70
|
+
/** One structured-output call; accumulates usage + cost. */
|
|
71
|
+
async function callJSON(modelId, system, user, schema, adaptiveThinking) {
|
|
72
|
+
const params = {
|
|
73
|
+
model: modelId,
|
|
74
|
+
max_tokens: 8192,
|
|
75
|
+
system,
|
|
76
|
+
messages: [{ role: "user", content: user }],
|
|
77
|
+
output_config: { format: { type: "json_schema", schema } },
|
|
78
|
+
...(adaptiveThinking ? { thinking: { type: "adaptive" } } : {}),
|
|
79
|
+
};
|
|
80
|
+
const resp = await client.messages.create(params);
|
|
81
|
+
const block = resp.content.find((b) => b.type === "text");
|
|
82
|
+
const usage = resp.usage;
|
|
83
|
+
result.calls++;
|
|
84
|
+
result.inputTokens += usage.input_tokens;
|
|
85
|
+
result.outputTokens += usage.output_tokens;
|
|
86
|
+
const [pin, pout] = PRICING[modelId] ?? [0, 0];
|
|
87
|
+
result.estCostUsd += (usage.input_tokens * pin + usage.output_tokens * pout) / 1_000_000;
|
|
88
|
+
return JSON.parse(block?.text ?? "{}");
|
|
89
|
+
}
|
|
90
|
+
const llmProv = (modelId) => ({ source: "code", ref: `llm:${modelId}`, confidence: LLM_CONFIDENCE });
|
|
91
|
+
try {
|
|
92
|
+
// --- Capabilities (Haiku, batched) ---
|
|
93
|
+
if (model.capabilities.length) {
|
|
94
|
+
const items = model.capabilities.map((c) => ({
|
|
95
|
+
id: c.id,
|
|
96
|
+
name: c.name,
|
|
97
|
+
code: lineAt(root, c.provenance[0]?.ref ?? "", fileCache),
|
|
98
|
+
}));
|
|
99
|
+
const schema = {
|
|
100
|
+
type: "object",
|
|
101
|
+
additionalProperties: false,
|
|
102
|
+
properties: {
|
|
103
|
+
items: {
|
|
104
|
+
type: "array",
|
|
105
|
+
items: {
|
|
106
|
+
type: "object",
|
|
107
|
+
additionalProperties: false,
|
|
108
|
+
properties: { id: { type: "string" }, description: { type: "string" } },
|
|
109
|
+
required: ["id", "description"],
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
required: ["items"],
|
|
114
|
+
};
|
|
115
|
+
const out = await callJSON(HAIKU, "You describe software capabilities in plain English for a non-engineer audience (PMs, architects). One sentence each, present tense, no code identifiers or file names. Describe what the system can DO, not how it's implemented.", "Write a capability description for each item (the `code` is the exported declaration):\n" +
|
|
116
|
+
JSON.stringify(items), schema, false);
|
|
117
|
+
const byId = new Map(out.items.map((i) => [i.id, i.description]));
|
|
118
|
+
for (const cap of model.capabilities) {
|
|
119
|
+
const desc = byId.get(cap.id);
|
|
120
|
+
if (!desc)
|
|
121
|
+
continue;
|
|
122
|
+
cap.description = desc;
|
|
123
|
+
cap.confidence = Math.max(cap.confidence, LLM_CONFIDENCE);
|
|
124
|
+
cap.provenance.push(llmProv(HAIKU));
|
|
125
|
+
result.capabilitiesRefined++;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// --- Component responsibilities (Haiku, batched) ---
|
|
129
|
+
if (model.components.length) {
|
|
130
|
+
const targetName = (id) => {
|
|
131
|
+
if (id.startsWith("comp:"))
|
|
132
|
+
return id.slice("comp:".length).split("/").pop() ?? id;
|
|
133
|
+
if (id.startsWith("sys:ext:"))
|
|
134
|
+
return id.slice("sys:ext:".length);
|
|
135
|
+
return id;
|
|
136
|
+
};
|
|
137
|
+
const items = model.components.map((c) => ({
|
|
138
|
+
id: c.id,
|
|
139
|
+
file: c.id.slice("comp:".length),
|
|
140
|
+
dependsOn: model.relations.filter((r) => r.from === c.id).map((r) => targetName(r.to)),
|
|
141
|
+
}));
|
|
142
|
+
const schema = {
|
|
143
|
+
type: "object",
|
|
144
|
+
additionalProperties: false,
|
|
145
|
+
properties: {
|
|
146
|
+
items: {
|
|
147
|
+
type: "array",
|
|
148
|
+
items: {
|
|
149
|
+
type: "object",
|
|
150
|
+
additionalProperties: false,
|
|
151
|
+
properties: { id: { type: "string" }, responsibility: { type: "string" } },
|
|
152
|
+
required: ["id", "responsibility"],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
required: ["items"],
|
|
157
|
+
};
|
|
158
|
+
const out = await callJSON(HAIKU, "You write one-line responsibility statements for code modules, in the style of a senior architect's component catalog. Infer the role from the file path and its dependencies. One concise clause, no trailing period needed.", "State each module's single responsibility:\n" + JSON.stringify(items), schema, false);
|
|
159
|
+
const byId = new Map(out.items.map((i) => [i.id, i.responsibility]));
|
|
160
|
+
for (const comp of model.components) {
|
|
161
|
+
const resp = byId.get(comp.id);
|
|
162
|
+
if (!resp)
|
|
163
|
+
continue;
|
|
164
|
+
comp.responsibility = resp;
|
|
165
|
+
comp.description = resp;
|
|
166
|
+
comp.confidence = Math.max(comp.confidence, LLM_CONFIDENCE);
|
|
167
|
+
comp.provenance.push(llmProv(HAIKU));
|
|
168
|
+
result.componentsRefined++;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// --- Process + flow synthesis (Opus 4.8) ---
|
|
172
|
+
const process = model.processes[0];
|
|
173
|
+
if (process && process.tasks.length) {
|
|
174
|
+
const respById = new Map(model.components.map((c) => [c.id, c.responsibility ?? ""]));
|
|
175
|
+
const steps = process.tasks.map((t) => {
|
|
176
|
+
const compId = t.id.replace(/^task:/, "");
|
|
177
|
+
return { id: t.id, module: t.name, responsibility: respById.get(compId) ?? "" };
|
|
178
|
+
});
|
|
179
|
+
const schema = {
|
|
180
|
+
type: "object",
|
|
181
|
+
additionalProperties: false,
|
|
182
|
+
properties: {
|
|
183
|
+
name: { type: "string" },
|
|
184
|
+
description: { type: "string" },
|
|
185
|
+
tasks: {
|
|
186
|
+
type: "array",
|
|
187
|
+
items: {
|
|
188
|
+
type: "object",
|
|
189
|
+
additionalProperties: false,
|
|
190
|
+
properties: { id: { type: "string" }, name: { type: "string" } },
|
|
191
|
+
required: ["id", "name"],
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
required: ["name", "description", "tasks"],
|
|
196
|
+
};
|
|
197
|
+
const out = await callJSON(OPUS, "You are a senior solution architect. Given the ordered modules a process orchestrates (with each module's responsibility), name the business process and rewrite each step as a concise business-meaningful action (verb phrase). Preserve the given order and the task ids exactly. Output strict JSON matching the schema.", "Synthesize the process from these ordered steps:\n" +
|
|
198
|
+
JSON.stringify({ currentName: process.name, steps }), schema, true);
|
|
199
|
+
process.name = out.name || process.name;
|
|
200
|
+
process.description = out.description || process.description;
|
|
201
|
+
process.confidence = Math.max(process.confidence, LLM_CONFIDENCE);
|
|
202
|
+
process.provenance.push(llmProv(OPUS));
|
|
203
|
+
const taskNameById = new Map(out.tasks.map((t) => [t.id, t.name]));
|
|
204
|
+
for (const task of process.tasks) {
|
|
205
|
+
const nm = taskNameById.get(task.id);
|
|
206
|
+
if (nm) {
|
|
207
|
+
task.name = nm;
|
|
208
|
+
task.provenance.push(llmProv(OPUS));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Mirror onto the matching flow's name/description if present.
|
|
212
|
+
const flow = model.flows[0];
|
|
213
|
+
if (flow) {
|
|
214
|
+
flow.name = out.name ? `${out.name} sequence` : flow.name;
|
|
215
|
+
flow.confidence = Math.max(flow.confidence, LLM_CONFIDENCE);
|
|
216
|
+
flow.provenance.push(llmProv(OPUS));
|
|
217
|
+
}
|
|
218
|
+
result.processRefined = true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
if (err instanceof sdk_1.default.AuthenticationError) {
|
|
223
|
+
return emptyResult(`Anthropic authentication failed — ${auth_js_1.NO_CREDENTIAL_HINT}`);
|
|
224
|
+
}
|
|
225
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
226
|
+
// Surface partial progress: keep ran=true, attach the error reason.
|
|
227
|
+
result.reason = `Tier-2 stopped early: ${msg}`;
|
|
228
|
+
}
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=tier2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier2.js","sourceRoot":"","sources":["../../src/analyze/tier2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/analyze/walk.ts"],"names":[],"mappings":"AAiBA,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BtD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.walkSourceFiles = walkSourceFiles;
|
|
4
|
+
/** Tier 0 helper: walk the repo and return relative paths of source files. */
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const IGNORE_DIRS = new Set([
|
|
8
|
+
"node_modules",
|
|
9
|
+
".git",
|
|
10
|
+
"dist",
|
|
11
|
+
".archmantic",
|
|
12
|
+
"coverage",
|
|
13
|
+
".next",
|
|
14
|
+
"build",
|
|
15
|
+
".vercel",
|
|
16
|
+
]);
|
|
17
|
+
const SOURCE_RE = /\.(ts|tsx|js|jsx|mjs|cjs)$/;
|
|
18
|
+
/** Returns repo-relative, forward-slashed source file paths, sorted. */
|
|
19
|
+
function walkSourceFiles(root) {
|
|
20
|
+
const out = [];
|
|
21
|
+
const stack = [root];
|
|
22
|
+
while (stack.length) {
|
|
23
|
+
const dir = stack.pop();
|
|
24
|
+
let entries;
|
|
25
|
+
try {
|
|
26
|
+
entries = (0, node_fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
for (const e of entries) {
|
|
32
|
+
const full = (0, node_path_1.join)(dir, e.name);
|
|
33
|
+
if (e.isDirectory()) {
|
|
34
|
+
if (IGNORE_DIRS.has(e.name) || e.name.startsWith("."))
|
|
35
|
+
continue;
|
|
36
|
+
// A nested package (its own package.json) is a separate model — skip it,
|
|
37
|
+
// so analysis stays scoped to the package rooted at `root` (e.g. don't
|
|
38
|
+
// pull a sibling Next.js app in `web/` into the CLI's self-model).
|
|
39
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.join)(full, "package.json")))
|
|
40
|
+
continue;
|
|
41
|
+
stack.push(full);
|
|
42
|
+
}
|
|
43
|
+
else if (e.isFile() && SOURCE_RE.test(e.name) && !e.name.endsWith(".d.ts")) {
|
|
44
|
+
out.push((0, node_path_1.relative)(root, full).split("\\").join("/"));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return out.sort();
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/analyze/walk.ts"],"names":[],"mappings":";;AAkBA,0CA2BC;AA7CD,8EAA8E;AAC9E,qCAAkD;AAClD,yCAA2C;AAE3C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc;IACd,MAAM;IACN,MAAM;IACN,aAAa;IACb,UAAU;IACV,OAAO;IACP,OAAO;IACP,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C,wEAAwE;AACxE,SAAgB,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;IAE/B,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,qBAAW,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAChE,yEAAyE;gBACzE,uEAAuE;gBACvE,mEAAmE;gBACnE,IAAI,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBAAE,SAAS;gBACrD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7E,GAAG,CAAC,IAAI,CAAC,IAAA,oBAAQ,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort: if no key/token is in the env, try to hydrate one from an
|
|
3
|
+
* `ant auth login` session. No-op if `ant` isn't installed or isn't logged in.
|
|
4
|
+
* Never overrides an existing credential (and never sets both key + token,
|
|
5
|
+
* which the API rejects).
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureAnthropicAuth(): void;
|
|
8
|
+
/** Whether any Anthropic credential is available (after attempting CLI login). */
|
|
9
|
+
export declare function hasAnthropicCredentials(): boolean;
|
|
10
|
+
/** Shared, user-facing message for when no credential is found. */
|
|
11
|
+
export declare const NO_CREDENTIAL_HINT = "no Anthropic credential \u2014 set ANTHROPIC_API_KEY in .env.local, or run `ant auth login` (CLI OAuth).";
|
|
12
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAuB1C;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,IAAI,OAAO,CAGjD;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,6GACwE,CAAC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NO_CREDENTIAL_HINT = void 0;
|
|
4
|
+
exports.ensureAnthropicAuth = ensureAnthropicAuth;
|
|
5
|
+
exports.hasAnthropicCredentials = hasAnthropicCredentials;
|
|
6
|
+
/**
|
|
7
|
+
* Anthropic credential resolution (BYOK). Two ways to authenticate the Tier-2
|
|
8
|
+
* LLM pass and `bench --exact`:
|
|
9
|
+
* 1. An API key / auth token in the environment or .env.local
|
|
10
|
+
* (ANTHROPIC_API_KEY, or ANTHROPIC_AUTH_TOKEN for OAuth).
|
|
11
|
+
* 2. `ant auth login` — the Anthropic CLI stores an OAuth profile; we pull a
|
|
12
|
+
* short-lived token from it via `ant auth print-credentials --env`.
|
|
13
|
+
*
|
|
14
|
+
* The SDK already resolves these on its own in most cases; this just makes the
|
|
15
|
+
* CLI-login path explicit and lets us gate gracefully (skip with a clear note)
|
|
16
|
+
* when no credential is available — without ever making a failed API call.
|
|
17
|
+
*/
|
|
18
|
+
const node_child_process_1 = require("node:child_process");
|
|
19
|
+
/**
|
|
20
|
+
* Best-effort: if no key/token is in the env, try to hydrate one from an
|
|
21
|
+
* `ant auth login` session. No-op if `ant` isn't installed or isn't logged in.
|
|
22
|
+
* Never overrides an existing credential (and never sets both key + token,
|
|
23
|
+
* which the API rejects).
|
|
24
|
+
*/
|
|
25
|
+
function ensureAnthropicAuth() {
|
|
26
|
+
if (process.env.ANTHROPIC_API_KEY || process.env.ANTHROPIC_AUTH_TOKEN)
|
|
27
|
+
return;
|
|
28
|
+
let out;
|
|
29
|
+
try {
|
|
30
|
+
out = (0, node_child_process_1.execFileSync)("ant", ["auth", "print-credentials", "--env"], {
|
|
31
|
+
encoding: "utf8",
|
|
32
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return; // ant not installed, or not logged in
|
|
37
|
+
}
|
|
38
|
+
for (const raw of out.split("\n")) {
|
|
39
|
+
const line = raw.trim();
|
|
40
|
+
if (!line || line.startsWith("#"))
|
|
41
|
+
continue;
|
|
42
|
+
const eq = line.indexOf("=");
|
|
43
|
+
if (eq === -1)
|
|
44
|
+
continue;
|
|
45
|
+
const key = line.slice(0, eq).trim();
|
|
46
|
+
let val = line.slice(eq + 1).trim();
|
|
47
|
+
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
48
|
+
val = val.slice(1, -1);
|
|
49
|
+
}
|
|
50
|
+
if (!process.env[key])
|
|
51
|
+
process.env[key] = val;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Whether any Anthropic credential is available (after attempting CLI login). */
|
|
55
|
+
function hasAnthropicCredentials() {
|
|
56
|
+
ensureAnthropicAuth();
|
|
57
|
+
return Boolean(process.env.ANTHROPIC_API_KEY || process.env.ANTHROPIC_AUTH_TOKEN);
|
|
58
|
+
}
|
|
59
|
+
/** Shared, user-facing message for when no credential is found. */
|
|
60
|
+
exports.NO_CREDENTIAL_HINT = "no Anthropic credential — set ANTHROPIC_API_KEY in .env.local, or run `ant auth login` (CLI OAuth).";
|
|
61
|
+
//# sourceMappingURL=auth.js.map
|