@reqlan/analytical 0.5.4 → 0.6.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 (77) hide show
  1. package/README.md +13 -2
  2. package/out/analysis/git-dates-analyser.js +41 -12
  3. package/out/analysis/git-dates-analyser.js.map +1 -1
  4. package/out/core/analytical-store.d.ts +9 -2
  5. package/out/core/analytical-store.js +7 -5
  6. package/out/core/analytical-store.js.map +1 -1
  7. package/out/core/application-memory.d.ts +17 -2
  8. package/out/core/application-memory.js +23 -5
  9. package/out/core/application-memory.js.map +1 -1
  10. package/out/core/base-discovery.d.ts +40 -0
  11. package/out/core/base-discovery.js +166 -0
  12. package/out/core/base-discovery.js.map +1 -0
  13. package/out/core/context-model.d.ts +17 -0
  14. package/out/core/context-model.js.map +1 -1
  15. package/out/core/create-base.d.ts +11 -0
  16. package/out/core/create-base.js +33 -0
  17. package/out/core/create-base.js.map +1 -0
  18. package/out/core/rqignore.d.ts +25 -0
  19. package/out/core/rqignore.js +149 -0
  20. package/out/core/rqignore.js.map +1 -0
  21. package/out/core/types.d.ts +5 -1
  22. package/out/core/types.js.map +1 -1
  23. package/out/create-runtime.d.ts +29 -4
  24. package/out/create-runtime.js +47 -8
  25. package/out/create-runtime.js.map +1 -1
  26. package/out/export/html-export-assets.d.ts +2 -2
  27. package/out/export/html-export-assets.js +259 -239
  28. package/out/export/html-export-assets.js.map +1 -1
  29. package/out/graph/physics-core.d.ts +141 -0
  30. package/out/graph/physics-core.js +237 -0
  31. package/out/graph/physics-core.js.map +1 -0
  32. package/out/headless-index-service.d.ts +6 -23
  33. package/out/headless-index-service.js +5 -171
  34. package/out/headless-index-service.js.map +1 -1
  35. package/out/index-store/base-registry.d.ts +57 -0
  36. package/out/index-store/base-registry.js +192 -0
  37. package/out/index-store/base-registry.js.map +1 -0
  38. package/out/index-store/index-diagnostics-store.d.ts +72 -0
  39. package/out/index-store/index-diagnostics-store.js +238 -0
  40. package/out/index-store/index-diagnostics-store.js.map +1 -0
  41. package/out/index-store/index-file-error.d.ts +16 -0
  42. package/out/index-store/index-file-error.js +27 -0
  43. package/out/index-store/index-file-error.js.map +1 -0
  44. package/out/index-store/index-parse-issues.d.ts +9 -0
  45. package/out/index-store/index-parse-issues.js +62 -0
  46. package/out/index-store/index-parse-issues.js.map +1 -0
  47. package/out/index-store/index-status.d.ts +20 -0
  48. package/out/index-store/index-status.js +2 -0
  49. package/out/index-store/index-status.js.map +1 -0
  50. package/out/index-store/overview-coverage.d.ts +23 -0
  51. package/out/index-store/overview-coverage.js +254 -0
  52. package/out/index-store/overview-coverage.js.map +1 -0
  53. package/out/index-store/schema.d.ts +1 -1
  54. package/out/index-store/schema.js +4 -1
  55. package/out/index-store/schema.js.map +1 -1
  56. package/out/index-store/sqlite-store.d.ts +31 -2
  57. package/out/index-store/sqlite-store.js +152 -13
  58. package/out/index-store/sqlite-store.js.map +1 -1
  59. package/out/index-store/webview-table-queries.d.ts +65 -1
  60. package/out/index-store/webview-table-queries.js +188 -26
  61. package/out/index-store/webview-table-queries.js.map +1 -1
  62. package/out/index-store/workspace-index-file.d.ts +27 -0
  63. package/out/index-store/workspace-index-file.js +98 -0
  64. package/out/index-store/workspace-index-file.js.map +1 -0
  65. package/out/index-store/workspace-index-sync.d.ts +53 -0
  66. package/out/index-store/workspace-index-sync.js +164 -0
  67. package/out/index-store/workspace-index-sync.js.map +1 -0
  68. package/out/index-store/workspace-index.d.ts +80 -0
  69. package/out/index-store/workspace-index.js +525 -0
  70. package/out/index-store/workspace-index.js.map +1 -0
  71. package/out/index-store/workspace-mtime.d.ts +14 -0
  72. package/out/index-store/workspace-mtime.js +56 -0
  73. package/out/index-store/workspace-mtime.js.map +1 -0
  74. package/out/index.d.ts +25 -6
  75. package/out/index.js +12 -3
  76. package/out/index.js.map +1 -1
  77. package/package.json +7 -2
package/README.md CHANGED
@@ -22,14 +22,25 @@ npm install @reqlan/analytical
22
22
 
23
23
  ## Links
24
24
 
25
- - [Site](https://tony.is-a.dev/reqlan)
25
+ - [Site](https://reqlan.com)
26
26
  - [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=reqlan.reqlan-extension)
27
27
  - [Open VSX](https://open-vsx.org/extension/reqlan/reqlan-extension)
28
28
  - [GitHub repository](https://github.com/littletuna4/reqlan)
29
- - [Contact](mailto:reqlan@tony.is-a.dev)
29
+ - [Contact](mailto:reqlan@reqlan.com)
30
30
 
31
31
  ## Changelog
32
32
 
33
+ ### 0.6.0
34
+
35
+ #### Minor Changes
36
+
37
+ - 54a2536: introduce bases, refine config, improvements to summary, site improvements.
38
+
39
+ #### Patch Changes
40
+
41
+ - Updated dependencies [54a2536]
42
+ - @reqlan/language@1.6.0
43
+
33
44
  ### 0.5.4
34
45
 
35
46
  #### Patch Changes
@@ -3,30 +3,59 @@ import { execFile } from 'node:child_process';
3
3
  import { promisify } from 'node:util';
4
4
  import { resolveWorkspaceFileUri } from '../core/workspace-paths.js';
5
5
  const execFileAsync = promisify(execFile);
6
+ const GIT_LOG_TIMEOUT_MS = 4000;
7
+ const LOOKUP_CONCURRENCY = 4;
6
8
  export const gitDatesAnalyser = {
7
9
  id: 'git_dates',
8
10
  async run({ store, workspaceRoot }, { ideaIds }) {
9
- const ideas = ideaIds
10
- ? (await Promise.all(ideaIds.map(id => store.getIdea(id)))).filter((idea) => !!idea)
11
- : await store.listAllIdeas();
12
- const results = [];
13
- for (const idea of ideas) {
14
- const dates = await lookupGitDates(idea.fileUri, idea.lineStart + 1, workspaceRoot);
15
- if (dates.createdAt || dates.modifiedAt) {
16
- await store.updateGitDates(idea.id, dates.createdAt, dates.modifiedAt);
11
+ const wanted = ideaIds ? new Set(ideaIds) : undefined;
12
+ const ideas = (await store.getAllIdeasRaw()).filter(idea => {
13
+ if (idea.kind === 'ideaset') {
14
+ return false;
17
15
  }
18
- results.push({ ideaId: idea.id, ...dates });
16
+ return wanted ? wanted.has(idea.id) : true;
17
+ });
18
+ const results = [];
19
+ for (let offset = 0; offset < ideas.length; offset += LOOKUP_CONCURRENCY) {
20
+ const batch = ideas.slice(offset, offset + LOOKUP_CONCURRENCY);
21
+ const batchResults = await Promise.all(batch.map(async (idea) => {
22
+ const dates = await lookupGitDates(idea.fileUri, idea.lineStart, idea.lineEnd, workspaceRoot);
23
+ if (dates.createdAt || dates.modifiedAt) {
24
+ await store.updateGitDates(idea.id, dates.createdAt, dates.modifiedAt);
25
+ }
26
+ return { ideaId: idea.id, ...dates };
27
+ }));
28
+ results.push(...batchResults);
19
29
  }
20
30
  return results;
21
31
  }
22
32
  };
23
- async function lookupGitDates(fileUri, line, workspaceRoot) {
33
+ async function lookupGitDates(fileUri, lineStart, lineEnd, workspaceRoot) {
24
34
  const resolvedUri = resolveWorkspaceFileUri(fileUri, workspaceRoot);
25
35
  const filePath = resolvedUri.startsWith('file://') ? URI.parse(resolvedUri).fsPath : resolvedUri;
26
36
  const cwd = workspaceRoot;
37
+ const start = Math.min(lineStart, lineEnd) + 1;
38
+ const end = Math.max(lineStart, lineEnd) + 1;
39
+ try {
40
+ const { stdout: lineStdout } = await execFileAsync('git', ['log', '-L', `${start},${end}:${filePath}`, '--format=%aI', '-n', '40'], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
41
+ const lineDates = lineStdout
42
+ .trim()
43
+ .split('\n')
44
+ .map(line => line.trim())
45
+ .filter(Boolean);
46
+ if (lineDates.length > 0) {
47
+ return {
48
+ modifiedAt: lineDates[0],
49
+ createdAt: lineDates[lineDates.length - 1]
50
+ };
51
+ }
52
+ }
53
+ catch {
54
+ // Fall through to file-level dates.
55
+ }
27
56
  try {
28
- const { stdout: createdStdout } = await execFileAsync('git', ['log', '--diff-filter=A', '--format=%aI', '-1', '--', filePath], { cwd });
29
- const { stdout: modifiedStdout } = await execFileAsync('git', ['log', '-L', `${line},${line}:${filePath}`, '--format=%aI', '-1'], { cwd });
57
+ const { stdout: createdStdout } = await execFileAsync('git', ['log', '--diff-filter=A', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
58
+ const { stdout: modifiedStdout } = await execFileAsync('git', ['log', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
30
59
  return {
31
60
  createdAt: createdStdout.trim() || undefined,
32
61
  modifiedAt: modifiedStdout.trim() || undefined
@@ -1 +1 @@
1
- {"version":3,"file":"git-dates-analyser.js","sourceRoot":"","sources":["../../src/analysis/git-dates-analyser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,CAAC,MAAM,gBAAgB,GAAoD;IAC7E,EAAE,EAAE,WAAW;IACf,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE;QAC3C,MAAM,KAAK,GAAG,OAAO;YACjB,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAoC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtH,CAAC,CAAC,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;YACpF,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,cAAc,CACzB,OAAe,EACf,IAAY,EACZ,aAAsB;IAEtB,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACjG,MAAM,GAAG,GAAG,aAAa,CAAC;IAC1B,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,aAAa,CACjD,KAAK,EACL,CAAC,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAChE,EAAE,GAAG,EAAE,CACV,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CAClD,KAAK,EACL,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,EAClE,EAAE,GAAG,EAAE,CACV,CAAC;QACF,OAAO;YACH,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,SAAS;YAC5C,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,SAAS;SACjD,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"git-dates-analyser.js","sourceRoot":"","sources":["../../src/analysis/git-dates-analyser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,kBAAkB,GAAG,IAAK,CAAC;AACjC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAQ7B,MAAM,CAAC,MAAM,gBAAgB,GAAoD;IAC7E,EAAE,EAAE,WAAW;IACf,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1D,MAAM,KAAK,GAAG,MAAM,cAAc,CAC9B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EACZ,aAAa,CAChB,CAAC;gBACF,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtC,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,cAAc,CACzB,OAAe,EACf,SAAiB,EACjB,OAAe,EACf,aAAsB;IAEtB,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACjG,MAAM,GAAG,GAAG,aAAa,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAC9C,KAAK,EACL,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,EACxE,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,MAAM,SAAS,GAAG,UAAU;aACvB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO;gBACH,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;aAC7C,CAAC;QACN,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,oCAAoC;IACxC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,aAAa,CACjD,KAAK,EACL,CAAC,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAChE,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CAClD,KAAK,EACL,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAC7C,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,OAAO;YACH,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,SAAS;YAC5C,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,SAAS;SACjD,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { type StoreApi } from 'zustand/vanilla';
5
5
  export type IndexState = 'uninitialized' | 'opening' | 'idle' | 'syncing' | 'ready' | 'error' | 'closing';
6
- type IndexEvent = 'activate' | 'opened' | 'sync' | 'synced' | 'fail' | 'deactivate';
6
+ type IndexEvent = 'activate' | 'opened' | 'sync' | 'synced' | 'fail' | 'deactivate' | 'closed';
7
7
  export type WorkspaceChange = 'created' | 'changed' | 'deleted';
8
8
  export type IndexErrorPhase = 'open' | 'parse' | 'extract' | 'persist' | 'sync' | 'transition';
9
9
  export interface IndexError {
@@ -23,9 +23,16 @@ export interface FileIndexIssue {
23
23
  cause?: string;
24
24
  at: number;
25
25
  }
26
+ export interface DocumentUpdateIdea {
27
+ id: string;
28
+ name: string;
29
+ lineStart: number;
30
+ }
26
31
  export interface DocumentUpdate {
27
32
  fileUri: string;
28
33
  ideaCount: number;
34
+ /** Ideas persisted in this update — used for idea-centric Timeline events. */
35
+ ideas?: DocumentUpdateIdea[];
29
36
  at: number;
30
37
  }
31
38
  export interface WorkspaceFileChange {
@@ -65,7 +72,7 @@ export interface AnalyticalActions {
65
72
  clearFileIndexIssues: () => void;
66
73
  clearFileIndexIssuesForFile: (fileUri: string) => void;
67
74
  clearLastError: () => void;
68
- recordDocumentUpdate: (fileUri: string, ideaCount: number) => void;
75
+ recordDocumentUpdate: (fileUri: string, ideaCount: number, ideas?: DocumentUpdateIdea[]) => void;
69
76
  recordWorkspaceChange: (fileUri: string, change: WorkspaceChange) => void;
70
77
  startAnalysis: (analyser: string, params: unknown) => void;
71
78
  completeAnalysis: (analyser: string, result: unknown) => void;
@@ -4,12 +4,13 @@
4
4
  import { createStore } from 'zustand/vanilla';
5
5
  const INDEX_TRANSITIONS = {
6
6
  uninitialized: { activate: 'opening' },
7
- opening: { opened: 'idle', fail: 'error' },
7
+ opening: { opened: 'idle', fail: 'error', deactivate: 'closing' },
8
8
  idle: { sync: 'syncing', deactivate: 'closing' },
9
9
  ready: { sync: 'syncing', deactivate: 'closing' },
10
- syncing: { synced: 'ready', fail: 'error' },
11
- error: { sync: 'syncing', deactivate: 'closing' },
12
- closing: {}
10
+ syncing: { synced: 'ready', fail: 'error', deactivate: 'closing' },
11
+ // Recoverable: reopen after open failure, or soft-sync if the store is already open.
12
+ error: { activate: 'opening', sync: 'syncing', deactivate: 'closing' },
13
+ closing: { closed: 'uninitialized' }
13
14
  };
14
15
  const INITIAL_STATE = {
15
16
  indexState: 'uninitialized',
@@ -80,11 +81,12 @@ export function createAnalyticalStore() {
80
81
  clearLastError() {
81
82
  set({ lastError: undefined });
82
83
  },
83
- recordDocumentUpdate(fileUri, ideaCount) {
84
+ recordDocumentUpdate(fileUri, ideaCount, ideas) {
84
85
  set(state => ({
85
86
  documentUpdates: appendActivity(state.documentUpdates, {
86
87
  fileUri,
87
88
  ideaCount,
89
+ ideas,
88
90
  at: Date.now()
89
91
  })
90
92
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"analytical-store.js","sourceRoot":"","sources":["../../src/core/analytical-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analytical-store.js","sourceRoot":"","sources":["../../src/core/analytical-store.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,26 @@
1
- /** Directory name under the workspace root for shared application memory. */
1
+ /** Directory name under the base root for shared application memory (also the base marker). */
2
2
  export declare const APPLICATION_MEMORY_DIR = ".reqlan";
3
+ /** Config filename under `<base>/.reqlan/` (shared settings for the base). */
4
+ export declare const CONFIG_FILENAME = "config.json";
5
+ /**
6
+ * Gitignore-syntax ignore file under `<base>/.reqlan/` (path filters for discovery/indexing).
7
+ * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
8
+ */
9
+ export declare const RQIGNORE_FILENAME = ".rqignore";
3
10
  /** Default SQLite filename for the ideas graph index inside application memory. */
4
11
  export declare const IDEAS_INDEX_FILENAME = "ideas-index.sqlite";
5
12
  /**
6
- * Resolve the application-memory directory for a workspace.
13
+ * Sibling SQLite for indexing timing diagnostics (survives ideas-index rebuild).
14
+ * rq:["../../../reqlan rq/extension/module/index.rq".index_diagnostics_store]
15
+ * rq:["../../../reqlan rq/extension/features-index-diagnostics.rq".index_diagnostics]
16
+ */
17
+ export declare const INDEX_DIAGNOSTICS_FILENAME = "index-diagnostics.sqlite";
18
+ /**
19
+ * Resolve the application-memory directory for a base.
7
20
  * Override with an absolute or relative `storagePath` when set (e.g. tests / REQLAN_INDEX_PATH).
8
21
  */
9
22
  export declare function resolveApplicationMemoryPath(workspaceRoot: string, storagePath?: string): string;
10
23
  /** Full path to the ideas-index SQLite file under application memory. */
11
24
  export declare function resolveIdeasIndexDbPath(workspaceRoot: string, storagePath?: string): string;
25
+ /** Full path to the index-diagnostics SQLite file under application memory. */
26
+ export declare function resolveIndexDiagnosticsDbPath(workspaceRoot: string, storagePath?: string): string;
@@ -1,16 +1,30 @@
1
1
  /**
2
- * Workspace-local application memory for reqlan tools.
2
+ * Base-local application memory for reqlan tools.
3
3
  *
4
- * The ideas index SQLite database lives under `<workspace>/.reqlan/` so the
5
- * extension, CLI, and MCP share one on-disk store — not VS Code globalStorage.
4
+ * The ideas index SQLite database lives under `<base>/.reqlan/` so the
5
+ * extension, CLI, and MCP share one on-disk store per base — not VS Code globalStorage.
6
+ * The presence of `.reqlan` marks a directory as a reqlan base.
6
7
  */
7
8
  import { join } from 'node:path';
8
- /** Directory name under the workspace root for shared application memory. */
9
+ /** Directory name under the base root for shared application memory (also the base marker). */
9
10
  export const APPLICATION_MEMORY_DIR = '.reqlan';
11
+ /** Config filename under `<base>/.reqlan/` (shared settings for the base). */
12
+ export const CONFIG_FILENAME = 'config.json';
13
+ /**
14
+ * Gitignore-syntax ignore file under `<base>/.reqlan/` (path filters for discovery/indexing).
15
+ * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
16
+ */
17
+ export const RQIGNORE_FILENAME = '.rqignore';
10
18
  /** Default SQLite filename for the ideas graph index inside application memory. */
11
19
  export const IDEAS_INDEX_FILENAME = 'ideas-index.sqlite';
12
20
  /**
13
- * Resolve the application-memory directory for a workspace.
21
+ * Sibling SQLite for indexing timing diagnostics (survives ideas-index rebuild).
22
+ * rq:["../../../reqlan rq/extension/module/index.rq".index_diagnostics_store]
23
+ * rq:["../../../reqlan rq/extension/features-index-diagnostics.rq".index_diagnostics]
24
+ */
25
+ export const INDEX_DIAGNOSTICS_FILENAME = 'index-diagnostics.sqlite';
26
+ /**
27
+ * Resolve the application-memory directory for a base.
14
28
  * Override with an absolute or relative `storagePath` when set (e.g. tests / REQLAN_INDEX_PATH).
15
29
  */
16
30
  export function resolveApplicationMemoryPath(workspaceRoot, storagePath) {
@@ -23,4 +37,8 @@ export function resolveApplicationMemoryPath(workspaceRoot, storagePath) {
23
37
  export function resolveIdeasIndexDbPath(workspaceRoot, storagePath) {
24
38
  return join(resolveApplicationMemoryPath(workspaceRoot, storagePath), IDEAS_INDEX_FILENAME);
25
39
  }
40
+ /** Full path to the index-diagnostics SQLite file under application memory. */
41
+ export function resolveIndexDiagnosticsDbPath(workspaceRoot, storagePath) {
42
+ return join(resolveApplicationMemoryPath(workspaceRoot, storagePath), INDEX_DIAGNOSTICS_FILENAME);
43
+ }
26
44
  //# sourceMappingURL=application-memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"application-memory.js","sourceRoot":"","sources":["../../src/core/application-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAEhD,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,aAAqB,EAAE,WAAoB;IACpF,IAAI,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAE,WAAoB;IAC/E,OAAO,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAChG,CAAC"}
1
+ {"version":3,"file":"application-memory.js","sourceRoot":"","sources":["../../src/core/application-memory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,+FAA+F;AAC/F,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAE7C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,aAAqB,EAAE,WAAoB;IACpF,IAAI,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAE,WAAoB;IAC/E,OAAO,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAChG,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,6BAA6B,CAAC,aAAqB,EAAE,WAAoB;IACrF,OAAO,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,0BAA0B,CAAC,CAAC;AACtG,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface BaseDescriptor {
2
+ /** Stable id: absolute normalized base root (forward slashes). */
3
+ id: string;
4
+ /** Absolute filesystem path of the base root (directory that owns `.reqlan`). */
5
+ root: string;
6
+ /** Absolute path to the base's `.reqlan` directory. */
7
+ memoryPath: string;
8
+ /** Optional label relative to a discovery root (for UI). */
9
+ label: string;
10
+ }
11
+ /**
12
+ * Recursively find directories under `root` that contain a `.reqlan` child.
13
+ * `root` itself is included when it owns `.reqlan`.
14
+ */
15
+ export declare function discoverBasesUnder(root: string): BaseDescriptor[];
16
+ /**
17
+ * Discover bases under one or more workspace / search roots.
18
+ * Deduplicates by absolute base root.
19
+ */
20
+ export declare function discoverBases(roots: string[]): BaseDescriptor[];
21
+ export declare function toBaseDescriptor(baseRoot: string, labelRoot?: string): BaseDescriptor;
22
+ /** Longest-matching base root that contains `absPath`, or undefined. */
23
+ export declare function baseForPath(bases: readonly BaseDescriptor[], absPath: string): BaseDescriptor | undefined;
24
+ /** True if `filePath` is under `dir` (or equal). */
25
+ export declare function isPathInsideOrEqual(filePath: string, dir: string): boolean;
26
+ /**
27
+ * Child bases of `parent` (strict descendants that are themselves bases).
28
+ */
29
+ export declare function childBasesOf(parent: BaseDescriptor, allBases: readonly BaseDescriptor[]): BaseDescriptor[];
30
+ /**
31
+ * Filter absolute file paths owned by `base`, excluding nested child bases.
32
+ */
33
+ export declare function filesOwnedByBase(base: BaseDescriptor, allFiles: readonly string[], allBases: readonly BaseDescriptor[]): string[];
34
+ /**
35
+ * Prefer the base containing `cwd`, else the first discovered base.
36
+ * Returns undefined when `bases` is empty.
37
+ */
38
+ export declare function selectDefaultBase(bases: readonly BaseDescriptor[], cwd?: string): BaseDescriptor | undefined;
39
+ /** Ensure path uses forward slashes for stable ids. */
40
+ export declare function stableBaseId(root: string): string;
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Discover reqlan bases: directories that own a `.reqlan` application-memory folder.
3
+ * Nested bases are supported; parent indexing stops at child base boundaries.
4
+ *
5
+ * Walk pruning uses built-in `.rqignore` defaults (and the search root's `.reqlan/.rqignore`
6
+ * when that root is already a base).
7
+ *
8
+ * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
9
+ * rq:["../../../reqlan rq/extension/module/index.rq".rqignore]
10
+ */
11
+ import { existsSync, readdirSync, statSync } from 'node:fs';
12
+ import { basename, join, relative, resolve, sep } from 'node:path';
13
+ import { APPLICATION_MEMORY_DIR } from './application-memory.js';
14
+ import { isIgnoredPath, loadRqIgnore } from './rqignore.js';
15
+ function normalizeRoot(path) {
16
+ return resolve(path).replace(/\\/g, '/');
17
+ }
18
+ /**
19
+ * Recursively find directories under `root` that contain a `.reqlan` child.
20
+ * `root` itself is included when it owns `.reqlan`.
21
+ */
22
+ export function discoverBasesUnder(root) {
23
+ const absRoot = resolve(root);
24
+ if (!existsSync(absRoot)) {
25
+ return [];
26
+ }
27
+ const found = [];
28
+ // Prefer the search root's .rqignore when it is already a base; else built-in defaults.
29
+ const walkFilter = loadRqIgnore(absRoot);
30
+ function visit(dir) {
31
+ let entries;
32
+ try {
33
+ entries = readdirSync(dir);
34
+ }
35
+ catch {
36
+ return;
37
+ }
38
+ if (entries.includes(APPLICATION_MEMORY_DIR)) {
39
+ const marker = join(dir, APPLICATION_MEMORY_DIR);
40
+ try {
41
+ if (statSync(marker).isDirectory()) {
42
+ found.push(dir);
43
+ }
44
+ }
45
+ catch {
46
+ // ignore unreadable marker
47
+ }
48
+ }
49
+ for (const name of entries) {
50
+ const child = join(dir, name);
51
+ if (isIgnoredPath(walkFilter, absRoot, child, true)) {
52
+ continue;
53
+ }
54
+ try {
55
+ if (statSync(child).isDirectory()) {
56
+ visit(child);
57
+ }
58
+ }
59
+ catch {
60
+ // skip unreadable
61
+ }
62
+ }
63
+ }
64
+ visit(absRoot);
65
+ return found
66
+ .map(baseRoot => toBaseDescriptor(baseRoot, absRoot))
67
+ .sort((a, b) => a.root.localeCompare(b.root));
68
+ }
69
+ /**
70
+ * Discover bases under one or more workspace / search roots.
71
+ * Deduplicates by absolute base root.
72
+ */
73
+ export function discoverBases(roots) {
74
+ const byId = new Map();
75
+ for (const root of roots) {
76
+ for (const base of discoverBasesUnder(root)) {
77
+ byId.set(base.id, base);
78
+ }
79
+ }
80
+ return [...byId.values()].sort((a, b) => a.root.localeCompare(b.root));
81
+ }
82
+ export function toBaseDescriptor(baseRoot, labelRoot) {
83
+ const root = resolve(baseRoot);
84
+ const id = normalizeRoot(root);
85
+ const memoryPath = join(root, APPLICATION_MEMORY_DIR);
86
+ let label;
87
+ if (labelRoot) {
88
+ const rel = relative(resolve(labelRoot), root).replace(/\\/g, '/');
89
+ label = rel === '' ? basename(root) || root : rel;
90
+ }
91
+ else {
92
+ label = basename(root) || root;
93
+ }
94
+ return { id, root, memoryPath, label };
95
+ }
96
+ /** Longest-matching base root that contains `absPath`, or undefined. */
97
+ export function baseForPath(bases, absPath) {
98
+ const target = resolve(absPath);
99
+ let best;
100
+ let bestLen = -1;
101
+ for (const base of bases) {
102
+ if (isPathInsideOrEqual(target, base.root)) {
103
+ const len = base.root.length;
104
+ if (len > bestLen) {
105
+ best = base;
106
+ bestLen = len;
107
+ }
108
+ }
109
+ }
110
+ return best;
111
+ }
112
+ /** True if `filePath` is under `dir` (or equal). */
113
+ export function isPathInsideOrEqual(filePath, dir) {
114
+ const absFile = resolve(filePath);
115
+ const absDir = resolve(dir);
116
+ if (absFile === absDir) {
117
+ return true;
118
+ }
119
+ const prefix = absDir.endsWith(sep) ? absDir : absDir + sep;
120
+ return absFile.startsWith(prefix);
121
+ }
122
+ /**
123
+ * Child bases of `parent` (strict descendants that are themselves bases).
124
+ */
125
+ export function childBasesOf(parent, allBases) {
126
+ return allBases.filter(b => b.id !== parent.id && isPathInsideOrEqual(b.root, parent.root));
127
+ }
128
+ /**
129
+ * Filter absolute file paths owned by `base`, excluding nested child bases.
130
+ */
131
+ export function filesOwnedByBase(base, allFiles, allBases) {
132
+ const children = childBasesOf(base, allBases);
133
+ return allFiles.filter(file => {
134
+ const abs = resolve(file);
135
+ if (!isPathInsideOrEqual(abs, base.root)) {
136
+ return false;
137
+ }
138
+ for (const child of children) {
139
+ if (isPathInsideOrEqual(abs, child.root)) {
140
+ return false;
141
+ }
142
+ }
143
+ return true;
144
+ });
145
+ }
146
+ /**
147
+ * Prefer the base containing `cwd`, else the first discovered base.
148
+ * Returns undefined when `bases` is empty.
149
+ */
150
+ export function selectDefaultBase(bases, cwd) {
151
+ if (bases.length === 0) {
152
+ return undefined;
153
+ }
154
+ if (cwd) {
155
+ const match = baseForPath(bases, cwd);
156
+ if (match) {
157
+ return match;
158
+ }
159
+ }
160
+ return bases[0];
161
+ }
162
+ /** Ensure path uses forward slashes for stable ids. */
163
+ export function stableBaseId(root) {
164
+ return normalizeRoot(root);
165
+ }
166
+ //# sourceMappingURL=base-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-discovery.js","sourceRoot":"","sources":["../../src/core/base-discovery.ts"],"names":[],"mappings":"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"}
@@ -130,10 +130,27 @@ export interface GitContextSlice {
130
130
  /** Focus-hero cue, e.g. "2d ago · main". */
131
131
  historyCue?: string;
132
132
  }
133
+ export interface WorkspaceBaseGlance {
134
+ id: string;
135
+ label: string;
136
+ root: string;
137
+ ready: boolean;
138
+ ideaCount: number;
139
+ edgeCount: number;
140
+ fileIssueCount: number;
141
+ }
133
142
  export interface WorkspaceContextSlice {
134
143
  ready: boolean;
135
144
  ideaCount: number;
136
145
  edgeCount: number;
146
+ /** Active ontology base id (`.reqlan`-marked root). */
147
+ activeBaseId?: string;
148
+ /** Active base display label. */
149
+ activeBaseLabel?: string;
150
+ /** All discovered bases in the VS Code workspace. */
151
+ bases?: WorkspaceBaseGlance[];
152
+ /** True when no `.reqlan` bases exist — UI should offer create-base. */
153
+ discoveryEmpty?: boolean;
137
154
  }
138
155
  export interface ContextFootprint {
139
156
  ideaIds: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"context-model.js","sourceRoot":"","sources":["../../src/core/context-model.ts"],"names":[],"mappings":"AAsOA,MAAM,CAAC,MAAM,wBAAwB,GAAuC;IACxE,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,QAAQ;IACtB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAuC;IACzE,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;IACjB,UAAU,EAAE,GAAG;IACf,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,GAAG;IACjB,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAwC;IAC3E,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;CACZ,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,+BAA+B,GAAyB;IACjE,cAAc;IACd,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;CACX,CAAC"}
1
+ {"version":3,"file":"context-model.js","sourceRoot":"","sources":["../../src/core/context-model.ts"],"names":[],"mappings":"AAwPA,MAAM,CAAC,MAAM,wBAAwB,GAAuC;IACxE,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,QAAQ;IACtB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAuC;IACzE,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;IACjB,UAAU,EAAE,GAAG;IACf,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,GAAG;IACjB,MAAM,EAAE,GAAG;IACX,GAAG,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAwC;IAC3E,SAAS,EAAE,IAAI;IACf,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;CACZ,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,+BAA+B,GAAyB;IACjE,cAAc;IACd,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;CACX,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type BaseDescriptor } from './base-discovery.js';
2
+ export interface CreateBaseResult {
3
+ base: BaseDescriptor;
4
+ /** True when `.reqlan` did not already exist before this call. */
5
+ created: boolean;
6
+ }
7
+ /**
8
+ * Ensure `<baseRoot>/.reqlan/` exists and seed `config.json` + `.rqignore` when creating a new base.
9
+ * Idempotent: existing markers are left alone and reported as `created: false`.
10
+ */
11
+ export declare function createBase(baseRoot: string): Promise<CreateBaseResult>;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Create a reqlan base by writing the `.reqlan` application-memory marker.
3
+ * Shared by CLI `init` and other headless tools; the extension uses the same marker.
4
+ *
5
+ * rq:["../../../reqlan rq/extension/module/index.rq".rqignore]
6
+ * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
7
+ */
8
+ import { existsSync } from 'node:fs';
9
+ import { mkdir, writeFile } from 'node:fs/promises';
10
+ import { join, resolve } from 'node:path';
11
+ import { CONFIG_FILENAME, RQIGNORE_FILENAME, resolveApplicationMemoryPath } from './application-memory.js';
12
+ import { toBaseDescriptor } from './base-discovery.js';
13
+ import { defaultRqIgnoreFileContents } from './rqignore.js';
14
+ const DEFAULT_CONFIG_JSON = `${JSON.stringify({}, null, 2)}\n`;
15
+ /**
16
+ * Ensure `<baseRoot>/.reqlan/` exists and seed `config.json` + `.rqignore` when creating a new base.
17
+ * Idempotent: existing markers are left alone and reported as `created: false`.
18
+ */
19
+ export async function createBase(baseRoot) {
20
+ const root = resolve(baseRoot);
21
+ const memoryPath = resolveApplicationMemoryPath(root);
22
+ const created = !existsSync(memoryPath);
23
+ await mkdir(memoryPath, { recursive: true });
24
+ if (created) {
25
+ await writeFile(join(memoryPath, CONFIG_FILENAME), DEFAULT_CONFIG_JSON, 'utf8');
26
+ await writeFile(join(memoryPath, RQIGNORE_FILENAME), defaultRqIgnoreFileContents(), 'utf8');
27
+ }
28
+ return {
29
+ base: toBaseDescriptor(root),
30
+ created
31
+ };
32
+ }
33
+ //# sourceMappingURL=create-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-base.js","sourceRoot":"","sources":["../../src/core/create-base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,4BAA4B,EAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAQ5D,MAAM,mBAAmB,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,2BAA2B,EAAE,EAAE,MAAM,CAAC,CAAC;IAChG,CAAC;IACD,OAAO;QACH,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC5B,OAAO;KACV,CAAC;AACN,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Built-in patterns always applied (also seeded into new `.rqignore` files).
3
+ * Users can un-ignore with `!pattern` in `.reqlan/.rqignore`.
4
+ */
5
+ export declare const DEFAULT_RQIGNORE_PATTERNS: readonly string[];
6
+ /** Text written when seeding a new base's `.reqlan/.rqignore`. */
7
+ export declare function defaultRqIgnoreFileContents(): string;
8
+ export interface RqIgnoreFilter {
9
+ /** True when `relativePath` (posix, from base root) should be skipped. */
10
+ ignores(relativePath: string, isDirectory?: boolean): boolean;
11
+ }
12
+ /**
13
+ * Build a filter from built-in defaults plus optional extra pattern lines
14
+ * (e.g. contents of `.reqlan/.rqignore`).
15
+ */
16
+ export declare function createRqIgnoreFilter(extraPatterns?: string | readonly string[]): RqIgnoreFilter;
17
+ /** Absolute path to `<baseRoot>/.reqlan/.rqignore`. */
18
+ export declare function resolveRqIgnorePath(baseRoot: string): string;
19
+ /**
20
+ * Load `.reqlan/.rqignore` for a base when present; always includes built-in defaults.
21
+ * Missing or unreadable files still yield the default filter.
22
+ */
23
+ export declare function loadRqIgnore(baseRoot: string): RqIgnoreFilter;
24
+ /** Whether an absolute path under `baseRoot` is ignored. */
25
+ export declare function isIgnoredPath(filter: RqIgnoreFilter, baseRoot: string, absPath: string, isDirectory?: boolean): boolean;