@lorepack/cli 0.0.0-stage → 0.1.0-alpha.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.
Files changed (229) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/commands/activate.d.ts +20 -0
  3. package/dist/commands/activate.d.ts.map +1 -0
  4. package/dist/commands/activate.js +171 -0
  5. package/dist/commands/activate.js.map +1 -0
  6. package/dist/commands/build.d.ts +3 -0
  7. package/dist/commands/build.d.ts.map +1 -0
  8. package/dist/commands/build.js +53 -0
  9. package/dist/commands/build.js.map +1 -0
  10. package/dist/commands/config.d.ts +14 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +109 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/connect.d.ts +5 -0
  15. package/dist/commands/connect.d.ts.map +1 -0
  16. package/dist/commands/connect.js +196 -0
  17. package/dist/commands/connect.js.map +1 -0
  18. package/dist/commands/deploy.d.ts +14 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +248 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/dev.d.ts +25 -0
  23. package/dist/commands/dev.d.ts.map +1 -0
  24. package/dist/commands/dev.js +227 -0
  25. package/dist/commands/dev.js.map +1 -0
  26. package/dist/commands/diff.d.ts +3 -0
  27. package/dist/commands/diff.d.ts.map +1 -0
  28. package/dist/commands/diff.js +75 -0
  29. package/dist/commands/diff.js.map +1 -0
  30. package/dist/commands/doctor.d.ts +14 -0
  31. package/dist/commands/doctor.d.ts.map +1 -0
  32. package/dist/commands/doctor.js +96 -0
  33. package/dist/commands/doctor.js.map +1 -0
  34. package/dist/commands/export.d.ts +3 -0
  35. package/dist/commands/export.d.ts.map +1 -0
  36. package/dist/commands/export.js +126 -0
  37. package/dist/commands/export.js.map +1 -0
  38. package/dist/commands/index.d.ts +8 -0
  39. package/dist/commands/index.d.ts.map +1 -0
  40. package/dist/commands/index.js +51 -0
  41. package/dist/commands/index.js.map +1 -0
  42. package/dist/commands/init.d.ts +3 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +95 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/inspect.d.ts +15 -0
  47. package/dist/commands/inspect.d.ts.map +1 -0
  48. package/dist/commands/inspect.js +527 -0
  49. package/dist/commands/inspect.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +12 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +219 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/pack.d.ts +9 -0
  55. package/dist/commands/pack.d.ts.map +1 -0
  56. package/dist/commands/pack.js +57 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan.d.ts +3 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +44 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/prune.d.ts +7 -0
  63. package/dist/commands/prune.d.ts.map +1 -0
  64. package/dist/commands/prune.js +341 -0
  65. package/dist/commands/prune.js.map +1 -0
  66. package/dist/commands/search.d.ts +3 -0
  67. package/dist/commands/search.d.ts.map +1 -0
  68. package/dist/commands/search.js +84 -0
  69. package/dist/commands/search.js.map +1 -0
  70. package/dist/commands/serve.d.ts +20 -0
  71. package/dist/commands/serve.d.ts.map +1 -0
  72. package/dist/commands/serve.js +66 -0
  73. package/dist/commands/serve.js.map +1 -0
  74. package/dist/commands/status.d.ts +3 -0
  75. package/dist/commands/status.d.ts.map +1 -0
  76. package/dist/commands/status.js +27 -0
  77. package/dist/commands/status.js.map +1 -0
  78. package/dist/commands/target.d.ts +71 -0
  79. package/dist/commands/target.d.ts.map +1 -0
  80. package/dist/commands/target.js +945 -0
  81. package/dist/commands/target.js.map +1 -0
  82. package/dist/entry.d.ts +3 -0
  83. package/dist/entry.d.ts.map +1 -0
  84. package/dist/entry.js +19 -0
  85. package/dist/entry.js.map +1 -0
  86. package/dist/framework/context.d.ts +49 -0
  87. package/dist/framework/context.d.ts.map +1 -0
  88. package/dist/framework/context.js +47 -0
  89. package/dist/framework/context.js.map +1 -0
  90. package/dist/framework/exit.d.ts +36 -0
  91. package/dist/framework/exit.d.ts.map +1 -0
  92. package/dist/framework/exit.js +57 -0
  93. package/dist/framework/exit.js.map +1 -0
  94. package/dist/framework/metadata.d.ts +38 -0
  95. package/dist/framework/metadata.d.ts.map +1 -0
  96. package/dist/framework/metadata.js +47 -0
  97. package/dist/framework/metadata.js.map +1 -0
  98. package/dist/framework/program.d.ts +47 -0
  99. package/dist/framework/program.d.ts.map +1 -0
  100. package/dist/framework/program.js +189 -0
  101. package/dist/framework/program.js.map +1 -0
  102. package/dist/index.d.ts +7 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +7 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/migrations/README.md +7 -0
  107. package/dist/migrations/build/0001_catalog.sql +85 -0
  108. package/dist/migrations/build/0002_tables.sql +43 -0
  109. package/dist/migrations/build/0003_table-cell-range.sql +13 -0
  110. package/dist/migrations/build/0004_chunk-page.sql +11 -0
  111. package/dist/migrations/state/0001_state.sql +40 -0
  112. package/dist/public-entry.js +38563 -0
  113. package/dist/public-entry.js.map +7 -0
  114. package/dist/public-index.js +36428 -0
  115. package/dist/public-index.js.map +7 -0
  116. package/dist/services/build.d.ts +48 -0
  117. package/dist/services/build.d.ts.map +1 -0
  118. package/dist/services/build.js +499 -0
  119. package/dist/services/build.js.map +1 -0
  120. package/dist/services/builds.d.ts +40 -0
  121. package/dist/services/builds.d.ts.map +1 -0
  122. package/dist/services/builds.js +184 -0
  123. package/dist/services/builds.js.map +1 -0
  124. package/dist/services/cancellation.d.ts +27 -0
  125. package/dist/services/cancellation.d.ts.map +1 -0
  126. package/dist/services/cancellation.js +41 -0
  127. package/dist/services/cancellation.js.map +1 -0
  128. package/dist/services/cloudflare-target.d.ts +38 -0
  129. package/dist/services/cloudflare-target.d.ts.map +1 -0
  130. package/dist/services/cloudflare-target.js +471 -0
  131. package/dist/services/cloudflare-target.js.map +1 -0
  132. package/dist/services/comparer.d.ts +15 -0
  133. package/dist/services/comparer.d.ts.map +1 -0
  134. package/dist/services/comparer.js +43 -0
  135. package/dist/services/comparer.js.map +1 -0
  136. package/dist/services/config-resolve.d.ts +60 -0
  137. package/dist/services/config-resolve.d.ts.map +1 -0
  138. package/dist/services/config-resolve.js +178 -0
  139. package/dist/services/config-resolve.js.map +1 -0
  140. package/dist/services/deploy.d.ts +70 -0
  141. package/dist/services/deploy.d.ts.map +1 -0
  142. package/dist/services/deploy.js +260 -0
  143. package/dist/services/deploy.js.map +1 -0
  144. package/dist/services/dev-session.d.ts +52 -0
  145. package/dist/services/dev-session.d.ts.map +1 -0
  146. package/dist/services/dev-session.js +102 -0
  147. package/dist/services/dev-session.js.map +1 -0
  148. package/dist/services/doctor.d.ts +35 -0
  149. package/dist/services/doctor.d.ts.map +1 -0
  150. package/dist/services/doctor.js +389 -0
  151. package/dist/services/doctor.js.map +1 -0
  152. package/dist/services/export.d.ts +20 -0
  153. package/dist/services/export.d.ts.map +1 -0
  154. package/dist/services/export.js +129 -0
  155. package/dist/services/export.js.map +1 -0
  156. package/dist/services/init.d.ts +46 -0
  157. package/dist/services/init.d.ts.map +1 -0
  158. package/dist/services/init.js +231 -0
  159. package/dist/services/init.js.map +1 -0
  160. package/dist/services/packing.d.ts +25 -0
  161. package/dist/services/packing.d.ts.map +1 -0
  162. package/dist/services/packing.js +69 -0
  163. package/dist/services/packing.js.map +1 -0
  164. package/dist/services/parse-cache.d.ts +47 -0
  165. package/dist/services/parse-cache.d.ts.map +1 -0
  166. package/dist/services/parse-cache.js +65 -0
  167. package/dist/services/parse-cache.js.map +1 -0
  168. package/dist/services/project.d.ts +49 -0
  169. package/dist/services/project.d.ts.map +1 -0
  170. package/dist/services/project.js +119 -0
  171. package/dist/services/project.js.map +1 -0
  172. package/dist/services/remote-prune.d.ts +7 -0
  173. package/dist/services/remote-prune.d.ts.map +1 -0
  174. package/dist/services/remote-prune.js +34 -0
  175. package/dist/services/remote-prune.js.map +1 -0
  176. package/dist/services/retention.d.ts +20 -0
  177. package/dist/services/retention.d.ts.map +1 -0
  178. package/dist/services/retention.js +106 -0
  179. package/dist/services/retention.js.map +1 -0
  180. package/dist/services/revalidate.d.ts +36 -0
  181. package/dist/services/revalidate.d.ts.map +1 -0
  182. package/dist/services/revalidate.js +73 -0
  183. package/dist/services/revalidate.js.map +1 -0
  184. package/dist/services/search.d.ts +25 -0
  185. package/dist/services/search.d.ts.map +1 -0
  186. package/dist/services/search.js +88 -0
  187. package/dist/services/search.js.map +1 -0
  188. package/dist/services/serving.d.ts +70 -0
  189. package/dist/services/serving.d.ts.map +1 -0
  190. package/dist/services/serving.js +240 -0
  191. package/dist/services/serving.js.map +1 -0
  192. package/dist/services/status.d.ts +54 -0
  193. package/dist/services/status.d.ts.map +1 -0
  194. package/dist/services/status.js +203 -0
  195. package/dist/services/status.js.map +1 -0
  196. package/dist/services/studio-assets.d.ts +13 -0
  197. package/dist/services/studio-assets.d.ts.map +1 -0
  198. package/dist/services/studio-assets.js +94 -0
  199. package/dist/services/studio-assets.js.map +1 -0
  200. package/dist/services/studio-diagnostics.d.ts +28 -0
  201. package/dist/services/studio-diagnostics.d.ts.map +1 -0
  202. package/dist/services/studio-diagnostics.js +88 -0
  203. package/dist/services/studio-diagnostics.js.map +1 -0
  204. package/dist/services/studio-endpoints.d.ts +61 -0
  205. package/dist/services/studio-endpoints.d.ts.map +1 -0
  206. package/dist/services/studio-endpoints.js +88 -0
  207. package/dist/services/studio-endpoints.js.map +1 -0
  208. package/dist/services/studio-mutations.d.ts +32 -0
  209. package/dist/services/studio-mutations.d.ts.map +1 -0
  210. package/dist/services/studio-mutations.js +149 -0
  211. package/dist/services/studio-mutations.js.map +1 -0
  212. package/dist/services/versions.d.ts +38 -0
  213. package/dist/services/versions.d.ts.map +1 -0
  214. package/dist/services/versions.js +46 -0
  215. package/dist/services/versions.js.map +1 -0
  216. package/dist/services/watch.d.ts +103 -0
  217. package/dist/services/watch.d.ts.map +1 -0
  218. package/dist/services/watch.js +420 -0
  219. package/dist/services/watch.js.map +1 -0
  220. package/package.json +73 -4
  221. package/studio-dist/assets/ibm-plex-mono-latin-400-normal-Dm_PoFIZ.woff2 +0 -0
  222. package/studio-dist/assets/ibm-plex-mono-latin-500-normal-C_OblDzq.woff2 +0 -0
  223. package/studio-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  224. package/studio-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  225. package/studio-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  226. package/studio-dist/assets/index-BuAYbQVX.js +66 -0
  227. package/studio-dist/assets/index-C_3XEUt4.css +1 -0
  228. package/studio-dist/index.html +30 -0
  229. package/README.md +0 -3
@@ -0,0 +1,189 @@
1
+ import { EXIT_CODES, LoreError, renderAsJson, renderForCli } from '@lorepack/core';
2
+ import { Command, CommanderError } from 'commander';
3
+ import { registerCommands } from '../commands/index.js';
4
+ import { createContext, resolveGlobalOptions, } from './context.js';
5
+ import { exitAfterFlush } from './exit.js';
6
+ import { validateCommandMetadata } from './metadata.js';
7
+ export const CLI_NAME = 'lorepack';
8
+ function defaultStreams() {
9
+ return {
10
+ stdout: process.stdout,
11
+ stderr: process.stderr,
12
+ isTty: process.stdout.isTTY === true,
13
+ errorIsTty: process.stderr.isTTY === true,
14
+ columns: process.stdout.columns ?? process.stderr.columns,
15
+ };
16
+ }
17
+ export function buildProgram(definitions, options, hooks) {
18
+ validateCommandMetadata(definitions);
19
+ const streams = options.streams ?? defaultStreams();
20
+ const program = new Command()
21
+ .name(CLI_NAME)
22
+ .description('Build, version, and deploy the context your AI depends on.')
23
+ .version(options.version ?? '0.0.0', '-v, --version')
24
+ .option('--json', 'emit machine-readable output on stdout', false)
25
+ .option('--verbose', 'include stage detail and debug diagnostics', false)
26
+ .option('--no-color', 'disable colour')
27
+ .option('--cwd <path>', 'run against a project in another directory')
28
+ .showSuggestionAfterError(true)
29
+ .exitOverride();
30
+ program.configureOutput({
31
+ writeOut: (text) => streams.stdout.write(text),
32
+ writeErr: (text) => streams.stderr.write(text),
33
+ // Commander writes its own error before throwing, which would print the message twice
34
+ // once the central handler renders it. Suppress the first: the thrown CommanderError
35
+ // carries the same text, and one renderer owns how a failure looks.
36
+ outputError: () => { },
37
+ });
38
+ for (const definition of definitions) {
39
+ const command = program.command(definition.name).description(definition.description);
40
+ for (const alias of definition.aliases ?? [])
41
+ command.alias(alias);
42
+ for (const argument of definition.arguments ?? []) {
43
+ command.argument(argument.required === false ? `[${argument.name}]` : `<${argument.name}>`, argument.description);
44
+ }
45
+ for (const flag of definition.flags ?? []) {
46
+ command.option(flag.flags, flag.description, flag.defaultValue);
47
+ }
48
+ command.exitOverride();
49
+ command.action(async (...actionArguments) => {
50
+ // commander passes positional arguments, then the options object, then the command.
51
+ const commandInstance = actionArguments.at(-1);
52
+ const flags = actionArguments.at(-2);
53
+ const positional = actionArguments
54
+ .slice(0, -2)
55
+ .filter((value) => typeof value === 'string');
56
+ const globalOptions = resolveGlobalOptions({ ...program.opts(), ...flags }, options.env ?? process.env, streams.isTty, streams.errorIsTty ?? streams.isTty);
57
+ const context = createContext(globalOptions, streams, options.signal);
58
+ hooks.onContext(context);
59
+ const result = await definition.handler(positional, { ...flags, _command: commandInstance }, context);
60
+ hooks.onResult(result, context);
61
+ });
62
+ }
63
+ return program;
64
+ }
65
+ /**
66
+ * Runs the CLI and returns the exit code.
67
+ *
68
+ * Every failure funnels through here: a `LoreError` renders with its remediation and maps
69
+ * to its documented exit code, and anything unexpected becomes `LORE_E_INTERNAL`. No
70
+ * command decides how an error looks or what it exits with.
71
+ */
72
+ export async function runCli(argv, options = {}) {
73
+ const streams = options.streams ?? defaultStreams();
74
+ const exitProcess = options.exitProcess ?? true;
75
+ let code = 0;
76
+ // One interrupt asks the current command to stop at its next checkpoint, which is what
77
+ // lets a build discard its candidate and leave the active pointer alone. A second one
78
+ // means the user is no longer asking, so the process ends immediately.
79
+ const controller = new AbortController();
80
+ const signal = options.signal ?? controller.signal;
81
+ const interrupt = () => {
82
+ if (controller.signal.aborted) {
83
+ // Still through the flush: the message explaining why the process is ending is the
84
+ // one most likely to be lost, because nothing follows it to push the pipe along.
85
+ void exitAfterFlush(EXIT_CODES.USER, streams);
86
+ return;
87
+ }
88
+ controller.abort();
89
+ streams.stderr.write('\nInterrupted. Finishing the current step and rolling back.\n');
90
+ };
91
+ const installHandlers = exitProcess && options.signal === undefined;
92
+ if (installHandlers) {
93
+ process.on('SIGINT', interrupt);
94
+ process.on('SIGTERM', interrupt);
95
+ }
96
+ // A holder rather than a plain `let`: the assignment happens inside a callback, and
97
+ // control-flow analysis would otherwise narrow the variable to null at the catch site.
98
+ const state = { context: null };
99
+ const program = buildProgram(options.commands ?? registerCommands(), { ...options, streams, signal }, {
100
+ onContext: (context) => {
101
+ state.context = context;
102
+ },
103
+ onResult: (result, context) => {
104
+ if (result === undefined)
105
+ return;
106
+ if (context.options.json) {
107
+ if (result.json !== undefined)
108
+ streams.stdout.write(`${JSON.stringify(result.json, null, 2)}\n`);
109
+ }
110
+ else if (result.human !== undefined && result.human !== '') {
111
+ streams.stdout.write(result.human.endsWith('\n') ? result.human : `${result.human}\n`);
112
+ }
113
+ if (result.exitCode !== undefined)
114
+ code = result.exitCode;
115
+ },
116
+ });
117
+ try {
118
+ await program.parseAsync([...argv]);
119
+ }
120
+ catch (error) {
121
+ // A parse failure happens before any context exists, so fall back to scanning argv:
122
+ // a user who asked for --json should get JSON even when the argument itself was wrong.
123
+ const jsonRequested = state.context?.options.json === true || argv.includes('--json');
124
+ code = handleFailure(error, streams, state.context, jsonRequested);
125
+ }
126
+ if (installHandlers) {
127
+ process.off('SIGINT', interrupt);
128
+ process.off('SIGTERM', interrupt);
129
+ }
130
+ if (exitProcess)
131
+ await exitAfterFlush(code, streams);
132
+ return code;
133
+ }
134
+ function handleFailure(error, streams, context, jsonRequested) {
135
+ // commander throws for --help and --version, which are successful outcomes.
136
+ if (error instanceof CommanderError) {
137
+ if (error.code === 'commander.helpDisplayed' || error.code === 'commander.version')
138
+ return 0;
139
+ if (error.code === 'commander.help')
140
+ return 0;
141
+ // Every argument-shaped failure becomes a typed error, so a user sees one format and
142
+ // a script sees one exit code. `excessArguments` is what commander reports for an
143
+ // unknown command when no subcommands are registered yet.
144
+ const argumentCodes = new Set([
145
+ 'commander.unknownCommand',
146
+ 'commander.unknownOption',
147
+ 'commander.excessArguments',
148
+ 'commander.missingArgument',
149
+ 'commander.invalidArgument',
150
+ 'commander.missingMandatoryOptionValue',
151
+ 'commander.optionMissingArgument',
152
+ ]);
153
+ if (argumentCodes.has(error.code)) {
154
+ const wrapped = new LoreError('LORE_E_INVALID_ARGUMENT', error.message.replace(/^error:\s*/i, '').trim(), { remediation: `Run \`${CLI_NAME} --help\` to see available commands and options.` });
155
+ if (jsonRequested) {
156
+ streams.stdout.write(`${JSON.stringify(renderAsJson(wrapped), null, 2)}\n`);
157
+ }
158
+ else {
159
+ streams.stderr.write(`${renderForCli(wrapped, { color: errorColor(context, streams) })}\n`);
160
+ }
161
+ return EXIT_CODES.USER;
162
+ }
163
+ streams.stderr.write(error.message.endsWith('\n') ? error.message : `${error.message}\n`);
164
+ return error.exitCode === 0 ? EXIT_CODES.USER : error.exitCode;
165
+ }
166
+ const loreError = LoreError.from(error);
167
+ if (jsonRequested) {
168
+ streams.stdout.write(`${JSON.stringify(renderAsJson(loreError), null, 2)}\n`);
169
+ }
170
+ else {
171
+ streams.stderr.write(`${renderForCli(loreError, {
172
+ verbose: context?.options.verbose === true,
173
+ color: errorColor(context, streams),
174
+ })}\n`);
175
+ }
176
+ return loreError.exitCode;
177
+ }
178
+ /**
179
+ * Colour for an error.
180
+ *
181
+ * A failure can happen before the context exists, which is exactly when the message matters
182
+ * most, so this falls back to the stream rather than giving up on the question.
183
+ */
184
+ function errorColor(context, streams) {
185
+ if (context != null)
186
+ return context.options.colorStderr;
187
+ return (streams.errorIsTty ?? streams.isTty) && process.env.NO_COLOR === undefined;
188
+ }
189
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/framework/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { registerCommands } from './commands/index.js';
2
+ export { initCommand } from './commands/init.js';
3
+ export { type CommandContext, createContext, type GlobalOptions, resolveGlobalOptions, type Streams, } from './framework/context.js';
4
+ export { type CommandArgumentDefinition, type CommandExample, type CommandFlagDefinition, type CommandMetadata, type CompletionContext, type CompletionProvider, type CompletionValueKind, validateCommandMetadata, } from './framework/metadata.js';
5
+ export { buildProgram, CLI_NAME, type CommandDefinition, type CommandHandler, type CommandResult, type RunOptions, runCli, } from './framework/program.js';
6
+ export { enclosingProject, findSecretShaped, type InitOptions, type InitPlan, type InitResult, planInit, projectNameFrom, renderConfig, renderIgnore, runInit, } from './services/init.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,aAAa,EAClB,oBAAoB,EACpB,KAAK,OAAO,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,MAAM,GACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,OAAO,GACR,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { registerCommands } from './commands/index.js';
2
+ export { initCommand } from './commands/init.js';
3
+ export { createContext, resolveGlobalOptions, } from './framework/context.js';
4
+ export { validateCommandMetadata, } from './framework/metadata.js';
5
+ export { buildProgram, CLI_NAME, runCli, } from './framework/program.js';
6
+ export { enclosingProject, findSecretShaped, planInit, projectNameFrom, renderConfig, renderIgnore, runInit, } from './services/init.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAEL,aAAa,EAEb,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAQL,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,YAAY,EACZ,QAAQ,EAKR,MAAM,GACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAIhB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,OAAO,GACR,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ # migrations
2
+
3
+ Raw SQL migrations, applied by `runMigrations` in this package. No ORM: versioned SQL is inspectable, and the same statements are the basis of the D1 projection in a later phase.
4
+
5
+ `state/` creates the mutable project database under `.lore/`. `build/` creates the catalog inside a sealed build. They are separate sets on purpose: running both into one database would put empty `builds` and `active_build` tables inside every build, which is the confusion between operational state and canonical content that invariant 1 exists to prevent.
6
+
7
+ They live inside this package, and `files` in its package.json publishes them, because an asset the code reads has to travel with the code. They used to sit at the repository root, where every test found them and no install did (#164).
@@ -0,0 +1,85 @@
1
+ -- The catalog inside a sealed build. Written once by the compiler, then opened read-only
2
+ -- forever. Schema semantics stay close to D1 so the Cloudflare projection is a
3
+ -- translation rather than a redesign (architecture section 17.4).
4
+
5
+ CREATE TABLE artifacts (
6
+ id TEXT PRIMARY KEY,
7
+ source_id TEXT NOT NULL,
8
+ relative_path TEXT NOT NULL,
9
+ display_path TEXT NOT NULL,
10
+ media_type TEXT NOT NULL,
11
+ byte_size INTEGER NOT NULL,
12
+ content_hash TEXT NOT NULL,
13
+ parser_id TEXT NOT NULL,
14
+ parser_version TEXT NOT NULL,
15
+ title TEXT,
16
+ status TEXT NOT NULL,
17
+ authority INTEGER NOT NULL,
18
+ object_hash TEXT NOT NULL,
19
+ metadata TEXT NOT NULL
20
+ ) STRICT;
21
+
22
+ CREATE TABLE nodes (
23
+ id TEXT PRIMARY KEY,
24
+ artifact_id TEXT NOT NULL REFERENCES artifacts (id),
25
+ parent_id TEXT REFERENCES nodes (id),
26
+ kind TEXT NOT NULL,
27
+ ordinal INTEGER NOT NULL,
28
+ title TEXT,
29
+ text TEXT,
30
+ heading_path TEXT NOT NULL,
31
+ line_start INTEGER,
32
+ line_end INTEGER,
33
+ metadata TEXT NOT NULL,
34
+ revision_hash TEXT NOT NULL
35
+ ) STRICT;
36
+
37
+ CREATE TABLE chunks (
38
+ id TEXT PRIMARY KEY,
39
+ artifact_id TEXT NOT NULL REFERENCES artifacts (id),
40
+ node_ids TEXT NOT NULL,
41
+ heading_path TEXT NOT NULL,
42
+ text TEXT NOT NULL,
43
+ estimated_tokens INTEGER NOT NULL,
44
+ relative_path TEXT NOT NULL,
45
+ line_start INTEGER,
46
+ line_end INTEGER,
47
+ revision_hash TEXT NOT NULL
48
+ ) STRICT;
49
+
50
+ -- Supersession is stored separately so an artifact can supersede several others without
51
+ -- an encoded list, which keeps the rule resolution queryable.
52
+ CREATE TABLE supersessions (
53
+ artifact_id TEXT NOT NULL REFERENCES artifacts (id),
54
+ superseded_id TEXT NOT NULL,
55
+ PRIMARY KEY (artifact_id, superseded_id)
56
+ ) STRICT;
57
+
58
+ CREATE TABLE build_warnings (
59
+ id INTEGER PRIMARY KEY,
60
+ code TEXT NOT NULL,
61
+ class TEXT NOT NULL,
62
+ path TEXT,
63
+ message TEXT NOT NULL
64
+ ) STRICT;
65
+
66
+ -- Column layout is fixed by architecture section 12.9. Ranking weights are applied at
67
+ -- query time by the runtime and deliberately not stored here: baking them into the index
68
+ -- would make retuning ranking a rebuild.
69
+ CREATE VIRTUAL TABLE chunks_fts USING fts5 (
70
+ chunk_id UNINDEXED,
71
+ artifact_id UNINDEXED,
72
+ status UNINDEXED,
73
+ authority UNINDEXED,
74
+ path,
75
+ title,
76
+ heading,
77
+ body,
78
+ tokenize = 'unicode61 remove_diacritics 2'
79
+ );
80
+
81
+ CREATE INDEX nodes_artifact ON nodes (artifact_id);
82
+ CREATE INDEX nodes_parent ON nodes (parent_id);
83
+ CREATE INDEX chunks_artifact ON chunks (artifact_id);
84
+ CREATE INDEX artifacts_status ON artifacts (status);
85
+ CREATE INDEX artifacts_path ON artifacts (relative_path);
@@ -0,0 +1,43 @@
1
+ -- The typed-table catalog (architecture section 8.4).
2
+ --
3
+ -- Physical tables are created at import time with generated names, so they cannot appear
4
+ -- here. What can, and does, is the mapping from a stable Lore table id to the physical name,
5
+ -- which is the only place the two are connected. Nothing else in the system is allowed to
6
+ -- take a SQL identifier from user content.
7
+
8
+ CREATE TABLE tables (
9
+ id TEXT PRIMARY KEY,
10
+ artifact_id TEXT NOT NULL REFERENCES artifacts (id),
11
+ name TEXT NOT NULL,
12
+ sheet TEXT,
13
+ -- The generated physical table, validated against a strict identifier pattern before it
14
+ -- is ever interpolated into DDL or a query.
15
+ sql_name TEXT NOT NULL UNIQUE,
16
+ row_count INTEGER NOT NULL,
17
+ relative_path TEXT NOT NULL,
18
+ line_start INTEGER,
19
+ line_end INTEGER,
20
+ metadata TEXT NOT NULL
21
+ ) STRICT;
22
+
23
+ -- Ordinal is stored rather than implied by rowid: `describeTable` must return columns in the
24
+ -- order the source declared them, and a query plan is free to return rows in any order.
25
+ CREATE TABLE table_columns (
26
+ table_id TEXT NOT NULL REFERENCES tables (id),
27
+ ordinal INTEGER NOT NULL,
28
+ name TEXT NOT NULL,
29
+ sql_name TEXT NOT NULL,
30
+ type TEXT NOT NULL,
31
+ nullable INTEGER NOT NULL,
32
+ null_count INTEGER NOT NULL,
33
+ distinct_estimate INTEGER NOT NULL,
34
+ distinct_is_exact INTEGER NOT NULL,
35
+ -- Stored as text regardless of the column's type. A STRICT table needs one storage class
36
+ -- per column, and these hold numbers, dates and strings depending on the row. They are
37
+ -- reported, never compared, so text is the honest choice.
38
+ min_value TEXT,
39
+ max_value TEXT,
40
+ PRIMARY KEY (table_id, ordinal)
41
+ ) STRICT;
42
+
43
+ CREATE INDEX tables_artifact ON tables (artifact_id);
@@ -0,0 +1,13 @@
1
+ -- The cell range a table was read from (#235).
2
+ --
3
+ -- `tables` already stores the rest of the locator as columns: relative_path, sheet,
4
+ -- line_start, line_end. The cell range was the one part left out, so it survived only inside
5
+ -- the parser-defined `metadata` blob and `describeTable` returned a locator naming a file
6
+ -- rather than a range. Architecture section 10.8 is explicit that a queried row traces back to
7
+ -- a sheet and a cell range, so this belongs beside the other locator parts rather than behind
8
+ -- a key one parser happens to write.
9
+ --
10
+ -- Nullable, because most tables have no such thing. A CSV file is one table with no cell
11
+ -- range, and reporting an invented one would be worse than reporting none.
12
+
13
+ ALTER TABLE tables ADD COLUMN cell_range TEXT;
@@ -0,0 +1,11 @@
1
+ -- The page a chunk is on (#241).
2
+ --
3
+ -- `nodes` could already carry a page inside its `metadata` blob, and the PDF parser wrote one
4
+ -- there. `chunks` could not, and search hits, context items and export citations are all built
5
+ -- from chunks. So the page reached the node table and stopped, and every citation of a PDF
6
+ -- named the file and then a line number of 1, which is not where the text is.
7
+ --
8
+ -- Nullable, because most formats have no such thing. A Markdown chunk has a line range and no
9
+ -- page, and inventing either is what this column exists to stop.
10
+
11
+ ALTER TABLE chunks ADD COLUMN page INTEGER;
@@ -0,0 +1,40 @@
1
+ -- Mutable project state. Never part of a build: sealed build databases are read-only,
2
+ -- and everything here is operational rather than canonical (architecture section 11.1).
3
+
4
+ CREATE TABLE builds (
5
+ build_id TEXT PRIMARY KEY,
6
+ state TEXT NOT NULL,
7
+ created_at TEXT NOT NULL,
8
+ artifacts INTEGER NOT NULL DEFAULT 0,
9
+ nodes INTEGER NOT NULL DEFAULT 0,
10
+ chunks INTEGER NOT NULL DEFAULT 0,
11
+ tables_ INTEGER NOT NULL DEFAULT 0,
12
+ table_rows INTEGER NOT NULL DEFAULT 0
13
+ ) STRICT;
14
+
15
+ -- Exactly one row, enforced by the primary key check. The generation is monotonic and
16
+ -- never repeats, including after a rollback, so a reader can detect a change by comparing
17
+ -- a single integer.
18
+ CREATE TABLE active_build (
19
+ id INTEGER PRIMARY KEY CHECK (id = 1),
20
+ build_id TEXT REFERENCES builds (build_id),
21
+ generation INTEGER NOT NULL DEFAULT 0,
22
+ activated_at TEXT
23
+ ) STRICT;
24
+
25
+ INSERT INTO active_build (id, build_id, generation, activated_at) VALUES (1, NULL, 0, NULL);
26
+
27
+ -- Wall-clock and machine facts, deliberately outside the build so two machines can agree
28
+ -- on a build id while disagreeing about how long it took (architecture section 11.7).
29
+ CREATE TABLE build_receipts (
30
+ build_id TEXT PRIMARY KEY REFERENCES builds (build_id),
31
+ started_at TEXT NOT NULL,
32
+ completed_at TEXT NOT NULL,
33
+ duration_ms INTEGER NOT NULL,
34
+ reused_artifacts INTEGER NOT NULL,
35
+ rebuilt_artifacts INTEGER NOT NULL,
36
+ platform TEXT NOT NULL,
37
+ node_version TEXT NOT NULL
38
+ ) STRICT;
39
+
40
+ CREATE INDEX builds_created_at ON builds (created_at DESC);