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.
Files changed (137) hide show
  1. package/README.md +57 -0
  2. package/dist/cli/commands/mcp.d.ts.map +1 -1
  3. package/dist/cli/commands/mcp.js +18 -1
  4. package/dist/cli/commands/mcp.js.map +1 -1
  5. package/dist/cli/export/index.d.ts +10 -0
  6. package/dist/cli/export/index.d.ts.map +1 -0
  7. package/dist/cli/export/index.js +27 -0
  8. package/dist/cli/export/index.js.map +1 -0
  9. package/dist/cli/export/scip.d.ts +22 -0
  10. package/dist/cli/export/scip.d.ts.map +1 -0
  11. package/dist/cli/export/scip.js +95 -0
  12. package/dist/cli/export/scip.js.map +1 -0
  13. package/dist/cli/index.js +19 -9
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/install/adapters/agents-md.d.ts +8 -0
  16. package/dist/cli/install/adapters/agents-md.d.ts.map +1 -0
  17. package/dist/cli/install/adapters/agents-md.js +21 -0
  18. package/dist/cli/install/adapters/agents-md.js.map +1 -0
  19. package/dist/cli/install/adapters/claude-code.d.ts +8 -0
  20. package/dist/cli/install/adapters/claude-code.d.ts.map +1 -0
  21. package/dist/cli/install/adapters/claude-code.js +184 -0
  22. package/dist/cli/install/adapters/claude-code.js.map +1 -0
  23. package/dist/cli/install/adapters/cline.d.ts +6 -0
  24. package/dist/cli/install/adapters/cline.d.ts.map +1 -0
  25. package/dist/cli/install/adapters/cline.js +19 -0
  26. package/dist/cli/install/adapters/cline.js.map +1 -0
  27. package/dist/cli/install/adapters/continue.d.ts +13 -0
  28. package/dist/cli/install/adapters/continue.d.ts.map +1 -0
  29. package/dist/cli/install/adapters/continue.js +119 -0
  30. package/dist/cli/install/adapters/continue.js.map +1 -0
  31. package/dist/cli/install/adapters/cursor.d.ts +8 -0
  32. package/dist/cli/install/adapters/cursor.d.ts.map +1 -0
  33. package/dist/cli/install/adapters/cursor.js +195 -0
  34. package/dist/cli/install/adapters/cursor.js.map +1 -0
  35. package/dist/cli/install/adapters/markdown-block.d.ts +20 -0
  36. package/dist/cli/install/adapters/markdown-block.d.ts.map +1 -0
  37. package/dist/cli/install/adapters/markdown-block.js +114 -0
  38. package/dist/cli/install/adapters/markdown-block.js.map +1 -0
  39. package/dist/cli/install/adapters/types.d.ts +39 -0
  40. package/dist/cli/install/adapters/types.d.ts.map +1 -0
  41. package/dist/cli/install/adapters/types.js +10 -0
  42. package/dist/cli/install/adapters/types.js.map +1 -0
  43. package/dist/cli/install/block.d.ts +53 -0
  44. package/dist/cli/install/block.d.ts.map +1 -0
  45. package/dist/cli/install/block.js +106 -0
  46. package/dist/cli/install/block.js.map +1 -0
  47. package/dist/cli/install/detect.d.ts +23 -0
  48. package/dist/cli/install/detect.d.ts.map +1 -0
  49. package/dist/cli/install/detect.js +115 -0
  50. package/dist/cli/install/detect.js.map +1 -0
  51. package/dist/cli/install/diff.d.ts +12 -0
  52. package/dist/cli/install/diff.d.ts.map +1 -0
  53. package/dist/cli/install/diff.js +51 -0
  54. package/dist/cli/install/diff.js.map +1 -0
  55. package/dist/cli/install/index.d.ts +19 -0
  56. package/dist/cli/install/index.d.ts.map +1 -0
  57. package/dist/cli/install/index.js +133 -0
  58. package/dist/cli/install/index.js.map +1 -0
  59. package/dist/cli/install/json-managed.d.ts +43 -0
  60. package/dist/cli/install/json-managed.d.ts.map +1 -0
  61. package/dist/cli/install/json-managed.js +137 -0
  62. package/dist/cli/install/json-managed.js.map +1 -0
  63. package/dist/cli/install/templates/agent-instructions.md +12 -0
  64. package/dist/cli/install/templates/cursor-openlore.mdc +7 -0
  65. package/dist/cli/manifest/detect/events.d.ts +31 -0
  66. package/dist/cli/manifest/detect/events.d.ts.map +1 -0
  67. package/dist/cli/manifest/detect/events.js +22 -0
  68. package/dist/cli/manifest/detect/events.js.map +1 -0
  69. package/dist/cli/manifest/detect/http-routes.d.ts +22 -0
  70. package/dist/cli/manifest/detect/http-routes.d.ts.map +1 -0
  71. package/dist/cli/manifest/detect/http-routes.js +18 -0
  72. package/dist/cli/manifest/detect/http-routes.js.map +1 -0
  73. package/dist/cli/manifest/detect/public-symbols.d.ts +46 -0
  74. package/dist/cli/manifest/detect/public-symbols.d.ts.map +1 -0
  75. package/dist/cli/manifest/detect/public-symbols.js +144 -0
  76. package/dist/cli/manifest/detect/public-symbols.js.map +1 -0
  77. package/dist/cli/manifest/emit.d.ts +103 -0
  78. package/dist/cli/manifest/emit.d.ts.map +1 -0
  79. package/dist/cli/manifest/emit.js +272 -0
  80. package/dist/cli/manifest/emit.js.map +1 -0
  81. package/dist/cli/manifest/index.d.ts +11 -0
  82. package/dist/cli/manifest/index.d.ts.map +1 -0
  83. package/dist/cli/manifest/index.js +31 -0
  84. package/dist/cli/manifest/index.js.map +1 -0
  85. package/dist/cli/manifest/schema-validator.d.ts +18 -0
  86. package/dist/cli/manifest/schema-validator.d.ts.map +1 -0
  87. package/dist/cli/manifest/schema-validator.js +77 -0
  88. package/dist/cli/manifest/schema-validator.js.map +1 -0
  89. package/dist/cli/manifest/validate.d.ts +15 -0
  90. package/dist/cli/manifest/validate.d.ts.map +1 -0
  91. package/dist/cli/manifest/validate.js +51 -0
  92. package/dist/cli/manifest/validate.js.map +1 -0
  93. package/dist/cli/preflight/diff.d.ts +42 -0
  94. package/dist/cli/preflight/diff.d.ts.map +1 -0
  95. package/dist/cli/preflight/diff.js +162 -0
  96. package/dist/cli/preflight/diff.js.map +1 -0
  97. package/dist/cli/preflight/index.d.ts +31 -0
  98. package/dist/cli/preflight/index.d.ts.map +1 -0
  99. package/dist/cli/preflight/index.js +126 -0
  100. package/dist/cli/preflight/index.js.map +1 -0
  101. package/dist/cli/preflight/report.d.ts +50 -0
  102. package/dist/cli/preflight/report.d.ts.map +1 -0
  103. package/dist/cli/preflight/report.js +174 -0
  104. package/dist/cli/preflight/report.js.map +1 -0
  105. package/dist/cli/preflight/score.d.ts +43 -0
  106. package/dist/cli/preflight/score.d.ts.map +1 -0
  107. package/dist/cli/preflight/score.js +102 -0
  108. package/dist/cli/preflight/score.js.map +1 -0
  109. package/dist/core/analyzer/file-walker.d.ts.map +1 -1
  110. package/dist/core/analyzer/file-walker.js +20 -13
  111. package/dist/core/analyzer/file-walker.js.map +1 -1
  112. package/dist/core/analyzer/vector-index.d.ts +2 -0
  113. package/dist/core/analyzer/vector-index.d.ts.map +1 -1
  114. package/dist/core/analyzer/vector-index.js +30 -20
  115. package/dist/core/analyzer/vector-index.js.map +1 -1
  116. package/dist/core/scip/index.d.ts +51 -0
  117. package/dist/core/scip/index.d.ts.map +1 -0
  118. package/dist/core/scip/index.js +210 -0
  119. package/dist/core/scip/index.js.map +1 -0
  120. package/dist/core/scip/moniker.d.ts +48 -0
  121. package/dist/core/scip/moniker.d.ts.map +1 -0
  122. package/dist/core/scip/moniker.js +109 -0
  123. package/dist/core/scip/moniker.js.map +1 -0
  124. package/dist/core/scip/schema.d.ts +34 -0
  125. package/dist/core/scip/schema.d.ts.map +1 -0
  126. package/dist/core/scip/schema.js +48 -0
  127. package/dist/core/scip/schema.js.map +1 -0
  128. package/dist/core/scip/vendor/scip.proto +910 -0
  129. package/dist/core/services/mcp-handlers/utils.d.ts +2 -0
  130. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
  131. package/dist/core/services/mcp-handlers/utils.js +18 -2
  132. package/dist/core/services/mcp-handlers/utils.js.map +1 -1
  133. package/examples/ci/openlore-preflight.gitlab.yml +16 -0
  134. package/examples/ci/openlore-preflight.sh +16 -0
  135. package/examples/ci/openlore-preflight.yml +30 -0
  136. package/package.json +6 -2
  137. package/schemas/openlore-manifest-v1.json +191 -0
@@ -0,0 +1,184 @@
1
+ /**
2
+ * claude-code adapter — appends the OpenLore instruction block to CLAUDE.md
3
+ * (creating it if absent) and adds a SessionStart hook + MCP server
4
+ * registration to `.claude/settings.json`.
5
+ */
6
+ import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
7
+ import { dirname, join } from 'node:path';
8
+ import { applyMarkdownBlock, uninstallMarkdownBlock } from './markdown-block.js';
9
+ import { mergeEntries, readMeta, removeManaged, isHandEdited } from '../json-managed.js';
10
+ import { previewCreate, previewDiff } from '../diff.js';
11
+ const MD_FILE = 'CLAUDE.md';
12
+ const SETTINGS_PATH = '.claude/settings.json';
13
+ const MCP_ENTRY = {
14
+ command: 'npx',
15
+ args: ['--yes', 'openlore', 'mcp'],
16
+ };
17
+ /**
18
+ * Our SessionStart entry is marked with `_openlore: true` so we can identify
19
+ * (and replace, or remove on uninstall) just our group without touching any
20
+ * other SessionStart hooks the user may have configured. Claude Code ignores
21
+ * unknown fields on matcher groups.
22
+ */
23
+ const ORIENT_COMMAND = 'npx --yes openlore orient --json';
24
+ const SESSION_HOOK = {
25
+ matcher: '',
26
+ _openlore: true,
27
+ hooks: [
28
+ {
29
+ type: 'command',
30
+ command: ORIENT_COMMAND,
31
+ },
32
+ ],
33
+ };
34
+ function isOurSessionEntry(entry) {
35
+ if (!entry || typeof entry !== 'object')
36
+ return false;
37
+ return entry._openlore === true;
38
+ }
39
+ function mergeSessionStart(existing) {
40
+ const arr = Array.isArray(existing) ? existing : [];
41
+ const withoutOurs = arr.filter((e) => !isOurSessionEntry(e));
42
+ return [...withoutOurs, SESSION_HOOK];
43
+ }
44
+ function stripOurSessionStart(existing) {
45
+ const arr = Array.isArray(existing) ? existing : [];
46
+ return arr.filter((e) => !isOurSessionEntry(e));
47
+ }
48
+ async function readJsonOrEmpty(path) {
49
+ try {
50
+ const raw = await readFile(path, 'utf8');
51
+ const parsed = JSON.parse(raw);
52
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
53
+ ? parsed
54
+ : {};
55
+ }
56
+ catch {
57
+ return {};
58
+ }
59
+ }
60
+ async function fileExists(path) {
61
+ try {
62
+ await readFile(path);
63
+ return true;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ export const claudeCodeAdapter = {
70
+ name: 'claude-code',
71
+ async apply(ctx) {
72
+ const mdResult = await applyMarkdownBlock(ctx, {
73
+ fileName: MD_FILE,
74
+ createIfMissing: true,
75
+ blockBody: ctx.instructionTemplate,
76
+ });
77
+ const settingsPath = join(ctx.root, SETTINGS_PATH);
78
+ const existing = await readJsonOrEmpty(settingsPath);
79
+ const had = await fileExists(settingsPath);
80
+ const prevMeta = readMeta(existing);
81
+ if (prevMeta && isHandEdited(existing, prevMeta) && !ctx.force) {
82
+ mdResult.changes.push({
83
+ path: settingsPath,
84
+ kind: 'noop',
85
+ summary: `${SETTINGS_PATH}: refused to overwrite hand-edited OpenLore entries (use --force)`,
86
+ });
87
+ mdResult.warnings.push(`${SETTINGS_PATH} has hand-edits in OpenLore-managed paths — pass --force to overwrite`);
88
+ mdResult.conflict = true;
89
+ return mdResult;
90
+ }
91
+ // SessionStart is computed imperatively (preserving any user-defined
92
+ // entries) and written through mergeEntries, but only mcpServers.openlore
93
+ // is tracked in our meta — we identify our SessionStart entry by its
94
+ // `_openlore: true` marker, not by claiming the whole array.
95
+ const currentSessionStart = existing.hooks?.SessionStart ?? [];
96
+ const nextSessionStart = mergeSessionStart(currentSessionStart);
97
+ const { next, action } = mergeEntries(existing, [
98
+ { path: 'mcpServers.openlore', value: MCP_ENTRY },
99
+ ]);
100
+ // Apply the SessionStart update outside the managed-paths set.
101
+ if (!next.hooks || typeof next.hooks !== 'object')
102
+ next.hooks = {};
103
+ next.hooks.SessionStart = nextSessionStart;
104
+ // Re-derive action: if existing already had identical SessionStart + meta noop, it's noop.
105
+ const sessionChanged = JSON.stringify(currentSessionStart) !== JSON.stringify(nextSessionStart);
106
+ const finalAction = action === 'noop' && !sessionChanged ? 'noop' : action === 'created' ? 'created' : 'updated';
107
+ const before = had ? JSON.stringify(existing, null, 2) + '\n' : '';
108
+ const after = JSON.stringify(next, null, 2) + '\n';
109
+ const change = {
110
+ path: settingsPath,
111
+ kind: !had ? 'create' : finalAction === 'noop' ? 'noop' : 'update',
112
+ summary: !had
113
+ ? `create ${SETTINGS_PATH} with SessionStart hook + mcpServers.openlore`
114
+ : finalAction === 'noop'
115
+ ? `${SETTINGS_PATH}: already up to date`
116
+ : `update SessionStart hook + mcpServers.openlore in ${SETTINGS_PATH}`,
117
+ preview: !had
118
+ ? previewCreate(settingsPath, after)
119
+ : finalAction === 'noop'
120
+ ? undefined
121
+ : previewDiff(settingsPath, before, after),
122
+ };
123
+ if (!ctx.dryRun && (finalAction !== 'noop' || !had)) {
124
+ await mkdir(dirname(settingsPath), { recursive: true });
125
+ await writeFile(settingsPath, JSON.stringify(next, null, 2) + '\n', 'utf8');
126
+ }
127
+ mdResult.changes.push(change);
128
+ return mdResult;
129
+ },
130
+ async uninstall(ctx) {
131
+ const md = await uninstallMarkdownBlock(ctx, MD_FILE, false);
132
+ const settingsPath = join(ctx.root, SETTINGS_PATH);
133
+ let parsed;
134
+ try {
135
+ parsed = JSON.parse(await readFile(settingsPath, 'utf8'));
136
+ }
137
+ catch {
138
+ return md;
139
+ }
140
+ // Strip our SessionStart entry first (it's identified by _openlore marker,
141
+ // not by the managed-paths meta).
142
+ const hooksObj = parsed.hooks;
143
+ if (hooksObj && Array.isArray(hooksObj.SessionStart)) {
144
+ const filtered = stripOurSessionStart(hooksObj.SessionStart);
145
+ if (filtered.length === 0) {
146
+ delete hooksObj.SessionStart;
147
+ if (Object.keys(hooksObj).length === 0)
148
+ delete parsed.hooks;
149
+ }
150
+ else {
151
+ hooksObj.SessionStart = filtered;
152
+ }
153
+ }
154
+ const { next, removed } = removeManaged(parsed);
155
+ if (!removed && parsed.hooks === undefined) {
156
+ // We may have only stripped a SessionStart entry — that still counts as work.
157
+ }
158
+ else if (!removed) {
159
+ return md;
160
+ }
161
+ // If file is now empty (only had our entries), delete it.
162
+ const isEmpty = Object.keys(next).length === 0;
163
+ if (isEmpty) {
164
+ if (!ctx.dryRun)
165
+ await unlink(settingsPath);
166
+ md.changes.push({
167
+ path: settingsPath,
168
+ kind: 'delete',
169
+ summary: `remove ${SETTINGS_PATH} (was OpenLore-only)`,
170
+ });
171
+ }
172
+ else {
173
+ if (!ctx.dryRun)
174
+ await writeFile(settingsPath, JSON.stringify(next, null, 2) + '\n', 'utf8');
175
+ md.changes.push({
176
+ path: settingsPath,
177
+ kind: 'update',
178
+ summary: `strip OpenLore entries from ${SETTINGS_PATH}`,
179
+ });
180
+ }
181
+ return md;
182
+ },
183
+ };
184
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/cli/install/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * cline adapter — appends the OpenLore instruction block to `.clinerules`.
3
+ */
4
+ import type { Adapter } from './types.js';
5
+ export declare const clineAdapter: Adapter;
6
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../../../src/cli/install/adapters/cline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AAIxD,eAAO,MAAM,YAAY,EAAE,OAY1B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * cline adapter — appends the OpenLore instruction block to `.clinerules`.
3
+ */
4
+ import { applyMarkdownBlock, uninstallMarkdownBlock } from './markdown-block.js';
5
+ const FILE_NAME = '.clinerules';
6
+ export const clineAdapter = {
7
+ name: 'cline',
8
+ async apply(ctx) {
9
+ return applyMarkdownBlock(ctx, {
10
+ fileName: FILE_NAME,
11
+ createIfMissing: true,
12
+ blockBody: ctx.instructionTemplate,
13
+ });
14
+ },
15
+ async uninstall(ctx) {
16
+ return uninstallMarkdownBlock(ctx, FILE_NAME, true);
17
+ },
18
+ };
19
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../../../src/cli/install/adapters/cline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGjF,MAAM,SAAS,GAAG,aAAa,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAY;IACnC,IAAI,EAAE,OAAO;IACb,KAAK,CAAC,KAAK,CAAC,GAAiB;QAC3B,OAAO,kBAAkB,CAAC,GAAG,EAAE;YAC7B,QAAQ,EAAE,SAAS;YACnB,eAAe,EAAE,IAAI;YACrB,SAAS,EAAE,GAAG,CAAC,mBAAmB;SACnC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,GAAiB;QAC/B,OAAO,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * continue adapter — adds an "/orient" slash command entry to
3
+ * `.continue/config.json`. The Continue config schema accepts a top-level
4
+ * `slashCommands` array; we add (or replace) an entry whose `name === 'orient'`.
5
+ *
6
+ * Continue's MCP integration path differs across recent versions; rather than
7
+ * guess and silently write to the wrong key, we leave a TODO and warn the user
8
+ * (per spec-01 "do not guess" rule). MCP server registration for Continue is
9
+ * gated behind a follow-up TODO.
10
+ */
11
+ import type { Adapter } from './types.js';
12
+ export declare const continueAdapter: Adapter;
13
+ //# sourceMappingURL=continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.d.ts","sourceRoot":"","sources":["../../../../src/cli/install/adapters/continue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,OAAO,EAA4C,MAAM,YAAY,CAAC;AAUpF,eAAO,MAAM,eAAe,EAAE,OAyG7B,CAAC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * continue adapter — adds an "/orient" slash command entry to
3
+ * `.continue/config.json`. The Continue config schema accepts a top-level
4
+ * `slashCommands` array; we add (or replace) an entry whose `name === 'orient'`.
5
+ *
6
+ * Continue's MCP integration path differs across recent versions; rather than
7
+ * guess and silently write to the wrong key, we leave a TODO and warn the user
8
+ * (per spec-01 "do not guess" rule). MCP server registration for Continue is
9
+ * gated behind a follow-up TODO.
10
+ */
11
+ import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
12
+ import { dirname, join } from 'node:path';
13
+ import { mergeEntries, readMeta, removeManaged, isHandEdited } from '../json-managed.js';
14
+ import { previewCreate, previewDiff } from '../diff.js';
15
+ const CONFIG_PATH = '.continue/config.json';
16
+ const SLASH_COMMAND = {
17
+ name: 'orient',
18
+ description: 'Call openlore orient() for the current task context',
19
+ run: 'npx --yes openlore orient --json',
20
+ };
21
+ export const continueAdapter = {
22
+ name: 'continue',
23
+ async apply(ctx) {
24
+ const configPath = join(ctx.root, CONFIG_PATH);
25
+ let had = true;
26
+ let existing;
27
+ try {
28
+ existing = JSON.parse(await readFile(configPath, 'utf8'));
29
+ }
30
+ catch {
31
+ existing = {};
32
+ had = false;
33
+ }
34
+ const prevMeta = readMeta(existing);
35
+ if (prevMeta && isHandEdited(existing, prevMeta) && !ctx.force) {
36
+ return {
37
+ changes: [
38
+ {
39
+ path: configPath,
40
+ kind: 'noop',
41
+ summary: `${CONFIG_PATH}: refused to overwrite hand-edited OpenLore entries (use --force)`,
42
+ },
43
+ ],
44
+ warnings: [`${CONFIG_PATH} has hand-edits in OpenLore-managed paths — pass --force to overwrite`],
45
+ conflict: true,
46
+ };
47
+ }
48
+ // Preserve any non-OpenLore slashCommands already present.
49
+ const existingSlash = Array.isArray(existing.slashCommands) ? existing.slashCommands : [];
50
+ const otherSlash = existingSlash.filter((c) => c?.name !== 'orient');
51
+ const nextSlash = [...otherSlash, SLASH_COMMAND];
52
+ const { next, action } = mergeEntries(existing, [
53
+ { path: 'slashCommands', value: nextSlash },
54
+ ]);
55
+ const before = had ? JSON.stringify(existing, null, 2) + '\n' : '';
56
+ const after = JSON.stringify(next, null, 2) + '\n';
57
+ const change = {
58
+ path: configPath,
59
+ kind: !had ? 'create' : action === 'noop' ? 'noop' : 'update',
60
+ summary: !had
61
+ ? `create ${CONFIG_PATH} with /orient slash command`
62
+ : action === 'noop'
63
+ ? `${CONFIG_PATH}: already up to date`
64
+ : `add /orient slash command to ${CONFIG_PATH}`,
65
+ preview: !had
66
+ ? previewCreate(configPath, after)
67
+ : action === 'noop'
68
+ ? undefined
69
+ : previewDiff(configPath, before, after),
70
+ };
71
+ const warnings = [
72
+ // TODO(openlore-spec-01): verify Continue MCP server registration path; not written here.
73
+ 'continue: MCP server registration is not yet wired (path varies by Continue version) — slash command only',
74
+ ];
75
+ if (!ctx.dryRun && (action !== 'noop' || !had)) {
76
+ await mkdir(dirname(configPath), { recursive: true });
77
+ await writeFile(configPath, JSON.stringify(next, null, 2) + '\n', 'utf8');
78
+ }
79
+ return { changes: [change], warnings, conflict: false };
80
+ },
81
+ async uninstall(ctx) {
82
+ const configPath = join(ctx.root, CONFIG_PATH);
83
+ let parsed;
84
+ try {
85
+ parsed = JSON.parse(await readFile(configPath, 'utf8'));
86
+ }
87
+ catch {
88
+ return { changes: [], warnings: [], conflict: false };
89
+ }
90
+ const beforeSlash = Array.isArray(parsed.slashCommands) ? parsed.slashCommands : [];
91
+ const filteredSlash = beforeSlash.filter((c) => c?.name !== 'orient');
92
+ if (filteredSlash.length === beforeSlash.length && !readMeta(parsed)) {
93
+ return { changes: [], warnings: [], conflict: false };
94
+ }
95
+ parsed.slashCommands = filteredSlash;
96
+ const { next } = removeManaged(parsed);
97
+ if (Array.isArray(next.slashCommands) && next.slashCommands.length === 0) {
98
+ delete next.slashCommands;
99
+ }
100
+ const isEmpty = Object.keys(next).length === 0;
101
+ if (isEmpty) {
102
+ if (!ctx.dryRun)
103
+ await unlink(configPath);
104
+ return {
105
+ changes: [{ path: configPath, kind: 'delete', summary: `remove ${CONFIG_PATH} (was OpenLore-only)` }],
106
+ warnings: [],
107
+ conflict: false,
108
+ };
109
+ }
110
+ if (!ctx.dryRun)
111
+ await writeFile(configPath, JSON.stringify(next, null, 2) + '\n', 'utf8');
112
+ return {
113
+ changes: [{ path: configPath, kind: 'update', summary: `strip OpenLore entries from ${CONFIG_PATH}` }],
114
+ warnings: [],
115
+ conflict: false,
116
+ };
117
+ },
118
+ };
119
+ //# sourceMappingURL=continue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.js","sourceRoot":"","sources":["../../../../src/cli/install/adapters/continue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * cursor adapter — writes an OpenLore-managed block to `.cursorrules`, a
3
+ * companion `.cursor/rules/openlore.mdc` file describing the orient() workflow,
4
+ * and registers the OpenLore MCP server in `.cursor/mcp.json`.
5
+ */
6
+ import type { Adapter } from './types.js';
7
+ export declare const cursorAdapter: Adapter;
8
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../../src/cli/install/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,OAAO,EAA4C,MAAM,YAAY,CAAC;AAoCpF,eAAO,MAAM,aAAa,EAAE,OA0J3B,CAAC"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * cursor adapter — writes an OpenLore-managed block to `.cursorrules`, a
3
+ * companion `.cursor/rules/openlore.mdc` file describing the orient() workflow,
4
+ * and registers the OpenLore MCP server in `.cursor/mcp.json`.
5
+ */
6
+ import { mkdir, readFile, writeFile, unlink } from 'node:fs/promises';
7
+ import { dirname, join } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { applyMarkdownBlock, uninstallMarkdownBlock } from './markdown-block.js';
10
+ import { fingerprint } from '../block.js';
11
+ import { mergeEntries, readMeta, removeManaged, isHandEdited } from '../json-managed.js';
12
+ import { previewCreate, previewDiff } from '../diff.js';
13
+ const RULES_FILE = '.cursorrules';
14
+ const MDC_FILE = '.cursor/rules/openlore.mdc';
15
+ const MCP_FILE = '.cursor/mcp.json';
16
+ const MCP_ENTRY = {
17
+ command: 'npx',
18
+ args: ['--yes', 'openlore', 'mcp'],
19
+ };
20
+ async function loadMdcTemplate() {
21
+ const here = dirname(fileURLToPath(import.meta.url));
22
+ const candidates = [
23
+ // adapters/ → ../templates/cursor-openlore.mdc (dist + tsx run share this layout)
24
+ join(here, '..', 'templates', 'cursor-openlore.mdc'),
25
+ // tsx fallback if for any reason we're not co-located with templates
26
+ join(here, '..', '..', '..', '..', 'src', 'cli', 'install', 'templates', 'cursor-openlore.mdc'),
27
+ ];
28
+ for (const p of candidates) {
29
+ try {
30
+ return await readFile(p, 'utf8');
31
+ }
32
+ catch {
33
+ /* try next */
34
+ }
35
+ }
36
+ throw new Error('cursor adapter: could not locate cursor-openlore.mdc template');
37
+ }
38
+ async function renderMdc(instructions) {
39
+ const tmpl = await loadMdcTemplate();
40
+ return tmpl
41
+ .replace('{{fingerprint}}', fingerprint(instructions.trimEnd()))
42
+ .replace('{{instructions}}', instructions.trimEnd());
43
+ }
44
+ export const cursorAdapter = {
45
+ name: 'cursor',
46
+ async apply(ctx) {
47
+ const rulesResult = await applyMarkdownBlock(ctx, {
48
+ fileName: RULES_FILE,
49
+ createIfMissing: true,
50
+ blockBody: ctx.instructionTemplate,
51
+ });
52
+ const mdcPath = join(ctx.root, MDC_FILE);
53
+ const desired = await renderMdc(ctx.instructionTemplate);
54
+ let existing = null;
55
+ try {
56
+ existing = await readFile(mdcPath, 'utf8');
57
+ }
58
+ catch {
59
+ existing = null;
60
+ }
61
+ if (existing === desired) {
62
+ rulesResult.changes.push({
63
+ path: mdcPath,
64
+ kind: 'noop',
65
+ summary: `${MDC_FILE}: already up to date`,
66
+ });
67
+ return rulesResult;
68
+ }
69
+ const isOurs = existing === null ||
70
+ /^openlore-fingerprint:/m.test(existing);
71
+ if (existing !== null && !isOurs && !ctx.force) {
72
+ rulesResult.changes.push({
73
+ path: mdcPath,
74
+ kind: 'noop',
75
+ summary: `${MDC_FILE}: refused to overwrite non-OpenLore file (use --force)`,
76
+ });
77
+ rulesResult.warnings.push(`${MDC_FILE} exists but was not written by OpenLore`);
78
+ rulesResult.conflict = true;
79
+ return rulesResult;
80
+ }
81
+ const change = {
82
+ path: mdcPath,
83
+ kind: existing === null ? 'create' : 'update',
84
+ summary: existing === null ? `create ${MDC_FILE}` : `update ${MDC_FILE}`,
85
+ preview: existing === null
86
+ ? previewCreate(mdcPath, desired)
87
+ : previewDiff(mdcPath, existing, desired),
88
+ };
89
+ if (!ctx.dryRun) {
90
+ await mkdir(dirname(mdcPath), { recursive: true });
91
+ await writeFile(mdcPath, desired, 'utf8');
92
+ }
93
+ rulesResult.changes.push(change);
94
+ // MCP server registration via .cursor/mcp.json (standard Cursor path).
95
+ const mcpPath = join(ctx.root, MCP_FILE);
96
+ let mcpExisting = {};
97
+ let mcpHad = true;
98
+ try {
99
+ const parsed = JSON.parse(await readFile(mcpPath, 'utf8'));
100
+ mcpExisting =
101
+ parsed && typeof parsed === 'object' && !Array.isArray(parsed)
102
+ ? parsed
103
+ : {};
104
+ }
105
+ catch {
106
+ mcpHad = false;
107
+ }
108
+ const mcpMeta = readMeta(mcpExisting);
109
+ if (mcpMeta && isHandEdited(mcpExisting, mcpMeta) && !ctx.force) {
110
+ rulesResult.changes.push({
111
+ path: mcpPath,
112
+ kind: 'noop',
113
+ summary: `${MCP_FILE}: refused to overwrite hand-edited OpenLore entries (use --force)`,
114
+ });
115
+ rulesResult.warnings.push(`${MCP_FILE} has hand-edits in OpenLore-managed paths — pass --force to overwrite`);
116
+ rulesResult.conflict = true;
117
+ return rulesResult;
118
+ }
119
+ const { next: nextMcp, action: mcpAction } = mergeEntries(mcpExisting, [
120
+ { path: 'mcpServers.openlore', value: MCP_ENTRY },
121
+ ]);
122
+ const beforeMcp = mcpHad ? JSON.stringify(mcpExisting, null, 2) + '\n' : '';
123
+ const afterMcp = JSON.stringify(nextMcp, null, 2) + '\n';
124
+ rulesResult.changes.push({
125
+ path: mcpPath,
126
+ kind: !mcpHad ? 'create' : mcpAction === 'noop' ? 'noop' : 'update',
127
+ summary: !mcpHad
128
+ ? `create ${MCP_FILE} with mcpServers.openlore`
129
+ : mcpAction === 'noop'
130
+ ? `${MCP_FILE}: already up to date`
131
+ : `update mcpServers.openlore in ${MCP_FILE}`,
132
+ preview: !mcpHad
133
+ ? previewCreate(mcpPath, afterMcp)
134
+ : mcpAction === 'noop'
135
+ ? undefined
136
+ : previewDiff(mcpPath, beforeMcp, afterMcp),
137
+ });
138
+ if (!ctx.dryRun && (mcpAction !== 'noop' || !mcpHad)) {
139
+ await mkdir(dirname(mcpPath), { recursive: true });
140
+ await writeFile(mcpPath, JSON.stringify(nextMcp, null, 2) + '\n', 'utf8');
141
+ }
142
+ return rulesResult;
143
+ },
144
+ async uninstall(ctx) {
145
+ const rules = await uninstallMarkdownBlock(ctx, RULES_FILE, true);
146
+ const mdcPath = join(ctx.root, MDC_FILE);
147
+ try {
148
+ const raw = await readFile(mdcPath, 'utf8');
149
+ if (/^openlore-fingerprint:/m.test(raw)) {
150
+ if (!ctx.dryRun)
151
+ await unlink(mdcPath);
152
+ rules.changes.push({
153
+ path: mdcPath,
154
+ kind: 'delete',
155
+ summary: `remove ${MDC_FILE}`,
156
+ });
157
+ }
158
+ }
159
+ catch {
160
+ /* not present, nothing to do */
161
+ }
162
+ // Strip our MCP entry from .cursor/mcp.json.
163
+ const mcpPath = join(ctx.root, MCP_FILE);
164
+ try {
165
+ const parsed = JSON.parse(await readFile(mcpPath, 'utf8'));
166
+ const { next, removed } = removeManaged(parsed);
167
+ if (removed) {
168
+ const isEmpty = Object.keys(next).length === 0;
169
+ if (isEmpty) {
170
+ if (!ctx.dryRun)
171
+ await unlink(mcpPath);
172
+ rules.changes.push({
173
+ path: mcpPath,
174
+ kind: 'delete',
175
+ summary: `remove ${MCP_FILE} (was OpenLore-only)`,
176
+ });
177
+ }
178
+ else {
179
+ if (!ctx.dryRun)
180
+ await writeFile(mcpPath, JSON.stringify(next, null, 2) + '\n', 'utf8');
181
+ rules.changes.push({
182
+ path: mcpPath,
183
+ kind: 'update',
184
+ summary: `strip OpenLore entries from ${MCP_FILE}`,
185
+ });
186
+ }
187
+ }
188
+ }
189
+ catch {
190
+ /* not present, nothing to do */
191
+ }
192
+ return rules;
193
+ },
194
+ };
195
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../src/cli/install/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Shared helper for adapters that append/update a managed markdown block in
3
+ * a single file at the project root (CLAUDE.md, AGENTS.md, .cursorrules,
4
+ * .clinerules). Centralises the read/upsert/write logic so each adapter is
5
+ * just a one-liner.
6
+ */
7
+ import type { ApplyContext, ApplyResult } from './types.js';
8
+ export interface MarkdownBlockOptions {
9
+ /** File name, relative to ctx.root. */
10
+ fileName: string;
11
+ /** Whether the file should be created if it doesn't yet exist. */
12
+ createIfMissing: boolean;
13
+ /** Optional adapter-specific prefix added above the template (e.g. heading). */
14
+ blockBody: string;
15
+ }
16
+ export declare function applyMarkdownBlock(ctx: ApplyContext, opts: MarkdownBlockOptions): Promise<ApplyResult>;
17
+ export declare function uninstallMarkdownBlock(ctx: ApplyContext, fileName: string,
18
+ /** If true, delete the file when removing the block empties it. */
19
+ deleteIfBlockOnly: boolean): Promise<ApplyResult>;
20
+ //# sourceMappingURL=markdown-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-block.d.ts","sourceRoot":"","sources":["../../../../src/cli/install/adapters/markdown-block.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAE3E,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,eAAe,EAAE,OAAO,CAAC;IACzB,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqEtB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM;AAChB,mEAAmE;AACnE,iBAAiB,EAAE,OAAO,GACzB,OAAO,CAAC,WAAW,CAAC,CAkCtB"}