ctxr-cli 0.9.0 → 0.11.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 (211) hide show
  1. package/README.md +28 -11
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +10 -2
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/publish-check.d.ts.map +1 -1
  6. package/dist/commands/publish-check.js +8 -0
  7. package/dist/commands/publish-check.js.map +1 -1
  8. package/dist/commands/publish-new.d.ts.map +1 -1
  9. package/dist/commands/publish-new.js +15 -0
  10. package/dist/commands/publish-new.js.map +1 -1
  11. package/dist/commands/serve.d.ts.map +1 -1
  12. package/dist/commands/serve.js +33 -11
  13. package/dist/commands/serve.js.map +1 -1
  14. package/dist/commands/session-start.d.ts.map +1 -1
  15. package/dist/commands/session-start.js +9 -1
  16. package/dist/commands/session-start.js.map +1 -1
  17. package/dist/commands/source-check.d.ts.map +1 -1
  18. package/dist/commands/source-check.js +28 -3
  19. package/dist/commands/source-check.js.map +1 -1
  20. package/dist/commands/update.d.ts.map +1 -1
  21. package/dist/commands/update.js +7 -1
  22. package/dist/commands/update.js.map +1 -1
  23. package/dist/commands/verify.d.ts +11 -2
  24. package/dist/commands/verify.d.ts.map +1 -1
  25. package/dist/commands/verify.js +86 -5
  26. package/dist/commands/verify.js.map +1 -1
  27. package/dist/commands/version.d.ts +31 -0
  28. package/dist/commands/version.d.ts.map +1 -0
  29. package/dist/commands/version.js +87 -0
  30. package/dist/commands/version.js.map +1 -0
  31. package/dist/config/defaults.d.ts +71 -5
  32. package/dist/config/defaults.d.ts.map +1 -1
  33. package/dist/config/defaults.js +70 -5
  34. package/dist/config/defaults.js.map +1 -1
  35. package/dist/config/load.d.ts +2 -2
  36. package/dist/config/load.d.ts.map +1 -1
  37. package/dist/config/load.js +13 -3
  38. package/dist/config/load.js.map +1 -1
  39. package/dist/config/render.d.ts +0 -6
  40. package/dist/config/render.d.ts.map +1 -1
  41. package/dist/config/render.js +4 -27
  42. package/dist/config/render.js.map +1 -1
  43. package/dist/config/schema.d.ts +21 -67
  44. package/dist/config/schema.d.ts.map +1 -1
  45. package/dist/config/schema.js +73 -112
  46. package/dist/config/schema.js.map +1 -1
  47. package/dist/core/agents-doc.d.ts.map +1 -1
  48. package/dist/core/agents-doc.js +2 -1
  49. package/dist/core/agents-doc.js.map +1 -1
  50. package/dist/core/browse/nav.d.ts.map +1 -1
  51. package/dist/core/browse/nav.js +4 -1
  52. package/dist/core/browse/nav.js.map +1 -1
  53. package/dist/core/browse/preferences.d.ts +26 -0
  54. package/dist/core/browse/preferences.d.ts.map +1 -0
  55. package/dist/core/browse/preferences.js +74 -0
  56. package/dist/core/browse/preferences.js.map +1 -0
  57. package/dist/core/browse/routes.d.ts +10 -8
  58. package/dist/core/browse/routes.d.ts.map +1 -1
  59. package/dist/core/browse/routes.js +113 -24
  60. package/dist/core/browse/routes.js.map +1 -1
  61. package/dist/core/browse/templates.d.ts +14 -4
  62. package/dist/core/browse/templates.d.ts.map +1 -1
  63. package/dist/core/browse/templates.js +22 -4
  64. package/dist/core/browse/templates.js.map +1 -1
  65. package/dist/core/checks/harness-portability-checks.d.ts +21 -0
  66. package/dist/core/checks/harness-portability-checks.d.ts.map +1 -1
  67. package/dist/core/checks/harness-portability-checks.js +46 -1
  68. package/dist/core/checks/harness-portability-checks.js.map +1 -1
  69. package/dist/core/checks/integrity-checks.d.ts +0 -2
  70. package/dist/core/checks/integrity-checks.d.ts.map +1 -1
  71. package/dist/core/checks/integrity-checks.js +38 -27
  72. package/dist/core/checks/integrity-checks.js.map +1 -1
  73. package/dist/core/checks/manifest.d.ts.map +1 -1
  74. package/dist/core/checks/manifest.js +2 -0
  75. package/dist/core/checks/manifest.js.map +1 -1
  76. package/dist/core/checks/store-checks.d.ts +12 -0
  77. package/dist/core/checks/store-checks.d.ts.map +1 -0
  78. package/dist/core/checks/store-checks.js +37 -0
  79. package/dist/core/checks/store-checks.js.map +1 -0
  80. package/dist/core/command.d.ts +6 -0
  81. package/dist/core/command.d.ts.map +1 -1
  82. package/dist/core/convention-doc.d.ts.map +1 -1
  83. package/dist/core/convention-doc.js +15 -9
  84. package/dist/core/convention-doc.js.map +1 -1
  85. package/dist/core/env.d.ts +5 -0
  86. package/dist/core/env.d.ts.map +1 -1
  87. package/dist/core/env.js +3 -0
  88. package/dist/core/env.js.map +1 -1
  89. package/dist/core/environment/probe.d.ts +12 -0
  90. package/dist/core/environment/probe.d.ts.map +1 -0
  91. package/dist/core/environment/probe.js +36 -0
  92. package/dist/core/environment/probe.js.map +1 -0
  93. package/dist/core/errors.d.ts +16 -3
  94. package/dist/core/errors.d.ts.map +1 -1
  95. package/dist/core/errors.js +41 -15
  96. package/dist/core/errors.js.map +1 -1
  97. package/dist/core/git/worktree.d.ts +22 -0
  98. package/dist/core/git/worktree.d.ts.map +1 -1
  99. package/dist/core/git/worktree.js +34 -0
  100. package/dist/core/git/worktree.js.map +1 -1
  101. package/dist/core/graph/model.d.ts +7 -6
  102. package/dist/core/graph/model.d.ts.map +1 -1
  103. package/dist/core/graph/model.js +11 -7
  104. package/dist/core/graph/model.js.map +1 -1
  105. package/dist/core/harness/isolated-run.d.ts +52 -0
  106. package/dist/core/harness/isolated-run.d.ts.map +1 -0
  107. package/dist/core/harness/isolated-run.js +100 -0
  108. package/dist/core/harness/isolated-run.js.map +1 -0
  109. package/dist/core/install-kind.d.ts +25 -0
  110. package/dist/core/install-kind.d.ts.map +1 -0
  111. package/dist/core/install-kind.js +56 -0
  112. package/dist/core/install-kind.js.map +1 -0
  113. package/dist/core/note-templates.d.ts +61 -0
  114. package/dist/core/note-templates.d.ts.map +1 -0
  115. package/dist/core/note-templates.js +188 -0
  116. package/dist/core/note-templates.js.map +1 -0
  117. package/dist/core/notes/list.d.ts.map +1 -1
  118. package/dist/core/notes/list.js +5 -0
  119. package/dist/core/notes/list.js.map +1 -1
  120. package/dist/core/publish/script-check.d.ts +5 -2
  121. package/dist/core/publish/script-check.d.ts.map +1 -1
  122. package/dist/core/publish/script-check.js +5 -2
  123. package/dist/core/publish/script-check.js.map +1 -1
  124. package/dist/core/reconcile.d.ts.map +1 -1
  125. package/dist/core/reconcile.js +8 -0
  126. package/dist/core/reconcile.js.map +1 -1
  127. package/dist/core/registry.d.ts +40 -0
  128. package/dist/core/registry.d.ts.map +1 -0
  129. package/dist/core/registry.js +55 -0
  130. package/dist/core/registry.js.map +1 -0
  131. package/dist/core/root.d.ts +11 -5
  132. package/dist/core/root.d.ts.map +1 -1
  133. package/dist/core/root.js +20 -8
  134. package/dist/core/root.js.map +1 -1
  135. package/dist/core/skills.d.ts.map +1 -1
  136. package/dist/core/skills.js +32 -15
  137. package/dist/core/skills.js.map +1 -1
  138. package/dist/core/version-check.d.ts +63 -0
  139. package/dist/core/version-check.d.ts.map +1 -0
  140. package/dist/core/version-check.js +181 -0
  141. package/dist/core/version-check.js.map +1 -0
  142. package/dist/core/write-lifecycle/path-gate.d.ts.map +1 -1
  143. package/dist/core/write-lifecycle/path-gate.js +4 -1
  144. package/dist/core/write-lifecycle/path-gate.js.map +1 -1
  145. package/dist/run.d.ts +1 -1
  146. package/dist/run.d.ts.map +1 -1
  147. package/dist/run.js +38 -16
  148. package/dist/run.js.map +1 -1
  149. package/dist/version.d.ts +8 -1
  150. package/dist/version.d.ts.map +1 -1
  151. package/dist/version.js +8 -1
  152. package/dist/version.js.map +1 -1
  153. package/package.json +1 -1
  154. package/templates/agents/canonical.md +5 -1
  155. package/templates/notes/Company.md +25 -0
  156. package/templates/notes/Concept.md +29 -0
  157. package/templates/notes/Deal.md +25 -0
  158. package/templates/notes/Note.md +6 -0
  159. package/templates/notes/People.md +19 -0
  160. package/templates/notes/Project.md +19 -0
  161. package/templates/serve/shell.html +16 -2
  162. package/templates/serve/style.css +145 -3
  163. package/templates/skills/ctxr-ingest-orchestration.md +4 -1
  164. package/templates/skills/ctxr-placement.md +21 -2
  165. package/templates/skills/ctxr-session-capture.md +5 -1
  166. package/templates/skills/ctxr-session-lifecycle.md +20 -0
  167. package/templates/skills/ctxr-upgrade.md +44 -0
  168. package/dist/commands/migrate.d.ts +0 -30
  169. package/dist/commands/migrate.d.ts.map +0 -1
  170. package/dist/commands/migrate.js +0 -56
  171. package/dist/commands/migrate.js.map +0 -1
  172. package/dist/core/migrations/add-explanation-craft-skill.d.ts +0 -26
  173. package/dist/core/migrations/add-explanation-craft-skill.d.ts.map +0 -1
  174. package/dist/core/migrations/add-explanation-craft-skill.js +0 -94
  175. package/dist/core/migrations/add-explanation-craft-skill.js.map +0 -1
  176. package/dist/core/migrations/archive-destination-from-taxonomy.d.ts +0 -35
  177. package/dist/core/migrations/archive-destination-from-taxonomy.d.ts.map +0 -1
  178. package/dist/core/migrations/archive-destination-from-taxonomy.js +0 -109
  179. package/dist/core/migrations/archive-destination-from-taxonomy.js.map +0 -1
  180. package/dist/core/migrations/config-defaults-as-the-convention.d.ts +0 -21
  181. package/dist/core/migrations/config-defaults-as-the-convention.d.ts.map +0 -1
  182. package/dist/core/migrations/config-defaults-as-the-convention.js +0 -54
  183. package/dist/core/migrations/config-defaults-as-the-convention.js.map +0 -1
  184. package/dist/core/migrations/drop-access-axes.d.ts +0 -24
  185. package/dist/core/migrations/drop-access-axes.d.ts.map +0 -1
  186. package/dist/core/migrations/drop-access-axes.js +0 -54
  187. package/dist/core/migrations/drop-access-axes.js.map +0 -1
  188. package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts +0 -19
  189. package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts.map +0 -1
  190. package/dist/core/migrations/drop-forge-and-workspaces-external.js +0 -49
  191. package/dist/core/migrations/drop-forge-and-workspaces-external.js.map +0 -1
  192. package/dist/core/migrations/registry.d.ts +0 -16
  193. package/dist/core/migrations/registry.d.ts.map +0 -1
  194. package/dist/core/migrations/registry.js +0 -34
  195. package/dist/core/migrations/registry.js.map +0 -1
  196. package/dist/core/migrations/rename-conventions-path.d.ts +0 -26
  197. package/dist/core/migrations/rename-conventions-path.d.ts.map +0 -1
  198. package/dist/core/migrations/rename-conventions-path.js +0 -86
  199. package/dist/core/migrations/rename-conventions-path.js.map +0 -1
  200. package/dist/core/migrations/rename-procedures-path.d.ts +0 -17
  201. package/dist/core/migrations/rename-procedures-path.d.ts.map +0 -1
  202. package/dist/core/migrations/rename-procedures-path.js +0 -45
  203. package/dist/core/migrations/rename-procedures-path.js.map +0 -1
  204. package/dist/core/migrations/retain-captures-as-provenance.d.ts +0 -22
  205. package/dist/core/migrations/retain-captures-as-provenance.d.ts.map +0 -1
  206. package/dist/core/migrations/retain-captures-as-provenance.js +0 -133
  207. package/dist/core/migrations/retain-captures-as-provenance.js.map +0 -1
  208. package/dist/core/migrations/types.d.ts +0 -27
  209. package/dist/core/migrations/types.d.ts.map +0 -1
  210. package/dist/core/migrations/types.js +0 -2
  211. package/dist/core/migrations/types.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-explanation-craft-skill.js","sourceRoot":"","sources":["../../../src/core/migrations/add-explanation-craft-skill.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * archive-destination-from-taxonomy: `ctxr init` wrote a fixed
4
- * `DEFAULT_ARCHIVE_PATH` regardless of the taxonomy it had just resolved, so
5
- * every PARA store was born with `archive/` while its own taxonomy declared
6
- * `archives/` — a config key pointing at a directory the store does not have.
7
- * Init now asks the profile; this migration does the same for stores already
8
- * on disk.
9
- *
10
- * Two independent halves, and the second is conditional:
11
- *
12
- * 1. The key rename is unconditional — every schema-5 store gets
13
- * `archive_destination`. `OrganizeSchema`'s fallback transform has already
14
- * resolved the old spelling by the time `readConfig` returns, so writing
15
- * the parsed config back is what drops `archive_path` from disk.
16
- * 2. The value only changes when the store never customized it AND its
17
- * profile declares a destination of its own. An operator who deliberately
18
- * set some other path keeps it; a Zettelkasten or Diataxis store, whose
19
- * profile declares none, keeps `archive/` — for them this is a pure key
20
- * rename. A custom taxonomy resolves to no shipped profile and is left
21
- * alone for the same reason.
22
- *
23
- * Like 0004, the directory move is a plain filesystem rename (migrations see
24
- * only `Store` — `root` + `config`, no `GitRunner`), and it is skipped when
25
- * the old directory was never created. History survives either way: whatever
26
- * commits this output stages a coherent delete-old/add-new diff, which
27
- * `git log --follow`'s rename detection reads identically to a `git mv`.
28
- *
29
- * Pending-ness is `schema_version < 6`, not key presence — the rule 0002,
30
- * 0004, and 0005 established, for the same reason: the fallback transform
31
- * populates `archive_destination` on an unmigrated store too, so its presence
32
- * cannot distinguish migrated from not.
33
- */
34
- export declare const archiveDestinationFromTaxonomyMigration: Migration;
35
- //# sourceMappingURL=archive-destination-from-taxonomy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive-destination-from-taxonomy.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/archive-destination-from-taxonomy.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAc5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,uCAAuC,EAAE,SA4CrD,CAAC"}
@@ -1,109 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { rename } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { readConfig } from '../../config/load.js';
5
- import { DEFAULT_ARCHIVE_DESTINATION } from '../../config/defaults.js';
6
- import { renderStoreConfig } from '../../config/render.js';
7
- import { profileById } from '../../taxonomy/profiles.js';
8
- import { writeFileAtomic } from '../fs/atomic.js';
9
- const CONFIG_DELTA = {
10
- path: 'contexture.yaml',
11
- description: 'rename organize.archive_path to organize.archive_destination and set schema_version to 6',
12
- };
13
- function destinationDelta(from, to) {
14
- return {
15
- path: to,
16
- description: `adopt the taxonomy's own archive destination, moving the default-valued archive directory from ${from} to ${to}`,
17
- };
18
- }
19
- /**
20
- * archive-destination-from-taxonomy: `ctxr init` wrote a fixed
21
- * `DEFAULT_ARCHIVE_PATH` regardless of the taxonomy it had just resolved, so
22
- * every PARA store was born with `archive/` while its own taxonomy declared
23
- * `archives/` — a config key pointing at a directory the store does not have.
24
- * Init now asks the profile; this migration does the same for stores already
25
- * on disk.
26
- *
27
- * Two independent halves, and the second is conditional:
28
- *
29
- * 1. The key rename is unconditional — every schema-5 store gets
30
- * `archive_destination`. `OrganizeSchema`'s fallback transform has already
31
- * resolved the old spelling by the time `readConfig` returns, so writing
32
- * the parsed config back is what drops `archive_path` from disk.
33
- * 2. The value only changes when the store never customized it AND its
34
- * profile declares a destination of its own. An operator who deliberately
35
- * set some other path keeps it; a Zettelkasten or Diataxis store, whose
36
- * profile declares none, keeps `archive/` — for them this is a pure key
37
- * rename. A custom taxonomy resolves to no shipped profile and is left
38
- * alone for the same reason.
39
- *
40
- * Like 0004, the directory move is a plain filesystem rename (migrations see
41
- * only `Store` — `root` + `config`, no `GitRunner`), and it is skipped when
42
- * the old directory was never created. History survives either way: whatever
43
- * commits this output stages a coherent delete-old/add-new diff, which
44
- * `git log --follow`'s rename detection reads identically to a `git mv`.
45
- *
46
- * Pending-ness is `schema_version < 6`, not key presence — the rule 0002,
47
- * 0004, and 0005 established, for the same reason: the fallback transform
48
- * populates `archive_destination` on an unmigrated store too, so its presence
49
- * cannot distinguish migrated from not.
50
- */
51
- export const archiveDestinationFromTaxonomyMigration = {
52
- id: '0006-archive-destination-from-taxonomy',
53
- fromVersion: 5,
54
- toVersion: 6,
55
- description: "Rename the organize.archive_path config key to organize.archive_destination, adopt the taxonomy profile's own archive destination when the value still sat at the shipped default, and bump schema_version to 6.",
56
- async plan(store) {
57
- if (store.config.schema_version >= 6)
58
- return [];
59
- const deltas = [CONFIG_DELTA];
60
- const target = taxonomyDestination(store.config.taxonomy.profile, store.config.organize.archive_destination);
61
- if (target)
62
- deltas.push(destinationDelta(DEFAULT_ARCHIVE_DESTINATION, target));
63
- return deltas;
64
- },
65
- async apply(store) {
66
- if (store.config.schema_version >= 6)
67
- return [];
68
- const configPath = path.join(store.root, 'contexture.yaml');
69
- const currentConfig = await readConfig(store.root);
70
- const appliedDeltas = [CONFIG_DELTA];
71
- let destination = currentConfig.organize.archive_destination;
72
- const target = taxonomyDestination(currentConfig.taxonomy.profile, destination);
73
- if (target) {
74
- const oldDir = path.join(store.root, DEFAULT_ARCHIVE_DESTINATION);
75
- const newDir = path.join(store.root, target);
76
- // Absent whenever nothing was ever archived — only the config changes.
77
- if (existsSync(oldDir) && !existsSync(newDir)) {
78
- await rename(oldDir, newDir);
79
- }
80
- destination = target;
81
- appliedDeltas.push(destinationDelta(DEFAULT_ARCHIVE_DESTINATION, target));
82
- }
83
- const nextConfig = {
84
- ...currentConfig,
85
- schema_version: 6,
86
- organize: { ...currentConfig.organize, archive_destination: destination },
87
- };
88
- await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
89
- return appliedDeltas;
90
- },
91
- };
92
- /**
93
- * The profile's own destination, but only when adopting it is safe: the
94
- * store must still be sitting on the shipped default (otherwise the value is
95
- * the operator's, not ours to rewrite), the profile must be a shipped one
96
- * that declares a destination, and it must actually differ from what's
97
- * already configured.
98
- */
99
- function taxonomyDestination(profileId, current) {
100
- if (current !== DEFAULT_ARCHIVE_DESTINATION)
101
- return undefined;
102
- if (profileId === null)
103
- return undefined;
104
- const declared = profileById(profileId)?.archiveDestination;
105
- if (declared === undefined || declared === current)
106
- return undefined;
107
- return declared;
108
- }
109
- //# sourceMappingURL=archive-destination-from-taxonomy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"archive-destination-from-taxonomy.js","sourceRoot":"","sources":["../../../src/core/migrations/archive-destination-from-taxonomy.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * config-defaults-as-the-convention: every store written before this change
4
- * restates the whole convention verbatim, because `init` wrote every resolved
5
- * value. That is what made a changed shipped default reach existing stores
6
- * only through a migration rewriting files whose operators never chose those
7
- * values.
8
- *
9
- * This removes the restatements. It cannot tell an echo `init` wrote from a
10
- * value an operator typed that happens to equal the default — and treats them
11
- * the same deliberately: agreeing with the convention is not a decision that
12
- * needs recording, and after pruning the store resolves the identical value.
13
- * An operator who wants to pin a value against a future default change
14
- * re-declares it, which is now a meaningful act rather than one line among
15
- * forty identical ones.
16
- *
17
- * The pruning itself lives in `renderStoreConfig`, not here — every writer
18
- * goes through it, so this migration only has to trigger a write.
19
- */
20
- export declare const configDefaultsAsTheConventionMigration: Migration;
21
- //# sourceMappingURL=config-defaults-as-the-convention.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-defaults-as-the-convention.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/config-defaults-as-the-convention.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAI5D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sCAAsC,EAAE,SA+BpD,CAAC"}
@@ -1,54 +0,0 @@
1
- import path from 'node:path';
2
- import { readConfig } from '../../config/load.js';
3
- import { redundantKeyPaths, renderStoreConfig } from '../../config/render.js';
4
- import { writeFileAtomic } from '../fs/atomic.js';
5
- const CONFIG_PATH = 'contexture.yaml';
6
- /**
7
- * config-defaults-as-the-convention: every store written before this change
8
- * restates the whole convention verbatim, because `init` wrote every resolved
9
- * value. That is what made a changed shipped default reach existing stores
10
- * only through a migration rewriting files whose operators never chose those
11
- * values.
12
- *
13
- * This removes the restatements. It cannot tell an echo `init` wrote from a
14
- * value an operator typed that happens to equal the default — and treats them
15
- * the same deliberately: agreeing with the convention is not a decision that
16
- * needs recording, and after pruning the store resolves the identical value.
17
- * An operator who wants to pin a value against a future default change
18
- * re-declares it, which is now a meaningful act rather than one line among
19
- * forty identical ones.
20
- *
21
- * The pruning itself lives in `renderStoreConfig`, not here — every writer
22
- * goes through it, so this migration only has to trigger a write.
23
- */
24
- export const configDefaultsAsTheConventionMigration = {
25
- id: '0010-config-defaults-as-the-convention',
26
- fromVersion: 9,
27
- toVersion: 10,
28
- description: 'Remove configuration keys whose value already equals contexture\'s shipped default, so the file records only what the store chose, and bump schema_version to 10.',
29
- async plan(store) {
30
- if (store.config.schema_version >= 10)
31
- return [];
32
- const deltas = [
33
- { path: CONFIG_PATH, description: 'set schema_version to 10' },
34
- ];
35
- for (const key of redundantKeyPaths(store.config)) {
36
- deltas.push({
37
- path: CONFIG_PATH,
38
- description: `remove ${key}, which already holds contexture's shipped default`,
39
- });
40
- }
41
- return deltas;
42
- },
43
- async apply(store) {
44
- if (store.config.schema_version >= 10)
45
- return [];
46
- const currentConfig = await readConfig(store.root);
47
- const appliedDeltas = await this.plan({ ...store, config: currentConfig });
48
- // renderStoreConfig drops every redundant key on the way out, and its
49
- // round-trip re-parse proves the pruned file still resolves to this.
50
- await writeFileAtomic(path.join(store.root, CONFIG_PATH), renderStoreConfig({ ...currentConfig, schema_version: 10 }));
51
- return appliedDeltas;
52
- },
53
- };
54
- //# sourceMappingURL=config-defaults-as-the-convention.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-defaults-as-the-convention.js","sourceRoot":"","sources":["../../../src/core/migrations/config-defaults-as-the-convention.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAc;IAC/D,EAAE,EAAE,wCAAwC;IAC5C,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,EAAE;IACb,WAAW,EACT,mKAAmK;IAErK,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QACjD,MAAM,MAAM,GAAqB;YAC/B,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,0BAA0B,EAAE;SAC/D,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,UAAU,GAAG,oDAAoD;aAC/E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK;QACf,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAEjD,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC3E,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvH,OAAO,aAAa,CAAC;IACvB,CAAC;CACF,CAAC"}
@@ -1,24 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * retire-the-access-axes: the visibility and disclosure axes are removed, and
4
- * with them `fields.visibility` (the configurable name of the visibility
5
- * frontmatter key).
6
- *
7
- * Unlike 0005, this migration cannot lean on `readConfig` having already
8
- * stripped the legacy shape: all three keys are TOP-LEVEL, and
9
- * `StoreConfigSchema` is `.passthrough()`, so they survive parsing intact.
10
- * Deleting them explicitly is the whole job.
11
- *
12
- * No note is rewritten (design.md D3). A note's retired visibility-field key
13
- * stays in its frontmatter, unread — `parseNote` reads frontmatter into a
14
- * `Record<string, unknown>` and nothing consumes that key any more, so it
15
- * costs nothing at runtime and keeps the removal cheap to reverse. Stripping
16
- * it would make re-entry a hand re-labelling pass over every note.
17
- *
18
- * Pending-ness is `schema_version < 8`, not key presence — the rule every
19
- * migration from 0002 onward established. A store could have had its config
20
- * hand-edited to drop the keys while still sitting at an older version, and
21
- * it still needs the version bump.
22
- */
23
- export declare const dropAccessAxesMigration: Migration;
24
- //# sourceMappingURL=drop-access-axes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drop-access-axes.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/drop-access-axes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAU5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAuBrC,CAAC"}
@@ -1,54 +0,0 @@
1
- import path from 'node:path';
2
- import { readConfig } from '../../config/load.js';
3
- import { renderStoreConfig } from '../../config/render.js';
4
- import { writeFileAtomic } from '../fs/atomic.js';
5
- const CONFIG_DELTA = {
6
- path: 'contexture.yaml',
7
- description: 'remove the visibility:, disclosure:, and fields: blocks, and set schema_version to 8',
8
- };
9
- /** The retired top-level keys, named here as fixed historical literals — no constant for them survives. */
10
- const RETIRED_KEYS = ['visibility', 'disclosure', 'fields'];
11
- /**
12
- * retire-the-access-axes: the visibility and disclosure axes are removed, and
13
- * with them `fields.visibility` (the configurable name of the visibility
14
- * frontmatter key).
15
- *
16
- * Unlike 0005, this migration cannot lean on `readConfig` having already
17
- * stripped the legacy shape: all three keys are TOP-LEVEL, and
18
- * `StoreConfigSchema` is `.passthrough()`, so they survive parsing intact.
19
- * Deleting them explicitly is the whole job.
20
- *
21
- * No note is rewritten (design.md D3). A note's retired visibility-field key
22
- * stays in its frontmatter, unread — `parseNote` reads frontmatter into a
23
- * `Record<string, unknown>` and nothing consumes that key any more, so it
24
- * costs nothing at runtime and keeps the removal cheap to reverse. Stripping
25
- * it would make re-entry a hand re-labelling pass over every note.
26
- *
27
- * Pending-ness is `schema_version < 8`, not key presence — the rule every
28
- * migration from 0002 onward established. A store could have had its config
29
- * hand-edited to drop the keys while still sitting at an older version, and
30
- * it still needs the version bump.
31
- */
32
- export const dropAccessAxesMigration = {
33
- id: '0008-drop-access-axes',
34
- fromVersion: 7,
35
- toVersion: 8,
36
- description: 'Remove the visibility:, disclosure:, and fields: blocks from contexture.yaml, and bump schema_version to 8. No note is modified.',
37
- async plan(store) {
38
- if (store.config.schema_version >= 8)
39
- return [];
40
- return [CONFIG_DELTA];
41
- },
42
- async apply(store) {
43
- if (store.config.schema_version >= 8)
44
- return [];
45
- const configPath = path.join(store.root, 'contexture.yaml');
46
- const currentConfig = await readConfig(store.root);
47
- const nextConfig = { ...currentConfig, schema_version: 8 };
48
- for (const key of RETIRED_KEYS)
49
- delete nextConfig[key];
50
- await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
51
- return [CONFIG_DELTA];
52
- },
53
- };
54
- //# sourceMappingURL=drop-access-axes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drop-access-axes.js","sourceRoot":"","sources":["../../../src/core/migrations/drop-access-axes.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,YAAY,GAAmB;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,sFAAsF;CACpG,CAAC;AAEF,2GAA2G;AAC3G,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAc;IAChD,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EACT,kIAAkI;IAEpI,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK;QACf,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAEhD,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,MAAM,UAAU,GAA4B,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACpF,KAAK,MAAM,GAAG,IAAI,YAAY;YAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,eAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAqD,CAAC,CAAC,CAAC;QAE5G,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;CACF,CAAC"}
@@ -1,19 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * session-keeps-only-what-git-cannot-do (design D2): `ctxr session
4
- * submit`/`land`/`abandon`/`reap` and the `forge` adapter kind are removed;
5
- * `session.workspaces_external` goes with them, its skill-rendering half
6
- * never having worked as shipped. Both legacy shapes are ALREADY stripped
7
- * by the time `readConfig` returns — the adapters field's lenient schema
8
- * transform drops a `kind: forge` entry (session-keeps-only-what-git-cannot-do
9
- * D2), and `SessionSchema`'s default strip-unknown-keys behavior drops
10
- * `workspaces_external` — so this migration's only real work is bumping
11
- * `schema_version` and writing the already-clean config back to disk.
12
- *
13
- * Pending-ness is `schema_version < 5`, not key presence — the same rule
14
- * 0002 and 0004 established, for the same reason: an unmigrated store
15
- * already parses as though the legacy shape were gone, so its presence in
16
- * the parsed config can't distinguish migrated from not.
17
- */
18
- export declare const dropForgeAndWorkspacesExternalMigration: Migration;
19
- //# sourceMappingURL=drop-forge-and-workspaces-external.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drop-forge-and-workspaces-external.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/drop-forge-and-workspaces-external.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAO5D;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,uCAAuC,EAAE,SA0BrD,CAAC"}
@@ -1,49 +0,0 @@
1
- import path from 'node:path';
2
- import { readConfig } from '../../config/load.js';
3
- import { renderStoreConfig } from '../../config/render.js';
4
- import { writeFileAtomic } from '../fs/atomic.js';
5
- const CONFIG_DELTA = {
6
- path: 'contexture.yaml',
7
- description: 'strip any legacy kind: forge adapter declarations and the session.workspaces_external key, and set schema_version to 5',
8
- };
9
- /**
10
- * session-keeps-only-what-git-cannot-do (design D2): `ctxr session
11
- * submit`/`land`/`abandon`/`reap` and the `forge` adapter kind are removed;
12
- * `session.workspaces_external` goes with them, its skill-rendering half
13
- * never having worked as shipped. Both legacy shapes are ALREADY stripped
14
- * by the time `readConfig` returns — the adapters field's lenient schema
15
- * transform drops a `kind: forge` entry (session-keeps-only-what-git-cannot-do
16
- * D2), and `SessionSchema`'s default strip-unknown-keys behavior drops
17
- * `workspaces_external` — so this migration's only real work is bumping
18
- * `schema_version` and writing the already-clean config back to disk.
19
- *
20
- * Pending-ness is `schema_version < 5`, not key presence — the same rule
21
- * 0002 and 0004 established, for the same reason: an unmigrated store
22
- * already parses as though the legacy shape were gone, so its presence in
23
- * the parsed config can't distinguish migrated from not.
24
- */
25
- export const dropForgeAndWorkspacesExternalMigration = {
26
- id: '0005-drop-forge-and-workspaces-external',
27
- fromVersion: 4,
28
- toVersion: 5,
29
- description: 'Strip any legacy kind: forge adapter declarations and the session.workspaces_external key from contexture.yaml, and bump schema_version to 5.',
30
- async plan(store) {
31
- if (store.config.schema_version >= 5)
32
- return [];
33
- return [CONFIG_DELTA];
34
- },
35
- async apply(store) {
36
- if (store.config.schema_version >= 5)
37
- return [];
38
- const configPath = path.join(store.root, 'contexture.yaml');
39
- // readConfig() already applies the lenient schema — a raw `kind: forge`
40
- // entry and a raw `session.workspaces_external` key are both gone from
41
- // this object before this line runs; writing it back is what removes
42
- // them from disk.
43
- const currentConfig = await readConfig(store.root);
44
- const nextConfig = { ...currentConfig, schema_version: 5 };
45
- await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
46
- return [CONFIG_DELTA];
47
- },
48
- };
49
- //# sourceMappingURL=drop-forge-and-workspaces-external.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drop-forge-and-workspaces-external.js","sourceRoot":"","sources":["../../../src/core/migrations/drop-forge-and-workspaces-external.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,YAAY,GAAmB;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,wHAAwH;CACtI,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAc;IAChE,EAAE,EAAE,yCAAyC;IAC7C,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EACT,+IAA+I;IAEjJ,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK;QACf,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAEhD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC5D,wEAAwE;QACxE,uEAAuE;QACvE,qEAAqE;QACrE,kBAAkB;QAClB,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,eAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;CACF,CAAC"}
@@ -1,16 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * Every migration contexture ships, in ascending fromVersion order. Later
4
- * phases append here, nothing else.
5
- *
6
- * The chain is deliberately NOT contiguous: the 1 -> 2 visibility-field
7
- * rename was retired with the field itself (retire-the-access-axes D7), so a
8
- * schema-1 store's first pending migration is the 2 -> 3 one, which guards on
9
- * `schema_version < 3` and carries it straight there. `pendingMigrations`
10
- * selects on `fromVersion >= current`, never on adjacency, so a gap costs
11
- * nothing.
12
- */
13
- export declare const MIGRATIONS: readonly Migration[];
14
- /** Every migration a store currently at `fromVersion` still needs to reach the CLI's supported version, in order. */
15
- export declare function pendingMigrations(fromVersion: number): Migration[];
16
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAS1C,CAAC;AAEF,qHAAqH;AACrH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,CAElE"}
@@ -1,34 +0,0 @@
1
- import { addExplanationCraftSkillMigration } from './add-explanation-craft-skill.js';
2
- import { configDefaultsAsTheConventionMigration } from './config-defaults-as-the-convention.js';
3
- import { archiveDestinationFromTaxonomyMigration } from './archive-destination-from-taxonomy.js';
4
- import { dropAccessAxesMigration } from './drop-access-axes.js';
5
- import { dropForgeAndWorkspacesExternalMigration } from './drop-forge-and-workspaces-external.js';
6
- import { renameConventionsPathMigration } from './rename-conventions-path.js';
7
- import { renameProceduresPathMigration } from './rename-procedures-path.js';
8
- import { retainCapturesAsProvenanceMigration } from './retain-captures-as-provenance.js';
9
- /**
10
- * Every migration contexture ships, in ascending fromVersion order. Later
11
- * phases append here, nothing else.
12
- *
13
- * The chain is deliberately NOT contiguous: the 1 -> 2 visibility-field
14
- * rename was retired with the field itself (retire-the-access-axes D7), so a
15
- * schema-1 store's first pending migration is the 2 -> 3 one, which guards on
16
- * `schema_version < 3` and carries it straight there. `pendingMigrations`
17
- * selects on `fromVersion >= current`, never on adjacency, so a gap costs
18
- * nothing.
19
- */
20
- export const MIGRATIONS = [
21
- renameProceduresPathMigration,
22
- renameConventionsPathMigration,
23
- dropForgeAndWorkspacesExternalMigration,
24
- archiveDestinationFromTaxonomyMigration,
25
- addExplanationCraftSkillMigration,
26
- dropAccessAxesMigration,
27
- retainCapturesAsProvenanceMigration,
28
- configDefaultsAsTheConventionMigration,
29
- ];
30
- /** Every migration a store currently at `fromVersion` still needs to reach the CLI's supported version, in order. */
31
- export function pendingMigrations(fromVersion) {
32
- return MIGRATIONS.filter((m) => m.fromVersion >= fromVersion).slice().sort((a, b) => a.fromVersion - b.fromVersion);
33
- }
34
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/migrations/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,sCAAsC,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EAAE,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAGzF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,6BAA6B;IAC7B,8BAA8B;IAC9B,uCAAuC;IACvC,uCAAuC;IACvC,iCAAiC;IACjC,uBAAuB;IACvB,mCAAmC;IACnC,sCAAsC;CACvC,CAAC;AAEF,qHAAqH;AACrH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACtH,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * rename-conventions-path-to-guidance-path (compose-store-guidance-documents
4
- * design.md D1/D7): unlike 0003's pure key rename, the key's *default value*
5
- * also changes (`.contexture/conventions/` -> `.contexture/guidance/`), so a
6
- * store that never customized the path needs its directory moved on disk,
7
- * not merely its config key renamed. An operator-customized path is left
8
- * exactly where it is — only the key spelling changes for them.
9
- *
10
- * Migrations only see `Store` (`root` + `config`, no `GitRunner` — see
11
- * core/store.ts), so the directory move is a plain filesystem rename, not
12
- * `git mv`. History is still preserved: whatever commits this migration's
13
- * output (the normal session-submit flow) stages a coherent delete-old,
14
- * add-new diff, which `git log --follow`'s content-similarity rename
15
- * detection recognizes identically to an explicit `git mv` — git never
16
- * records "this was a rename" as a distinct fact in its object model
17
- * either way.
18
- *
19
- * Pending-ness is `store.config.schema_version < 4`, the same
20
- * schema-version-not-key-presence rule 0003 established, for the same
21
- * reason: `HarnessSchema`'s fallback transform already populates
22
- * `guidance_path` on an unmigrated store, so its presence can't distinguish
23
- * migrated from not.
24
- */
25
- export declare const renameConventionsPathMigration: Migration;
26
- //# sourceMappingURL=rename-conventions-path.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename-conventions-path.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/rename-conventions-path.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAiB5D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,8BAA8B,EAAE,SA+C5C,CAAC"}
@@ -1,86 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { rename } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { readConfig } from '../../config/load.js';
5
- import { renderStoreConfig } from '../../config/render.js';
6
- import { writeFileAtomic } from '../fs/atomic.js';
7
- const OLD_DEFAULT_GUIDANCE_PATH = '.contexture/conventions/';
8
- const NEW_DEFAULT_GUIDANCE_PATH = '.contexture/guidance/';
9
- const CONFIG_DELTA = {
10
- path: 'contexture.yaml',
11
- description: 'rename harness.conventions_path to harness.guidance_path and set schema_version to 4',
12
- };
13
- function directoryDelta() {
14
- return {
15
- path: NEW_DEFAULT_GUIDANCE_PATH,
16
- description: `move the default-valued guidance directory from ${OLD_DEFAULT_GUIDANCE_PATH} to ${NEW_DEFAULT_GUIDANCE_PATH}`,
17
- };
18
- }
19
- /**
20
- * rename-conventions-path-to-guidance-path (compose-store-guidance-documents
21
- * design.md D1/D7): unlike 0003's pure key rename, the key's *default value*
22
- * also changes (`.contexture/conventions/` -> `.contexture/guidance/`), so a
23
- * store that never customized the path needs its directory moved on disk,
24
- * not merely its config key renamed. An operator-customized path is left
25
- * exactly where it is — only the key spelling changes for them.
26
- *
27
- * Migrations only see `Store` (`root` + `config`, no `GitRunner` — see
28
- * core/store.ts), so the directory move is a plain filesystem rename, not
29
- * `git mv`. History is still preserved: whatever commits this migration's
30
- * output (the normal session-submit flow) stages a coherent delete-old,
31
- * add-new diff, which `git log --follow`'s content-similarity rename
32
- * detection recognizes identically to an explicit `git mv` — git never
33
- * records "this was a rename" as a distinct fact in its object model
34
- * either way.
35
- *
36
- * Pending-ness is `store.config.schema_version < 4`, the same
37
- * schema-version-not-key-presence rule 0003 established, for the same
38
- * reason: `HarnessSchema`'s fallback transform already populates
39
- * `guidance_path` on an unmigrated store, so its presence can't distinguish
40
- * migrated from not.
41
- */
42
- export const renameConventionsPathMigration = {
43
- id: '0004-rename-conventions-path-to-guidance-path',
44
- fromVersion: 3,
45
- toVersion: 4,
46
- description: 'Rename the harness.conventions_path config key to harness.guidance_path, move the guidance directory when it sat at the old default, and bump schema_version to 4.',
47
- async plan(store) {
48
- if (store.config.schema_version >= 4)
49
- return [];
50
- const deltas = [CONFIG_DELTA];
51
- if (store.config.harness.guidance_path === OLD_DEFAULT_GUIDANCE_PATH)
52
- deltas.push(directoryDelta());
53
- return deltas;
54
- },
55
- async apply(store) {
56
- if (store.config.schema_version >= 4)
57
- return [];
58
- const configPath = path.join(store.root, 'contexture.yaml');
59
- // readConfig() already resolves harness.guidance_path via HarnessSchema's
60
- // fallback (from conventions_path if that's all the file has), so
61
- // currentConfig.harness carries no conventions_path key at all —
62
- // rendering it below writes only guidance_path to disk.
63
- const currentConfig = await readConfig(store.root);
64
- const appliedDeltas = [CONFIG_DELTA];
65
- let guidancePath = currentConfig.harness.guidance_path;
66
- if (guidancePath === OLD_DEFAULT_GUIDANCE_PATH) {
67
- const oldDir = path.join(store.root, OLD_DEFAULT_GUIDANCE_PATH);
68
- const newDir = path.join(store.root, NEW_DEFAULT_GUIDANCE_PATH);
69
- // Absent when the store never carried any convention files — nothing
70
- // to move on disk, only the config value changes.
71
- if (existsSync(oldDir)) {
72
- await rename(oldDir, newDir);
73
- }
74
- guidancePath = NEW_DEFAULT_GUIDANCE_PATH;
75
- appliedDeltas.push(directoryDelta());
76
- }
77
- const nextConfig = {
78
- ...currentConfig,
79
- schema_version: 4,
80
- harness: { ...currentConfig.harness, guidance_path: guidancePath },
81
- };
82
- await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
83
- return appliedDeltas;
84
- },
85
- };
86
- //# sourceMappingURL=rename-conventions-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename-conventions-path.js","sourceRoot":"","sources":["../../../src/core/migrations/rename-conventions-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAC7D,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAE1D,MAAM,YAAY,GAAmB;IACnC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,sFAAsF;CACpG,CAAC;AAEF,SAAS,cAAc;IACrB,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,mDAAmD,yBAAyB,OAAO,yBAAyB,EAAE;KAC5H,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAc;IACvD,EAAE,EAAE,+CAA+C;IACnD,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,WAAW,EACT,oKAAoK;IAEtK,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,MAAM,GAAqB,CAAC,YAAY,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,KAAK,yBAAyB;YAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACpG,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK;QACf,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAEhD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC5D,0EAA0E;QAC1E,kEAAkE;QAClE,iEAAiE;QACjE,wDAAwD;QACxD,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,aAAa,GAAqB,CAAC,YAAY,CAAC,CAAC;QAEvD,IAAI,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC;QACvD,IAAI,YAAY,KAAK,yBAAyB,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;YAChE,qEAAqE;YACrE,kDAAkD;YAClD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC;YACD,YAAY,GAAG,yBAAyB,CAAC;YACzC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,UAAU,GAAG;YACjB,GAAG,aAAa;YAChB,cAAc,EAAE,CAAC;YACjB,OAAO,EAAE,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE;SACnE,CAAC;QACF,MAAM,eAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjE,OAAO,aAAa,CAAC;IACvB,CAAC;CACF,CAAC"}
@@ -1,17 +0,0 @@
1
- import type { Migration } from './types.js';
2
- /**
3
- * rename-procedures-to-skills (design.md D2): a single-delta migration —
4
- * unlike the visibility-field rename, no note frontmatter is touched, since
5
- * only the config key's spelling changes, never any store file's location
6
- * (DEFAULT_SKILLS_PATH is already DEFAULT_PROCEDURES_PATH's old value).
7
- *
8
- * Pending-ness is `store.config.schema_version < 3`, NOT the presence or
9
- * absence of `store.config.harness.skills_path` — that field is populated
10
- * by HarnessSchema's fallback transform even on an unmigrated v2 store (so
11
- * every command keeps working before `ctxr migrate` runs), which means its
12
- * presence can never distinguish "already migrated" from "not yet
13
- * migrated." `schema_version` is the one signal the fallback doesn't mask,
14
- * and this migration is the only thing that ever sets it to 3.
15
- */
16
- export declare const renameProceduresPathMigration: Migration;
17
- //# sourceMappingURL=rename-procedures-path.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename-procedures-path.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/rename-procedures-path.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAO5D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,EAAE,SAwB3C,CAAC"}