@rryando/arcs 3.3.2 → 3.4.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.
- package/README.md +29 -25
- package/dist/cli/arcs-orchestrate-caveman.d.ts +1 -1
- package/dist/cli/arcs-orchestrate-caveman.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate-caveman.js +4 -5
- package/dist/cli/arcs-orchestrate-caveman.js.map +1 -1
- package/dist/cli/arcs-orchestrate.d.ts +1 -1
- package/dist/cli/arcs-orchestrate.d.ts.map +1 -1
- package/dist/cli/arcs-orchestrate.js +94 -102
- package/dist/cli/arcs-orchestrate.js.map +1 -1
- package/dist/cli/bundle-installer.d.ts.map +1 -1
- package/dist/cli/bundle-installer.js +32 -0
- package/dist/cli/bundle-installer.js.map +1 -1
- package/dist/cli/commands/maintenance.js +26 -24
- package/dist/cli/commands/maintenance.js.map +1 -1
- package/dist/cli/commands/project.js +49 -26
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/proposal.js +12 -11
- package/dist/cli/commands/proposal.js.map +1 -1
- package/dist/cli/config.d.ts +19 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +23 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/instructions.d.ts.map +1 -1
- package/dist/cli/instructions.js +16 -0
- package/dist/cli/instructions.js.map +1 -1
- package/dist/cli/setup.d.ts +15 -3
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +257 -64
- package/dist/cli/setup.js.map +1 -1
- package/dist/utils/codegraph-install.d.ts +16 -0
- package/dist/utils/codegraph-install.d.ts.map +1 -0
- package/dist/utils/codegraph-install.js +81 -0
- package/dist/utils/codegraph-install.js.map +1 -0
- package/dist/utils/codegraph-knowledge.d.ts +22 -0
- package/dist/utils/codegraph-knowledge.d.ts.map +1 -0
- package/dist/utils/codegraph-knowledge.js +47 -0
- package/dist/utils/codegraph-knowledge.js.map +1 -0
- package/dist/utils/codegraph.d.ts +101 -0
- package/dist/utils/codegraph.d.ts.map +1 -0
- package/dist/utils/codegraph.js +383 -0
- package/dist/utils/codegraph.js.map +1 -0
- package/dist/utils/json-schemas.d.ts +84 -84
- package/dist/utils/json-schemas.d.ts.map +1 -1
- package/dist/utils/json-schemas.js +11 -9
- package/dist/utils/json-schemas.js.map +1 -1
- package/dist/utils/proposal-store.d.ts +2 -2
- package/dist/utils/proposal-store.d.ts.map +1 -1
- package/dist/utils/proposal-store.js +34 -7
- package/dist/utils/proposal-store.js.map +1 -1
- package/dist/utils/rtk.d.ts +7 -0
- package/dist/utils/rtk.d.ts.map +1 -0
- package/dist/utils/rtk.js +26 -0
- package/dist/utils/rtk.js.map +1 -0
- package/opencode/arcs/.opencode/plugins/arcs.js +1 -40
- package/opencode/arcs/bundle-runtime.json +2 -2
- package/opencode/arcs/manifest.json +68 -8
- package/opencode/arcs/prompts/arcs-docs.txt +34 -33
- package/opencode/arcs/prompts/arcs-orchestrate-caveman.txt +98 -107
- package/opencode/arcs/prompts/arcs-orchestrate.txt +94 -102
- package/opencode/arcs/prompts/code-reviewer.txt +29 -20
- package/opencode/arcs/prompts/devil-advocate.txt +16 -6
- package/opencode/arcs/prompts/docs-researcher.txt +18 -15
- package/opencode/arcs/prompts/graph-explorer.txt +53 -216
- package/opencode/arcs/prompts/oncall-ops.txt +28 -19
- package/opencode/arcs/prompts/qa-analyst.txt +26 -20
- package/opencode/arcs/prompts/software-engineer.txt +18 -19
- package/opencode/arcs/prompts/system-architect.txt +20 -13
- package/opencode/arcs/prompts/tech-architect.txt +20 -13
- package/opencode/arcs/skills/code-agent/SKILL.md +2 -2
- package/opencode/arcs/skills/deep-pr-review/SKILL.md +12 -12
- package/opencode/arcs/skills/deep-pr-review/{graphify-diff.md → codegraph-diff.md} +27 -31
- package/opencode/arcs/skills/deep-pr-review/review-template.md +4 -4
- package/opencode/arcs/skills/{enriching-graphify-proposals → enriching-codegraph-proposals}/SKILL.md +8 -8
- package/opencode/arcs/skills/executing-plans/SKILL.md +12 -8
- package/opencode/arcs/skills/init-project/SKILL.md +39 -39
- package/opencode/arcs/skills/quick-dev/SKILL.md +3 -3
- package/opencode/arcs/skills/requesting-code-review/SKILL.md +11 -7
- package/opencode/arcs/skills/requesting-code-review/code-reviewer.md +36 -76
- package/opencode/arcs/skills/subagent-driven-development/SKILL.md +30 -11
- package/opencode/arcs/skills/subagent-driven-development/code-quality-reviewer-prompt.md +3 -2
- package/opencode/arcs/skills/subagent-driven-development/implementer-prompt.md +13 -13
- package/opencode/arcs/skills/subagent-driven-development/spec-reviewer-prompt.md +1 -1
- package/opencode/arcs/skills/systematic-debugging/SKILL.md +3 -3
- package/opencode/arcs/skills/systematic-debugging/root-cause-tracing.md +2 -2
- package/opencode/arcs/skills/test-driven-development/SKILL.md +4 -4
- package/opencode/arcs/skills/test-driven-development/tdd-rationalizations-and-examples.md +2 -2
- package/opencode/arcs/skills/to-diagram/SKILL.md +3 -1
- package/opencode/arcs/skills/writing-plans/SKILL.md +3 -1
- package/package.json +2 -2
- package/scripts/arcs-init.mjs +3 -2
- package/scripts/build-opencode-bundle.mjs +4 -3
- package/scripts/deploy-claudecode-bundle.mjs +37 -11
- package/scripts/deploy-opencode-bundle.mjs +12 -1
- package/scripts/lib/bundle-helpers.mjs +43 -0
- package/scripts/lint-bundle.mjs +5 -3
- package/skills/init-project.md +25 -25
- package/skills/orchestrate.md +10 -3
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { annotateDedupCandidates, computeGraphFingerprint, readProposals, writeProposals, } from "./proposal-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Convert codegraph ingestion output into the proposals file payload
|
|
4
|
+
* and persist it through `proposal-store.writeProposals()`.
|
|
5
|
+
*
|
|
6
|
+
* Replaces the legacy direct-write path that used to populate
|
|
7
|
+
* `knowledge/index.json` and `knowledge/<id>.md` at ingest time. Codegraph
|
|
8
|
+
* proposals now sit in the proposals gate until a skill-aware host enriches
|
|
9
|
+
* them into durable knowledge entries.
|
|
10
|
+
*
|
|
11
|
+
* Merge semantics: if a proposals file already exists, proposals from the
|
|
12
|
+
* existing file with ids NOT present in the new extraction are preserved.
|
|
13
|
+
* This protects backfilled proposals (with empty structuralFacts) and any
|
|
14
|
+
* other pending entries from being clobbered when codegraph re-runs. The new
|
|
15
|
+
* extraction wins on collisions — a fresh extraction produces fresher facts.
|
|
16
|
+
*/
|
|
17
|
+
export async function writeProposalsFile(slug, proposals, graphJsonContent) {
|
|
18
|
+
// Map ingestion shape → storage shape. The storage `Proposal` adds an
|
|
19
|
+
// initially-empty `suggestedDedupCandidates`; `annotateDedupCandidates`
|
|
20
|
+
// populates it from the existing knowledge index.
|
|
21
|
+
const draft = proposals.map((p) => ({
|
|
22
|
+
id: p.id,
|
|
23
|
+
kind: p.kind,
|
|
24
|
+
label: p.label,
|
|
25
|
+
structuralFacts: p.structuralFacts,
|
|
26
|
+
sourceFiles: p.sourceFiles,
|
|
27
|
+
suggestedDedupCandidates: [],
|
|
28
|
+
}));
|
|
29
|
+
const annotated = await annotateDedupCandidates(slug, draft);
|
|
30
|
+
// Preserve existing proposals not present in the new extraction. This
|
|
31
|
+
// protects the lossy backfill payload (structuralFacts: {}) and any other
|
|
32
|
+
// pending agent-enrichment work from being silently dropped on the next
|
|
33
|
+
// sync. New extraction wins on id collisions.
|
|
34
|
+
const existing = await readProposals(slug);
|
|
35
|
+
const newIds = new Set(annotated.map((p) => p.id));
|
|
36
|
+
const preserved = existing ? existing.proposals.filter((p) => !newIds.has(p.id)) : [];
|
|
37
|
+
const fingerprint = computeGraphFingerprint(graphJsonContent);
|
|
38
|
+
const payload = {
|
|
39
|
+
version: 1,
|
|
40
|
+
generatedAt: new Date().toISOString(),
|
|
41
|
+
graphFingerprint: fingerprint,
|
|
42
|
+
proposals: [...annotated, ...preserved],
|
|
43
|
+
};
|
|
44
|
+
await writeProposals(slug, payload);
|
|
45
|
+
return { written: proposals.length, fingerprint, preserved: preserved.length };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=codegraph-knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegraph-knowledge.js","sourceRoot":"","sources":["../../src/utils/codegraph-knowledge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EAGvB,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,SAA8B,EAC9B,gBAAwB;IAExB,sEAAsE;IACtE,wEAAwE;IACxE,kDAAkD;IAClD,MAAM,KAAK,GAAe,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,eAAe,EAAE,CAAC,CAAC,eAAqD;QACxE,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,wBAAwB,EAAE,EAAE;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE7D,sEAAsE;IACtE,0EAA0E;IAC1E,wEAAwE;IACxE,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtF,MAAM,WAAW,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAkB;QAC7B,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,gBAAgB,EAAE,WAAW;QAC7B,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC;KACxC,CAAC;IAEF,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export interface CodegraphInfo {
|
|
2
|
+
available: boolean;
|
|
3
|
+
version?: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function detectCodegraph(): CodegraphInfo;
|
|
7
|
+
export interface CodegraphStatus {
|
|
8
|
+
initialized: boolean;
|
|
9
|
+
nodeCount: number;
|
|
10
|
+
edgeCount: number;
|
|
11
|
+
fileCount: number;
|
|
12
|
+
nodesByKind: Record<string, number>;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface ExtractionResult {
|
|
16
|
+
success: true;
|
|
17
|
+
status: CodegraphStatus;
|
|
18
|
+
}
|
|
19
|
+
export interface ExtractionError {
|
|
20
|
+
success: false;
|
|
21
|
+
error: string;
|
|
22
|
+
code?: string;
|
|
23
|
+
}
|
|
24
|
+
export type ExtractionOutcome = ExtractionResult | ExtractionError;
|
|
25
|
+
/**
|
|
26
|
+
* A codegraph-derived knowledge proposal.
|
|
27
|
+
*
|
|
28
|
+
* Carries STRUCTURAL FACTS only — not prose. The calling agent (which has LLM
|
|
29
|
+
* tokens) is responsible for producing the final `title`/`summary`/`keywords`
|
|
30
|
+
* during the proposal-promote step. See plan
|
|
31
|
+
* `2026-06-02-graphify-proposal-gate-implementation-plan` §Proposal Shape.
|
|
32
|
+
*
|
|
33
|
+
* `suggestedDedupCandidates` is intentionally NOT on this type — that's
|
|
34
|
+
* computed by the proposal-store layer when proposals are written to disk,
|
|
35
|
+
* not at ingest time.
|
|
36
|
+
*/
|
|
37
|
+
export interface KnowledgeProposal {
|
|
38
|
+
/** Stable id, e.g. "codegraph-cluster-src-utils". */
|
|
39
|
+
id: string;
|
|
40
|
+
kind: "architecture" | "module" | "gotcha" | "pattern";
|
|
41
|
+
/** Human-friendly label. Agents will write the final title. */
|
|
42
|
+
label: string;
|
|
43
|
+
structuralFacts: ProposalStructuralFacts;
|
|
44
|
+
sourceFiles: Array<{
|
|
45
|
+
path: string;
|
|
46
|
+
anchor?: string;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
export interface ProposalStructuralFacts {
|
|
50
|
+
memberCount?: number;
|
|
51
|
+
fileCount?: number;
|
|
52
|
+
/** e.g. { code: 260, document: 0 } */
|
|
53
|
+
fileTypeBreakdown?: Record<string, number>;
|
|
54
|
+
topHubs?: Array<{
|
|
55
|
+
label: string;
|
|
56
|
+
file: string;
|
|
57
|
+
in: number;
|
|
58
|
+
out: number;
|
|
59
|
+
}>;
|
|
60
|
+
topFilesByEntityCount?: Array<{
|
|
61
|
+
file: string;
|
|
62
|
+
count: number;
|
|
63
|
+
}>;
|
|
64
|
+
incomingFromOtherClusters?: number;
|
|
65
|
+
outgoingToOtherClusters?: number;
|
|
66
|
+
nodeFile?: string;
|
|
67
|
+
nodeIn?: number;
|
|
68
|
+
nodeOut?: number;
|
|
69
|
+
topCallers?: Array<{
|
|
70
|
+
label: string;
|
|
71
|
+
file: string;
|
|
72
|
+
}>;
|
|
73
|
+
topCallees?: Array<{
|
|
74
|
+
label: string;
|
|
75
|
+
file: string;
|
|
76
|
+
}>;
|
|
77
|
+
couplingA?: {
|
|
78
|
+
label: string;
|
|
79
|
+
file: string;
|
|
80
|
+
degree: number;
|
|
81
|
+
};
|
|
82
|
+
couplingB?: {
|
|
83
|
+
label: string;
|
|
84
|
+
file: string;
|
|
85
|
+
degree: number;
|
|
86
|
+
};
|
|
87
|
+
/** Edge relation types (e.g. ["imports_from", "calls"]). */
|
|
88
|
+
relations?: string[];
|
|
89
|
+
}
|
|
90
|
+
export interface IngestionResult {
|
|
91
|
+
proposals: KnowledgeProposal[];
|
|
92
|
+
stats: {
|
|
93
|
+
godNodes: number;
|
|
94
|
+
communities: number;
|
|
95
|
+
crossModuleCouplings: number;
|
|
96
|
+
totalProposals: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export declare function runIndex(workspacePath: string): ExtractionOutcome;
|
|
100
|
+
export declare function ingestGraph(_workspacePath: string, _slug: string): IngestionResult;
|
|
101
|
+
//# sourceMappingURL=codegraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegraph.d.ts","sourceRoot":"","sources":["../../src/utils/codegraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
2
|
+
import { appendFileSync, existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { basename, extname, join, resolve } from "node:path";
|
|
4
|
+
export function detectCodegraph() {
|
|
5
|
+
try {
|
|
6
|
+
const version = execSync("codegraph --version", {
|
|
7
|
+
encoding: "utf-8",
|
|
8
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
9
|
+
timeout: 5000,
|
|
10
|
+
}).trim();
|
|
11
|
+
const resolvedPath = execSync("which codegraph", {
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
14
|
+
timeout: 5000,
|
|
15
|
+
}).trim();
|
|
16
|
+
// Extract semver from output (e.g. "codegraph 0.9.9" or just "0.9.9")
|
|
17
|
+
const match = version.match(/(\d+\.\d+\.\d+)/);
|
|
18
|
+
return {
|
|
19
|
+
available: true,
|
|
20
|
+
version: match ? match[1] : version,
|
|
21
|
+
path: resolvedPath || undefined,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { available: false };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// --- Shared predicates / helpers ---
|
|
29
|
+
/**
|
|
30
|
+
* Test files import/define many symbols but aren't architectural hubs.
|
|
31
|
+
*/
|
|
32
|
+
const isTestFile = (file) => /\.(test|spec)\.[jt]sx?$/.test(file) ||
|
|
33
|
+
file.startsWith("test/") ||
|
|
34
|
+
file.startsWith("tests/") ||
|
|
35
|
+
file.includes("/__tests__/");
|
|
36
|
+
/** First N path segments (default 2), e.g. "src/utils/foo.ts" → "src/utils". */
|
|
37
|
+
function dirPrefix(file, segments = 2) {
|
|
38
|
+
return file.split("/").slice(0, segments).join("/");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run a codegraph CLI subcommand and parse its stdout as JSON.
|
|
42
|
+
*
|
|
43
|
+
* CRITICAL: codegraph prints plain-text "Symbol X not found" notices (with
|
|
44
|
+
* ANSI codes) to stdout/stderr even with --json, and exits 0. There is no JSON
|
|
45
|
+
* payload in that case. Every parse must therefore be guarded — empty or
|
|
46
|
+
* non-JSON stdout → null (no-data), NEVER throw.
|
|
47
|
+
*/
|
|
48
|
+
function runCgJson(args, timeout = 15_000) {
|
|
49
|
+
try {
|
|
50
|
+
const result = spawnSync("codegraph", args, {
|
|
51
|
+
encoding: "utf-8",
|
|
52
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
53
|
+
timeout,
|
|
54
|
+
});
|
|
55
|
+
if (result.error)
|
|
56
|
+
return null;
|
|
57
|
+
const out = (result.stdout || "").trim();
|
|
58
|
+
if (!out)
|
|
59
|
+
return null;
|
|
60
|
+
// Guarded parse — plain-text "not found" notices are not valid JSON.
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(out);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function cgStatus() {
|
|
73
|
+
const status = runCgJson(["status", "--json"], 15_000);
|
|
74
|
+
if (!status || typeof status.initialized !== "boolean")
|
|
75
|
+
return null;
|
|
76
|
+
return status;
|
|
77
|
+
}
|
|
78
|
+
function cgFiles() {
|
|
79
|
+
const files = runCgJson(["files", "--json"], 15_000);
|
|
80
|
+
return Array.isArray(files) ? files : [];
|
|
81
|
+
}
|
|
82
|
+
function cgQueryFunctions(term, limit) {
|
|
83
|
+
const hits = runCgJson(["query", term, "--kind", "function", "--limit", String(limit), "--json"], 15_000);
|
|
84
|
+
if (!Array.isArray(hits))
|
|
85
|
+
return [];
|
|
86
|
+
return hits.map((h) => h?.node).filter((n) => !!n && typeof n.id === "string");
|
|
87
|
+
}
|
|
88
|
+
function cgCallers(name, limit) {
|
|
89
|
+
const res = runCgJson(["callers", name, "--limit", String(limit), "--json"], 15_000);
|
|
90
|
+
return res && Array.isArray(res.callers) ? res.callers : [];
|
|
91
|
+
}
|
|
92
|
+
function cgCallees(name, limit) {
|
|
93
|
+
const res = runCgJson(["callees", name, "--limit", String(limit), "--json"], 15_000);
|
|
94
|
+
return res && Array.isArray(res.callees) ? res.callees : [];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Approximate file "type" buckets from language/extension
|
|
98
|
+
* (code vs document vs other).
|
|
99
|
+
*/
|
|
100
|
+
function fileTypeOf(file) {
|
|
101
|
+
const ext = extname(file.path).toLowerCase();
|
|
102
|
+
if (ext === ".ts" || ext === ".tsx" || ext === ".js" || ext === ".jsx" || ext === ".mjs") {
|
|
103
|
+
return "code";
|
|
104
|
+
}
|
|
105
|
+
if (ext === ".md" || ext === ".mdx")
|
|
106
|
+
return "document";
|
|
107
|
+
const lang = (file.language || "").toLowerCase();
|
|
108
|
+
if (lang === "typescript" || lang === "javascript")
|
|
109
|
+
return "code";
|
|
110
|
+
if (lang === "markdown")
|
|
111
|
+
return "document";
|
|
112
|
+
return lang || "unknown";
|
|
113
|
+
}
|
|
114
|
+
// --- runIndex ---
|
|
115
|
+
export function runIndex(workspacePath) {
|
|
116
|
+
const info = detectCodegraph();
|
|
117
|
+
if (!info.available) {
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
error: "codegraph binary not found",
|
|
121
|
+
code: "ENOENT",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const absolutePath = resolve(workspacePath);
|
|
125
|
+
// `index <path> --force --quiet` is side-effecting and non-interactive.
|
|
126
|
+
// (`init -i` is deprecated.) No --json on this command.
|
|
127
|
+
const result = spawnSync("codegraph", ["index", absolutePath, "--force", "--quiet"], {
|
|
128
|
+
encoding: "utf-8",
|
|
129
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
130
|
+
timeout: 120_000,
|
|
131
|
+
cwd: absolutePath,
|
|
132
|
+
});
|
|
133
|
+
if (result.error) {
|
|
134
|
+
const errCode = result.error.code;
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: result.error.message,
|
|
138
|
+
code: errCode === "ETIMEDOUT" ? "ETIMEDOUT" : errCode,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (result.status !== 0) {
|
|
142
|
+
const stderr = result.stderr?.trim() || "Process exited with non-zero status";
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
error: stderr,
|
|
146
|
+
code: `EXIT_${result.status}`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Ensure .codegraph/ is in .gitignore so the index db doesn't pollute the repo.
|
|
150
|
+
ensureGitignoreEntry(absolutePath, ".codegraph/");
|
|
151
|
+
const status = cgStatus();
|
|
152
|
+
if (!status) {
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
error: "Index completed but codegraph status returned no valid JSON",
|
|
156
|
+
code: "ENODATA",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (!status.initialized) {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
error: "Index completed but codegraph reports not initialized",
|
|
163
|
+
code: "ENOINIT",
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
success: true,
|
|
168
|
+
status,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// --- ingestGraph (CLI-only) ---
|
|
172
|
+
export function ingestGraph(_workspacePath, _slug) {
|
|
173
|
+
const empty = {
|
|
174
|
+
proposals: [],
|
|
175
|
+
stats: { godNodes: 0, communities: 0, crossModuleCouplings: 0, totalProposals: 0 },
|
|
176
|
+
};
|
|
177
|
+
const info = detectCodegraph();
|
|
178
|
+
if (!info.available)
|
|
179
|
+
return empty;
|
|
180
|
+
// (a) status
|
|
181
|
+
const status = cgStatus();
|
|
182
|
+
if (!status?.initialized || status.nodeCount <= 0)
|
|
183
|
+
return empty;
|
|
184
|
+
// (b) files (minus test files)
|
|
185
|
+
const allFiles = cgFiles();
|
|
186
|
+
const files = allFiles.filter((f) => f?.path && !isTestFile(f.path));
|
|
187
|
+
if (files.length === 0)
|
|
188
|
+
return empty;
|
|
189
|
+
const proposals = [];
|
|
190
|
+
const communityMap = new Map();
|
|
191
|
+
for (const f of files) {
|
|
192
|
+
const prefix = dirPrefix(f.path);
|
|
193
|
+
if (!prefix)
|
|
194
|
+
continue;
|
|
195
|
+
const list = communityMap.get(prefix) || [];
|
|
196
|
+
list.push(f);
|
|
197
|
+
communityMap.set(prefix, list);
|
|
198
|
+
}
|
|
199
|
+
const communities = [];
|
|
200
|
+
for (const [prefix, groupFiles] of communityMap) {
|
|
201
|
+
if (groupFiles.length < 3)
|
|
202
|
+
continue;
|
|
203
|
+
const memberCount = groupFiles.reduce((sum, f) => sum + (f.nodeCount || 0), 0);
|
|
204
|
+
communities.push({ prefix, files: groupFiles, memberCount });
|
|
205
|
+
}
|
|
206
|
+
// Cap surviving communities at 8 (largest first, by member/node count).
|
|
207
|
+
communities.sort((a, b) => b.memberCount - a.memberCount);
|
|
208
|
+
const survivingCommunities = communities.slice(0, 8);
|
|
209
|
+
for (const community of survivingCommunities) {
|
|
210
|
+
const fileTypeBreakdown = {};
|
|
211
|
+
for (const f of community.files) {
|
|
212
|
+
const t = fileTypeOf(f);
|
|
213
|
+
fileTypeBreakdown[t] = (fileTypeBreakdown[t] || 0) + 1;
|
|
214
|
+
}
|
|
215
|
+
const topFilesByEntityCount = [...community.files]
|
|
216
|
+
.sort((a, b) => (b.nodeCount || 0) - (a.nodeCount || 0))
|
|
217
|
+
.slice(0, 3)
|
|
218
|
+
.map((f) => ({ file: f.path, count: f.nodeCount || 0 }));
|
|
219
|
+
// Heuristic: large top-level communities → "architecture", others → "module".
|
|
220
|
+
// "src" / 2-segment prefixes that are big are architectural surfaces.
|
|
221
|
+
const isArchitectural = community.files.length >= 8 || community.memberCount >= 100 || community.prefix === "src";
|
|
222
|
+
proposals.push({
|
|
223
|
+
id: makeProposalId("codegraph-cluster", community.prefix),
|
|
224
|
+
kind: isArchitectural ? "architecture" : "module",
|
|
225
|
+
label: community.prefix,
|
|
226
|
+
structuralFacts: {
|
|
227
|
+
memberCount: community.memberCount,
|
|
228
|
+
fileCount: community.files.length,
|
|
229
|
+
fileTypeBreakdown,
|
|
230
|
+
topFilesByEntityCount,
|
|
231
|
+
},
|
|
232
|
+
sourceFiles: community.files.map((f) => ({ path: f.path })),
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
// ----- (d) GOD-NODES -----
|
|
236
|
+
// Pre-filter: densest ~30 files by nodeCount.
|
|
237
|
+
const densestFiles = [...files]
|
|
238
|
+
.filter((f) => (f.nodeCount || 0) > 0)
|
|
239
|
+
.sort((a, b) => (b.nodeCount || 0) - (a.nodeCount || 0))
|
|
240
|
+
.slice(0, 30);
|
|
241
|
+
// Collect candidate function nodes via per-file basename query.
|
|
242
|
+
const candidatesById = new Map();
|
|
243
|
+
for (const f of densestFiles) {
|
|
244
|
+
if (candidatesById.size >= 40)
|
|
245
|
+
break;
|
|
246
|
+
const term = basename(f.path, extname(f.path));
|
|
247
|
+
if (!term)
|
|
248
|
+
continue;
|
|
249
|
+
const hits = cgQueryFunctions(term, 5);
|
|
250
|
+
for (const node of hits) {
|
|
251
|
+
if (candidatesById.size >= 40)
|
|
252
|
+
break;
|
|
253
|
+
if (!candidatesById.has(node.id))
|
|
254
|
+
candidatesById.set(node.id, node);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const scored = [];
|
|
258
|
+
for (const node of candidatesById.values()) {
|
|
259
|
+
const name = node.name;
|
|
260
|
+
if (!name)
|
|
261
|
+
continue;
|
|
262
|
+
const callers = cgCallers(name, 100);
|
|
263
|
+
const callees = cgCallees(name, 100);
|
|
264
|
+
scored.push({ node, callers, callees, score: callers.length + callees.length });
|
|
265
|
+
}
|
|
266
|
+
const godNodes = scored
|
|
267
|
+
.filter((s) => !!s.node.filePath && !isTestFile(s.node.filePath))
|
|
268
|
+
.sort((a, b) => b.score - a.score)
|
|
269
|
+
.slice(0, 8);
|
|
270
|
+
for (const g of godNodes) {
|
|
271
|
+
const nodeFile = g.node.filePath;
|
|
272
|
+
const topCallers = g.callers
|
|
273
|
+
.slice(0, 5)
|
|
274
|
+
.map((c) => ({ label: c.name || "", file: c.filePath || "" }));
|
|
275
|
+
const topCallees = g.callees
|
|
276
|
+
.slice(0, 5)
|
|
277
|
+
.map((c) => ({ label: c.name || "", file: c.filePath || "" }));
|
|
278
|
+
proposals.push({
|
|
279
|
+
id: makeProposalId("codegraph-god", `${g.node.name}-${nodeFile}`),
|
|
280
|
+
kind: "module",
|
|
281
|
+
label: g.node.name || nodeFile,
|
|
282
|
+
structuralFacts: {
|
|
283
|
+
nodeFile,
|
|
284
|
+
nodeIn: g.callers.length,
|
|
285
|
+
nodeOut: g.callees.length,
|
|
286
|
+
topCallers,
|
|
287
|
+
topCallees,
|
|
288
|
+
},
|
|
289
|
+
sourceFiles: [{ path: nodeFile }],
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
const couplingByPair = new Map();
|
|
293
|
+
for (const g of godNodes) {
|
|
294
|
+
const nodeFile = g.node.filePath;
|
|
295
|
+
const nodePrefix = dirPrefix(nodeFile);
|
|
296
|
+
const edges = [...g.callers, ...g.callees];
|
|
297
|
+
for (const edge of edges) {
|
|
298
|
+
const edgeFile = edge.filePath;
|
|
299
|
+
if (!edgeFile || isTestFile(edgeFile))
|
|
300
|
+
continue;
|
|
301
|
+
const edgePrefix = dirPrefix(edgeFile);
|
|
302
|
+
if (!nodePrefix || !edgePrefix || nodePrefix === edgePrefix)
|
|
303
|
+
continue;
|
|
304
|
+
// Canonicalize the pair so (A,B) and (B,A) aggregate together.
|
|
305
|
+
const [pA, pB, fA, fB] = nodePrefix < edgePrefix
|
|
306
|
+
? [nodePrefix, edgePrefix, nodeFile, edgeFile]
|
|
307
|
+
: [edgePrefix, nodePrefix, edgeFile, nodeFile];
|
|
308
|
+
const key = `${pA}|${pB}`;
|
|
309
|
+
const existing = couplingByPair.get(key);
|
|
310
|
+
if (existing) {
|
|
311
|
+
existing.count++;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
couplingByPair.set(key, { prefixA: pA, prefixB: pB, count: 1, fileA: fA, fileB: fB });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const topCouplings = [...couplingByPair.values()].sort((a, b) => b.count - a.count).slice(0, 5);
|
|
319
|
+
for (const c of topCouplings) {
|
|
320
|
+
proposals.push({
|
|
321
|
+
id: makeProposalId("codegraph-coupling", `${c.prefixA}-${c.prefixB}`),
|
|
322
|
+
kind: "gotcha",
|
|
323
|
+
label: `${c.prefixA} ↔ ${c.prefixB}`,
|
|
324
|
+
structuralFacts: {
|
|
325
|
+
couplingA: { label: c.prefixA, file: c.fileA, degree: c.count },
|
|
326
|
+
couplingB: { label: c.prefixB, file: c.fileB, degree: c.count },
|
|
327
|
+
// codegraph exposes no edge-type labels — hard-coded per spike.
|
|
328
|
+
relations: ["calls"],
|
|
329
|
+
},
|
|
330
|
+
sourceFiles: [{ path: c.fileA }, { path: c.fileB }],
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
// ----- (f) Cap total at 20 -----
|
|
334
|
+
const capped = proposals.slice(0, 20);
|
|
335
|
+
return {
|
|
336
|
+
proposals: capped,
|
|
337
|
+
stats: {
|
|
338
|
+
godNodes: capped.filter((p) => p.id.startsWith("codegraph-god-")).length,
|
|
339
|
+
communities: capped.filter((p) => p.id.startsWith("codegraph-cluster-")).length,
|
|
340
|
+
crossModuleCouplings: capped.filter((p) => p.id.startsWith("codegraph-coupling-")).length,
|
|
341
|
+
totalProposals: capped.length,
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Slugify a label suffix and prefix it. Stable, lowercase, dash-separated.
|
|
347
|
+
* E.g. makeProposalId("codegraph-cluster", "src/utils") → "codegraph-cluster-src-utils".
|
|
348
|
+
*/
|
|
349
|
+
function makeProposalId(prefix, suffix) {
|
|
350
|
+
const slug = suffix
|
|
351
|
+
.toLowerCase()
|
|
352
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
353
|
+
.replace(/^-+|-+$/g, "")
|
|
354
|
+
.slice(0, 80);
|
|
355
|
+
return slug ? `${prefix}-${slug}` : prefix;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Append an entry to .gitignore if it's not already present.
|
|
359
|
+
* Creates the file if it doesn't exist.
|
|
360
|
+
*/
|
|
361
|
+
function ensureGitignoreEntry(workspacePath, entry) {
|
|
362
|
+
const gitignorePath = join(workspacePath, ".gitignore");
|
|
363
|
+
try {
|
|
364
|
+
if (existsSync(gitignorePath)) {
|
|
365
|
+
const content = readFileSync(gitignorePath, "utf-8");
|
|
366
|
+
// Check if entry already present (exact line match)
|
|
367
|
+
const lines = content.split("\n").map((l) => l.trim());
|
|
368
|
+
if (lines.includes(entry))
|
|
369
|
+
return;
|
|
370
|
+
// Append with newline separator if file doesn't end with one
|
|
371
|
+
const separator = content.endsWith("\n") ? "" : "\n";
|
|
372
|
+
appendFileSync(gitignorePath, `${separator}${entry}\n`, "utf-8");
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// Create .gitignore with the entry
|
|
376
|
+
appendFileSync(gitignorePath, `${entry}\n`, "utf-8");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// Non-fatal — don't fail over .gitignore issues
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=codegraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegraph.js","sourceRoot":"","sources":["../../src/utils/codegraph.ts"],"names":[],"mappings":"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"}
|