@momentiq/dark-factory-cli 2.0.0 → 2.2.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/dist/adapters/static-schema-lint.js +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +18 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/onboard.d.ts +69 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +323 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/cycle-doc-validator/validate_cycle_doc.py +131 -60
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +20 -0
- package/dist/doctor.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/onboard.d.ts +6 -0
- package/dist/mcp/tools/onboard.d.ts.map +1 -0
- package/dist/mcp/tools/onboard.js +115 -0
- package/dist/mcp/tools/onboard.js.map +1 -0
- package/dist/onboard/analyze.d.ts +7 -0
- package/dist/onboard/analyze.d.ts.map +1 -0
- package/dist/onboard/analyze.js +86 -0
- package/dist/onboard/analyze.js.map +1 -0
- package/dist/onboard/analyzer.d.ts +15 -0
- package/dist/onboard/analyzer.d.ts.map +1 -0
- package/dist/onboard/analyzer.js +52 -0
- package/dist/onboard/analyzer.js.map +1 -0
- package/dist/onboard/analyzers/ci.d.ts +3 -0
- package/dist/onboard/analyzers/ci.d.ts.map +1 -0
- package/dist/onboard/analyzers/ci.js +112 -0
- package/dist/onboard/analyzers/ci.js.map +1 -0
- package/dist/onboard/analyzers/docs.d.ts +3 -0
- package/dist/onboard/analyzers/docs.d.ts.map +1 -0
- package/dist/onboard/analyzers/docs.js +151 -0
- package/dist/onboard/analyzers/docs.js.map +1 -0
- package/dist/onboard/analyzers/git.d.ts +3 -0
- package/dist/onboard/analyzers/git.d.ts.map +1 -0
- package/dist/onboard/analyzers/git.js +87 -0
- package/dist/onboard/analyzers/git.js.map +1 -0
- package/dist/onboard/analyzers/lockfile.d.ts +3 -0
- package/dist/onboard/analyzers/lockfile.d.ts.map +1 -0
- package/dist/onboard/analyzers/lockfile.js +285 -0
- package/dist/onboard/analyzers/lockfile.js.map +1 -0
- package/dist/onboard/analyzers/manifest.d.ts +3 -0
- package/dist/onboard/analyzers/manifest.d.ts.map +1 -0
- package/dist/onboard/analyzers/manifest.js +228 -0
- package/dist/onboard/analyzers/manifest.js.map +1 -0
- package/dist/onboard/analyzers/tree.d.ts +3 -0
- package/dist/onboard/analyzers/tree.d.ts.map +1 -0
- package/dist/onboard/analyzers/tree.js +196 -0
- package/dist/onboard/analyzers/tree.js.map +1 -0
- package/dist/onboard/apply-plan.d.ts +29 -0
- package/dist/onboard/apply-plan.d.ts.map +1 -0
- package/dist/onboard/apply-plan.js +80 -0
- package/dist/onboard/apply-plan.js.map +1 -0
- package/dist/onboard/auto-profile.d.ts +3 -0
- package/dist/onboard/auto-profile.d.ts.map +1 -0
- package/dist/onboard/auto-profile.js +20 -0
- package/dist/onboard/auto-profile.js.map +1 -0
- package/dist/onboard/fixtures/replay-git-history.d.ts +20 -0
- package/dist/onboard/fixtures/replay-git-history.d.ts.map +1 -0
- package/dist/onboard/fixtures/replay-git-history.js +91 -0
- package/dist/onboard/fixtures/replay-git-history.js.map +1 -0
- package/dist/onboard/generate-plan.d.ts +18 -0
- package/dist/onboard/generate-plan.d.ts.map +1 -0
- package/dist/onboard/generate-plan.js +68 -0
- package/dist/onboard/generate-plan.js.map +1 -0
- package/dist/onboard/llm-client.d.ts +45 -0
- package/dist/onboard/llm-client.d.ts.map +1 -0
- package/dist/onboard/llm-client.js +84 -0
- package/dist/onboard/llm-client.js.map +1 -0
- package/dist/onboard/prompts/scaffold.md +93 -0
- package/dist/onboard/prompts.d.ts +13 -0
- package/dist/onboard/prompts.d.ts.map +1 -0
- package/dist/onboard/prompts.js +54 -0
- package/dist/onboard/prompts.js.map +1 -0
- package/dist/onboard/scaffold-schema.d.ts +194 -0
- package/dist/onboard/scaffold-schema.d.ts.map +1 -0
- package/dist/onboard/scaffold-schema.js +73 -0
- package/dist/onboard/scaffold-schema.js.map +1 -0
- package/dist/onboard/schema.d.ts +545 -0
- package/dist/onboard/schema.d.ts.map +1 -0
- package/dist/onboard/schema.js +148 -0
- package/dist/onboard/schema.js.map +1 -0
- package/dist/onboard/seeders/adr.d.ts +3 -0
- package/dist/onboard/seeders/adr.d.ts.map +1 -0
- package/dist/onboard/seeders/adr.js +212 -0
- package/dist/onboard/seeders/adr.js.map +1 -0
- package/dist/onboard/seeders/agent-review-config/cloud.canonical.json +22 -0
- package/dist/onboard/seeders/agent-review-config/local.canonical.json +21 -0
- package/dist/onboard/seeders/agent-review-config.d.ts +3 -0
- package/dist/onboard/seeders/agent-review-config.d.ts.map +1 -0
- package/dist/onboard/seeders/agent-review-config.js +38 -0
- package/dist/onboard/seeders/agent-review-config.js.map +1 -0
- package/dist/onboard/seeders/cycle1-bootstrap.d.ts +3 -0
- package/dist/onboard/seeders/cycle1-bootstrap.d.ts.map +1 -0
- package/dist/onboard/seeders/cycle1-bootstrap.js +76 -0
- package/dist/onboard/seeders/cycle1-bootstrap.js.map +1 -0
- package/dist/onboard/seeders/index.d.ts +47 -0
- package/dist/onboard/seeders/index.d.ts.map +1 -0
- package/dist/onboard/seeders/index.js +37 -0
- package/dist/onboard/seeders/index.js.map +1 -0
- package/dist/onboard/seeders/runbook.d.ts +13 -0
- package/dist/onboard/seeders/runbook.d.ts.map +1 -0
- package/dist/onboard/seeders/runbook.js +85 -0
- package/dist/onboard/seeders/runbook.js.map +1 -0
- package/dist/onboard/seeders/templates/adr.md.tmpl +26 -0
- package/dist/onboard/seeders/templates/cycle1-bootstrap.md.tmpl +64 -0
- package/dist/onboard/seeders/templates/runbook.md.tmpl +26 -0
- package/dist/onboard/template-loader.d.ts +20 -0
- package/dist/onboard/template-loader.d.ts.map +1 -0
- package/dist/onboard/template-loader.js +143 -0
- package/dist/onboard/template-loader.js.map +1 -0
- package/dist/onboard/template-ref.d.ts +15 -0
- package/dist/onboard/template-ref.d.ts.map +1 -0
- package/dist/onboard/template-ref.js +45 -0
- package/dist/onboard/template-ref.js.map +1 -0
- package/dist/onboard/validate.d.ts +19 -0
- package/dist/onboard/validate.d.ts.map +1 -0
- package/dist/onboard/validate.js +127 -0
- package/dist/onboard/validate.js.map +1 -0
- package/dist/onboard/writers/dry-run-renderer.d.ts +6 -0
- package/dist/onboard/writers/dry-run-renderer.d.ts.map +1 -0
- package/dist/onboard/writers/dry-run-renderer.js +88 -0
- package/dist/onboard/writers/dry-run-renderer.js.map +1 -0
- package/dist/onboard/writers/emit.d.ts +6 -0
- package/dist/onboard/writers/emit.d.ts.map +1 -0
- package/dist/onboard/writers/emit.js +29 -0
- package/dist/onboard/writers/emit.js.map +1 -0
- package/dist/onboard/writers/merge.d.ts +16 -0
- package/dist/onboard/writers/merge.d.ts.map +1 -0
- package/dist/onboard/writers/merge.js +142 -0
- package/dist/onboard/writers/merge.js.map +1 -0
- package/dist/onboard/writers/pr-writer.d.ts +44 -0
- package/dist/onboard/writers/pr-writer.d.ts.map +1 -0
- package/dist/onboard/writers/pr-writer.js +104 -0
- package/dist/onboard/writers/pr-writer.js.map +1 -0
- package/dist/onboard/writers/skip.d.ts +9 -0
- package/dist/onboard/writers/skip.d.ts.map +1 -0
- package/dist/onboard/writers/skip.js +9 -0
- package/dist/onboard/writers/skip.js.map +1 -0
- package/package.json +8 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// packages/cli/src/onboard/analyzers/docs.ts
|
|
2
|
+
//
|
|
3
|
+
// Cycle 15 Phase A — Task 8. Two concerns merged in one analyzer because both
|
|
4
|
+
// walk the top of the tree once:
|
|
5
|
+
//
|
|
6
|
+
// 1. Docs scan — populate docs.existing[] (README/CONTRIBUTING/CHANGELOG/
|
|
7
|
+
// ARCHITECTURE at root + every docs/**/*.md, cap 50), set hasClaudeMd /
|
|
8
|
+
// hasAgentsMd, derive agentContextSetPresent, and (per D2 lines 142–145)
|
|
9
|
+
// capture the structural envelope of CLAUDE.md / AGENTS.md when present —
|
|
10
|
+
// sizeBytes + ordered H1+H2 heading list, cap 50. Bodies are NEVER stored.
|
|
11
|
+
//
|
|
12
|
+
// 2. DF gate-presence check — populate dfPresence.{hooks, configJson,
|
|
13
|
+
// prWorkflow, cliPin}. cliPin parses the @momentiq/dark-factory-cli
|
|
14
|
+
// version from the ROOT package.json (dependencies first, then
|
|
15
|
+
// devDependencies), verbatim, or null if absent.
|
|
16
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
17
|
+
import { join, relative, sep } from "node:path";
|
|
18
|
+
const ROOT_DOC_FILES = [
|
|
19
|
+
"README.md",
|
|
20
|
+
"CONTRIBUTING.md",
|
|
21
|
+
"CHANGELOG.md",
|
|
22
|
+
"ARCHITECTURE.md",
|
|
23
|
+
];
|
|
24
|
+
const MAX_DOCS = 50;
|
|
25
|
+
const MAX_HEADINGS = 50;
|
|
26
|
+
async function isFile(p) {
|
|
27
|
+
try {
|
|
28
|
+
return (await stat(p)).isFile();
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function isDir(p) {
|
|
35
|
+
try {
|
|
36
|
+
return (await stat(p)).isDirectory();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Recursive walk of docs/ collecting *.md paths (forward-slash-relative to
|
|
43
|
+
// rootDir). The output array is shared with the root-doc scan, so we stop as
|
|
44
|
+
// soon as it hits MAX_DOCS — the cap is on the COMBINED list.
|
|
45
|
+
async function walkDocsDir(docsRoot, rootDir, out) {
|
|
46
|
+
if (out.length >= MAX_DOCS)
|
|
47
|
+
return;
|
|
48
|
+
let entries;
|
|
49
|
+
try {
|
|
50
|
+
entries = await readdir(docsRoot, { withFileTypes: true });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Stable ordering: filesystem readdir is not guaranteed sorted on all
|
|
56
|
+
// platforms; sort by name so the analysis envelope is deterministic.
|
|
57
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (out.length >= MAX_DOCS)
|
|
60
|
+
return;
|
|
61
|
+
const p = join(docsRoot, entry.name);
|
|
62
|
+
if (entry.isDirectory()) {
|
|
63
|
+
await walkDocsDir(p, rootDir, out);
|
|
64
|
+
}
|
|
65
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
66
|
+
out.push(relative(rootDir, p).split(sep).join("/"));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Extract H1+H2 headings from a markdown body. Tracks fenced code block state
|
|
71
|
+
// so a `# foo` line inside a ```-fence is NOT counted as a heading. Strips
|
|
72
|
+
// trailing whitespace from each captured heading. Caps the list at
|
|
73
|
+
// MAX_HEADINGS (silent truncation — the test pins this behavior).
|
|
74
|
+
function extractHeadings(body) {
|
|
75
|
+
const sizeBytes = Buffer.byteLength(body, "utf8");
|
|
76
|
+
const headings = [];
|
|
77
|
+
let inFence = false;
|
|
78
|
+
for (const line of body.split(/\r?\n/)) {
|
|
79
|
+
const trimmed = line.trimEnd();
|
|
80
|
+
// Treat any ```-prefix line (optionally indented) as a fence toggle.
|
|
81
|
+
if (/^\s*```/.test(trimmed)) {
|
|
82
|
+
inFence = !inFence;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (inFence)
|
|
86
|
+
continue;
|
|
87
|
+
const m = trimmed.match(/^#{1,2}\s+(.+)$/);
|
|
88
|
+
if (m && m[1] !== undefined) {
|
|
89
|
+
headings.push(m[1].trimEnd());
|
|
90
|
+
if (headings.length >= MAX_HEADINGS)
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { sizeBytes, headings };
|
|
95
|
+
}
|
|
96
|
+
async function readAgentFile(p) {
|
|
97
|
+
try {
|
|
98
|
+
const body = await readFile(p, "utf8");
|
|
99
|
+
return extractHeadings(body);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export const docsAnalyzer = {
|
|
106
|
+
name: "docs",
|
|
107
|
+
async detect(rootDir) {
|
|
108
|
+
const existing = [];
|
|
109
|
+
for (const name of ROOT_DOC_FILES) {
|
|
110
|
+
if (existing.length >= MAX_DOCS)
|
|
111
|
+
break;
|
|
112
|
+
if (await isFile(join(rootDir, name)))
|
|
113
|
+
existing.push(name);
|
|
114
|
+
}
|
|
115
|
+
await walkDocsDir(join(rootDir, "docs"), rootDir, existing);
|
|
116
|
+
const claudeMd = await readAgentFile(join(rootDir, "CLAUDE.md"));
|
|
117
|
+
const agentsMd = await readAgentFile(join(rootDir, "AGENTS.md"));
|
|
118
|
+
const hasClaudeMd = claudeMd !== null;
|
|
119
|
+
const hasAgentsMd = agentsMd !== null;
|
|
120
|
+
const agentContextSetPresent = hasClaudeMd &&
|
|
121
|
+
hasAgentsMd &&
|
|
122
|
+
existing.some((p) => p.startsWith("docs/"));
|
|
123
|
+
const hooks = await isDir(join(rootDir, ".husky"));
|
|
124
|
+
const configJson = await isFile(join(rootDir, ".agent-review", "config.json"));
|
|
125
|
+
const prWorkflow = await isFile(join(rootDir, ".github", "workflows", "dark-factory-pr.yml"));
|
|
126
|
+
let cliPin = null;
|
|
127
|
+
try {
|
|
128
|
+
const pkgRaw = await readFile(join(rootDir, "package.json"), "utf8");
|
|
129
|
+
const pkg = JSON.parse(pkgRaw);
|
|
130
|
+
cliPin =
|
|
131
|
+
pkg?.dependencies?.["@momentiq/dark-factory-cli"] ??
|
|
132
|
+
pkg?.devDependencies?.["@momentiq/dark-factory-cli"] ??
|
|
133
|
+
null;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
cliPin = null;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
docs: {
|
|
140
|
+
existing: existing.slice(0, MAX_DOCS),
|
|
141
|
+
hasClaudeMd,
|
|
142
|
+
hasAgentsMd,
|
|
143
|
+
agentContextSetPresent,
|
|
144
|
+
claudeMd,
|
|
145
|
+
agentsMd,
|
|
146
|
+
},
|
|
147
|
+
dfPresence: { hooks, configJson, prWorkflow, cliPin },
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/onboard/analyzers/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/onboard/analyzers/git.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiC/C,eAAO,MAAM,WAAW,EAAE,QAqDzB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// packages/cli/src/onboard/analyzers/git.ts
|
|
2
|
+
//
|
|
3
|
+
// Cycle 15 Phase A — Task 7. Populates:
|
|
4
|
+
// - canonicalName (owner/repo from origin remote, HTTPS or SSH)
|
|
5
|
+
// - git.defaultBranch (origin/HEAD symref, falling back to local HEAD)
|
|
6
|
+
// - git.recentCommitConventions.{conventional,cycleReferenced}
|
|
7
|
+
// (derived from up to the last 200 commit subjects)
|
|
8
|
+
//
|
|
9
|
+
// Returns null when the directory isn't a git repo, when git commands fail,
|
|
10
|
+
// or when the repo has no commits yet (zero-subject sample = no signal).
|
|
11
|
+
import { execFile } from "node:child_process";
|
|
12
|
+
import { promisify } from "node:util";
|
|
13
|
+
const ex = promisify(execFile);
|
|
14
|
+
async function gitOut(cwd, args) {
|
|
15
|
+
try {
|
|
16
|
+
const { stdout } = await ex("git", args, {
|
|
17
|
+
cwd,
|
|
18
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
19
|
+
});
|
|
20
|
+
return stdout;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// HTTPS form: https://host/owner/repo[.git]
|
|
27
|
+
// SSH form: user@host:owner/repo[.git]
|
|
28
|
+
// Host-agnostic by design (works for github.com, gitlab.com, self-hosted, …).
|
|
29
|
+
function parseCanonicalName(remoteUrl) {
|
|
30
|
+
const https = remoteUrl.match(/^https?:\/\/[^/]+\/([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
31
|
+
if (https)
|
|
32
|
+
return `${https[1]}/${https[2]}`;
|
|
33
|
+
const ssh = remoteUrl.match(/^[^@]+@[^:]+:([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
34
|
+
if (ssh)
|
|
35
|
+
return `${ssh[1]}/${ssh[2]}`;
|
|
36
|
+
return "";
|
|
37
|
+
}
|
|
38
|
+
const CONVENTIONAL_RE = /^(feat|fix|docs|chore|refactor|test|perf|build|ci)(\([^)]+\))?(!)?:\s/;
|
|
39
|
+
const CYCLE_RE = /[Cc]ycle \d+|closes #\d+/;
|
|
40
|
+
export const gitAnalyzer = {
|
|
41
|
+
name: "git",
|
|
42
|
+
async detect(rootDir) {
|
|
43
|
+
// Cheapest probe: `git rev-parse --git-dir` confirms it's a git repo.
|
|
44
|
+
const gitDir = await gitOut(rootDir, ["rev-parse", "--git-dir"]);
|
|
45
|
+
if (gitDir === null)
|
|
46
|
+
return null;
|
|
47
|
+
// Origin remote → canonicalName. Missing remote is fine (empty string).
|
|
48
|
+
const remote = (await gitOut(rootDir, ["remote", "get-url", "origin"]))?.trim() ?? "";
|
|
49
|
+
const canonicalName = remote ? parseCanonicalName(remote) : "";
|
|
50
|
+
// Default branch: prefer origin/HEAD symref, fall back to local HEAD,
|
|
51
|
+
// final fallback "main" so the schema always has a non-empty string.
|
|
52
|
+
let defaultBranch = "main";
|
|
53
|
+
const symRef = (await gitOut(rootDir, [
|
|
54
|
+
"symbolic-ref",
|
|
55
|
+
"--quiet",
|
|
56
|
+
"refs/remotes/origin/HEAD",
|
|
57
|
+
]))?.trim();
|
|
58
|
+
if (symRef && symRef.startsWith("refs/remotes/origin/")) {
|
|
59
|
+
defaultBranch = symRef.slice("refs/remotes/origin/".length);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const head = (await gitOut(rootDir, ["rev-parse", "--abbrev-ref", "HEAD"]))?.trim();
|
|
63
|
+
if (head && head !== "HEAD")
|
|
64
|
+
defaultBranch = head;
|
|
65
|
+
}
|
|
66
|
+
// Sample the last 200 subjects. A fresh repo with zero commits returns
|
|
67
|
+
// null — we cannot make a conventional/cycle call without any signal.
|
|
68
|
+
const subjectsBlob = (await gitOut(rootDir, ["log", "--pretty=%s", "-200"])) ?? "";
|
|
69
|
+
const subjects = subjectsBlob
|
|
70
|
+
.split(/\r?\n/)
|
|
71
|
+
.filter((s) => s.length > 0);
|
|
72
|
+
if (subjects.length === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const convCount = subjects.filter((s) => CONVENTIONAL_RE.test(s)).length;
|
|
75
|
+
const cycleCount = subjects.filter((s) => CYCLE_RE.test(s)).length;
|
|
76
|
+
const conventional = convCount / subjects.length >= 0.3;
|
|
77
|
+
const cycleReferenced = cycleCount / subjects.length >= 0.2;
|
|
78
|
+
return {
|
|
79
|
+
canonicalName,
|
|
80
|
+
git: {
|
|
81
|
+
recentCommitConventions: { conventional, cycleReferenced },
|
|
82
|
+
defaultBranch,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/onboard/analyzers/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../../src/onboard/analyzers/lockfile.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA2P/C,eAAO,MAAM,gBAAgB,EAAE,QAyB9B,CAAC"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// Lockfile analyzer — cycle 15 Phase A.
|
|
2
|
+
//
|
|
3
|
+
// Reads ONE lockfile per repo (precedence: package-lock.json > yarn.lock >
|
|
4
|
+
// poetry.lock > go.sum) and populates two RepoAnalysis fields:
|
|
5
|
+
//
|
|
6
|
+
// 1. `dependencies[]` — top 20 DIRECT deps with PINNED versions
|
|
7
|
+
// (schema cap = 20). The deterministic name+version table Phase B's
|
|
8
|
+
// LLM cites verbatim in ADR seeds (cycle 15 D2 lines 132–134).
|
|
9
|
+
//
|
|
10
|
+
// 2. `decisions[]` — heuristic markers (test-framework / deploy-target /
|
|
11
|
+
// stack / auth-model) derived from dep names. Schema cap = 10 globally.
|
|
12
|
+
//
|
|
13
|
+
// `package.json` alone (no lockfile) returns null: only a real lockfile has
|
|
14
|
+
// PINNED versions — package.json deps are ranges. Stack DETECTION is the
|
|
15
|
+
// manifest analyzer's job (Task 3); pinned versions are this analyzer's.
|
|
16
|
+
import { readFile } from "node:fs/promises";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import TOML from "@iarna/toml";
|
|
19
|
+
// @yarnpkg/lockfile is CJS; ESM only sees the default export.
|
|
20
|
+
// Pull `parse` off the default to keep ESM consumers + Node ESM-loader happy.
|
|
21
|
+
import yarnpkgLockfile from "@yarnpkg/lockfile";
|
|
22
|
+
const { parse: parseYarnLock } = yarnpkgLockfile;
|
|
23
|
+
const MAX_DEPS = 20;
|
|
24
|
+
const MAX_DECISIONS = 10;
|
|
25
|
+
// Decision-surface heuristics. Each entry matches a single dep name (exact
|
|
26
|
+
// match, post-lowercase) and emits ONE decision with evidence: [lockfilePath].
|
|
27
|
+
// Title strings follow the spec's example phrasing — Phase B's LLM polishes
|
|
28
|
+
// the narrative; Phase A only surfaces deterministic signals.
|
|
29
|
+
const DECISION_MARKERS = [
|
|
30
|
+
// test-framework
|
|
31
|
+
{ match: "vitest", surface: "test-framework", title: "Repo uses Vitest as test framework" },
|
|
32
|
+
{ match: "jest", surface: "test-framework", title: "Repo uses Jest as test framework" },
|
|
33
|
+
{ match: "mocha", surface: "test-framework", title: "Repo uses Mocha as test framework" },
|
|
34
|
+
{ match: "pytest", surface: "test-framework", title: "Repo uses Pytest as test framework" },
|
|
35
|
+
// deploy-target
|
|
36
|
+
{ match: "@kubernetes/client-node", surface: "deploy-target", title: "Repo deploys via Kubernetes" },
|
|
37
|
+
{ match: "aws-sdk", surface: "deploy-target", title: "Repo deploys via AWS" },
|
|
38
|
+
// stack — frontend
|
|
39
|
+
{ match: "next", surface: "stack", title: "Frontend stack: Next.js" },
|
|
40
|
+
{ match: "react", surface: "stack", title: "Frontend stack: React" },
|
|
41
|
+
{ match: "vue", surface: "stack", title: "Frontend stack: Vue" },
|
|
42
|
+
{ match: "svelte", surface: "stack", title: "Frontend stack: Svelte" },
|
|
43
|
+
{ match: "solid-js", surface: "stack", title: "Frontend stack: Solid.js" },
|
|
44
|
+
// stack — backend
|
|
45
|
+
{ match: "express", surface: "stack", title: "Backend framework: Express" },
|
|
46
|
+
{ match: "fastify", surface: "stack", title: "Backend framework: Fastify" },
|
|
47
|
+
{ match: "koa", surface: "stack", title: "Backend framework: Koa" },
|
|
48
|
+
{ match: "hono", surface: "stack", title: "Backend framework: Hono" },
|
|
49
|
+
{ match: "fastapi", surface: "stack", title: "Backend framework: FastAPI" },
|
|
50
|
+
{ match: "gin", surface: "stack", title: "Backend framework: Gin" },
|
|
51
|
+
// auth-model
|
|
52
|
+
{ match: "passport", surface: "auth-model", title: "Auth model: Passport" },
|
|
53
|
+
{ match: "auth0", surface: "auth-model", title: "Auth model: Auth0" },
|
|
54
|
+
{ match: "clerk", surface: "auth-model", title: "Auth model: Clerk" },
|
|
55
|
+
{ match: "next-auth", surface: "auth-model", title: "Auth model: NextAuth" },
|
|
56
|
+
{ match: "nextauth", surface: "auth-model", title: "Auth model: NextAuth" },
|
|
57
|
+
];
|
|
58
|
+
const LOCKFILE_PRECEDENCE = [
|
|
59
|
+
"package-lock.json",
|
|
60
|
+
"yarn.lock",
|
|
61
|
+
"poetry.lock",
|
|
62
|
+
"go.sum",
|
|
63
|
+
];
|
|
64
|
+
async function readIfExists(path) {
|
|
65
|
+
try {
|
|
66
|
+
return await readFile(path, "utf8");
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
if (e.code === "ENOENT")
|
|
70
|
+
return null;
|
|
71
|
+
throw e;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function chooseLockfile(rootDir) {
|
|
75
|
+
for (const name of LOCKFILE_PRECEDENCE) {
|
|
76
|
+
const contents = await readIfExists(join(rootDir, name));
|
|
77
|
+
if (contents !== null)
|
|
78
|
+
return { name, contents };
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
// package-lock.json — handles both lockfileVersion 1 (root-level dependencies
|
|
83
|
+
// with the version values being the pins) and 2/3 (packages[""].dependencies
|
|
84
|
+
// for direct-dep names; packages["node_modules/<name>"].version for the pin).
|
|
85
|
+
function parsePackageLock(contents, lockfilePath) {
|
|
86
|
+
let parsed;
|
|
87
|
+
try {
|
|
88
|
+
parsed = JSON.parse(contents);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
94
|
+
return [];
|
|
95
|
+
const obj = parsed;
|
|
96
|
+
const out = [];
|
|
97
|
+
const seen = new Set();
|
|
98
|
+
// v2/v3: prefer packages[""] for direct-dep NAMES; resolve pins from
|
|
99
|
+
// packages["node_modules/<name>"].version when available.
|
|
100
|
+
const packages = obj.packages;
|
|
101
|
+
const root = typeof packages === "object" && packages !== null
|
|
102
|
+
? packages[""]
|
|
103
|
+
: undefined;
|
|
104
|
+
if (root !== undefined && typeof root === "object" && packages !== null) {
|
|
105
|
+
const directDeps = {
|
|
106
|
+
...root.dependencies,
|
|
107
|
+
...root.devDependencies,
|
|
108
|
+
};
|
|
109
|
+
const pkgMap = packages;
|
|
110
|
+
for (const [name, requestedRange] of Object.entries(directDeps)) {
|
|
111
|
+
if (seen.has(name))
|
|
112
|
+
continue;
|
|
113
|
+
const pkgEntry = pkgMap[`node_modules/${name}`];
|
|
114
|
+
const pinnedVersion = pkgEntry && typeof pkgEntry.version === "string"
|
|
115
|
+
? pkgEntry.version
|
|
116
|
+
: requestedRange;
|
|
117
|
+
out.push({ name, version: pinnedVersion, manifestPath: lockfilePath });
|
|
118
|
+
seen.add(name);
|
|
119
|
+
if (out.length >= MAX_DEPS)
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// v1 fallback (and a belt+braces top-up if v2/v3 produced nothing): root
|
|
124
|
+
// dependencies/devDependencies whose values ARE the pinned versions.
|
|
125
|
+
if (out.length === 0) {
|
|
126
|
+
const flat = {
|
|
127
|
+
...obj.dependencies,
|
|
128
|
+
...obj.devDependencies,
|
|
129
|
+
};
|
|
130
|
+
for (const [name, version] of Object.entries(flat)) {
|
|
131
|
+
if (seen.has(name))
|
|
132
|
+
continue;
|
|
133
|
+
// v1 entries can be either bare strings (pin) or objects with .version.
|
|
134
|
+
// We only get strings here from the spread above; objects are excluded.
|
|
135
|
+
if (typeof version !== "string")
|
|
136
|
+
continue;
|
|
137
|
+
out.push({ name, version, manifestPath: lockfilePath });
|
|
138
|
+
seen.add(name);
|
|
139
|
+
if (out.length >= MAX_DEPS)
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
// yarn.lock — cross-reference top-level package.json keys with parsed lockfile
|
|
146
|
+
// entries; lockfile keys take the form "<name>@<range>", so we look up each
|
|
147
|
+
// direct dep by its requested range.
|
|
148
|
+
async function parseYarn(contents, lockfilePath, rootDir) {
|
|
149
|
+
const pkgJsonRaw = await readIfExists(join(rootDir, "package.json"));
|
|
150
|
+
if (pkgJsonRaw === null)
|
|
151
|
+
return [];
|
|
152
|
+
let pkg;
|
|
153
|
+
try {
|
|
154
|
+
pkg = JSON.parse(pkgJsonRaw);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
if (typeof pkg !== "object" || pkg === null)
|
|
160
|
+
return [];
|
|
161
|
+
const pkgObj = pkg;
|
|
162
|
+
const directDeps = {
|
|
163
|
+
...pkgObj.dependencies,
|
|
164
|
+
...pkgObj.devDependencies,
|
|
165
|
+
};
|
|
166
|
+
const parsed = parseYarnLock(contents);
|
|
167
|
+
if (parsed.type === "conflict")
|
|
168
|
+
return [];
|
|
169
|
+
const entries = parsed.object;
|
|
170
|
+
const out = [];
|
|
171
|
+
for (const [name, range] of Object.entries(directDeps)) {
|
|
172
|
+
const key = `${name}@${range}`;
|
|
173
|
+
const entry = entries[key];
|
|
174
|
+
const version = entry && typeof entry.version === "string" ? entry.version : range;
|
|
175
|
+
out.push({ name, version, manifestPath: lockfilePath });
|
|
176
|
+
if (out.length >= MAX_DEPS)
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
// poetry.lock — iterate [[package]] blocks. Older formats use category="main";
|
|
182
|
+
// newer formats omit category — accept either.
|
|
183
|
+
function parsePoetry(contents, lockfilePath) {
|
|
184
|
+
let parsed;
|
|
185
|
+
try {
|
|
186
|
+
parsed = TOML.parse(contents);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
192
|
+
return [];
|
|
193
|
+
const pkgs = parsed.package;
|
|
194
|
+
if (!Array.isArray(pkgs))
|
|
195
|
+
return [];
|
|
196
|
+
const out = [];
|
|
197
|
+
for (const raw of pkgs) {
|
|
198
|
+
if (typeof raw !== "object" || raw === null)
|
|
199
|
+
continue;
|
|
200
|
+
const entry = raw;
|
|
201
|
+
const category = entry.category;
|
|
202
|
+
if (typeof category === "string" && category !== "main")
|
|
203
|
+
continue;
|
|
204
|
+
const name = entry.name;
|
|
205
|
+
const version = entry.version;
|
|
206
|
+
if (typeof name !== "string" || typeof version !== "string")
|
|
207
|
+
continue;
|
|
208
|
+
out.push({ name, version, manifestPath: lockfilePath });
|
|
209
|
+
if (out.length >= MAX_DEPS)
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
// go.sum — `<module> <version>/go.mod <hash>` lines. The /go.mod-suffix is
|
|
215
|
+
// the canonical pin (the bare `<module> <version>` lines hash the module zip;
|
|
216
|
+
// many lines per dep exist — first-match-per-module wins).
|
|
217
|
+
function parseGoSum(contents, lockfilePath) {
|
|
218
|
+
const out = [];
|
|
219
|
+
const seen = new Set();
|
|
220
|
+
for (const line of contents.split(/\r?\n/)) {
|
|
221
|
+
const trimmed = line.trim();
|
|
222
|
+
if (!trimmed)
|
|
223
|
+
continue;
|
|
224
|
+
// Match: "<module> <version>/go.mod <hash>"
|
|
225
|
+
const match = trimmed.match(/^(\S+)\s+(\S+?)\/go\.mod\s+/);
|
|
226
|
+
if (!match)
|
|
227
|
+
continue;
|
|
228
|
+
const name = match[1];
|
|
229
|
+
const version = match[2];
|
|
230
|
+
if (name === undefined || version === undefined)
|
|
231
|
+
continue;
|
|
232
|
+
if (seen.has(name))
|
|
233
|
+
continue;
|
|
234
|
+
seen.add(name);
|
|
235
|
+
out.push({ name, version, manifestPath: lockfilePath });
|
|
236
|
+
if (out.length >= MAX_DEPS)
|
|
237
|
+
return out;
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
function deriveDecisions(dependencies, lockfilePath) {
|
|
242
|
+
const out = [];
|
|
243
|
+
for (const dep of dependencies) {
|
|
244
|
+
const lower = dep.name.toLowerCase();
|
|
245
|
+
for (const marker of DECISION_MARKERS) {
|
|
246
|
+
if (lower === marker.match) {
|
|
247
|
+
out.push({
|
|
248
|
+
title: marker.title,
|
|
249
|
+
surface: marker.surface,
|
|
250
|
+
evidence: [lockfilePath],
|
|
251
|
+
});
|
|
252
|
+
if (out.length >= MAX_DECISIONS)
|
|
253
|
+
return out;
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
export const lockfileAnalyzer = {
|
|
261
|
+
name: "lockfile",
|
|
262
|
+
async detect(rootDir) {
|
|
263
|
+
const chosen = await chooseLockfile(rootDir);
|
|
264
|
+
if (chosen === null)
|
|
265
|
+
return null;
|
|
266
|
+
let dependencies;
|
|
267
|
+
switch (chosen.name) {
|
|
268
|
+
case "package-lock.json":
|
|
269
|
+
dependencies = parsePackageLock(chosen.contents, chosen.name);
|
|
270
|
+
break;
|
|
271
|
+
case "yarn.lock":
|
|
272
|
+
dependencies = await parseYarn(chosen.contents, chosen.name, rootDir);
|
|
273
|
+
break;
|
|
274
|
+
case "poetry.lock":
|
|
275
|
+
dependencies = parsePoetry(chosen.contents, chosen.name);
|
|
276
|
+
break;
|
|
277
|
+
case "go.sum":
|
|
278
|
+
dependencies = parseGoSum(chosen.contents, chosen.name);
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
const decisions = deriveDecisions(dependencies, chosen.name);
|
|
282
|
+
return { dependencies, decisions };
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../src/onboard/analyzers/lockfile.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,2EAA2E;AAC3E,+DAA+D;AAC/D,EAAE;AACF,kEAAkE;AAClE,yEAAyE;AACzE,oEAAoE;AACpE,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,yEAAyE;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,8DAA8D;AAC9D,8EAA8E;AAC9E,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;AAIjD,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,8DAA8D;AAC9D,MAAM,gBAAgB,GAIjB;IACH,iBAAiB;IACjB,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,oCAAoC,EAAE;IAC3F,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,kCAAkC,EAAE;IACvF,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,mCAAmC,EAAE;IACzF,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,oCAAoC,EAAE;IAE3F,gBAAgB;IAChB,EAAE,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,6BAA6B,EAAE;IACpG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,sBAAsB,EAAE;IAE7E,mBAAmB;IACnB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE;IACrE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE;IACpE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE;IAChE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE;IACtE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE;IAE1E,kBAAkB;IAClB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE;IAC3E,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE;IAC3E,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE;IACnE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,yBAAyB,EAAE;IACrE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE;IAC3E,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE;IAEnE,aAAa;IACb,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE;IAC3E,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACrE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACrE,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE;IAC5E,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE;CAC5E,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC1B,mBAAmB;IACnB,WAAW;IACX,aAAa;IACb,QAAQ;CACA,CAAC;AAIX,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChE,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe;IAEf,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,SAAS,gBAAgB,CAAC,QAAgB,EAAE,YAAoB;IAC9D,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,qEAAqE;IACrE,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC9B,MAAM,IAAI,GACR,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;QAC/C,CAAC,CAAE,QAAgE,CAAC,EAAE,CAAC;QACvE,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACxE,MAAM,UAAU,GAA2B;YACzC,GAAI,IAAI,CAAC,YAAmD;YAC5D,GAAI,IAAI,CAAC,eAAsD;SAChE,CAAC;QACF,MAAM,MAAM,GAAG,QAAmD,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YAChD,MAAM,aAAa,GACjB,QAAQ,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;gBAC9C,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAClB,CAAC,CAAC,cAAc,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO,GAAG,CAAC;QACzC,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,qEAAqE;IACrE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAA2B;YACnC,GAAI,GAAG,CAAC,YAAmD;YAC3D,GAAI,GAAG,CAAC,eAAsD;SAC/D,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7B,wEAAwE;YACxE,wEAAwE;YACxE,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,SAAS;YAC1C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO,GAAG,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,qCAAqC;AACrC,KAAK,UAAU,SAAS,CACtB,QAAgB,EAChB,YAAoB,EACpB,OAAe;IAEf,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,UAAU,GAA2B;QACzC,GAAI,MAAM,CAAC,YAAmD;QAC9D,GAAI,MAAM,CAAC,eAAsD;KAClE,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAE9B,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,OAAO,GACX,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;YAAE,OAAO,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,+CAA+C;AAC/C,SAAS,WAAW,CAAC,QAAgB,EAAE,YAAoB;IACzD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAI,MAAkC,CAAC,OAAO,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;YAAE,SAAS;QACtD,MAAM,KAAK,GAAG,GAA8B,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM;YAAE,SAAS;QAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;YAAE,OAAO,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2EAA2E;AAC3E,8EAA8E;AAC9E,2DAA2D;AAC3D,SAAS,UAAU,CAAC,QAAgB,EAAE,YAAoB;IACxD,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,4CAA4C;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;YAAE,SAAS;QAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;YAAE,OAAO,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CACtB,YAA0B,EAC1B,YAAoB;IAEpB,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,IAAI,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC;oBACP,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ,EAAE,CAAC,YAAY,CAAC;iBACzB,CAAC,CAAC;gBACH,IAAI,GAAG,CAAC,MAAM,IAAI,aAAa;oBAAE,OAAO,GAAG,CAAC;gBAC5C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,IAAI,EAAE,UAAU;IAChB,KAAK,CAAC,MAAM,CAAC,OAAO;QAClB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEjC,IAAI,YAA0B,CAAC;QAC/B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,mBAAmB;gBACtB,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,WAAW;gBACd,YAAY,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACtE,MAAM;YACR,KAAK,aAAa;gBAChB,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,QAAQ;gBACX,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM;QACV,CAAC;QAED,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACrC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/onboard/analyzers/manifest.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAyM/C,eAAO,MAAM,gBAAgB,EAAE,QAqB9B,CAAC"}
|