openlore 2.0.1 → 2.0.3
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 +57 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +18 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/export/index.d.ts +10 -0
- package/dist/cli/export/index.d.ts.map +1 -0
- package/dist/cli/export/index.js +27 -0
- package/dist/cli/export/index.js.map +1 -0
- package/dist/cli/export/scip.d.ts +22 -0
- package/dist/cli/export/scip.d.ts.map +1 -0
- package/dist/cli/export/scip.js +95 -0
- package/dist/cli/export/scip.js.map +1 -0
- package/dist/cli/index.js +19 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install/adapters/agents-md.d.ts +8 -0
- package/dist/cli/install/adapters/agents-md.d.ts.map +1 -0
- package/dist/cli/install/adapters/agents-md.js +21 -0
- package/dist/cli/install/adapters/agents-md.js.map +1 -0
- package/dist/cli/install/adapters/claude-code.d.ts +8 -0
- package/dist/cli/install/adapters/claude-code.d.ts.map +1 -0
- package/dist/cli/install/adapters/claude-code.js +184 -0
- package/dist/cli/install/adapters/claude-code.js.map +1 -0
- package/dist/cli/install/adapters/cline.d.ts +6 -0
- package/dist/cli/install/adapters/cline.d.ts.map +1 -0
- package/dist/cli/install/adapters/cline.js +19 -0
- package/dist/cli/install/adapters/cline.js.map +1 -0
- package/dist/cli/install/adapters/continue.d.ts +13 -0
- package/dist/cli/install/adapters/continue.d.ts.map +1 -0
- package/dist/cli/install/adapters/continue.js +119 -0
- package/dist/cli/install/adapters/continue.js.map +1 -0
- package/dist/cli/install/adapters/cursor.d.ts +8 -0
- package/dist/cli/install/adapters/cursor.d.ts.map +1 -0
- package/dist/cli/install/adapters/cursor.js +195 -0
- package/dist/cli/install/adapters/cursor.js.map +1 -0
- package/dist/cli/install/adapters/markdown-block.d.ts +20 -0
- package/dist/cli/install/adapters/markdown-block.d.ts.map +1 -0
- package/dist/cli/install/adapters/markdown-block.js +114 -0
- package/dist/cli/install/adapters/markdown-block.js.map +1 -0
- package/dist/cli/install/adapters/types.d.ts +39 -0
- package/dist/cli/install/adapters/types.d.ts.map +1 -0
- package/dist/cli/install/adapters/types.js +10 -0
- package/dist/cli/install/adapters/types.js.map +1 -0
- package/dist/cli/install/block.d.ts +53 -0
- package/dist/cli/install/block.d.ts.map +1 -0
- package/dist/cli/install/block.js +106 -0
- package/dist/cli/install/block.js.map +1 -0
- package/dist/cli/install/detect.d.ts +23 -0
- package/dist/cli/install/detect.d.ts.map +1 -0
- package/dist/cli/install/detect.js +115 -0
- package/dist/cli/install/detect.js.map +1 -0
- package/dist/cli/install/diff.d.ts +12 -0
- package/dist/cli/install/diff.d.ts.map +1 -0
- package/dist/cli/install/diff.js +51 -0
- package/dist/cli/install/diff.js.map +1 -0
- package/dist/cli/install/index.d.ts +19 -0
- package/dist/cli/install/index.d.ts.map +1 -0
- package/dist/cli/install/index.js +133 -0
- package/dist/cli/install/index.js.map +1 -0
- package/dist/cli/install/json-managed.d.ts +43 -0
- package/dist/cli/install/json-managed.d.ts.map +1 -0
- package/dist/cli/install/json-managed.js +137 -0
- package/dist/cli/install/json-managed.js.map +1 -0
- package/dist/cli/install/templates/agent-instructions.md +12 -0
- package/dist/cli/install/templates/cursor-openlore.mdc +7 -0
- package/dist/cli/manifest/detect/events.d.ts +31 -0
- package/dist/cli/manifest/detect/events.d.ts.map +1 -0
- package/dist/cli/manifest/detect/events.js +22 -0
- package/dist/cli/manifest/detect/events.js.map +1 -0
- package/dist/cli/manifest/detect/http-routes.d.ts +22 -0
- package/dist/cli/manifest/detect/http-routes.d.ts.map +1 -0
- package/dist/cli/manifest/detect/http-routes.js +18 -0
- package/dist/cli/manifest/detect/http-routes.js.map +1 -0
- package/dist/cli/manifest/detect/public-symbols.d.ts +46 -0
- package/dist/cli/manifest/detect/public-symbols.d.ts.map +1 -0
- package/dist/cli/manifest/detect/public-symbols.js +144 -0
- package/dist/cli/manifest/detect/public-symbols.js.map +1 -0
- package/dist/cli/manifest/emit.d.ts +103 -0
- package/dist/cli/manifest/emit.d.ts.map +1 -0
- package/dist/cli/manifest/emit.js +272 -0
- package/dist/cli/manifest/emit.js.map +1 -0
- package/dist/cli/manifest/index.d.ts +11 -0
- package/dist/cli/manifest/index.d.ts.map +1 -0
- package/dist/cli/manifest/index.js +31 -0
- package/dist/cli/manifest/index.js.map +1 -0
- package/dist/cli/manifest/schema-validator.d.ts +18 -0
- package/dist/cli/manifest/schema-validator.d.ts.map +1 -0
- package/dist/cli/manifest/schema-validator.js +77 -0
- package/dist/cli/manifest/schema-validator.js.map +1 -0
- package/dist/cli/manifest/validate.d.ts +15 -0
- package/dist/cli/manifest/validate.d.ts.map +1 -0
- package/dist/cli/manifest/validate.js +51 -0
- package/dist/cli/manifest/validate.js.map +1 -0
- package/dist/cli/preflight/diff.d.ts +42 -0
- package/dist/cli/preflight/diff.d.ts.map +1 -0
- package/dist/cli/preflight/diff.js +162 -0
- package/dist/cli/preflight/diff.js.map +1 -0
- package/dist/cli/preflight/index.d.ts +31 -0
- package/dist/cli/preflight/index.d.ts.map +1 -0
- package/dist/cli/preflight/index.js +126 -0
- package/dist/cli/preflight/index.js.map +1 -0
- package/dist/cli/preflight/report.d.ts +50 -0
- package/dist/cli/preflight/report.d.ts.map +1 -0
- package/dist/cli/preflight/report.js +174 -0
- package/dist/cli/preflight/report.js.map +1 -0
- package/dist/cli/preflight/score.d.ts +43 -0
- package/dist/cli/preflight/score.d.ts.map +1 -0
- package/dist/cli/preflight/score.js +102 -0
- package/dist/cli/preflight/score.js.map +1 -0
- package/dist/core/analyzer/file-walker.d.ts.map +1 -1
- package/dist/core/analyzer/file-walker.js +20 -13
- package/dist/core/analyzer/file-walker.js.map +1 -1
- package/dist/core/analyzer/vector-index.d.ts +2 -0
- package/dist/core/analyzer/vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/vector-index.js +30 -20
- package/dist/core/analyzer/vector-index.js.map +1 -1
- package/dist/core/scip/index.d.ts +51 -0
- package/dist/core/scip/index.d.ts.map +1 -0
- package/dist/core/scip/index.js +210 -0
- package/dist/core/scip/index.js.map +1 -0
- package/dist/core/scip/moniker.d.ts +48 -0
- package/dist/core/scip/moniker.d.ts.map +1 -0
- package/dist/core/scip/moniker.js +109 -0
- package/dist/core/scip/moniker.js.map +1 -0
- package/dist/core/scip/schema.d.ts +34 -0
- package/dist/core/scip/schema.d.ts.map +1 -0
- package/dist/core/scip/schema.js +48 -0
- package/dist/core/scip/schema.js.map +1 -0
- package/dist/core/scip/vendor/scip.proto +910 -0
- package/dist/core/services/mcp-handlers/utils.d.ts +2 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/utils.js +18 -2
- package/dist/core/services/mcp-handlers/utils.js.map +1 -1
- package/examples/ci/openlore-preflight.gitlab.yml +16 -0
- package/examples/ci/openlore-preflight.sh +16 -0
- package/examples/ci/openlore-preflight.yml +30 -0
- package/package.json +6 -2
- package/schemas/openlore-manifest-v1.json +191 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `openlore install` — auto-configure popular agent surfaces so they call
|
|
3
|
+
* `orient()` automatically.
|
|
4
|
+
*
|
|
5
|
+
* Dispatches to one or more adapters depending on `--agent` / detection,
|
|
6
|
+
* supports `--dry-run`, `--force`, and `--uninstall`.
|
|
7
|
+
*/
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { dirname, join } from 'node:path';
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { logger } from '../../utils/logger.js';
|
|
13
|
+
import { detect, ALL_AGENTS } from './detect.js';
|
|
14
|
+
import { agentsMdAdapter } from './adapters/agents-md.js';
|
|
15
|
+
import { claudeCodeAdapter } from './adapters/claude-code.js';
|
|
16
|
+
import { cursorAdapter } from './adapters/cursor.js';
|
|
17
|
+
import { clineAdapter } from './adapters/cline.js';
|
|
18
|
+
import { continueAdapter } from './adapters/continue.js';
|
|
19
|
+
const ADAPTERS = {
|
|
20
|
+
'agents-md': agentsMdAdapter,
|
|
21
|
+
'claude-code': claudeCodeAdapter,
|
|
22
|
+
cursor: cursorAdapter,
|
|
23
|
+
cline: clineAdapter,
|
|
24
|
+
continue: continueAdapter,
|
|
25
|
+
};
|
|
26
|
+
async function loadTemplate() {
|
|
27
|
+
// Template lives next to this file in the source tree, but at runtime we
|
|
28
|
+
// resolve via the compiled dist path.
|
|
29
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const candidates = [
|
|
31
|
+
join(here, 'templates', 'agent-instructions.md'),
|
|
32
|
+
// tsx / source-run fallback
|
|
33
|
+
join(here, '..', '..', '..', 'src', 'cli', 'install', 'templates', 'agent-instructions.md'),
|
|
34
|
+
];
|
|
35
|
+
for (const p of candidates) {
|
|
36
|
+
try {
|
|
37
|
+
return await readFile(p, 'utf8');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* try next */
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw new Error('openlore install: could not locate agent-instructions.md template (looked in dist + src)');
|
|
44
|
+
}
|
|
45
|
+
export async function runInstall(opts) {
|
|
46
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
47
|
+
const template = await loadTemplate();
|
|
48
|
+
let surfaces;
|
|
49
|
+
if (opts.agent) {
|
|
50
|
+
if (!ALL_AGENTS.includes(opts.agent)) {
|
|
51
|
+
logger.error(`Unknown agent surface "${opts.agent}". Known: ${ALL_AGENTS.join(', ')}`);
|
|
52
|
+
return 2;
|
|
53
|
+
}
|
|
54
|
+
surfaces = [{ agent: opts.agent, root: cwd, markers: ['(explicit --agent)'] }];
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
surfaces = await detect(cwd);
|
|
58
|
+
}
|
|
59
|
+
logger.discovery(`${opts.uninstall ? 'Uninstalling' : 'Installing'} for ${surfaces.length} surface(s): ${surfaces
|
|
60
|
+
.map((s) => s.agent)
|
|
61
|
+
.join(', ')}`);
|
|
62
|
+
let conflict = false;
|
|
63
|
+
const allChanges = [];
|
|
64
|
+
const allWarnings = [];
|
|
65
|
+
for (const surface of surfaces) {
|
|
66
|
+
const adapter = ADAPTERS[surface.agent];
|
|
67
|
+
const ctx = {
|
|
68
|
+
root: surface.root,
|
|
69
|
+
instructionTemplate: template,
|
|
70
|
+
dryRun: !!opts.dryRun,
|
|
71
|
+
force: !!opts.force,
|
|
72
|
+
};
|
|
73
|
+
const result = opts.uninstall
|
|
74
|
+
? await adapter.uninstall(ctx)
|
|
75
|
+
: await adapter.apply(ctx);
|
|
76
|
+
if (result.conflict)
|
|
77
|
+
conflict = true;
|
|
78
|
+
allChanges.push(...result.changes);
|
|
79
|
+
allWarnings.push(...result.warnings);
|
|
80
|
+
}
|
|
81
|
+
printSummary(allChanges, allWarnings, !!opts.dryRun, !!opts.uninstall);
|
|
82
|
+
if (conflict) {
|
|
83
|
+
logger.error('Hand-edited OpenLore block(s) detected. Re-run with --force to overwrite, or revert your edits.');
|
|
84
|
+
return 1;
|
|
85
|
+
}
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
function printSummary(changes, warnings, dryRun, uninstall) {
|
|
89
|
+
const verb = dryRun ? 'would' : 'did';
|
|
90
|
+
for (const c of changes) {
|
|
91
|
+
const tag = c.kind === 'create'
|
|
92
|
+
? `[${verb} create]`
|
|
93
|
+
: c.kind === 'update'
|
|
94
|
+
? `[${verb} update]`
|
|
95
|
+
: c.kind === 'delete'
|
|
96
|
+
? `[${verb} delete]`
|
|
97
|
+
: '[noop]';
|
|
98
|
+
if (c.kind === 'noop')
|
|
99
|
+
logger.discovery(`${tag} ${c.summary}`);
|
|
100
|
+
else
|
|
101
|
+
logger.success(`${tag} ${c.summary}`);
|
|
102
|
+
if (dryRun && c.preview) {
|
|
103
|
+
const indented = c.preview
|
|
104
|
+
.split('\n')
|
|
105
|
+
.map((l) => ' ' + l)
|
|
106
|
+
.join('\n');
|
|
107
|
+
process.stderr.write(indented + '\n');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const w of warnings)
|
|
111
|
+
logger.warning(w);
|
|
112
|
+
if (dryRun) {
|
|
113
|
+
logger.discovery('Dry run — no files were written.');
|
|
114
|
+
}
|
|
115
|
+
else if (!uninstall) {
|
|
116
|
+
logger.success('OpenLore install complete.');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
logger.success('OpenLore uninstall complete.');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export const installCommand = new Command('install')
|
|
123
|
+
.description('Auto-configure agent surfaces to call orient() (Claude Code, Cursor, Cline, Continue, AGENTS.md).')
|
|
124
|
+
.option('--agent <name>', 'Install only for a specific surface (claude-code, cursor, cline, continue, agents-md)')
|
|
125
|
+
.option('--dry-run', 'Print the planned changes without writing any files', false)
|
|
126
|
+
.option('--force', 'Overwrite OpenLore-managed blocks even if hand-edited', false)
|
|
127
|
+
.option('--uninstall', 'Remove OpenLore-managed blocks and entries', false)
|
|
128
|
+
.action(async (opts) => {
|
|
129
|
+
const code = await runInstall(opts);
|
|
130
|
+
if (code !== 0)
|
|
131
|
+
process.exit(code);
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/install/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe merge of an OpenLore-managed entry into a JSON config file.
|
|
3
|
+
*
|
|
4
|
+
* We store our additions under a top-level `_openlore` key for bookkeeping
|
|
5
|
+
* (fingerprint of the merged subtree, version), while writing the actual
|
|
6
|
+
* config under whatever path the host tool reads (e.g. `mcpServers.openlore`,
|
|
7
|
+
* `hooks.SessionStart`). The fingerprint lets us detect hand-edits.
|
|
8
|
+
*/
|
|
9
|
+
export interface ManagedJsonMeta {
|
|
10
|
+
managed: true;
|
|
11
|
+
version: number;
|
|
12
|
+
fingerprint: string;
|
|
13
|
+
/**
|
|
14
|
+
* Dotted paths into the JSON document that OpenLore manages. Used by
|
|
15
|
+
* `--uninstall` to remove only what we added.
|
|
16
|
+
*/
|
|
17
|
+
paths: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function canonicalJsonHash(value: unknown): string;
|
|
20
|
+
export interface ManagedEntry {
|
|
21
|
+
/** Dotted path into the JSON document (e.g. "mcpServers.openlore"). */
|
|
22
|
+
path: string;
|
|
23
|
+
/** Value to write at that path. */
|
|
24
|
+
value: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface MergeResult {
|
|
27
|
+
next: Record<string, unknown>;
|
|
28
|
+
action: 'created' | 'updated' | 'noop';
|
|
29
|
+
/** If the existing meta fingerprint didn't match what was on disk. */
|
|
30
|
+
handEdited: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function readMeta(doc: Record<string, unknown>): ManagedJsonMeta | null;
|
|
33
|
+
/**
|
|
34
|
+
* Verify the meta fingerprint still matches the values we previously wrote.
|
|
35
|
+
* If not, the user has hand-edited one of our managed paths.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isHandEdited(doc: Record<string, unknown>, meta: ManagedJsonMeta): boolean;
|
|
38
|
+
export declare function mergeEntries(existing: Record<string, unknown>, entries: ManagedEntry[]): MergeResult;
|
|
39
|
+
export declare function removeManaged(doc: Record<string, unknown>): {
|
|
40
|
+
next: Record<string, unknown>;
|
|
41
|
+
removed: boolean;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=json-managed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-managed.d.ts","sourceRoot":"","sources":["../../../src/cli/install/json-managed.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD;AAeD,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,sEAAsE;IACtE,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,IAAI,CAW7E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAOzF;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,YAAY,EAAE,GACtB,WAAW,CA4Bb;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC3D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB,CAOA"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe merge of an OpenLore-managed entry into a JSON config file.
|
|
3
|
+
*
|
|
4
|
+
* We store our additions under a top-level `_openlore` key for bookkeeping
|
|
5
|
+
* (fingerprint of the merged subtree, version), while writing the actual
|
|
6
|
+
* config under whatever path the host tool reads (e.g. `mcpServers.openlore`,
|
|
7
|
+
* `hooks.SessionStart`). The fingerprint lets us detect hand-edits.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
const META_KEY = '_openlore';
|
|
11
|
+
const META_VERSION = 1;
|
|
12
|
+
export function canonicalJsonHash(value) {
|
|
13
|
+
return createHash('sha256').update(canonicalize(value), 'utf8').digest('hex').slice(0, 16);
|
|
14
|
+
}
|
|
15
|
+
function canonicalize(value) {
|
|
16
|
+
if (value === null || typeof value !== 'object')
|
|
17
|
+
return JSON.stringify(value);
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return '[' + value.map(canonicalize).join(',') + ']';
|
|
20
|
+
const keys = Object.keys(value).sort();
|
|
21
|
+
return ('{' +
|
|
22
|
+
keys
|
|
23
|
+
.map((k) => JSON.stringify(k) + ':' + canonicalize(value[k]))
|
|
24
|
+
.join(',') +
|
|
25
|
+
'}');
|
|
26
|
+
}
|
|
27
|
+
export function readMeta(doc) {
|
|
28
|
+
const meta = doc[META_KEY];
|
|
29
|
+
if (!meta || typeof meta !== 'object')
|
|
30
|
+
return null;
|
|
31
|
+
const m = meta;
|
|
32
|
+
if (m.managed !== true || typeof m.fingerprint !== 'string')
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
managed: true,
|
|
36
|
+
version: typeof m.version === 'number' ? m.version : 1,
|
|
37
|
+
fingerprint: m.fingerprint,
|
|
38
|
+
paths: Array.isArray(m.paths) ? m.paths.filter((p) => typeof p === 'string') : [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Verify the meta fingerprint still matches the values we previously wrote.
|
|
43
|
+
* If not, the user has hand-edited one of our managed paths.
|
|
44
|
+
*/
|
|
45
|
+
export function isHandEdited(doc, meta) {
|
|
46
|
+
const subset = {};
|
|
47
|
+
for (const path of meta.paths) {
|
|
48
|
+
const value = getPath(doc, path);
|
|
49
|
+
if (value !== undefined)
|
|
50
|
+
setPath(subset, path, value);
|
|
51
|
+
}
|
|
52
|
+
return canonicalJsonHash(subset) !== meta.fingerprint;
|
|
53
|
+
}
|
|
54
|
+
export function mergeEntries(existing, entries) {
|
|
55
|
+
const next = structuredClone(existing);
|
|
56
|
+
const prevMeta = readMeta(next);
|
|
57
|
+
const handEdited = prevMeta ? isHandEdited(next, prevMeta) : false;
|
|
58
|
+
for (const e of entries)
|
|
59
|
+
setPath(next, e.path, e.value);
|
|
60
|
+
const subset = {};
|
|
61
|
+
for (const e of entries)
|
|
62
|
+
setPath(subset, e.path, e.value);
|
|
63
|
+
const newMeta = {
|
|
64
|
+
managed: true,
|
|
65
|
+
version: META_VERSION,
|
|
66
|
+
fingerprint: canonicalJsonHash(subset),
|
|
67
|
+
paths: entries.map((e) => e.path),
|
|
68
|
+
};
|
|
69
|
+
next[META_KEY] = newMeta;
|
|
70
|
+
// Did anything actually change vs `existing`?
|
|
71
|
+
const before = canonicalize(existing);
|
|
72
|
+
const after = canonicalize(next);
|
|
73
|
+
const action = prevMeta
|
|
74
|
+
? before === after
|
|
75
|
+
? 'noop'
|
|
76
|
+
: 'updated'
|
|
77
|
+
: 'created';
|
|
78
|
+
return { next, action, handEdited };
|
|
79
|
+
}
|
|
80
|
+
export function removeManaged(doc) {
|
|
81
|
+
const meta = readMeta(doc);
|
|
82
|
+
if (!meta)
|
|
83
|
+
return { next: doc, removed: false };
|
|
84
|
+
const next = structuredClone(doc);
|
|
85
|
+
for (const path of meta.paths)
|
|
86
|
+
deletePath(next, path);
|
|
87
|
+
delete next[META_KEY];
|
|
88
|
+
return { next, removed: true };
|
|
89
|
+
}
|
|
90
|
+
// ---------- path helpers ----------
|
|
91
|
+
function getPath(obj, path) {
|
|
92
|
+
const parts = path.split('.');
|
|
93
|
+
let cur = obj;
|
|
94
|
+
for (const p of parts) {
|
|
95
|
+
if (cur === null || typeof cur !== 'object')
|
|
96
|
+
return undefined;
|
|
97
|
+
cur = cur[p];
|
|
98
|
+
}
|
|
99
|
+
return cur;
|
|
100
|
+
}
|
|
101
|
+
function setPath(obj, path, value) {
|
|
102
|
+
const parts = path.split('.');
|
|
103
|
+
let cur = obj;
|
|
104
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
105
|
+
const k = parts[i];
|
|
106
|
+
const next = cur[k];
|
|
107
|
+
if (next === null || typeof next !== 'object' || Array.isArray(next)) {
|
|
108
|
+
cur[k] = {};
|
|
109
|
+
}
|
|
110
|
+
cur = cur[k];
|
|
111
|
+
}
|
|
112
|
+
cur[parts[parts.length - 1]] = value;
|
|
113
|
+
}
|
|
114
|
+
function deletePath(obj, path) {
|
|
115
|
+
const parts = path.split('.');
|
|
116
|
+
const chain = [];
|
|
117
|
+
let cur = obj;
|
|
118
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
119
|
+
const k = parts[i];
|
|
120
|
+
const next = cur[k];
|
|
121
|
+
if (next === null || typeof next !== 'object' || Array.isArray(next))
|
|
122
|
+
return;
|
|
123
|
+
chain.push({ container: cur, key: k });
|
|
124
|
+
cur = next;
|
|
125
|
+
}
|
|
126
|
+
delete cur[parts[parts.length - 1]];
|
|
127
|
+
// Prune empty parent objects we walked through.
|
|
128
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
129
|
+
const { container, key } = chain[i];
|
|
130
|
+
const child = container[key];
|
|
131
|
+
if (Object.keys(child).length === 0)
|
|
132
|
+
delete container[key];
|
|
133
|
+
else
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=json-managed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-managed.js","sourceRoot":"","sources":["../../../src/cli/install/json-managed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
This project uses OpenLore for persistent architectural memory.
|
|
2
|
+
|
|
3
|
+
ALWAYS call `orient()` (via the openlore MCP server, or `npx openlore orient --json`)
|
|
4
|
+
before reading source files when starting a new task. This returns the relevant
|
|
5
|
+
functions, callers, spec sections, and insertion points for the task at hand and
|
|
6
|
+
saves you 15,000–50,000 tokens of file-by-file rediscovery.
|
|
7
|
+
|
|
8
|
+
Re-orient whenever the Epistemic Lease indicates staleness (you'll see a prefix
|
|
9
|
+
on tool responses telling you to do so).
|
|
10
|
+
|
|
11
|
+
For the MCP setup, ensure `openlore mcp` is configured as an MCP server.
|
|
12
|
+
See https://github.com/clay-good/OpenLore for details.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter/consumer and RPC detection for the manifest.
|
|
3
|
+
*
|
|
4
|
+
* The current analyzer does not surface message-bus events or gRPC/RPC service
|
|
5
|
+
* definitions as structured data, so per spec-05's conservative rule these are
|
|
6
|
+
* emitted as empty arrays rather than guessed. The schema and federation index
|
|
7
|
+
* already accommodate them, so a later analyzer change can populate them
|
|
8
|
+
* without a manifest-schema bump.
|
|
9
|
+
*
|
|
10
|
+
* TODO(spec-05-followup): surface events_emitted / events_consumed from analyzer.
|
|
11
|
+
* TODO(spec-05-followup): surface rpc_endpoints (gRPC service/method) from analyzer.
|
|
12
|
+
*/
|
|
13
|
+
export interface ManifestEvent {
|
|
14
|
+
name: string;
|
|
15
|
+
schema_ref?: string | null;
|
|
16
|
+
emitter?: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface ManifestConsumedEvent {
|
|
19
|
+
name: string;
|
|
20
|
+
handler: string | null;
|
|
21
|
+
}
|
|
22
|
+
export interface ManifestRpcEndpoint {
|
|
23
|
+
kind: string;
|
|
24
|
+
service: string;
|
|
25
|
+
method: string;
|
|
26
|
+
handler: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function deriveEventsEmitted(): ManifestEvent[];
|
|
29
|
+
export declare function deriveEventsConsumed(): ManifestConsumedEvent[];
|
|
30
|
+
export declare function deriveRpcEndpoints(): ManifestRpcEndpoint[];
|
|
31
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../src/cli/manifest/detect/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,mBAAmB,IAAI,aAAa,EAAE,CAErD;AAED,wBAAgB,oBAAoB,IAAI,qBAAqB,EAAE,CAE9D;AAED,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAE1D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter/consumer and RPC detection for the manifest.
|
|
3
|
+
*
|
|
4
|
+
* The current analyzer does not surface message-bus events or gRPC/RPC service
|
|
5
|
+
* definitions as structured data, so per spec-05's conservative rule these are
|
|
6
|
+
* emitted as empty arrays rather than guessed. The schema and federation index
|
|
7
|
+
* already accommodate them, so a later analyzer change can populate them
|
|
8
|
+
* without a manifest-schema bump.
|
|
9
|
+
*
|
|
10
|
+
* TODO(spec-05-followup): surface events_emitted / events_consumed from analyzer.
|
|
11
|
+
* TODO(spec-05-followup): surface rpc_endpoints (gRPC service/method) from analyzer.
|
|
12
|
+
*/
|
|
13
|
+
export function deriveEventsEmitted() {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
export function deriveEventsConsumed() {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
export function deriveRpcEndpoints() {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/cli/manifest/detect/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoBH,MAAM,UAAU,mBAAmB;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP routes for the manifest, taken verbatim from the route inventory the
|
|
3
|
+
* analyzer already produces (Express, Fastify, NestJS, FastAPI, … detectors
|
|
4
|
+
* live in the analyzer). We do not add framework parsers here (spec-05 scope).
|
|
5
|
+
*
|
|
6
|
+
* TODO(spec-05-followup): more framework detectors in the analyzer.
|
|
7
|
+
*/
|
|
8
|
+
export interface RouteInventoryEntry {
|
|
9
|
+
method: string;
|
|
10
|
+
path: string;
|
|
11
|
+
framework?: string;
|
|
12
|
+
file?: string;
|
|
13
|
+
handler?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ManifestRoute {
|
|
16
|
+
method: string;
|
|
17
|
+
path: string;
|
|
18
|
+
/** "<file>:<handler>" when both are known, else whichever is known, else null. */
|
|
19
|
+
handler: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function deriveHttpRoutes(routes: RouteInventoryEntry[]): ManifestRoute[];
|
|
22
|
+
//# sourceMappingURL=http-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-routes.d.ts","sourceRoot":"","sources":["../../../../src/cli/manifest/detect/http-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,aAAa,EAAE,CAY/E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP routes for the manifest, taken verbatim from the route inventory the
|
|
3
|
+
* analyzer already produces (Express, Fastify, NestJS, FastAPI, … detectors
|
|
4
|
+
* live in the analyzer). We do not add framework parsers here (spec-05 scope).
|
|
5
|
+
*
|
|
6
|
+
* TODO(spec-05-followup): more framework detectors in the analyzer.
|
|
7
|
+
*/
|
|
8
|
+
export function deriveHttpRoutes(routes) {
|
|
9
|
+
return routes
|
|
10
|
+
.map((r) => {
|
|
11
|
+
const handler = r.file && r.handler ? `${r.file}:${r.handler}` : r.handler ?? r.file ?? null;
|
|
12
|
+
return { method: r.method.toUpperCase(), path: r.path, handler };
|
|
13
|
+
})
|
|
14
|
+
.sort((a, b) => a.path.localeCompare(b.path) ||
|
|
15
|
+
a.method.localeCompare(b.method) ||
|
|
16
|
+
(a.handler ?? '').localeCompare(b.handler ?? ''));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=http-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-routes.js","sourceRoot":"","sources":["../../../../src/cli/manifest/detect/http-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,UAAU,gBAAgB,CAAC,MAA6B;IAC5D,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAiB,EAAE;QACxB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;QAC7F,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IACnE,CAAC,CAAC;SACD,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CACnD,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive the public API surface from data the analyzer already produced.
|
|
3
|
+
*
|
|
4
|
+
* Default (conservative, per spec-05): a symbol is "public" if it is exported
|
|
5
|
+
* from the *package entry point(s)* (TS/JS), following re-exports to their
|
|
6
|
+
* definition for an accurate kind/line. Public methods of an exported class are
|
|
7
|
+
* included too (e.g. `BillingService.refund`). For files in languages the
|
|
8
|
+
* export extractor does not cover, we fall back to "top-level non-underscore
|
|
9
|
+
* function" (matching the Python `__all__`/non-underscore convention).
|
|
10
|
+
*
|
|
11
|
+
* `--include-private` drops the public filter entirely and emits every
|
|
12
|
+
* file-level export plus every function/method node (a much larger list).
|
|
13
|
+
*
|
|
14
|
+
* Sources:
|
|
15
|
+
* - dependency-graph.json `exports[]` — name/kind/line/isReExport per file.
|
|
16
|
+
* - the call graph — public methods of exported classes, with lines.
|
|
17
|
+
*
|
|
18
|
+
* We do NOT add new language parsers here (spec-05 scope).
|
|
19
|
+
* TODO(spec-05-followup): surface exported types/interfaces with line numbers.
|
|
20
|
+
*/
|
|
21
|
+
import type { FunctionNode, ClassNode } from '../../../core/analyzer/call-graph.js';
|
|
22
|
+
export interface ExportEntry {
|
|
23
|
+
name: string;
|
|
24
|
+
kind: string;
|
|
25
|
+
line: number;
|
|
26
|
+
isType?: boolean;
|
|
27
|
+
isDefault?: boolean;
|
|
28
|
+
isReExport?: boolean;
|
|
29
|
+
reExportSource?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface PublicSymbol {
|
|
32
|
+
name: string;
|
|
33
|
+
kind: string;
|
|
34
|
+
file: string;
|
|
35
|
+
line: number;
|
|
36
|
+
}
|
|
37
|
+
export interface DerivePublicSymbolsArgs {
|
|
38
|
+
nodes: FunctionNode[];
|
|
39
|
+
classes: ClassNode[];
|
|
40
|
+
exportsByFile: Map<string, ExportEntry[]>;
|
|
41
|
+
/** Repo-relative entry-point source files (from package.json), TS/JS. */
|
|
42
|
+
entryFiles: string[];
|
|
43
|
+
includePrivate: boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function derivePublicSymbols(args: DerivePublicSymbolsArgs): PublicSymbol[];
|
|
46
|
+
//# sourceMappingURL=public-symbols.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-symbols.d.ts","sourceRoot":"","sources":["../../../../src/cli/manifest/detect/public-symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAsDD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1C,yEAAyE;IACzE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,YAAY,EAAE,CAuEjF"}
|