@opencodehub/cli 0.1.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 +85 -0
- package/dist/agent-context.d.ts +54 -0
- package/dist/agent-context.d.ts.map +1 -0
- package/dist/agent-context.js +122 -0
- package/dist/agent-context.js.map +1 -0
- package/dist/cobol-proleap-setup.d.ts +77 -0
- package/dist/cobol-proleap-setup.d.ts.map +1 -0
- package/dist/cobol-proleap-setup.js +289 -0
- package/dist/cobol-proleap-setup.js.map +1 -0
- package/dist/commands/analyze.d.ts +234 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +1096 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/augment.d.ts +48 -0
- package/dist/commands/augment.d.ts.map +1 -0
- package/dist/commands/augment.js +249 -0
- package/dist/commands/augment.js.map +1 -0
- package/dist/commands/baseline.d.ts +68 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +110 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/bench.d.ts +54 -0
- package/dist/commands/bench.d.ts.map +1 -0
- package/dist/commands/bench.js +283 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/ci-init.d.ts +37 -0
- package/dist/commands/ci-init.d.ts.map +1 -0
- package/dist/commands/ci-init.js +115 -0
- package/dist/commands/ci-init.js.map +1 -0
- package/dist/commands/clean.d.ts +13 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +38 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/code-pack.d.ts +105 -0
- package/dist/commands/code-pack.d.ts.map +1 -0
- package/dist/commands/code-pack.js +187 -0
- package/dist/commands/code-pack.js.map +1 -0
- package/dist/commands/context.d.ts +30 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +237 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/detect-changes.d.ts +26 -0
- package/dist/commands/detect-changes.d.ts.map +1 -0
- package/dist/commands/detect-changes.js +73 -0
- package/dist/commands/detect-changes.js.map +1 -0
- package/dist/commands/doctor.d.ts +52 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +472 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/find-enclosing-symbol.d.ts +67 -0
- package/dist/commands/find-enclosing-symbol.d.ts.map +1 -0
- package/dist/commands/find-enclosing-symbol.js +106 -0
- package/dist/commands/find-enclosing-symbol.js.map +1 -0
- package/dist/commands/group.d.ts +123 -0
- package/dist/commands/group.d.ts.map +1 -0
- package/dist/commands/group.js +448 -0
- package/dist/commands/group.js.map +1 -0
- package/dist/commands/impact.d.ts +23 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +91 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/index-repo.d.ts +39 -0
- package/dist/commands/index-repo.d.ts.map +1 -0
- package/dist/commands/index-repo.js +148 -0
- package/dist/commands/index-repo.js.map +1 -0
- package/dist/commands/ingest-sarif.d.ts +64 -0
- package/dist/commands/ingest-sarif.d.ts.map +1 -0
- package/dist/commands/ingest-sarif.js +381 -0
- package/dist/commands/ingest-sarif.js.map +1 -0
- package/dist/commands/init.d.ts +75 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +315 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +17 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +79 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +28 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/open-store.d.ts +25 -0
- package/dist/commands/open-store.d.ts.map +1 -0
- package/dist/commands/open-store.js +47 -0
- package/dist/commands/open-store.js.map +1 -0
- package/dist/commands/pack.d.ts +35 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +83 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/query.d.ts +85 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +309 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/scan.d.ts +81 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +407 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/setup.d.ts +178 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +370 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/sql.d.ts +19 -0
- package/dist/commands/sql.d.ts.map +1 -0
- package/dist/commands/sql.js +51 -0
- package/dist/commands/sql.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/verdict-render.d.ts +33 -0
- package/dist/commands/verdict-render.d.ts.map +1 -0
- package/dist/commands/verdict-render.js +123 -0
- package/dist/commands/verdict-render.js.map +1 -0
- package/dist/commands/verdict.d.ts +61 -0
- package/dist/commands/verdict.d.ts.map +1 -0
- package/dist/commands/verdict.js +146 -0
- package/dist/commands/verdict.js.map +1 -0
- package/dist/commands/wiki.d.ts +26 -0
- package/dist/commands/wiki.d.ts.map +1 -0
- package/dist/commands/wiki.js +74 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/editors/claude-code.d.ts +23 -0
- package/dist/editors/claude-code.d.ts.map +1 -0
- package/dist/editors/claude-code.js +58 -0
- package/dist/editors/claude-code.js.map +1 -0
- package/dist/editors/codex.d.ts +22 -0
- package/dist/editors/codex.d.ts.map +1 -0
- package/dist/editors/codex.js +59 -0
- package/dist/editors/codex.js.map +1 -0
- package/dist/editors/cursor.d.ts +13 -0
- package/dist/editors/cursor.d.ts.map +1 -0
- package/dist/editors/cursor.js +21 -0
- package/dist/editors/cursor.js.map +1 -0
- package/dist/editors/index.d.ts +12 -0
- package/dist/editors/index.d.ts.map +1 -0
- package/dist/editors/index.js +11 -0
- package/dist/editors/index.js.map +1 -0
- package/dist/editors/opencode.d.ts +23 -0
- package/dist/editors/opencode.d.ts.map +1 -0
- package/dist/editors/opencode.js +61 -0
- package/dist/editors/opencode.js.map +1 -0
- package/dist/editors/types.d.ts +33 -0
- package/dist/editors/types.d.ts.map +1 -0
- package/dist/editors/types.js +19 -0
- package/dist/editors/types.js.map +1 -0
- package/dist/editors/windows-wrap.d.ts +19 -0
- package/dist/editors/windows-wrap.d.ts.map +1 -0
- package/dist/editors/windows-wrap.js +28 -0
- package/dist/editors/windows-wrap.js.map +1 -0
- package/dist/editors/windsurf.d.ts +12 -0
- package/dist/editors/windsurf.d.ts.map +1 -0
- package/dist/editors/windsurf.js +21 -0
- package/dist/editors/windsurf.js.map +1 -0
- package/dist/embedder-downloader.d.ts +87 -0
- package/dist/embedder-downloader.d.ts.map +1 -0
- package/dist/embedder-downloader.js +261 -0
- package/dist/embedder-downloader.js.map +1 -0
- package/dist/fs-atomic.d.ts +22 -0
- package/dist/fs-atomic.d.ts.map +1 -0
- package/dist/fs-atomic.js +28 -0
- package/dist/fs-atomic.js.map +1 -0
- package/dist/groups.d.ts +64 -0
- package/dist/groups.d.ts.map +1 -0
- package/dist/groups.js +172 -0
- package/dist/groups.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +703 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/is-indexed.d.ts +20 -0
- package/dist/lib/is-indexed.d.ts.map +1 -0
- package/dist/lib/is-indexed.js +35 -0
- package/dist/lib/is-indexed.js.map +1 -0
- package/dist/registry.d.ts +64 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +145 -0
- package/dist/registry.js.map +1 -0
- package/dist/scip-downloader.d.ts +138 -0
- package/dist/scip-downloader.d.ts.map +1 -0
- package/dist/scip-downloader.js +372 -0
- package/dist/scip-downloader.js.map +1 -0
- package/dist/scip-pins.d.ts +99 -0
- package/dist/scip-pins.d.ts.map +1 -0
- package/dist/scip-pins.js +195 -0
- package/dist/scip-pins.js.map +1 -0
- package/dist/skills-gen.d.ts +47 -0
- package/dist/skills-gen.d.ts.map +1 -0
- package/dist/skills-gen.js +292 -0
- package/dist/skills-gen.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-enclosing-symbol.js","sourceRoot":"","sources":["../../src/commands/find-enclosing-symbol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAgBH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA0B,IAAI,GAAG,CAAW;IAC7E,UAAU;IACV,QAAQ;IACR,aAAa;IACb,OAAO;IACP,WAAW;IACX,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAwB;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAChB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;YAClE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAwB,EACxB,QAAgB,EAChB,IAAY;IAEZ,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,IAAyB,CAAC;IAC9B,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,mEAAmE;QACnE,+BAA+B;QAC/B,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI;YAAE,MAAM;QAChC,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,CAAC;YACX,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codehub group <subcommand>` — create and operate on named sets of repos.
|
|
3
|
+
*
|
|
4
|
+
* Groups live at `~/.codehub/groups/<name>.json` (see `../groups.ts`). A
|
|
5
|
+
* group is a pure pointer into the per-user registry: on create/add we
|
|
6
|
+
* require every repo to already exist in `~/.codehub/registry.json`, so
|
|
7
|
+
* downstream consumers (MCP `group_query`, `group_status`) can route through
|
|
8
|
+
* the registry without having to re-resolve paths.
|
|
9
|
+
*
|
|
10
|
+
* Subcommands:
|
|
11
|
+
* create <name> <repo1> <repo2>... create a group (repos must be registered)
|
|
12
|
+
* list print every group
|
|
13
|
+
* delete <name> remove a group
|
|
14
|
+
* add <name> <repo> add one registered repo to an existing group
|
|
15
|
+
* remove <name> <repo> drop one repo from an existing group
|
|
16
|
+
* show <name> print a group's metadata + member repos
|
|
17
|
+
* status <name> per-repo staleness within the group
|
|
18
|
+
* query <name> <text> RRF-fused BM25 across the group (CLI)
|
|
19
|
+
*
|
|
20
|
+
* `query` is provided for parity with `codehub query`; agents are expected to
|
|
21
|
+
* reach for the MCP `group_query` tool instead.
|
|
22
|
+
*/
|
|
23
|
+
import type { ContractRegistry } from "@opencodehub/analysis";
|
|
24
|
+
import type { SearchResult } from "@opencodehub/storage";
|
|
25
|
+
import { Command } from "commander";
|
|
26
|
+
import { type GroupEntry } from "../groups.js";
|
|
27
|
+
export interface GroupCommandOptions {
|
|
28
|
+
/** Test hook: override home dir for the registry + groups. */
|
|
29
|
+
readonly home?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a Commander subparser so `codehub group ...` dispatches to the right
|
|
33
|
+
* handler. Returned via a factory so the CLI entrypoint can lazy-import this
|
|
34
|
+
* module.
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildGroupCommand(opts?: GroupCommandOptions): Command;
|
|
37
|
+
export interface GroupCreateOptions {
|
|
38
|
+
readonly home?: string;
|
|
39
|
+
readonly description?: string;
|
|
40
|
+
/** Override createdAt timestamp (tests). */
|
|
41
|
+
readonly now?: () => string;
|
|
42
|
+
}
|
|
43
|
+
export declare function runGroupCreate(name: string, repoNames: readonly string[], opts?: GroupCreateOptions): Promise<GroupEntry>;
|
|
44
|
+
export declare function runGroupList(opts?: GroupCommandOptions): Promise<void>;
|
|
45
|
+
export declare function runGroupDelete(name: string, opts?: GroupCommandOptions): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Add one registered repo to an existing group. Idempotent — re-adding an
|
|
48
|
+
* already-member repo is a no-op (and emits a warning). Rejects unknown
|
|
49
|
+
* group names and unknown registry names with actionable errors.
|
|
50
|
+
*/
|
|
51
|
+
export declare function runGroupAdd(groupName: string, repoName: string, opts?: GroupCommandOptions): Promise<GroupEntry>;
|
|
52
|
+
/**
|
|
53
|
+
* Drop a repo from a group. Idempotent — removing a non-member is a no-op
|
|
54
|
+
* (and emits a warning). If the group becomes empty, the group is retained
|
|
55
|
+
* (callers who want it gone should call `codehub group delete`).
|
|
56
|
+
*/
|
|
57
|
+
export declare function runGroupRemove(groupName: string, repoName: string, opts?: GroupCommandOptions): Promise<GroupEntry>;
|
|
58
|
+
/**
|
|
59
|
+
* Print a single group's metadata + member repos. Each member is annotated
|
|
60
|
+
* with registry staleness (indexedAt, node/edge counts, lastCommit) so the
|
|
61
|
+
* reader can see which repos need a re-analyze without a second call.
|
|
62
|
+
*/
|
|
63
|
+
export declare function runGroupShow(name: string, opts?: GroupCommandOptions): Promise<GroupEntry | null>;
|
|
64
|
+
export interface GroupStatusRow {
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly path: string;
|
|
67
|
+
readonly indexedAt: string | undefined;
|
|
68
|
+
readonly nodeCount: number | undefined;
|
|
69
|
+
readonly edgeCount: number | undefined;
|
|
70
|
+
readonly lastCommit: string | undefined;
|
|
71
|
+
readonly inRegistry: boolean;
|
|
72
|
+
}
|
|
73
|
+
export declare function runGroupStatus(name: string, opts?: GroupCommandOptions): Promise<readonly GroupStatusRow[]>;
|
|
74
|
+
export interface GroupQueryOptions {
|
|
75
|
+
readonly home?: string;
|
|
76
|
+
readonly limit?: number;
|
|
77
|
+
readonly json?: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface GroupQueryResultRow {
|
|
80
|
+
readonly repoName: string;
|
|
81
|
+
readonly nodeId: string;
|
|
82
|
+
readonly name: string;
|
|
83
|
+
readonly kind: string;
|
|
84
|
+
readonly filePath: string;
|
|
85
|
+
readonly score: number;
|
|
86
|
+
}
|
|
87
|
+
export declare function runGroupQuery(name: string, text: string, opts?: GroupQueryOptions): Promise<readonly GroupQueryResultRow[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Turn N per-repo BM25 runs into a single RRF-fused list. Keys are
|
|
90
|
+
* `${repoName}::${nodeId}` so a symbol that exists in two repos contributes
|
|
91
|
+
* two entries. Ties break lexically on `(repoName, nodeId)`.
|
|
92
|
+
*/
|
|
93
|
+
export declare function fuseGroupRuns(perRepoRuns: readonly {
|
|
94
|
+
readonly repoName: string;
|
|
95
|
+
readonly results: readonly SearchResult[];
|
|
96
|
+
}[], topK: number): GroupQueryResultRow[];
|
|
97
|
+
export declare function readGroupRepoMeta(repoPath: string): Promise<{
|
|
98
|
+
readonly indexedAt?: string;
|
|
99
|
+
readonly lastCommit?: string;
|
|
100
|
+
} | undefined>;
|
|
101
|
+
export interface GroupSyncOptions {
|
|
102
|
+
readonly home?: string;
|
|
103
|
+
readonly json?: boolean;
|
|
104
|
+
/** Override timestamp (tests). */
|
|
105
|
+
readonly now?: () => string;
|
|
106
|
+
}
|
|
107
|
+
export interface GroupSyncResult {
|
|
108
|
+
readonly groupName: string;
|
|
109
|
+
readonly registryPath: string;
|
|
110
|
+
readonly registry: ContractRegistry;
|
|
111
|
+
}
|
|
112
|
+
/** Resolve the per-group contracts.json path under the home directory. */
|
|
113
|
+
export declare function resolveGroupContractsPath(groupName: string, home?: string): string;
|
|
114
|
+
/**
|
|
115
|
+
* Walk the registered repos for a group, run every contract extractor,
|
|
116
|
+
* and persist the result to `<home>/.codehub/groups/<name>/contracts.json`.
|
|
117
|
+
* Re-running is idempotent — the serialized output is byte-identical
|
|
118
|
+
* given the same inputs and the same `now()` stamp.
|
|
119
|
+
*/
|
|
120
|
+
export declare function runGroupSyncCmd(groupName: string, opts?: GroupSyncOptions): Promise<GroupSyncResult>;
|
|
121
|
+
/** Shared path resolver so MCP can load the same file the CLI writes. */
|
|
122
|
+
export { resolveGroupContractsPath as resolveGroupContractsFile };
|
|
123
|
+
//# sourceMappingURL=group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/commands/group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codehub group <subcommand>` — create and operate on named sets of repos.
|
|
3
|
+
*
|
|
4
|
+
* Groups live at `~/.codehub/groups/<name>.json` (see `../groups.ts`). A
|
|
5
|
+
* group is a pure pointer into the per-user registry: on create/add we
|
|
6
|
+
* require every repo to already exist in `~/.codehub/registry.json`, so
|
|
7
|
+
* downstream consumers (MCP `group_query`, `group_status`) can route through
|
|
8
|
+
* the registry without having to re-resolve paths.
|
|
9
|
+
*
|
|
10
|
+
* Subcommands:
|
|
11
|
+
* create <name> <repo1> <repo2>... create a group (repos must be registered)
|
|
12
|
+
* list print every group
|
|
13
|
+
* delete <name> remove a group
|
|
14
|
+
* add <name> <repo> add one registered repo to an existing group
|
|
15
|
+
* remove <name> <repo> drop one repo from an existing group
|
|
16
|
+
* show <name> print a group's metadata + member repos
|
|
17
|
+
* status <name> per-repo staleness within the group
|
|
18
|
+
* query <name> <text> RRF-fused BM25 across the group (CLI)
|
|
19
|
+
*
|
|
20
|
+
* `query` is provided for parity with `codehub query`; agents are expected to
|
|
21
|
+
* reach for the MCP `group_query` tool instead.
|
|
22
|
+
*/
|
|
23
|
+
import { mkdir } from "node:fs/promises";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { dirname, resolve } from "node:path";
|
|
26
|
+
import { runGroupSync } from "@opencodehub/analysis";
|
|
27
|
+
import { DEFAULT_RRF_K, DEFAULT_RRF_TOP_K, rrf } from "@opencodehub/search";
|
|
28
|
+
import { openStore, readStoreMeta, resolveDbPath } from "@opencodehub/storage";
|
|
29
|
+
import { Command } from "commander";
|
|
30
|
+
import { writeFileAtomic } from "../fs-atomic.js";
|
|
31
|
+
import { deleteGroup, listGroups, readGroup, writeGroup, } from "../groups.js";
|
|
32
|
+
import { CODEHUB_HOME_DIR, readRegistry } from "../registry.js";
|
|
33
|
+
/**
|
|
34
|
+
* Build a Commander subparser so `codehub group ...` dispatches to the right
|
|
35
|
+
* handler. Returned via a factory so the CLI entrypoint can lazy-import this
|
|
36
|
+
* module.
|
|
37
|
+
*/
|
|
38
|
+
export function buildGroupCommand(opts = {}) {
|
|
39
|
+
const root = new Command("group").description("Manage named cross-repo groups");
|
|
40
|
+
root
|
|
41
|
+
.command("create <name> <repos...>")
|
|
42
|
+
.description("Create a group from registered repo names")
|
|
43
|
+
.option("--description <text>", "Short human-readable description")
|
|
44
|
+
.action(async (name, repos, subOpts) => {
|
|
45
|
+
await runGroupCreate(name, repos, {
|
|
46
|
+
...(typeof subOpts["description"] === "string"
|
|
47
|
+
? { description: subOpts["description"] }
|
|
48
|
+
: {}),
|
|
49
|
+
...(opts.home !== undefined ? { home: opts.home } : {}),
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
root
|
|
53
|
+
.command("list")
|
|
54
|
+
.description("List all groups")
|
|
55
|
+
.action(async () => {
|
|
56
|
+
await runGroupList(opts.home !== undefined ? { home: opts.home } : {});
|
|
57
|
+
});
|
|
58
|
+
root
|
|
59
|
+
.command("delete <name>")
|
|
60
|
+
.description("Delete a group")
|
|
61
|
+
.action(async (name) => {
|
|
62
|
+
await runGroupDelete(name, opts.home !== undefined ? { home: opts.home } : {});
|
|
63
|
+
});
|
|
64
|
+
root
|
|
65
|
+
.command("add <name> <repo>")
|
|
66
|
+
.description("Add one registered repo to an existing group")
|
|
67
|
+
.action(async (name, repo) => {
|
|
68
|
+
await runGroupAdd(name, repo, opts.home !== undefined ? { home: opts.home } : {});
|
|
69
|
+
});
|
|
70
|
+
root
|
|
71
|
+
.command("remove <name> <repo>")
|
|
72
|
+
.description("Remove one repo from an existing group (group stays if it becomes empty)")
|
|
73
|
+
.action(async (name, repo) => {
|
|
74
|
+
await runGroupRemove(name, repo, opts.home !== undefined ? { home: opts.home } : {});
|
|
75
|
+
});
|
|
76
|
+
root
|
|
77
|
+
.command("show <name>")
|
|
78
|
+
.description("Print group metadata + member repos (with registry staleness)")
|
|
79
|
+
.action(async (name) => {
|
|
80
|
+
await runGroupShow(name, opts.home !== undefined ? { home: opts.home } : {});
|
|
81
|
+
});
|
|
82
|
+
root
|
|
83
|
+
.command("status <name>")
|
|
84
|
+
.description("Per-repo index freshness within a group")
|
|
85
|
+
.action(async (name) => {
|
|
86
|
+
await runGroupStatus(name, opts.home !== undefined ? { home: opts.home } : {});
|
|
87
|
+
});
|
|
88
|
+
root
|
|
89
|
+
.command("sync <name>")
|
|
90
|
+
.description("Extract cross-repo HTTP / gRPC / topic contracts and write ~/.codehub/groups/<name>/contracts.json")
|
|
91
|
+
.option("--json", "Emit the written registry on stdout")
|
|
92
|
+
.action(async (name, subOpts) => {
|
|
93
|
+
await runGroupSyncCmd(name, {
|
|
94
|
+
json: subOpts["json"] === true,
|
|
95
|
+
...(opts.home !== undefined ? { home: opts.home } : {}),
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
root
|
|
99
|
+
.command("query <name> <text>")
|
|
100
|
+
.description("BM25 over every repo in the group, fused with RRF")
|
|
101
|
+
.option("--limit <n>", "Max results (default 20)", (v) => Number.parseInt(v, 10), 20)
|
|
102
|
+
.option("--json", "Emit JSON on stdout")
|
|
103
|
+
.action(async (name, text, subOpts) => {
|
|
104
|
+
await runGroupQuery(name, text, {
|
|
105
|
+
limit: typeof subOpts["limit"] === "number" ? subOpts["limit"] : 20,
|
|
106
|
+
json: subOpts["json"] === true,
|
|
107
|
+
...(opts.home !== undefined ? { home: opts.home } : {}),
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
return root;
|
|
111
|
+
}
|
|
112
|
+
export async function runGroupCreate(name, repoNames, opts = {}) {
|
|
113
|
+
if (repoNames.length === 0) {
|
|
114
|
+
throw new Error("codehub group create: at least one repo name is required");
|
|
115
|
+
}
|
|
116
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
117
|
+
const registry = await readRegistry(registryOpts);
|
|
118
|
+
const resolved = [];
|
|
119
|
+
const missing = [];
|
|
120
|
+
for (const n of repoNames) {
|
|
121
|
+
const hit = registry[n];
|
|
122
|
+
if (!hit) {
|
|
123
|
+
missing.push(n);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
resolved.push({ name: hit.name, path: resolve(hit.path) });
|
|
127
|
+
}
|
|
128
|
+
if (missing.length > 0) {
|
|
129
|
+
throw new Error(`codehub group create: unknown repo(s): ${missing.join(", ")}. ` +
|
|
130
|
+
"Run `codehub analyze` on each first, or `codehub list` to see what's registered.");
|
|
131
|
+
}
|
|
132
|
+
const now = opts.now ? opts.now() : new Date().toISOString();
|
|
133
|
+
const group = {
|
|
134
|
+
name,
|
|
135
|
+
createdAt: now,
|
|
136
|
+
repos: resolved,
|
|
137
|
+
...(opts.description !== undefined ? { description: opts.description } : {}),
|
|
138
|
+
};
|
|
139
|
+
await writeGroup(group, registryOpts);
|
|
140
|
+
console.warn(`codehub group create: ${name} (${resolved.length} repo${resolved.length === 1 ? "" : "s"})`);
|
|
141
|
+
return group;
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// list
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
export async function runGroupList(opts = {}) {
|
|
147
|
+
const groups = await listGroups(opts.home !== undefined ? { home: opts.home } : {});
|
|
148
|
+
if (groups.length === 0) {
|
|
149
|
+
console.warn("No groups defined. Use `codehub group create <name> <repo...>`.");
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
for (const g of groups) {
|
|
153
|
+
const repoList = g.repos.map((r) => r.name).join(", ");
|
|
154
|
+
console.log(`${g.name} (${g.repos.length}): ${repoList}`);
|
|
155
|
+
if (g.description)
|
|
156
|
+
console.log(` ${g.description}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// delete
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
export async function runGroupDelete(name, opts = {}) {
|
|
163
|
+
const removed = await deleteGroup(name, opts.home !== undefined ? { home: opts.home } : {});
|
|
164
|
+
if (removed) {
|
|
165
|
+
console.warn(`codehub group delete: ${name}`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.warn(`codehub group delete: ${name} — not found`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// add / remove / show
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
/**
|
|
175
|
+
* Add one registered repo to an existing group. Idempotent — re-adding an
|
|
176
|
+
* already-member repo is a no-op (and emits a warning). Rejects unknown
|
|
177
|
+
* group names and unknown registry names with actionable errors.
|
|
178
|
+
*/
|
|
179
|
+
export async function runGroupAdd(groupName, repoName, opts = {}) {
|
|
180
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
181
|
+
const group = await readGroup(groupName, registryOpts);
|
|
182
|
+
if (!group) {
|
|
183
|
+
throw new Error(`codehub group add: group ${groupName} not found. Run \`codehub group create\` first.`);
|
|
184
|
+
}
|
|
185
|
+
const registry = await readRegistry(registryOpts);
|
|
186
|
+
const hit = registry[repoName];
|
|
187
|
+
if (!hit) {
|
|
188
|
+
throw new Error(`codehub group add: unknown repo "${repoName}". Run \`codehub analyze\` on it first, or \`codehub list\` to see what's registered.`);
|
|
189
|
+
}
|
|
190
|
+
if (group.repos.some((r) => r.name === repoName)) {
|
|
191
|
+
console.warn(`codehub group add: ${repoName} is already a member of ${groupName}`);
|
|
192
|
+
return group;
|
|
193
|
+
}
|
|
194
|
+
const nextRepos = [...group.repos, { name: hit.name, path: resolve(hit.path) }];
|
|
195
|
+
const next = {
|
|
196
|
+
...group,
|
|
197
|
+
repos: nextRepos,
|
|
198
|
+
};
|
|
199
|
+
await writeGroup(next, registryOpts);
|
|
200
|
+
console.warn(`codehub group add: ${groupName} += ${repoName}`);
|
|
201
|
+
return next;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Drop a repo from a group. Idempotent — removing a non-member is a no-op
|
|
205
|
+
* (and emits a warning). If the group becomes empty, the group is retained
|
|
206
|
+
* (callers who want it gone should call `codehub group delete`).
|
|
207
|
+
*/
|
|
208
|
+
export async function runGroupRemove(groupName, repoName, opts = {}) {
|
|
209
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
210
|
+
const group = await readGroup(groupName, registryOpts);
|
|
211
|
+
if (!group) {
|
|
212
|
+
throw new Error(`codehub group remove: group ${groupName} not found`);
|
|
213
|
+
}
|
|
214
|
+
const filtered = group.repos.filter((r) => r.name !== repoName);
|
|
215
|
+
if (filtered.length === group.repos.length) {
|
|
216
|
+
console.warn(`codehub group remove: ${repoName} is not a member of ${groupName}`);
|
|
217
|
+
return group;
|
|
218
|
+
}
|
|
219
|
+
const next = { ...group, repos: filtered };
|
|
220
|
+
await writeGroup(next, registryOpts);
|
|
221
|
+
console.warn(`codehub group remove: ${groupName} -= ${repoName}`);
|
|
222
|
+
return next;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Print a single group's metadata + member repos. Each member is annotated
|
|
226
|
+
* with registry staleness (indexedAt, node/edge counts, lastCommit) so the
|
|
227
|
+
* reader can see which repos need a re-analyze without a second call.
|
|
228
|
+
*/
|
|
229
|
+
export async function runGroupShow(name, opts = {}) {
|
|
230
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
231
|
+
const group = await readGroup(name, registryOpts);
|
|
232
|
+
if (!group) {
|
|
233
|
+
console.warn(`codehub group show: ${name} not found`);
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const registry = await readRegistry(registryOpts);
|
|
237
|
+
console.log(`${group.name} (createdAt: ${group.createdAt})`);
|
|
238
|
+
if (group.description)
|
|
239
|
+
console.log(` ${group.description}`);
|
|
240
|
+
if (group.repos.length === 0) {
|
|
241
|
+
console.log(" (no member repos)");
|
|
242
|
+
return group;
|
|
243
|
+
}
|
|
244
|
+
for (const repo of group.repos) {
|
|
245
|
+
const hit = registry[repo.name];
|
|
246
|
+
const trailer = hit
|
|
247
|
+
? `(${hit.nodeCount} nodes, ${hit.edgeCount} edges, indexedAt ${hit.indexedAt})`
|
|
248
|
+
: "[orphan — no registry entry]";
|
|
249
|
+
console.log(` ${repo.name} ${repo.path} ${trailer}`);
|
|
250
|
+
}
|
|
251
|
+
return group;
|
|
252
|
+
}
|
|
253
|
+
export async function runGroupStatus(name, opts = {}) {
|
|
254
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
255
|
+
const group = await readGroup(name, registryOpts);
|
|
256
|
+
if (!group) {
|
|
257
|
+
console.warn(`codehub group status: ${name} not found`);
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
const registry = await readRegistry(registryOpts);
|
|
261
|
+
const rows = await collectStatusRows(group, registry);
|
|
262
|
+
for (const r of rows) {
|
|
263
|
+
const header = r.inRegistry
|
|
264
|
+
? `${r.name} (${r.nodeCount ?? "?"} nodes, ${r.edgeCount ?? "?"} edges)`
|
|
265
|
+
: `${r.name} [orphan — no registry entry]`;
|
|
266
|
+
console.log(header);
|
|
267
|
+
console.log(` path: ${r.path}`);
|
|
268
|
+
if (r.indexedAt)
|
|
269
|
+
console.log(` indexedAt: ${r.indexedAt}`);
|
|
270
|
+
if (r.lastCommit)
|
|
271
|
+
console.log(` lastCommit: ${r.lastCommit}`);
|
|
272
|
+
}
|
|
273
|
+
return rows;
|
|
274
|
+
}
|
|
275
|
+
async function collectStatusRows(group, registry) {
|
|
276
|
+
const rows = [];
|
|
277
|
+
for (const repo of group.repos) {
|
|
278
|
+
const registryHit = registry[repo.name];
|
|
279
|
+
const row = {
|
|
280
|
+
name: repo.name,
|
|
281
|
+
path: repo.path,
|
|
282
|
+
indexedAt: registryHit?.indexedAt,
|
|
283
|
+
nodeCount: registryHit?.nodeCount,
|
|
284
|
+
edgeCount: registryHit?.edgeCount,
|
|
285
|
+
lastCommit: registryHit?.lastCommit,
|
|
286
|
+
inRegistry: registryHit !== undefined,
|
|
287
|
+
};
|
|
288
|
+
rows.push(row);
|
|
289
|
+
}
|
|
290
|
+
return rows;
|
|
291
|
+
}
|
|
292
|
+
export async function runGroupQuery(name, text, opts = {}) {
|
|
293
|
+
const limit = opts.limit ?? 20;
|
|
294
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
295
|
+
const group = await readGroup(name, registryOpts);
|
|
296
|
+
if (!group) {
|
|
297
|
+
throw new Error(`codehub group query: group ${name} not found`);
|
|
298
|
+
}
|
|
299
|
+
const registry = await readRegistry(registryOpts);
|
|
300
|
+
// Sort alphabetically for deterministic RRF iteration.
|
|
301
|
+
const sortedRepos = [...group.repos].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
302
|
+
const perRepoRuns = [];
|
|
303
|
+
for (const repo of sortedRepos) {
|
|
304
|
+
const registryHit = registry[repo.name];
|
|
305
|
+
if (!registryHit) {
|
|
306
|
+
console.warn(`codehub group query: repo "${repo.name}" referenced by group ${name} is no longer in the registry`);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const repoPath = resolve(registryHit.path);
|
|
310
|
+
const dbPath = resolveDbPath(repoPath);
|
|
311
|
+
const composed = await openStore({ path: dbPath, backend: "auto", readOnly: true });
|
|
312
|
+
try {
|
|
313
|
+
await composed.graph.open();
|
|
314
|
+
const results = await composed.graph.search({ text, limit: 50 });
|
|
315
|
+
perRepoRuns.push({ repoName: repo.name, results: [...results] });
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
await composed.close();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const merged = fuseGroupRuns(perRepoRuns, limit);
|
|
322
|
+
if (opts.json) {
|
|
323
|
+
console.log(JSON.stringify({
|
|
324
|
+
groupName: name,
|
|
325
|
+
repos: sortedRepos.map((r) => r.name),
|
|
326
|
+
results: merged,
|
|
327
|
+
}, null, 2));
|
|
328
|
+
return merged;
|
|
329
|
+
}
|
|
330
|
+
if (merged.length === 0) {
|
|
331
|
+
console.warn(`codehub group query: no matches for "${text}" in ${name}`);
|
|
332
|
+
return merged;
|
|
333
|
+
}
|
|
334
|
+
for (const row of merged) {
|
|
335
|
+
console.log(`${row.score.toFixed(4)} ${row.repoName}::${row.name} [${row.kind}] ${row.filePath}`);
|
|
336
|
+
}
|
|
337
|
+
return merged;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Turn N per-repo BM25 runs into a single RRF-fused list. Keys are
|
|
341
|
+
* `${repoName}::${nodeId}` so a symbol that exists in two repos contributes
|
|
342
|
+
* two entries. Ties break lexically on `(repoName, nodeId)`.
|
|
343
|
+
*/
|
|
344
|
+
export function fuseGroupRuns(perRepoRuns, topK) {
|
|
345
|
+
const meta = new Map();
|
|
346
|
+
const runs = [];
|
|
347
|
+
for (const run of perRepoRuns) {
|
|
348
|
+
const ranked = [];
|
|
349
|
+
for (const r of run.results) {
|
|
350
|
+
const id = `${run.repoName}::${r.nodeId}`;
|
|
351
|
+
ranked.push({ id });
|
|
352
|
+
if (!meta.has(id)) {
|
|
353
|
+
meta.set(id, {
|
|
354
|
+
repoName: run.repoName,
|
|
355
|
+
nodeId: r.nodeId,
|
|
356
|
+
name: r.name,
|
|
357
|
+
kind: r.kind,
|
|
358
|
+
filePath: r.filePath,
|
|
359
|
+
score: 0,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
runs.push(ranked);
|
|
364
|
+
}
|
|
365
|
+
const fused = rrf(runs, DEFAULT_RRF_K, Math.max(topK, DEFAULT_RRF_TOP_K));
|
|
366
|
+
const out = [];
|
|
367
|
+
for (const f of fused) {
|
|
368
|
+
const row = meta.get(f.id);
|
|
369
|
+
if (!row)
|
|
370
|
+
continue;
|
|
371
|
+
out.push({ ...row, score: f.score });
|
|
372
|
+
}
|
|
373
|
+
// Deterministic final ordering: score desc, then (repoName, nodeId) lex asc.
|
|
374
|
+
out.sort((a, b) => {
|
|
375
|
+
if (a.score !== b.score)
|
|
376
|
+
return b.score - a.score;
|
|
377
|
+
if (a.repoName !== b.repoName)
|
|
378
|
+
return a.repoName < b.repoName ? -1 : 1;
|
|
379
|
+
if (a.nodeId !== b.nodeId)
|
|
380
|
+
return a.nodeId < b.nodeId ? -1 : 1;
|
|
381
|
+
return 0;
|
|
382
|
+
});
|
|
383
|
+
return out.slice(0, topK);
|
|
384
|
+
}
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
// Optional per-repo staleness helper — exported for reuse by the MCP tool.
|
|
387
|
+
// ---------------------------------------------------------------------------
|
|
388
|
+
export async function readGroupRepoMeta(repoPath) {
|
|
389
|
+
const meta = await readStoreMeta(repoPath);
|
|
390
|
+
if (!meta)
|
|
391
|
+
return undefined;
|
|
392
|
+
return {
|
|
393
|
+
...(typeof meta.indexedAt === "string" ? { indexedAt: meta.indexedAt } : {}),
|
|
394
|
+
...(typeof meta.lastCommit === "string" ? { lastCommit: meta.lastCommit } : {}),
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
/** Resolve the per-group contracts.json path under the home directory. */
|
|
398
|
+
export function resolveGroupContractsPath(groupName, home) {
|
|
399
|
+
const root = home ?? homedir();
|
|
400
|
+
return resolve(root, CODEHUB_HOME_DIR, "groups", groupName, "contracts.json");
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Walk the registered repos for a group, run every contract extractor,
|
|
404
|
+
* and persist the result to `<home>/.codehub/groups/<name>/contracts.json`.
|
|
405
|
+
* Re-running is idempotent — the serialized output is byte-identical
|
|
406
|
+
* given the same inputs and the same `now()` stamp.
|
|
407
|
+
*/
|
|
408
|
+
export async function runGroupSyncCmd(groupName, opts = {}) {
|
|
409
|
+
const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
|
|
410
|
+
const group = await readGroup(groupName, registryOpts);
|
|
411
|
+
if (!group) {
|
|
412
|
+
throw new Error(`codehub group sync: group ${groupName} not found. Run \`codehub group create\` first.`);
|
|
413
|
+
}
|
|
414
|
+
const registry = await readRegistry(registryOpts);
|
|
415
|
+
const sortedRepos = [...group.repos].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
416
|
+
const syncInputs = [];
|
|
417
|
+
const missing = [];
|
|
418
|
+
for (const repo of sortedRepos) {
|
|
419
|
+
const hit = registry[repo.name];
|
|
420
|
+
if (!hit) {
|
|
421
|
+
missing.push(repo.name);
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
syncInputs.push({ name: repo.name, path: resolve(hit.path) });
|
|
425
|
+
}
|
|
426
|
+
const syncOpts = { repos: syncInputs };
|
|
427
|
+
if (opts.now !== undefined)
|
|
428
|
+
syncOpts.now = opts.now;
|
|
429
|
+
const registryResult = await runGroupSync(syncOpts);
|
|
430
|
+
const outPath = resolveGroupContractsPath(groupName, opts.home);
|
|
431
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
432
|
+
const payload = `${JSON.stringify(registryResult, null, 2)}\n`;
|
|
433
|
+
await writeFileAtomic(outPath, payload, { raw: true });
|
|
434
|
+
if (opts.json) {
|
|
435
|
+
console.log(payload.trimEnd());
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
const header = `codehub group sync: wrote ${registryResult.contracts.length} contract(s) and ${registryResult.crossLinks.length} cross-link(s) for ${groupName} → ${outPath}`;
|
|
439
|
+
console.warn(header);
|
|
440
|
+
if (missing.length > 0) {
|
|
441
|
+
console.warn(`codehub group sync: skipped ${missing.length} unregistered repo(s): ${missing.join(", ")}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return { groupName, registryPath: outPath, registry: registryResult };
|
|
445
|
+
}
|
|
446
|
+
/** Shared path resolver so MCP can load the same file the CLI writes. */
|
|
447
|
+
export { resolveGroupContractsPath as resolveGroupContractsFile };
|
|
448
|
+
//# sourceMappingURL=group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/commands/group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codehub impact <symbol>` — dependent graph traversal for blast-radius.
|
|
3
|
+
*
|
|
4
|
+
* Delegates to `@opencodehub/analysis`'s `runImpact()` which owns the
|
|
5
|
+
* risk-tier scoring and PROCESS_STEP fan-out logic. The CLI layer only
|
|
6
|
+
* maps the user-facing `--direction` flag into the analysis query shape
|
|
7
|
+
* and formats the result.
|
|
8
|
+
*/
|
|
9
|
+
export interface ImpactOptions {
|
|
10
|
+
readonly depth?: number;
|
|
11
|
+
readonly direction?: "up" | "down" | "both";
|
|
12
|
+
readonly repo?: string;
|
|
13
|
+
readonly home?: string;
|
|
14
|
+
readonly json?: boolean;
|
|
15
|
+
/** Exact node id (uid) from a prior result; skips name disambiguation. */
|
|
16
|
+
readonly targetUid?: string;
|
|
17
|
+
/** File path substring to disambiguate same-named symbols. */
|
|
18
|
+
readonly filePath?: string;
|
|
19
|
+
/** Kind filter (Function, Method, Class, Interface, …). */
|
|
20
|
+
readonly kind?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function runImpact(symbol: string, opts?: ImpactOptions): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=impact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../src/commands/impact.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,0EAA0E;IAC1E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoFvF"}
|