codebase-context 1.8.1 → 1.9.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/README.md +236 -15
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +12 -4
- package/dist/cli.js.map +1 -1
- package/dist/constants/codebase-context.d.ts +12 -0
- package/dist/constants/codebase-context.d.ts.map +1 -1
- package/dist/constants/codebase-context.js +36 -0
- package/dist/constants/codebase-context.js.map +1 -1
- package/dist/core/file-watcher.d.ts.map +1 -1
- package/dist/core/file-watcher.js +2 -12
- package/dist/core/file-watcher.js.map +1 -1
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +2 -9
- package/dist/core/indexer.js.map +1 -1
- package/dist/index.d.ts +10 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +884 -192
- package/dist/index.js.map +1 -1
- package/dist/project-state.d.ts +24 -0
- package/dist/project-state.d.ts.map +1 -0
- package/dist/project-state.js +68 -0
- package/dist/project-state.js.map +1 -0
- package/dist/resources/uri.d.ts +4 -1
- package/dist/resources/uri.d.ts.map +1 -1
- package/dist/resources/uri.js +18 -1
- package/dist/resources/uri.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +31 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/search-codebase.d.ts.map +1 -1
- package/dist/tools/search-codebase.js +14 -41
- package/dist/tools/search-codebase.js.map +1 -1
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/project-discovery.d.ts +12 -0
- package/dist/utils/project-discovery.d.ts.map +1 -0
- package/dist/utils/project-discovery.js +183 -0
- package/dist/utils/project-discovery.js.map +1 -0
- package/docs/capabilities.md +37 -7
- package/docs/cli.md +3 -1
- package/package.json +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAChD,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC;IAC3C,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;CACtD;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IAChD,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,eAAe,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,YAAY,CAAC,EAAE,MAAM,iBAAiB,EAAE,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,IAAI,GAAG,gBAAgB,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1B;AAGD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACnC,CAAC;IACF,gBAAgB,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAGhC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAGD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ProjectEvidence = 'existing_index' | 'repo_root' | 'workspace_manifest' | 'project_manifest';
|
|
2
|
+
export interface DiscoveredProjectCandidate {
|
|
3
|
+
rootPath: string;
|
|
4
|
+
evidence: ProjectEvidence;
|
|
5
|
+
}
|
|
6
|
+
export interface DiscoverProjectsOptions {
|
|
7
|
+
maxDepth?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function isPathWithin(basePath: string, candidatePath: string): boolean;
|
|
10
|
+
export declare function discoverProjectsWithinRoot(trustedRootPath: string, options?: DiscoverProjectsOptions): Promise<DiscoveredProjectCandidate[]>;
|
|
11
|
+
export declare function findNearestProjectBoundary(inputPath: string, trustedRootPath?: string): Promise<DiscoveredProjectCandidate | undefined>;
|
|
12
|
+
//# sourceMappingURL=project-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../src/utils/project-discovery.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,WAAW,GACX,oBAAoB,GACpB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAM7E;AA6ED,wBAAsB,0BAA0B,CAC9C,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,0BAA0B,EAAE,CAAC,CA6CvC;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CA+CjD"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { EXCLUDED_DIRECTORY_NAMES, DISCOVERY_ONLY_IGNORED } from '../constants/codebase-context.js';
|
|
4
|
+
const DEFAULT_MAX_DEPTH = 4;
|
|
5
|
+
const IGNORED_DIRECTORY_NAMES = new Set([
|
|
6
|
+
...EXCLUDED_DIRECTORY_NAMES,
|
|
7
|
+
...DISCOVERY_ONLY_IGNORED
|
|
8
|
+
]);
|
|
9
|
+
const STRONG_DIRECTORY_MARKERS = new Set(['.codebase-context', '.git']);
|
|
10
|
+
const WORKSPACE_MARKERS = new Set(['lerna.json', 'nx.json', 'pnpm-workspace.yaml', 'turbo.json']);
|
|
11
|
+
const PROJECT_MANIFEST_NAMES = new Set([
|
|
12
|
+
'Cargo.toml',
|
|
13
|
+
'Gemfile',
|
|
14
|
+
'composer.json',
|
|
15
|
+
'deno.json',
|
|
16
|
+
'deno.jsonc',
|
|
17
|
+
'go.mod',
|
|
18
|
+
'mix.exs',
|
|
19
|
+
'package.json',
|
|
20
|
+
'pom.xml',
|
|
21
|
+
'pyproject.toml'
|
|
22
|
+
]);
|
|
23
|
+
const PROJECT_MANIFEST_SUFFIXES = ['.csproj', '.fsproj', '.vbproj'];
|
|
24
|
+
const GRADLE_MANIFESTS = new Set([
|
|
25
|
+
'build.gradle',
|
|
26
|
+
'build.gradle.kts',
|
|
27
|
+
'settings.gradle',
|
|
28
|
+
'settings.gradle.kts'
|
|
29
|
+
]);
|
|
30
|
+
function normalizePathKey(filePath) {
|
|
31
|
+
let normalized = path.resolve(filePath);
|
|
32
|
+
while (normalized.length > 1 && (normalized.endsWith('/') || normalized.endsWith('\\'))) {
|
|
33
|
+
normalized = normalized.slice(0, -1);
|
|
34
|
+
}
|
|
35
|
+
return process.platform === 'win32' ? normalized.toLowerCase() : normalized;
|
|
36
|
+
}
|
|
37
|
+
export function isPathWithin(basePath, candidatePath) {
|
|
38
|
+
const resolvedBasePath = path.resolve(basePath);
|
|
39
|
+
const resolvedCandidatePath = path.resolve(candidatePath);
|
|
40
|
+
if (resolvedBasePath === resolvedCandidatePath)
|
|
41
|
+
return true;
|
|
42
|
+
const relative = path.relative(resolvedBasePath, resolvedCandidatePath);
|
|
43
|
+
return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
|
|
44
|
+
}
|
|
45
|
+
async function isWorkspacePackageJson(directoryPath) {
|
|
46
|
+
const packageJsonPath = path.join(directoryPath, 'package.json');
|
|
47
|
+
try {
|
|
48
|
+
const content = await fs.readFile(packageJsonPath, 'utf-8');
|
|
49
|
+
const parsed = JSON.parse(content);
|
|
50
|
+
if (Array.isArray(parsed.workspaces)) {
|
|
51
|
+
return parsed.workspaces.length > 0;
|
|
52
|
+
}
|
|
53
|
+
if (parsed.workspaces &&
|
|
54
|
+
typeof parsed.workspaces === 'object' &&
|
|
55
|
+
!Array.isArray(parsed.workspaces) &&
|
|
56
|
+
'packages' in parsed.workspaces) {
|
|
57
|
+
return Array.isArray(parsed.workspaces.packages);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function classifyDirectory(directoryPath, fileNames, directoryNames) {
|
|
66
|
+
if (directoryNames.has('.codebase-context')) {
|
|
67
|
+
return {
|
|
68
|
+
candidate: { rootPath: directoryPath, evidence: 'existing_index' },
|
|
69
|
+
continueScanning: false
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (directoryNames.has('.git')) {
|
|
73
|
+
return {
|
|
74
|
+
candidate: { rootPath: directoryPath, evidence: 'repo_root' },
|
|
75
|
+
continueScanning: false
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
for (const marker of WORKSPACE_MARKERS) {
|
|
79
|
+
if (fileNames.has(marker)) {
|
|
80
|
+
return {
|
|
81
|
+
candidate: { rootPath: directoryPath, evidence: 'workspace_manifest' },
|
|
82
|
+
continueScanning: true
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (fileNames.has('package.json') && (await isWorkspacePackageJson(directoryPath))) {
|
|
87
|
+
return {
|
|
88
|
+
candidate: { rootPath: directoryPath, evidence: 'workspace_manifest' },
|
|
89
|
+
continueScanning: true
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
for (const fileName of fileNames) {
|
|
93
|
+
if (PROJECT_MANIFEST_NAMES.has(fileName) || GRADLE_MANIFESTS.has(fileName)) {
|
|
94
|
+
return {
|
|
95
|
+
candidate: { rootPath: directoryPath, evidence: 'project_manifest' },
|
|
96
|
+
continueScanning: false
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (PROJECT_MANIFEST_SUFFIXES.some((suffix) => fileName.endsWith(suffix))) {
|
|
100
|
+
return {
|
|
101
|
+
candidate: { rootPath: directoryPath, evidence: 'project_manifest' },
|
|
102
|
+
continueScanning: false
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { continueScanning: true };
|
|
107
|
+
}
|
|
108
|
+
export async function discoverProjectsWithinRoot(trustedRootPath, options = {}) {
|
|
109
|
+
const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
110
|
+
const resolvedTrustedRootPath = path.resolve(trustedRootPath);
|
|
111
|
+
const discovered = new Map();
|
|
112
|
+
async function walk(currentPath, depth) {
|
|
113
|
+
if (depth > maxDepth) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
let entries;
|
|
117
|
+
try {
|
|
118
|
+
entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const fileNames = new Set(entries.filter((entry) => entry.isFile()).map((entry) => entry.name));
|
|
124
|
+
const directoryNames = new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name));
|
|
125
|
+
const classification = await classifyDirectory(currentPath, fileNames, directoryNames);
|
|
126
|
+
const currentKey = normalizePathKey(currentPath);
|
|
127
|
+
const isTrustedRoot = currentKey === normalizePathKey(resolvedTrustedRootPath);
|
|
128
|
+
if (classification.candidate && !isTrustedRoot) {
|
|
129
|
+
discovered.set(currentKey, classification.candidate);
|
|
130
|
+
}
|
|
131
|
+
const shouldContinueScanning = isTrustedRoot ? true : classification.continueScanning;
|
|
132
|
+
if (depth >= maxDepth || !shouldContinueScanning) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
await Promise.all(entries
|
|
136
|
+
.filter((entry) => entry.isDirectory())
|
|
137
|
+
.filter((entry) => !IGNORED_DIRECTORY_NAMES.has(entry.name))
|
|
138
|
+
.filter((entry) => !STRONG_DIRECTORY_MARKERS.has(entry.name))
|
|
139
|
+
.map((entry) => walk(path.join(currentPath, entry.name), depth + 1)));
|
|
140
|
+
}
|
|
141
|
+
await walk(resolvedTrustedRootPath, 0);
|
|
142
|
+
return Array.from(discovered.values()).sort((a, b) => a.rootPath.localeCompare(b.rootPath));
|
|
143
|
+
}
|
|
144
|
+
export async function findNearestProjectBoundary(inputPath, trustedRootPath) {
|
|
145
|
+
const resolvedTrustedRootPath = trustedRootPath ? path.resolve(trustedRootPath) : undefined;
|
|
146
|
+
let currentPath = path.resolve(inputPath);
|
|
147
|
+
for (;;) {
|
|
148
|
+
if (resolvedTrustedRootPath && !isPathWithin(resolvedTrustedRootPath, currentPath)) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
let stats;
|
|
152
|
+
try {
|
|
153
|
+
stats = await fs.stat(currentPath);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
const directoryPath = stats.isDirectory() ? currentPath : path.dirname(currentPath);
|
|
159
|
+
let entries;
|
|
160
|
+
try {
|
|
161
|
+
entries = await fs.readdir(directoryPath, { withFileTypes: true });
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
entries = [];
|
|
165
|
+
}
|
|
166
|
+
const fileNames = new Set(entries.filter((entry) => entry.isFile()).map((entry) => entry.name));
|
|
167
|
+
const directoryNames = new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name));
|
|
168
|
+
const classification = await classifyDirectory(directoryPath, fileNames, directoryNames);
|
|
169
|
+
if (classification.candidate) {
|
|
170
|
+
return classification.candidate;
|
|
171
|
+
}
|
|
172
|
+
if (resolvedTrustedRootPath &&
|
|
173
|
+
normalizePathKey(directoryPath) === normalizePathKey(resolvedTrustedRootPath)) {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
const parentPath = path.dirname(directoryPath);
|
|
177
|
+
if (parentPath === directoryPath) {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
currentPath = parentPath;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=project-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-discovery.js","sourceRoot":"","sources":["../../src/utils/project-discovery.ts"],"names":[],"mappings":"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"}
|
package/docs/capabilities.md
CHANGED
|
@@ -4,7 +4,8 @@ Technical reference for what `codebase-context` ships today. For the user-facing
|
|
|
4
4
|
|
|
5
5
|
## CLI Reference
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Repo-scoped capabilities are available locally via the CLI (human-readable by default, `--json` for automation).
|
|
8
|
+
Multi-project selection is MCP-only because the CLI already targets one root per invocation.
|
|
8
9
|
For a “gallery” of commands and examples, see `docs/cli.md`.
|
|
9
10
|
|
|
10
11
|
| Command | Flags | Maps to |
|
|
@@ -34,17 +35,24 @@ npx codebase-context reindex --incremental
|
|
|
34
35
|
|
|
35
36
|
## Tool Surface
|
|
36
37
|
|
|
37
|
-
10 MCP tools +
|
|
38
|
+
10 MCP tools + active/project-scoped context resources.
|
|
39
|
+
|
|
40
|
+
Shared selector inputs:
|
|
41
|
+
|
|
42
|
+
- `project` (preferred): project root path, file path, `file://` URI, or relative subproject path under a configured root
|
|
43
|
+
- `project_directory` (compatibility alias): deprecated alias for `project`
|
|
44
|
+
|
|
45
|
+
**Migration:** `get_component_usage` was removed; use `get_symbol_references` for symbol usage evidence.
|
|
38
46
|
|
|
39
47
|
### Core Tools
|
|
40
48
|
|
|
41
49
|
| Tool | Input | Output |
|
|
42
50
|
| ----------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
43
|
-
| `search_codebase` | `query`, optional `intent`, `limit`, `filters`, `includeSnippets` | Ranked results (`file`, `summary`, `score`, `type`, `trend`, `patternWarning`, `relationships`, `hints`) + `searchQuality` + decision card (`ready`, `nextAction`, `patterns`, `bestExample`, `impact`, `whatWouldHelp`) when `intent="edit"`. Hints capped at 3 per category. |
|
|
44
|
-
| `get_team_patterns` | optional `category`
|
|
45
|
-
| `get_symbol_references` | `symbol`, optional `limit`
|
|
46
|
-
| `remember` | `type`, `category`, `memory`, `reason`
|
|
47
|
-
| `get_memory` | optional `category`, `type`, `query`, `limit`
|
|
51
|
+
| `search_codebase` | `query`, optional `intent`, `limit`, `filters`, `includeSnippets`, shared `project`/`project_directory` | Ranked results (`file`, `summary`, `score`, `type`, `trend`, `patternWarning`, `relationships`, `hints`) + `searchQuality` + decision card (`ready`, `nextAction`, `patterns`, `bestExample`, `impact`, `whatWouldHelp`) when `intent="edit"`. Hints capped at 3 per category. |
|
|
52
|
+
| `get_team_patterns` | optional `category`, shared `project`/`project_directory` | Pattern frequencies, trends, golden files, conflicts |
|
|
53
|
+
| `get_symbol_references` | `symbol`, optional `limit`, shared `project`/`project_directory` | Concrete symbol usage evidence: `usageCount` + top usage snippets + `confidence` + `isComplete`. `confidence: "syntactic"` means static/source-based only (no runtime or dynamic dispatch). When Tree-sitter + file content are available, comments and string literals are excluded from the scan — the count reflects real identifier nodes only. Replaces the removed `get_component_usage`. |
|
|
54
|
+
| `remember` | `type`, `category`, `memory`, `reason`, shared `project`/`project_directory` | Persists to `.codebase-context/memory.json` |
|
|
55
|
+
| `get_memory` | optional `category`, `type`, `query`, `limit`, shared `project`/`project_directory` | Memories with confidence decay scoring |
|
|
48
56
|
|
|
49
57
|
### Utility Tools
|
|
50
58
|
|
|
@@ -56,6 +64,28 @@ npx codebase-context reindex --incremental
|
|
|
56
64
|
| `refresh_index` | Full or incremental re-index + git memory extraction |
|
|
57
65
|
| `get_indexing_status` | Index state, progress, last stats |
|
|
58
66
|
|
|
67
|
+
## Project Routing
|
|
68
|
+
|
|
69
|
+
Behavior matrix:
|
|
70
|
+
|
|
71
|
+
| Situation | Server behavior |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| One known project | Automatic routing |
|
|
74
|
+
| Multiple known projects + active project already set | Automatic routing to the active project |
|
|
75
|
+
| Multiple known projects + no active project | `selection_required` |
|
|
76
|
+
| No workspace context and no bootstrap path | `selection_required` until the caller passes `project` |
|
|
77
|
+
|
|
78
|
+
Rules:
|
|
79
|
+
|
|
80
|
+
- If the client provides workspace context, that becomes the trusted workspace boundary for the session. In practice this usually comes from MCP roots.
|
|
81
|
+
- If the server still cannot tell which project to use, a bootstrap path or explicit absolute `project` path remains the fallback.
|
|
82
|
+
- `project` is the canonical explicit selector when routing is ambiguous.
|
|
83
|
+
- `project` may point at a project path, file path, `file://` URI, or relative subproject path.
|
|
84
|
+
- Later tool calls may omit `project`; the server falls back to the active project when one has already been established.
|
|
85
|
+
- The server does not rely on `cwd` walk-up in MCP mode.
|
|
86
|
+
- `codebase://context` serves the active project. Before selection in an unresolved multi-project session, it returns a workspace overview with candidate projects, readiness state, and project-scoped resource URIs.
|
|
87
|
+
- `codebase://context/project/<encoded-project-path>` serves a specific project directly and also makes that project active for later tool calls.
|
|
88
|
+
|
|
59
89
|
## Retrieval Pipeline
|
|
60
90
|
|
|
61
91
|
Ordered by execution:
|
package/docs/cli.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# CLI Gallery (Human-readable)
|
|
2
2
|
|
|
3
|
-
`codebase-context` exposes its
|
|
3
|
+
`codebase-context` exposes its tools as a local CLI so humans can:
|
|
4
4
|
|
|
5
5
|
- Onboard themselves onto an unfamiliar repo
|
|
6
6
|
- Debug what the MCP server is doing
|
|
7
7
|
- Use outputs in CI/scripts (via `--json`)
|
|
8
8
|
|
|
9
9
|
> Output depends on the repo you run it against. The examples below are illustrative (paths, counts, and detected frameworks will vary).
|
|
10
|
+
>
|
|
11
|
+
> The CLI is intentionally single-project per invocation. MCP multi-project routing and trusted-root auto-discovery are only for the MCP server; the CLI still targets one root via `CODEBASE_ROOT` or the current working directory.
|
|
10
12
|
|
|
11
13
|
## How to run
|
|
12
14
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codebase-context",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Second brain for AI agents working on your codebase - team coding patterns detection, persistent memory, edit readiness checks, and hybrid search with evidence scoring. Local-first MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/lib.js",
|
|
@@ -135,7 +135,6 @@
|
|
|
135
135
|
"vitest": "^4.0.18"
|
|
136
136
|
},
|
|
137
137
|
"scripts": {
|
|
138
|
-
"preinstall": "npx only-allow pnpm",
|
|
139
138
|
"sync:grammars": "node scripts/sync-grammars.mjs",
|
|
140
139
|
"prebuild": "pnpm run sync:grammars",
|
|
141
140
|
"build": "tsc",
|