ctxr-cli 0.6.0 → 0.8.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 (169) hide show
  1. package/dist/adapters/types.d.ts +2 -3
  2. package/dist/adapters/types.d.ts.map +1 -1
  3. package/dist/adapters/types.js.map +1 -1
  4. package/dist/commands/archive.d.ts +2 -2
  5. package/dist/commands/archive.js +2 -2
  6. package/dist/commands/catalog-show.d.ts +0 -1
  7. package/dist/commands/catalog-show.d.ts.map +1 -1
  8. package/dist/commands/catalog-show.js +1 -1
  9. package/dist/commands/catalog-show.js.map +1 -1
  10. package/dist/commands/graph-query.d.ts +2 -11
  11. package/dist/commands/graph-query.d.ts.map +1 -1
  12. package/dist/commands/graph-query.js +11 -14
  13. package/dist/commands/graph-query.js.map +1 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +2 -7
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/publish-check.d.ts.map +1 -1
  18. package/dist/commands/publish-check.js +0 -4
  19. package/dist/commands/publish-check.js.map +1 -1
  20. package/dist/commands/publish-gather.d.ts +6 -16
  21. package/dist/commands/publish-gather.d.ts.map +1 -1
  22. package/dist/commands/publish-gather.js +11 -30
  23. package/dist/commands/publish-gather.js.map +1 -1
  24. package/dist/commands/publish-new.d.ts +5 -4
  25. package/dist/commands/publish-new.d.ts.map +1 -1
  26. package/dist/commands/publish-new.js +32 -10
  27. package/dist/commands/publish-new.js.map +1 -1
  28. package/dist/commands/serve.d.ts.map +1 -1
  29. package/dist/commands/serve.js +6 -25
  30. package/dist/commands/serve.js.map +1 -1
  31. package/dist/commands/session-capture.d.ts.map +1 -1
  32. package/dist/commands/session-capture.js +0 -2
  33. package/dist/commands/session-capture.js.map +1 -1
  34. package/dist/config/defaults.d.ts +12 -29
  35. package/dist/config/defaults.d.ts.map +1 -1
  36. package/dist/config/defaults.js +11 -28
  37. package/dist/config/defaults.js.map +1 -1
  38. package/dist/config/schema.d.ts +18 -44
  39. package/dist/config/schema.d.ts.map +1 -1
  40. package/dist/config/schema.js +18 -52
  41. package/dist/config/schema.js.map +1 -1
  42. package/dist/core/agents-doc.d.ts +9 -0
  43. package/dist/core/agents-doc.d.ts.map +1 -1
  44. package/dist/core/agents-doc.js +31 -16
  45. package/dist/core/agents-doc.js.map +1 -1
  46. package/dist/core/browse/nav.d.ts +10 -0
  47. package/dist/core/browse/nav.d.ts.map +1 -0
  48. package/dist/core/browse/nav.js +101 -0
  49. package/dist/core/browse/nav.js.map +1 -0
  50. package/dist/core/browse/routes.d.ts +11 -2
  51. package/dist/core/browse/routes.d.ts.map +1 -1
  52. package/dist/core/browse/routes.js +19 -7
  53. package/dist/core/browse/routes.js.map +1 -1
  54. package/dist/core/browse/templates.d.ts +11 -2
  55. package/dist/core/browse/templates.d.ts.map +1 -1
  56. package/dist/core/browse/templates.js +16 -3
  57. package/dist/core/browse/templates.js.map +1 -1
  58. package/dist/core/browse/tree.d.ts +33 -0
  59. package/dist/core/browse/tree.d.ts.map +1 -0
  60. package/dist/core/browse/tree.js +53 -0
  61. package/dist/core/browse/tree.js.map +1 -0
  62. package/dist/core/catalog/build.d.ts +1 -1
  63. package/dist/core/catalog/build.d.ts.map +1 -1
  64. package/dist/core/catalog/build.js +1 -2
  65. package/dist/core/catalog/build.js.map +1 -1
  66. package/dist/core/catalog/model.d.ts +2 -0
  67. package/dist/core/catalog/model.d.ts.map +1 -1
  68. package/dist/core/catalog/model.js +2 -1
  69. package/dist/core/catalog/model.js.map +1 -1
  70. package/dist/core/checks/manifest.d.ts.map +1 -1
  71. package/dist/core/checks/manifest.js +0 -5
  72. package/dist/core/checks/manifest.js.map +1 -1
  73. package/dist/core/checks/organize-checks.d.ts +1 -2
  74. package/dist/core/checks/organize-checks.d.ts.map +1 -1
  75. package/dist/core/checks/organize-checks.js +1 -2
  76. package/dist/core/checks/organize-checks.js.map +1 -1
  77. package/dist/core/checks/types.d.ts +1 -1
  78. package/dist/core/convention-doc.d.ts +15 -12
  79. package/dist/core/convention-doc.d.ts.map +1 -1
  80. package/dist/core/convention-doc.js +25 -66
  81. package/dist/core/convention-doc.js.map +1 -1
  82. package/dist/core/errors.d.ts +9 -8
  83. package/dist/core/errors.d.ts.map +1 -1
  84. package/dist/core/errors.js +14 -18
  85. package/dist/core/errors.js.map +1 -1
  86. package/dist/core/exit-codes.d.ts +7 -5
  87. package/dist/core/exit-codes.d.ts.map +1 -1
  88. package/dist/core/exit-codes.js +7 -5
  89. package/dist/core/exit-codes.js.map +1 -1
  90. package/dist/core/ingest/identity.d.ts +4 -4
  91. package/dist/core/ingest/identity.js +4 -4
  92. package/dist/core/migrations/add-explanation-craft-skill.d.ts +26 -0
  93. package/dist/core/migrations/add-explanation-craft-skill.d.ts.map +1 -0
  94. package/dist/core/migrations/add-explanation-craft-skill.js +94 -0
  95. package/dist/core/migrations/add-explanation-craft-skill.js.map +1 -0
  96. package/dist/core/migrations/drop-access-axes.d.ts +24 -0
  97. package/dist/core/migrations/drop-access-axes.d.ts.map +1 -0
  98. package/dist/core/migrations/drop-access-axes.js +54 -0
  99. package/dist/core/migrations/drop-access-axes.js.map +1 -0
  100. package/dist/core/migrations/registry.d.ts +11 -1
  101. package/dist/core/migrations/registry.d.ts.map +1 -1
  102. package/dist/core/migrations/registry.js +15 -3
  103. package/dist/core/migrations/registry.js.map +1 -1
  104. package/dist/core/notes/list.d.ts +1 -12
  105. package/dist/core/notes/list.d.ts.map +1 -1
  106. package/dist/core/notes/list.js.map +1 -1
  107. package/dist/core/reconcile.js +2 -2
  108. package/dist/core/reconcile.js.map +1 -1
  109. package/dist/core/records.d.ts +4 -5
  110. package/dist/core/records.d.ts.map +1 -1
  111. package/dist/core/records.js +0 -2
  112. package/dist/core/records.js.map +1 -1
  113. package/dist/core/skills.d.ts +6 -0
  114. package/dist/core/skills.d.ts.map +1 -1
  115. package/dist/core/skills.js +7 -4
  116. package/dist/core/skills.js.map +1 -1
  117. package/dist/run.d.ts.map +1 -1
  118. package/dist/run.js +15 -53
  119. package/dist/run.js.map +1 -1
  120. package/dist/version.d.ts +1 -1
  121. package/dist/version.js +1 -1
  122. package/package.json +2 -2
  123. package/templates/agents/canonical.md +0 -2
  124. package/templates/conventions/baseline-conventions.md +1 -34
  125. package/templates/serve/shell.html +3 -0
  126. package/templates/serve/style.css +78 -3
  127. package/templates/skills/ctxr-organize-audit.md +2 -10
  128. package/templates/skills/ctxr-placement.md +6 -24
  129. package/templates/skills/ctxr-publish.md +26 -21
  130. package/templates/skills/ctxr-session-capture.md +1 -4
  131. package/templates/vendor/eli5/LICENSE.txt +21 -0
  132. package/templates/vendor/eli5/SKILL.md +116 -0
  133. package/templates/vendor/eli5/provenance.json +8 -0
  134. package/dist/commands/check.d.ts +0 -30
  135. package/dist/commands/check.d.ts.map +0 -1
  136. package/dist/commands/check.js +0 -65
  137. package/dist/commands/check.js.map +0 -1
  138. package/dist/commands/note-resolve.d.ts +0 -14
  139. package/dist/commands/note-resolve.d.ts.map +0 -1
  140. package/dist/commands/note-resolve.js +0 -24
  141. package/dist/commands/note-resolve.js.map +0 -1
  142. package/dist/core/checks/disclosure-checks.d.ts +0 -4
  143. package/dist/core/checks/disclosure-checks.d.ts.map +0 -1
  144. package/dist/core/checks/disclosure-checks.js +0 -24
  145. package/dist/core/checks/disclosure-checks.js.map +0 -1
  146. package/dist/core/disclosure/leak-scan.d.ts +0 -19
  147. package/dist/core/disclosure/leak-scan.d.ts.map +0 -1
  148. package/dist/core/disclosure/leak-scan.js +0 -31
  149. package/dist/core/disclosure/leak-scan.js.map +0 -1
  150. package/dist/core/disclosure/model.d.ts +0 -29
  151. package/dist/core/disclosure/model.d.ts.map +0 -1
  152. package/dist/core/disclosure/model.js +0 -69
  153. package/dist/core/disclosure/model.js.map +0 -1
  154. package/dist/core/graph/visibility-filter.d.ts +0 -13
  155. package/dist/core/graph/visibility-filter.d.ts.map +0 -1
  156. package/dist/core/graph/visibility-filter.js +0 -26
  157. package/dist/core/graph/visibility-filter.js.map +0 -1
  158. package/dist/core/migrations/rename-visibility-field.d.ts +0 -3
  159. package/dist/core/migrations/rename-visibility-field.d.ts.map +0 -1
  160. package/dist/core/migrations/rename-visibility-field.js +0 -62
  161. package/dist/core/migrations/rename-visibility-field.js.map +0 -1
  162. package/dist/core/notes/checks.d.ts +0 -20
  163. package/dist/core/notes/checks.d.ts.map +0 -1
  164. package/dist/core/notes/checks.js +0 -58
  165. package/dist/core/notes/checks.js.map +0 -1
  166. package/dist/core/notes/visibility.d.ts +0 -26
  167. package/dist/core/notes/visibility.d.ts.map +0 -1
  168. package/dist/core/notes/visibility.js +0 -41
  169. package/dist/core/notes/visibility.js.map +0 -1
@@ -1,13 +0,0 @@
1
- import type { Store } from '../store.js';
2
- import type { GraphBuildResult } from './model.js';
3
- /**
4
- * context-visibility spec: "excluded... before that operation ranks,
5
- * traverses, or otherwise processes results" — filtering the persisted
6
- * graph down to only visible nodes BEFORE calling neighbors/shortestPath/
7
- * hubs/orphans means an excluded note contributes no edges to any of them,
8
- * not merely a post-hoc omission from the final list. A node with no
9
- * corresponding current note (a stale graph entry) is excluded rather than
10
- * included — visibility can't be resolved for it, so it fails closed.
11
- */
12
- export declare function filterGraphByAudience(store: Store, graph: GraphBuildResult, audience: string): Promise<GraphBuildResult>;
13
- //# sourceMappingURL=visibility-filter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visibility-filter.d.ts","sourceRoot":"","sources":["../../../src/core/graph/visibility-filter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -1,26 +0,0 @@
1
- import { listNotes } from '../notes/list.js';
2
- import { canSee, resolveVisibility } from '../notes/visibility.js';
3
- import { subgraph } from './query.js';
4
- /**
5
- * context-visibility spec: "excluded... before that operation ranks,
6
- * traverses, or otherwise processes results" — filtering the persisted
7
- * graph down to only visible nodes BEFORE calling neighbors/shortestPath/
8
- * hubs/orphans means an excluded note contributes no edges to any of them,
9
- * not merely a post-hoc omission from the final list. A node with no
10
- * corresponding current note (a stale graph entry) is excluded rather than
11
- * included — visibility can't be resolved for it, so it fails closed.
12
- */
13
- export async function filterGraphByAudience(store, graph, audience) {
14
- const notes = await listNotes(store.root, store.config);
15
- const byPath = new Map(notes.map((note) => [note.path, note]));
16
- const visibleIds = graph.nodes
17
- .filter((node) => {
18
- const note = byPath.get(node.path);
19
- if (!note)
20
- return false;
21
- return canSee(store.config, audience, resolveVisibility(store.config, note).value);
22
- })
23
- .map((node) => node.id);
24
- return subgraph(graph, visibleIds);
25
- }
26
- //# sourceMappingURL=visibility-filter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visibility-filter.js","sourceRoot":"","sources":["../../../src/core/graph/visibility-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAY,EACZ,KAAuB,EACvB,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK;SAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1B,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Migration } from './types.js';
2
- export declare const renameVisibilityFieldMigration: Migration;
3
- //# sourceMappingURL=rename-visibility-field.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename-visibility-field.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/rename-visibility-field.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAsB5D,eAAO,MAAM,8BAA8B,EAAE,SAuC5C,CAAC"}
@@ -1,62 +0,0 @@
1
- import path from 'node:path';
2
- import { DEFAULT_VISIBILITY_FIELD_KEY, SCHEMA_V1_VISIBILITY_FIELD_KEY } from '../../config/defaults.js';
3
- import { readConfig } from '../../config/load.js';
4
- import { renderStoreConfig } from '../../config/render.js';
5
- import { writeFileAtomic } from '../fs/atomic.js';
6
- import { listNotes } from '../notes/list.js';
7
- import { parseNote } from '../notes/parse.js';
8
- import { renderNoteText } from '../notes/render.js';
9
- const OLD_KEY = SCHEMA_V1_VISIBILITY_FIELD_KEY;
10
- const NEW_KEY = DEFAULT_VISIBILITY_FIELD_KEY;
11
- /**
12
- * store-lifecycle spec (task 9.2): the concrete migration proving the
13
- * naming-inoculation design holds. The key to search for is the FIXED
14
- * historical literal (OLD_KEY), never `store.config.fields.visibility` —
15
- * that field is exactly what apply()'s own last step changes, so deriving
16
- * "what to look for" from it would make a resumed run, on a store whose
17
- * config was already bumped but whose notes weren't all done yet,
18
- * incorrectly treat the (already-correct) new key as something to rename
19
- * away from. A per-note check is "done" precisely when OLD_KEY is gone
20
- * from its frontmatter — true whether it was never present or already
21
- * renamed, which is what makes a re-run naturally skip completed work.
22
- */
23
- async function pendingNoteRenames(store) {
24
- const notes = await listNotes(store.root, store.config);
25
- return notes.filter((note) => note.frontmatter?.[OLD_KEY] !== undefined).map((note) => note.path);
26
- }
27
- export const renameVisibilityFieldMigration = {
28
- id: '0002-rename-visibility-field-to-lens',
29
- fromVersion: 1,
30
- toVersion: 2,
31
- description: `Rename the visibility frontmatter field from "${OLD_KEY}" to "${NEW_KEY}", on every note and in contexture.yaml.`,
32
- async plan(store) {
33
- const deltas = (await pendingNoteRenames(store)).map((notePath) => ({
34
- path: notePath,
35
- description: `rename frontmatter field "${OLD_KEY}" to "${NEW_KEY}"`,
36
- }));
37
- if (store.config.fields.visibility !== NEW_KEY || store.config.schema_version < 2) {
38
- deltas.push({ path: 'contexture.yaml', description: `set fields.visibility to "${NEW_KEY}" and schema_version to 2` });
39
- }
40
- return deltas;
41
- },
42
- async apply(store) {
43
- const applied = [];
44
- for (const notePath of await pendingNoteRenames(store)) {
45
- const absolutePath = path.join(store.root, notePath);
46
- const note = await parseNote(absolutePath, notePath);
47
- const { [OLD_KEY]: value, ...rest } = note.frontmatter ?? {};
48
- const frontmatter = { ...rest, [NEW_KEY]: value };
49
- await writeFileAtomic(absolutePath, renderNoteText(frontmatter, note.body));
50
- applied.push({ path: notePath, description: `renamed frontmatter field "${OLD_KEY}" to "${NEW_KEY}"` });
51
- }
52
- const configPath = path.join(store.root, 'contexture.yaml');
53
- const currentConfig = await readConfig(store.root);
54
- if (currentConfig.fields.visibility !== NEW_KEY || currentConfig.schema_version < 2) {
55
- const nextConfig = { ...currentConfig, fields: { ...currentConfig.fields, visibility: NEW_KEY }, schema_version: 2 };
56
- await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
57
- applied.push({ path: 'contexture.yaml', description: `set fields.visibility to "${NEW_KEY}" and schema_version to 2` });
58
- }
59
- return applied;
60
- },
61
- };
62
- //# sourceMappingURL=rename-visibility-field.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename-visibility-field.js","sourceRoot":"","sources":["../../../src/core/migrations/rename-visibility-field.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,4BAA4B,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAC/C,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,kBAAkB,CAAC,KAAY;IAC5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAc;IACvD,EAAE,EAAE,sCAAsC;IAC1C,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,iDAAiD,OAAO,SAAS,OAAO,0CAA0C;IAE/H,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,MAAM,MAAM,GAAqB,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpF,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6BAA6B,OAAO,SAAS,OAAO,GAAG;SACrE,CAAC,CAAC,CAAC;QACJ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,6BAA6B,OAAO,2BAA2B,EAAE,CAAC,CAAC;QACzH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK;QACf,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,KAAK,MAAM,QAAQ,IAAI,MAAM,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACrD,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YAC7D,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;YAClD,MAAM,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,OAAO,SAAS,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,aAAa,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YACpF,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YACrH,MAAM,eAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,6BAA6B,OAAO,2BAA2B,EAAE,CAAC,CAAC;QAC1H,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
@@ -1,20 +0,0 @@
1
- /**
2
- * store-lifecycle/context-visibility: a note relying on the fail-closed
3
- * default is a health OBSERVATION (lint), not a doctor-failing invariant —
4
- * doctor's own fail-closed-visibility invariant (wired in Phase 5, below)
5
- * is a different, stricter check. `severity: 'observation'` is what keeps
6
- * this out of doctor's exit code by construction, via the same registry
7
- * lint reads from in Phase 7.
8
- */
9
- export declare const failClosedVisibilityCheck: import("../checks/types.js").CheckDefinition;
10
- /**
11
- * context-visibility spec (task 5.2): the same underlying condition as the
12
- * lint-facing observation above, registered a second time as its own
13
- * invariant so `doctor` can fail a run on it. Each check id carries exactly
14
- * one severity, so the two never double-count a single run's pass/fail
15
- * totals against each other (task 9.4) even though both watch the same
16
- * condition for two different audiences (an operator skimming lint output,
17
- * versus a gate that must block).
18
- */
19
- export declare const failClosedVisibilityInvariantCheck: import("../checks/types.js").CheckDefinition;
20
- //# sourceMappingURL=checks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/core/notes/checks.ts"],"names":[],"mappings":"AAsBA;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,8CAUpC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,kCAAkC,8CAU7C,CAAC"}
@@ -1,58 +0,0 @@
1
- import { defineCheck } from '../checks/types.js';
2
- import { resolveVisibility } from './visibility.js';
3
- async function failClosedFindings(ctx) {
4
- const notes = await ctx.notes();
5
- const findings = [];
6
- for (const note of notes) {
7
- const resolution = resolveVisibility(ctx.config, note);
8
- if (resolution.reason === 'fail-closed default') {
9
- findings.push({
10
- code: 'visibility.fail_closed_default',
11
- severity: 'info',
12
- message: `"${note.path}" has no explicit or directory-derived visibility; relying on the fail-closed default.`,
13
- subject: note.path,
14
- });
15
- }
16
- }
17
- return findings;
18
- }
19
- /**
20
- * store-lifecycle/context-visibility: a note relying on the fail-closed
21
- * default is a health OBSERVATION (lint), not a doctor-failing invariant —
22
- * doctor's own fail-closed-visibility invariant (wired in Phase 5, below)
23
- * is a different, stricter check. `severity: 'observation'` is what keeps
24
- * this out of doctor's exit code by construction, via the same registry
25
- * lint reads from in Phase 7.
26
- */
27
- export const failClosedVisibilityCheck = defineCheck({
28
- id: 'visibility.fail_closed_default',
29
- title: 'Notes relying on the fail-closed default visibility',
30
- severity: 'observation',
31
- capability: 'context-visibility',
32
- scopes: ['store'],
33
- async run(ctx) {
34
- const findings = await failClosedFindings(ctx);
35
- return { status: findings.length > 0 ? 'fail' : 'pass', findings };
36
- },
37
- });
38
- /**
39
- * context-visibility spec (task 5.2): the same underlying condition as the
40
- * lint-facing observation above, registered a second time as its own
41
- * invariant so `doctor` can fail a run on it. Each check id carries exactly
42
- * one severity, so the two never double-count a single run's pass/fail
43
- * totals against each other (task 9.4) even though both watch the same
44
- * condition for two different audiences (an operator skimming lint output,
45
- * versus a gate that must block).
46
- */
47
- export const failClosedVisibilityInvariantCheck = defineCheck({
48
- id: 'visibility.fail_closed_default_invariant',
49
- title: 'Every note has a resolvable visibility value',
50
- severity: 'invariant',
51
- capability: 'context-visibility',
52
- scopes: ['store'],
53
- async run(ctx) {
54
- const findings = await failClosedFindings(ctx);
55
- return { status: findings.length > 0 ? 'fail' : 'pass', findings };
56
- },
57
- });
58
- //# sourceMappingURL=checks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/core/notes/checks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,KAAK,UAAU,kBAAkB,CAAC,GAAiB;IACjD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,IAAI,UAAU,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,gCAAgC;gBACtC,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,wFAAwF;gBAC9G,OAAO,EAAE,IAAI,CAAC,IAAI;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;IACnD,EAAE,EAAE,gCAAgC;IACpC,KAAK,EAAE,qDAAqD;IAC5D,QAAQ,EAAE,aAAa;IACvB,UAAU,EAAE,oBAAoB;IAChC,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,GAAG,CAAC,GAAG;QACX,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrE,CAAC;CACF,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,WAAW,CAAC;IAC5D,EAAE,EAAE,0CAA0C;IAC9C,KAAK,EAAE,8CAA8C;IACrD,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,oBAAoB;IAChC,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,KAAK,CAAC,GAAG,CAAC,GAAG;QACX,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrE,CAAC;CACF,CAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { StoreConfig } from '../../config/schema.js';
2
- import type { Note } from './list.js';
3
- /**
4
- * context-visibility spec: resolution order is explicit → directory default
5
- * → the configured fail-closed default, and every resolution reports WHICH
6
- * rung produced it — not just the resolved value — so a note relying on the
7
- * fail-closed default is distinguishable from one genuinely classified.
8
- */
9
- export type VisibilityReason = 'explicit' | 'directory default' | 'fail-closed default';
10
- export interface VisibilityResolution {
11
- value: string;
12
- reason: VisibilityReason;
13
- }
14
- export declare function resolveVisibility(config: StoreConfig, note: Note): VisibilityResolution;
15
- /**
16
- * context-visibility spec (visibility-contexts-and-wall-verdicts): the set
17
- * of visibility VALUES a requesting context can see — the one shared
18
- * primitive every filtered consumer (graph pre-filter, disclosure rung 3)
19
- * calls instead of raw equality. Identity default: an unconfigured context
20
- * sees exactly its own value, so unconfigured stores behave exactly as
21
- * before the mapping existed, and unknown contexts fail closed to it.
22
- */
23
- export declare function visibleValuesFor(config: StoreConfig, context: string): readonly string[];
24
- /** Whether `context` can see a note whose resolved visibility is `value`. */
25
- export declare function canSee(config: StoreConfig, context: string, value: string): boolean;
26
- //# sourceMappingURL=visibility.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visibility.d.ts","sourceRoot":"","sources":["../../../src/core/notes/visibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAExF,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,oBAAoB,CAavF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAExF;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnF"}
@@ -1,41 +0,0 @@
1
- export function resolveVisibility(config, note) {
2
- const fieldKey = config.fields.visibility;
3
- const explicit = note.frontmatter?.[fieldKey];
4
- if (typeof explicit === 'string' && explicit.length > 0) {
5
- return { value: explicit, reason: 'explicit' };
6
- }
7
- const directoryDefault = findDirectoryDefault(config, note.path);
8
- if (directoryDefault !== undefined) {
9
- return { value: directoryDefault, reason: 'directory default' };
10
- }
11
- return { value: config.visibility.default_context, reason: 'fail-closed default' };
12
- }
13
- /**
14
- * context-visibility spec (visibility-contexts-and-wall-verdicts): the set
15
- * of visibility VALUES a requesting context can see — the one shared
16
- * primitive every filtered consumer (graph pre-filter, disclosure rung 3)
17
- * calls instead of raw equality. Identity default: an unconfigured context
18
- * sees exactly its own value, so unconfigured stores behave exactly as
19
- * before the mapping existed, and unknown contexts fail closed to it.
20
- */
21
- export function visibleValuesFor(config, context) {
22
- return config.visibility.contexts[context] ?? [context];
23
- }
24
- /** Whether `context` can see a note whose resolved visibility is `value`. */
25
- export function canSee(config, context, value) {
26
- return visibleValuesFor(config, context).includes(value);
27
- }
28
- /** Longest matching path-prefix wins, so a more specific directory default overrides a broader one. */
29
- function findDirectoryDefault(config, notePath) {
30
- let best;
31
- for (const [prefix, value] of Object.entries(config.visibility.directory_defaults)) {
32
- const normalizedPrefix = prefix.endsWith('/') ? prefix : `${prefix}/`;
33
- if (notePath === prefix || notePath.startsWith(normalizedPrefix)) {
34
- if (!best || prefix.length > best.prefix.length) {
35
- best = { prefix, value };
36
- }
37
- }
38
- }
39
- return best?.value;
40
- }
41
- //# sourceMappingURL=visibility.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"visibility.js","sourceRoot":"","sources":["../../../src/core/notes/visibility.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,IAAU;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;AACrF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,OAAe;IACnE,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,MAAM,CAAC,MAAmB,EAAE,OAAe,EAAE,KAAa;IACxE,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,uGAAuG;AACvG,SAAS,oBAAoB,CAAC,MAAmB,EAAE,QAAgB;IACjE,IAAI,IAAmD,CAAC;IACxD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnF,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;QACtE,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChD,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,KAAK,CAAC;AACrB,CAAC"}