@ibgib/vcs-gib 0.0.6

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 (202) hide show
  1. package/README.md +94 -0
  2. package/VCS_CLI_USER_GUIDE.md +198 -0
  3. package/dist/AUTO-GENERATED-version.d.mts +6 -0
  4. package/dist/AUTO-GENERATED-version.d.mts.map +1 -0
  5. package/dist/AUTO-GENERATED-version.mjs +6 -0
  6. package/dist/AUTO-GENERATED-version.mjs.map +1 -0
  7. package/dist/assumptions.respec.d.mts +2 -0
  8. package/dist/assumptions.respec.d.mts.map +1 -0
  9. package/dist/assumptions.respec.mjs +41 -0
  10. package/dist/assumptions.respec.mjs.map +1 -0
  11. package/dist/bootstrap/node-bootstrap.d.mts +35 -0
  12. package/dist/bootstrap/node-bootstrap.d.mts.map +1 -0
  13. package/dist/bootstrap/node-bootstrap.mjs +165 -0
  14. package/dist/bootstrap/node-bootstrap.mjs.map +1 -0
  15. package/dist/bootstrap/node-bootstrap.respec.node.d.mts +7 -0
  16. package/dist/bootstrap/node-bootstrap.respec.node.d.mts.map +1 -0
  17. package/dist/bootstrap/node-bootstrap.respec.node.mjs +28 -0
  18. package/dist/bootstrap/node-bootstrap.respec.node.mjs.map +1 -0
  19. package/dist/cli/cli-arg-parser.d.mts +27 -0
  20. package/dist/cli/cli-arg-parser.d.mts.map +1 -0
  21. package/dist/cli/cli-arg-parser.mjs +96 -0
  22. package/dist/cli/cli-arg-parser.mjs.map +1 -0
  23. package/dist/cli/cli-arg-parser.respec.node.d.mts +7 -0
  24. package/dist/cli/cli-arg-parser.respec.node.d.mts.map +1 -0
  25. package/dist/cli/cli-arg-parser.respec.node.mjs +35 -0
  26. package/dist/cli/cli-arg-parser.respec.node.mjs.map +1 -0
  27. package/dist/cli/cli-constants.d.mts +26 -0
  28. package/dist/cli/cli-constants.d.mts.map +1 -0
  29. package/dist/cli/cli-constants.mjs +67 -0
  30. package/dist/cli/cli-constants.mjs.map +1 -0
  31. package/dist/cli/cli-e2e.respec.node.d.mts +8 -0
  32. package/dist/cli/cli-e2e.respec.node.d.mts.map +1 -0
  33. package/dist/cli/cli-e2e.respec.node.mjs +263 -0
  34. package/dist/cli/cli-e2e.respec.node.mjs.map +1 -0
  35. package/dist/cli/commands/add-cmd.d.mts +20 -0
  36. package/dist/cli/commands/add-cmd.d.mts.map +1 -0
  37. package/dist/cli/commands/add-cmd.mjs +333 -0
  38. package/dist/cli/commands/add-cmd.mjs.map +1 -0
  39. package/dist/cli/commands/branch-checkout-cmd.respec.node.d.mts +7 -0
  40. package/dist/cli/commands/branch-checkout-cmd.respec.node.d.mts.map +1 -0
  41. package/dist/cli/commands/branch-checkout-cmd.respec.node.mjs +288 -0
  42. package/dist/cli/commands/branch-checkout-cmd.respec.node.mjs.map +1 -0
  43. package/dist/cli/commands/branch-cmd.d.mts +25 -0
  44. package/dist/cli/commands/branch-cmd.d.mts.map +1 -0
  45. package/dist/cli/commands/branch-cmd.mjs +187 -0
  46. package/dist/cli/commands/branch-cmd.mjs.map +1 -0
  47. package/dist/cli/commands/checkout-cmd.d.mts +21 -0
  48. package/dist/cli/commands/checkout-cmd.d.mts.map +1 -0
  49. package/dist/cli/commands/checkout-cmd.mjs +154 -0
  50. package/dist/cli/commands/checkout-cmd.mjs.map +1 -0
  51. package/dist/cli/commands/commit-cmd.d.mts +23 -0
  52. package/dist/cli/commands/commit-cmd.d.mts.map +1 -0
  53. package/dist/cli/commands/commit-cmd.mjs +326 -0
  54. package/dist/cli/commands/commit-cmd.mjs.map +1 -0
  55. package/dist/cli/commands/commit-log-cmd.respec.node.d.mts +7 -0
  56. package/dist/cli/commands/commit-log-cmd.respec.node.d.mts.map +1 -0
  57. package/dist/cli/commands/commit-log-cmd.respec.node.mjs +251 -0
  58. package/dist/cli/commands/commit-log-cmd.respec.node.mjs.map +1 -0
  59. package/dist/cli/commands/init-cmd.d.mts +20 -0
  60. package/dist/cli/commands/init-cmd.d.mts.map +1 -0
  61. package/dist/cli/commands/init-cmd.mjs +119 -0
  62. package/dist/cli/commands/init-cmd.mjs.map +1 -0
  63. package/dist/cli/commands/init-cmd.respec.node.d.mts +7 -0
  64. package/dist/cli/commands/init-cmd.respec.node.d.mts.map +1 -0
  65. package/dist/cli/commands/init-cmd.respec.node.mjs +40 -0
  66. package/dist/cli/commands/init-cmd.respec.node.mjs.map +1 -0
  67. package/dist/cli/commands/log-cmd.d.mts +27 -0
  68. package/dist/cli/commands/log-cmd.d.mts.map +1 -0
  69. package/dist/cli/commands/log-cmd.mjs +146 -0
  70. package/dist/cli/commands/log-cmd.mjs.map +1 -0
  71. package/dist/cli/commands/status-add-cmd.respec.node.d.mts +7 -0
  72. package/dist/cli/commands/status-add-cmd.respec.node.d.mts.map +1 -0
  73. package/dist/cli/commands/status-add-cmd.respec.node.mjs +215 -0
  74. package/dist/cli/commands/status-add-cmd.respec.node.mjs.map +1 -0
  75. package/dist/cli/commands/status-cmd.d.mts +25 -0
  76. package/dist/cli/commands/status-cmd.d.mts.map +1 -0
  77. package/dist/cli/commands/status-cmd.mjs +286 -0
  78. package/dist/cli/commands/status-cmd.mjs.map +1 -0
  79. package/dist/cli/vcs-cli-main.d.mts +14 -0
  80. package/dist/cli/vcs-cli-main.d.mts.map +1 -0
  81. package/dist/cli/vcs-cli-main.mjs +136 -0
  82. package/dist/cli/vcs-cli-main.mjs.map +1 -0
  83. package/dist/engine/branch/branch-graph-helper.d.mts +19 -0
  84. package/dist/engine/branch/branch-graph-helper.d.mts.map +1 -0
  85. package/dist/engine/branch/branch-graph-helper.mjs +49 -0
  86. package/dist/engine/branch/branch-graph-helper.mjs.map +1 -0
  87. package/dist/engine/branch/branch-helper.d.mts +26 -0
  88. package/dist/engine/branch/branch-helper.d.mts.map +1 -0
  89. package/dist/engine/branch/branch-helper.mjs +57 -0
  90. package/dist/engine/branch/branch-helper.mjs.map +1 -0
  91. package/dist/engine/branch/branch-space-helper.d.mts +22 -0
  92. package/dist/engine/branch/branch-space-helper.d.mts.map +1 -0
  93. package/dist/engine/branch/branch-space-helper.mjs +77 -0
  94. package/dist/engine/branch/branch-space-helper.mjs.map +1 -0
  95. package/dist/engine/branch/branch-space.respec.node.d.mts +8 -0
  96. package/dist/engine/branch/branch-space.respec.node.d.mts.map +1 -0
  97. package/dist/engine/branch/branch-space.respec.node.mjs +138 -0
  98. package/dist/engine/branch/branch-space.respec.node.mjs.map +1 -0
  99. package/dist/engine/branch/branch-types.d.mts +26 -0
  100. package/dist/engine/branch/branch-types.d.mts.map +1 -0
  101. package/dist/engine/branch/branch-types.mjs +7 -0
  102. package/dist/engine/branch/branch-types.mjs.map +1 -0
  103. package/dist/engine/diff/line-diff-helper.d.mts +76 -0
  104. package/dist/engine/diff/line-diff-helper.d.mts.map +1 -0
  105. package/dist/engine/diff/line-diff-helper.mjs +144 -0
  106. package/dist/engine/diff/line-diff-helper.mjs.map +1 -0
  107. package/dist/engine/diff/line-diff-helper.respec.node.d.mts +7 -0
  108. package/dist/engine/diff/line-diff-helper.respec.node.d.mts.map +1 -0
  109. package/dist/engine/diff/line-diff-helper.respec.node.mjs +66 -0
  110. package/dist/engine/diff/line-diff-helper.respec.node.mjs.map +1 -0
  111. package/dist/engine/filter/glob-helper.d.mts +51 -0
  112. package/dist/engine/filter/glob-helper.d.mts.map +1 -0
  113. package/dist/engine/filter/glob-helper.mjs +132 -0
  114. package/dist/engine/filter/glob-helper.mjs.map +1 -0
  115. package/dist/engine/filter/glob-helper.respec.node.d.mts +7 -0
  116. package/dist/engine/filter/glob-helper.respec.node.d.mts.map +1 -0
  117. package/dist/engine/filter/glob-helper.respec.node.mjs +78 -0
  118. package/dist/engine/filter/glob-helper.respec.node.mjs.map +1 -0
  119. package/dist/engine/index/index-helper.d.mts +78 -0
  120. package/dist/engine/index/index-helper.d.mts.map +1 -0
  121. package/dist/engine/index/index-helper.mjs +289 -0
  122. package/dist/engine/index/index-helper.mjs.map +1 -0
  123. package/dist/engine/index/index-types.d.mts +63 -0
  124. package/dist/engine/index/index-types.d.mts.map +1 -0
  125. package/dist/engine/index/index-types.mjs +7 -0
  126. package/dist/engine/index/index-types.mjs.map +1 -0
  127. package/dist/engine/item/item-atom-helper.d.mts +20 -0
  128. package/dist/engine/item/item-atom-helper.d.mts.map +1 -0
  129. package/dist/engine/item/item-atom-helper.mjs +30 -0
  130. package/dist/engine/item/item-atom-helper.mjs.map +1 -0
  131. package/dist/engine/item/item-helper.d.mts +37 -0
  132. package/dist/engine/item/item-helper.d.mts.map +1 -0
  133. package/dist/engine/item/item-helper.mjs +194 -0
  134. package/dist/engine/item/item-helper.mjs.map +1 -0
  135. package/dist/engine/item/item-types.d.mts +127 -0
  136. package/dist/engine/item/item-types.d.mts.map +1 -0
  137. package/dist/engine/item/item-types.mjs +16 -0
  138. package/dist/engine/item/item-types.mjs.map +1 -0
  139. package/dist/index.d.mts +7 -0
  140. package/dist/index.d.mts.map +1 -0
  141. package/dist/index.mjs +7 -0
  142. package/dist/index.mjs.map +1 -0
  143. package/dist/respec-gib.node.d.mts +7 -0
  144. package/dist/respec-gib.node.d.mts.map +1 -0
  145. package/dist/respec-gib.node.mjs +11 -0
  146. package/dist/respec-gib.node.mjs.map +1 -0
  147. package/dist/vcs-gib-constants.d.mts +7 -0
  148. package/dist/vcs-gib-constants.d.mts.map +1 -0
  149. package/dist/vcs-gib-constants.mjs +7 -0
  150. package/dist/vcs-gib-constants.mjs.map +1 -0
  151. package/dist/vcs-gib.respec.node.d.mts +8 -0
  152. package/dist/vcs-gib.respec.node.d.mts.map +1 -0
  153. package/dist/vcs-gib.respec.node.mjs +82 -0
  154. package/dist/vcs-gib.respec.node.mjs.map +1 -0
  155. package/generate-version-file.js +20 -0
  156. package/package.json +28 -0
  157. package/src/AUTO-GENERATED-version.mts +5 -0
  158. package/src/assumptions.respec.mts +50 -0
  159. package/src/bootstrap/node-bootstrap.mts +198 -0
  160. package/src/bootstrap/node-bootstrap.respec.node.mts +35 -0
  161. package/src/cli/cli-arg-parser.mts +119 -0
  162. package/src/cli/cli-arg-parser.respec.node.mts +45 -0
  163. package/src/cli/cli-constants.mts +77 -0
  164. package/src/cli/cli-e2e.respec.node.mts +318 -0
  165. package/src/cli/commands/add-cmd.mts +415 -0
  166. package/src/cli/commands/branch-checkout-cmd.respec.node.mts +322 -0
  167. package/src/cli/commands/branch-cmd.mts +243 -0
  168. package/src/cli/commands/checkout-cmd.mts +202 -0
  169. package/src/cli/commands/commit-cmd.mts +421 -0
  170. package/src/cli/commands/commit-log-cmd.respec.node.mts +276 -0
  171. package/src/cli/commands/init-cmd.mts +152 -0
  172. package/src/cli/commands/init-cmd.respec.node.mts +49 -0
  173. package/src/cli/commands/log-cmd.mts +197 -0
  174. package/src/cli/commands/status-add-cmd.respec.node.mts +246 -0
  175. package/src/cli/commands/status-cmd.mts +366 -0
  176. package/src/cli/vcs-cli-main.mts +153 -0
  177. package/src/engine/branch/branch-graph-helper.mts +69 -0
  178. package/src/engine/branch/branch-helper.mts +79 -0
  179. package/src/engine/branch/branch-space-helper.mts +104 -0
  180. package/src/engine/branch/branch-space.respec.node.mts +158 -0
  181. package/src/engine/branch/branch-types.mts +29 -0
  182. package/src/engine/diff/line-diff-helper.mts +210 -0
  183. package/src/engine/diff/line-diff-helper.respec.node.mts +84 -0
  184. package/src/engine/filter/glob-helper.mts +165 -0
  185. package/src/engine/filter/glob-helper.respec.node.mts +94 -0
  186. package/src/engine/index/index-helper.mts +378 -0
  187. package/src/engine/index/index-types.mts +66 -0
  188. package/src/engine/item/item-atom-helper.mts +30 -0
  189. package/src/engine/item/item-helper.mts +239 -0
  190. package/src/engine/item/item-types.mts +136 -0
  191. package/src/index.mts +7 -0
  192. package/src/respec-gib.node.mts +12 -0
  193. package/src/vcs-gib-constants.mts +7 -0
  194. package/src/vcs-gib.respec.node.mts +96 -0
  195. package/test_runs/001-hello-node/20260728_090100_0001-flow-core-main.md +39 -0
  196. package/test_runs/001-hello-node/20260728_090200_0003-flow-branching-worktree.md +54 -0
  197. package/test_runs/001-hello-node/20260728_090300_0002-flow-selective-add.md +45 -0
  198. package/test_runs/001-hello-node/20260728_142100_0007-flow-edge-cases.md +44 -0
  199. package/test_runs/001-hello-node/20260728_142400_0005-flow-hardcoded-ignores.md +36 -0
  200. package/tools/pack-for-test.mjs +73 -0
  201. package/tsconfig.json +18 -0
  202. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * @module add-cmd
3
+ *
4
+ * Command handler for `vcs add <path...>`.
5
+ * Stages files and directories into candidate B2tFSItemIbGib_V1 and BinIbGib_V1 graph nodes
6
+ * and updates B2tFSIndexIbGib_V1 in localSpace.
7
+ */
8
+ import path from 'node:path';
9
+ import fs from 'node:fs/promises';
10
+ import crypto from 'node:crypto';
11
+ import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
12
+ import { Factory_V1 } from '@ibgib/ts-gib/dist/V1/factory.mjs';
13
+ import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
14
+ import { getGib } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
15
+ import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
16
+ import { putInSpace, persistTransformResult } from '@ibgib/core-gib/dist/witness/space/space-helper.mjs';
17
+ import { bootstrapVcsMetaspace } from '../../bootstrap/node-bootstrap.mjs';
18
+ import { getOrCreateBranchSpace } from '../../engine/branch/branch-space-helper.mjs';
19
+ import { getB2tFSItemIb } from '../../engine/item/item-atom-helper.mjs';
20
+ import { B2TFS_CHILD_ITEM_REL8N_NAME } from '../../engine/item/item-types.mjs';
21
+ import { getIbGibWithMetaspaceFallback } from '../../engine/item/item-helper.mjs';
22
+ import { isPathFiltered, parseFilterFileContent, globToRegExp } from '../../engine/filter/glob-helper.mjs';
23
+ import { getB2tFSIndexIbGib, updateB2tFSIndexIbGib } from '../../engine/index/index-helper.mjs';
24
+ import { GLOBAL_LOG_A_LOT } from '../../vcs-gib-constants.mjs';
25
+ const lcFile = `[add-cmd]`;
26
+ const logalot = GLOBAL_LOG_A_LOT;
27
+ export async function executeAddCmd({ paths = [], targetDir = process.cwd(), vcsFolderName = '.vcsgib', all = false, quiet = false, } = {}) {
28
+ const lc = `${lcFile}[${executeAddCmd.name}]`;
29
+ try {
30
+ if (logalot) {
31
+ console.log(`${lc} starting... (I: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d)`);
32
+ }
33
+ const absTargetDir = path.resolve(targetDir);
34
+ const { metaspace, localSpace, vcsPath, repoRoot } = await bootstrapVcsMetaspace({
35
+ repoPath: absTargetDir,
36
+ vcsFolderName,
37
+ });
38
+ // Verify repo exists
39
+ try {
40
+ await fs.access(vcsPath);
41
+ }
42
+ catch {
43
+ throw new Error(`Not an ibgib repository (directory ${vcsPath} does not exist) (E: 2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d)`);
44
+ }
45
+ // Retrieve authoritative B2tFSIndexIbGib_V1 from space
46
+ const indexIbGib = await getB2tFSIndexIbGib({ space: localSpace, vcsPath });
47
+ if (!indexIbGib) {
48
+ throw new Error(`Repository not initialized. Run 'vcs init' first. (E: 2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e)`);
49
+ }
50
+ const activeBranch = indexIbGib.data?.activeBranch || 'main';
51
+ const activeWorktreeDir = activeBranch === 'main' ? repoRoot : path.join(repoRoot, 'b', activeBranch);
52
+ // Target active branch space b2s_<activeBranch>
53
+ const { space: activeSpace } = await getOrCreateBranchSpace({
54
+ metaspace,
55
+ vcsPath,
56
+ branchName: activeBranch,
57
+ });
58
+ // Read .ibgibignore if present in active worktree
59
+ let filterPatterns = [];
60
+ const ignorePath = path.join(activeWorktreeDir, '.ibgibignore');
61
+ try {
62
+ const ignoreContent = await fs.readFile(ignorePath, 'utf8');
63
+ filterPatterns = parseFilterFileContent(ignoreContent);
64
+ }
65
+ catch {
66
+ // Ignore file not found is fine
67
+ }
68
+ // Walk active branch graph items to find committed files in snapshot
69
+ const committedBranchItemsMap = new Map();
70
+ const branchAddrs = [
71
+ ...(indexIbGib?.rel8ns?.branch || []),
72
+ ...(indexIbGib?.rel8ns?.branch_tjp || []),
73
+ ];
74
+ if (branchAddrs.length > 0) {
75
+ let branchIbGibs = [];
76
+ for (const bAddr of branchAddrs) {
77
+ const bIbGib = await getIbGibWithMetaspaceFallback({
78
+ addr: bAddr,
79
+ space: activeSpace,
80
+ metaspace,
81
+ });
82
+ if (bIbGib) {
83
+ branchIbGibs.push(bIbGib);
84
+ }
85
+ }
86
+ const activeBranchIbGib = branchIbGibs.find((b) => b?.data?.name === activeBranch) || branchIbGibs.at(0);
87
+ const rootItemAddr = activeBranchIbGib?.rel8ns?.b2tfs_item?.at(0);
88
+ if (rootItemAddr) {
89
+ const rootItem = await getIbGibWithMetaspaceFallback({
90
+ addr: rootItemAddr,
91
+ space: activeSpace,
92
+ metaspace,
93
+ });
94
+ if (rootItem) {
95
+ await addCmd_walkBranchGraph({
96
+ item: rootItem,
97
+ space: activeSpace,
98
+ metaspace,
99
+ currentRelPath: '',
100
+ outMap: committedBranchItemsMap,
101
+ });
102
+ }
103
+ }
104
+ }
105
+ // Determine candidate file paths to stage
106
+ const targetFilePaths = [];
107
+ if (all || paths.length === 0 || (paths.length === 1 && paths[0] === '.')) {
108
+ await addCmd_collectFilesRecursively({
109
+ dirPath: activeWorktreeDir,
110
+ baseDir: activeWorktreeDir,
111
+ vcsFolderName,
112
+ filterPatterns,
113
+ outFiles: targetFilePaths,
114
+ });
115
+ }
116
+ else {
117
+ for (const relOrAbs of paths) {
118
+ if (relOrAbs.includes('*') || relOrAbs.includes('?')) {
119
+ const rx = globToRegExp(relOrAbs);
120
+ const candidateFiles = [];
121
+ await addCmd_collectFilesRecursively({
122
+ dirPath: activeWorktreeDir,
123
+ baseDir: activeWorktreeDir,
124
+ vcsFolderName,
125
+ filterPatterns,
126
+ outFiles: candidateFiles,
127
+ });
128
+ let matchedCount = 0;
129
+ for (const candidateAbsPath of candidateFiles) {
130
+ const candidateRelPath = path.relative(activeWorktreeDir, candidateAbsPath).replace(/\\/g, '/');
131
+ const pathBasename = candidateRelPath.split('/').pop() || candidateRelPath;
132
+ if (rx.test(candidateRelPath) || rx.test(pathBasename)) {
133
+ if (!targetFilePaths.includes(candidateAbsPath)) {
134
+ targetFilePaths.push(candidateAbsPath);
135
+ }
136
+ matchedCount++;
137
+ }
138
+ }
139
+ if (matchedCount === 0) {
140
+ throw new Error(`No files matched glob pattern: ${relOrAbs} (E: e23d4c5f6a7b8c9d0e1f2a3b4c5d6e7f)`);
141
+ }
142
+ }
143
+ else {
144
+ const fullPath = path.resolve(activeWorktreeDir, relOrAbs);
145
+ let stat;
146
+ try {
147
+ stat = await fs.stat(fullPath);
148
+ }
149
+ catch {
150
+ throw new Error(`Path does not exist: ${relOrAbs} (E: 10c11d12e13f14a15b16c17d18e19f20)`);
151
+ }
152
+ const relPath = path.relative(activeWorktreeDir, fullPath).replace(/\\/g, '/');
153
+ if (isPathFiltered({ relativePath: relPath, isDirectory: stat.isDirectory(), filterPatterns })) {
154
+ continue;
155
+ }
156
+ if (stat.isDirectory()) {
157
+ await addCmd_collectFilesRecursively({
158
+ dirPath: fullPath,
159
+ baseDir: activeWorktreeDir,
160
+ vcsFolderName,
161
+ filterPatterns,
162
+ outFiles: targetFilePaths,
163
+ });
164
+ }
165
+ else if (stat.isFile()) {
166
+ if (!targetFilePaths.includes(fullPath)) {
167
+ targetFilePaths.push(fullPath);
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ const stagedItemAddrs = [...(indexIbGib.data?.staged_item || [])];
174
+ const stagedPathsMap = { ...(indexIbGib.data?.stagedPaths || {}) };
175
+ const newlyStagedPaths = [];
176
+ for (const absFilePath of targetFilePaths) {
177
+ const relPath = path.relative(activeWorktreeDir, absFilePath).replace(/\\/g, '/');
178
+ // Read file data & compute hash
179
+ const fileData = await fs.readFile(absFilePath);
180
+ const fileHash = crypto.createHash('sha256').update(fileData).digest('hex');
181
+ // Skip staging if candidate file matches active branch committed snapshot
182
+ const committedItem = committedBranchItemsMap.get(relPath);
183
+ if (committedItem && committedItem.fileHash && committedItem.fileHash === fileHash) {
184
+ continue;
185
+ }
186
+ // 1. Create BinIbGib_V1 graph node as Uint8Array
187
+ const binData = new Uint8Array(fileData);
188
+ const binIb = `bin ${fileHash}`;
189
+ const binGib = await getGib({ ibGib: { ib: binIb, data: binData } });
190
+ const binIbGib = {
191
+ ib: binIb,
192
+ gib: binGib,
193
+ data: binData,
194
+ };
195
+ const binAddr = getIbGibAddr({ ibGib: binIbGib });
196
+ await putInSpace({ ibGib: binIbGib, space: activeSpace });
197
+ await metaspace.registerNewIbGib({ ibGib: binIbGib, space: activeSpace });
198
+ // 2. Create B2tFSItemIbGib_V1 candidate graph node
199
+ const fileName = path.basename(absFilePath);
200
+ const fileNameSansExt = path.parse(fileName).name;
201
+ const fileExt = path.parse(fileName).ext.replace(/^\./, '');
202
+ const nameHash = crypto.createHash('sha256').update(fileName).digest('hex');
203
+ const itemRes = await Factory_V1.firstGen({
204
+ parentIbGib: ROOT,
205
+ ib: getB2tFSItemIb('file', fileName, nameHash),
206
+ data: {
207
+ name: fileName,
208
+ nameHash,
209
+ fsType: 'file',
210
+ fileNameSansExt,
211
+ fileExt,
212
+ fileHash,
213
+ fileEncoding: 'utf8',
214
+ diffTransactionId: await getUUID(),
215
+ uuid: await getUUID(),
216
+ classname: 'B2tFSItemIbGib_V1',
217
+ },
218
+ rel8ns: {
219
+ bin: [binAddr],
220
+ },
221
+ });
222
+ const itemIbGib = itemRes.newIbGib;
223
+ const itemAddr = getIbGibAddr({ ibGib: itemIbGib });
224
+ await persistTransformResult({ resTransform: itemRes, space: activeSpace });
225
+ await metaspace.registerNewIbGib({ ibGib: itemIbGib, space: activeSpace });
226
+ if (!stagedItemAddrs.includes(itemAddr)) {
227
+ stagedItemAddrs.push(itemAddr);
228
+ }
229
+ stagedPathsMap[relPath] = {
230
+ itemAddr,
231
+ binAddr,
232
+ fileHash,
233
+ fsType: 'file',
234
+ stagedAt: new Date().toISOString(),
235
+ };
236
+ newlyStagedPaths.push(relPath);
237
+ if (!quiet) {
238
+ console.log(`staged: ${relPath}`);
239
+ }
240
+ }
241
+ // 3. Update B2tFSIndexIbGib_V1 in activeSpace & localSpace
242
+ const updatedIndex = await updateB2tFSIndexIbGib({
243
+ space: activeSpace,
244
+ metaspace,
245
+ indexIbGib,
246
+ dataToUpdate: {
247
+ stagedPaths: stagedPathsMap,
248
+ staged_item: stagedItemAddrs,
249
+ },
250
+ vcsPath,
251
+ });
252
+ if (localSpace !== activeSpace) {
253
+ await putInSpace({ space: localSpace, ibGib: updatedIndex });
254
+ }
255
+ return {
256
+ stagedPaths: newlyStagedPaths,
257
+ stagedCount: newlyStagedPaths.length,
258
+ };
259
+ }
260
+ catch (error) {
261
+ console.error(`${lc} ${extractErrorMsg(error)} (E: 3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f)`);
262
+ throw error;
263
+ }
264
+ finally {
265
+ if (logalot) {
266
+ console.log(`${lc} complete. (I: 4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a)`);
267
+ }
268
+ }
269
+ }
270
+ // #region addCmd_walkBranchGraph
271
+ async function addCmd_walkBranchGraph({ item, space, metaspace, currentRelPath, outMap, }) {
272
+ if (!item || !item.data) {
273
+ return;
274
+ }
275
+ const { fsType, fileHash } = item.data;
276
+ if (currentRelPath) {
277
+ outMap.set(currentRelPath, { relPath: currentRelPath, fileHash, fsType });
278
+ }
279
+ if (fsType === 'folder') {
280
+ const childAddrs = item.rel8ns?.[B2TFS_CHILD_ITEM_REL8N_NAME] || [];
281
+ for (const childAddr of childAddrs) {
282
+ const childItem = await getIbGibWithMetaspaceFallback({
283
+ addr: childAddr,
284
+ space,
285
+ metaspace,
286
+ });
287
+ if (childItem && childItem.data) {
288
+ const childRelPath = currentRelPath
289
+ ? `${currentRelPath}/${childItem.data.name}`
290
+ : childItem.data.name;
291
+ await addCmd_walkBranchGraph({
292
+ item: childItem,
293
+ space,
294
+ metaspace,
295
+ currentRelPath: childRelPath,
296
+ outMap,
297
+ });
298
+ }
299
+ }
300
+ }
301
+ }
302
+ // #endregion addCmd_walkBranchGraph
303
+ // #region addCmd_collectFilesRecursively
304
+ async function addCmd_collectFilesRecursively({ dirPath, baseDir, vcsFolderName, filterPatterns, outFiles, }) {
305
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
306
+ for (const entry of entries) {
307
+ const fullPath = path.join(dirPath, entry.name);
308
+ const relPath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
309
+ // Ignore vcs storage folder, .git, and worktrees folder b
310
+ if (relPath === vcsFolderName || relPath.startsWith(vcsFolderName + '/') ||
311
+ relPath === '.git' || relPath.startsWith('.git/') ||
312
+ relPath === 'b' || relPath.startsWith('b/')) {
313
+ continue;
314
+ }
315
+ if (isPathFiltered({ relativePath: relPath, isDirectory: entry.isDirectory(), filterPatterns })) {
316
+ continue;
317
+ }
318
+ if (entry.isDirectory()) {
319
+ await addCmd_collectFilesRecursively({
320
+ dirPath: fullPath,
321
+ baseDir,
322
+ vcsFolderName,
323
+ filterPatterns,
324
+ outFiles,
325
+ });
326
+ }
327
+ else if (entry.isFile()) {
328
+ outFiles.push(fullPath);
329
+ }
330
+ }
331
+ }
332
+ // #endregion addCmd_collectFilesRecursively
333
+ //# sourceMappingURL=add-cmd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-cmd.mjs","sourceRoot":"","sources":["../../../src/cli/commands/add-cmd.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module branch-checkout-cmd.respec
3
+ *
4
+ * Unit tests for `vcs branch` and `vcs checkout` command handlers & worktree projections.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=branch-checkout-cmd.respec.node.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-checkout-cmd.respec.node.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/branch-checkout-cmd.respec.node.mts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * @module branch-checkout-cmd.respec
3
+ *
4
+ * Unit tests for `vcs branch` and `vcs checkout` command handlers & worktree projections.
5
+ */
6
+ import path from 'node:path';
7
+ import fs from 'node:fs/promises';
8
+ import { respecfully, ifWe, iReckon } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
9
+ import { executeInitCmd } from './init-cmd.mjs';
10
+ import { executeAddCmd } from './add-cmd.mjs';
11
+ import { executeCommitCmd } from './commit-cmd.mjs';
12
+ import { executeBranchCmd } from './branch-cmd.mjs';
13
+ import { executeCheckoutCmd } from './checkout-cmd.mjs';
14
+ import { executeStatusCmd } from './status-cmd.mjs';
15
+ const lc = `[apps/vcs-gib/src/cli/commands/branch-checkout-cmd.respec.node.mts]`;
16
+ await respecfully(lc, `vcs branch and vcs checkout Command Handlers`, async () => {
17
+ await ifWe(lc, `lists default branch main for new repository`, async () => {
18
+ const testDir = path.join(process.cwd(), '.test_branch_checkout_1');
19
+ const vcsFolderName = '.vcsgib_test_bc_1';
20
+ try {
21
+ await executeInitCmd({
22
+ targetDir: testDir,
23
+ vcsFolderName,
24
+ quiet: true,
25
+ });
26
+ const branchRes = await executeBranchCmd({
27
+ targetDir: testDir,
28
+ vcsFolderName,
29
+ quiet: true,
30
+ });
31
+ iReckon(lc, branchRes.branches.length).willEqual(1);
32
+ iReckon(lc, branchRes.branches[0].name).willEqual('main');
33
+ iReckon(lc, branchRes.branches[0].isActive).isGonnaBeTrue();
34
+ }
35
+ finally {
36
+ await fs.rm(testDir, { recursive: true, force: true });
37
+ }
38
+ });
39
+ await ifWe(lc, `creates new branch from active branch root item and rejects duplicates`, async () => {
40
+ const testDir = path.join(process.cwd(), '.test_branch_checkout_2');
41
+ const vcsFolderName = '.vcsgib_test_bc_2';
42
+ try {
43
+ await executeInitCmd({
44
+ targetDir: testDir,
45
+ vcsFolderName,
46
+ quiet: true,
47
+ });
48
+ // Create feature branch
49
+ const createRes = await executeBranchCmd({
50
+ branchName: 'feature-auth',
51
+ targetDir: testDir,
52
+ vcsFolderName,
53
+ quiet: true,
54
+ });
55
+ iReckon(lc, createRes.createdBranchName).willEqual('feature-auth');
56
+ iReckon(lc, Boolean(createRes.createdBranchAddr)).isGonnaBeTrue();
57
+ // List branches
58
+ const listRes = await executeBranchCmd({
59
+ targetDir: testDir,
60
+ vcsFolderName,
61
+ quiet: true,
62
+ });
63
+ iReckon(lc, listRes.branches.length).willEqual(2);
64
+ const featureBranch = listRes.branches.find(b => b.name === 'feature-auth');
65
+ iReckon(lc, Boolean(featureBranch)).isGonnaBeTrue();
66
+ iReckon(lc, featureBranch?.isActive).isGonnaBeFalse();
67
+ // Verify dedicated branch space subfolders exist in .vcsgib
68
+ const mainSpaceDir = path.join(testDir, vcsFolderName, 'ibgib', 'b2s_main');
69
+ const featureSpaceDir = path.join(testDir, vcsFolderName, 'ibgib', 'b2s_feature-auth');
70
+ const mainSpaceExists = await fs.stat(mainSpaceDir).then(s => s.isDirectory()).catch(() => fs.stat(path.join(testDir, vcsFolderName, 'b2s_main')).then(s => s.isDirectory()).catch(() => false));
71
+ const featureSpaceExists = await fs.stat(featureSpaceDir).then(s => s.isDirectory()).catch(() => fs.stat(path.join(testDir, vcsFolderName, 'b2s_feature-auth')).then(s => s.isDirectory()).catch(() => false));
72
+ iReckon(lc, mainSpaceExists).isGonnaBeTrue();
73
+ iReckon(lc, featureSpaceExists).isGonnaBeTrue();
74
+ // Duplicate branch attempt
75
+ let errorThrown = false;
76
+ try {
77
+ await executeBranchCmd({
78
+ branchName: 'feature-auth',
79
+ targetDir: testDir,
80
+ vcsFolderName,
81
+ quiet: true,
82
+ });
83
+ }
84
+ catch (err) {
85
+ errorThrown = true;
86
+ iReckon(lc, err.message).includes("already exists");
87
+ }
88
+ iReckon(lc, errorThrown).isGonnaBeTrue();
89
+ }
90
+ finally {
91
+ await fs.rm(testDir, { recursive: true, force: true });
92
+ }
93
+ });
94
+ await ifWe(lc, `switches active branch with checkout and projects branch snapshot onto worktree subfolder`, async () => {
95
+ const testDir = path.join(process.cwd(), '.test_branch_checkout_3');
96
+ const vcsFolderName = '.vcsgib_test_bc_3';
97
+ try {
98
+ await executeInitCmd({
99
+ targetDir: testDir,
100
+ vcsFolderName,
101
+ quiet: true,
102
+ });
103
+ // Commit a file on main
104
+ await fs.writeFile(path.join(testDir, 'app.ts'), 'console.log("Main");', 'utf8');
105
+ await executeAddCmd({
106
+ paths: ['app.ts'],
107
+ targetDir: testDir,
108
+ vcsFolderName,
109
+ quiet: true,
110
+ });
111
+ await executeCommitCmd({
112
+ message: 'Add app.ts on main',
113
+ targetDir: testDir,
114
+ vcsFolderName,
115
+ quiet: true,
116
+ });
117
+ // Create branch feature-ui
118
+ await executeBranchCmd({
119
+ branchName: 'feature-ui',
120
+ targetDir: testDir,
121
+ vcsFolderName,
122
+ quiet: true,
123
+ });
124
+ // Checkout feature-ui
125
+ const checkoutRes = await executeCheckoutCmd({
126
+ branchName: 'feature-ui',
127
+ targetDir: testDir,
128
+ vcsFolderName,
129
+ quiet: true,
130
+ });
131
+ iReckon(lc, checkoutRes.previousBranch).willEqual('main');
132
+ iReckon(lc, checkoutRes.currentBranch).willEqual('feature-ui');
133
+ const expectedWorktree = path.join(testDir, 'b', 'feature-ui');
134
+ iReckon(lc, checkoutRes.worktreePath).willEqual(expectedWorktree);
135
+ // Verify project file exists in worktree path
136
+ const projectedFile = path.join(expectedWorktree, 'app.ts');
137
+ const fileContent = await fs.readFile(projectedFile, 'utf8');
138
+ iReckon(lc, fileContent).willEqual('console.log("Main");');
139
+ // Verify active branch in status
140
+ const statusRes = await executeStatusCmd({
141
+ targetDir: testDir,
142
+ vcsFolderName,
143
+ quiet: true,
144
+ });
145
+ iReckon(lc, statusRes.branchName).willEqual('feature-ui');
146
+ // Verify branch list displays ALL branches while on feature-ui
147
+ const branchListOnFeature = await executeBranchCmd({
148
+ targetDir: testDir,
149
+ vcsFolderName,
150
+ quiet: true,
151
+ });
152
+ iReckon(lc, branchListOnFeature.branches.length).willEqual(2);
153
+ iReckon(lc, branchListOnFeature.branches.map(b => b.name)).includes('main');
154
+ iReckon(lc, branchListOnFeature.branches.map(b => b.name)).includes('feature-ui');
155
+ // Make a commit on feature-ui branch
156
+ await fs.writeFile(path.join(expectedWorktree, 'ui.ts'), 'export const ui = 1;', 'utf8');
157
+ await executeAddCmd({
158
+ paths: ['ui.ts'],
159
+ targetDir: expectedWorktree,
160
+ vcsFolderName,
161
+ quiet: true,
162
+ });
163
+ await executeCommitCmd({
164
+ message: 'Add ui.ts on feature-ui',
165
+ targetDir: expectedWorktree,
166
+ vcsFolderName,
167
+ quiet: true,
168
+ });
169
+ // Verify branch list after commit on feature-ui still displays ALL branches
170
+ const branchListAfterCommit = await executeBranchCmd({
171
+ targetDir: expectedWorktree,
172
+ vcsFolderName,
173
+ quiet: true,
174
+ });
175
+ iReckon(lc, branchListAfterCommit.branches.length).willEqual(2);
176
+ // Switch back to main
177
+ const switchBackRes = await executeCheckoutCmd({
178
+ branchName: 'main',
179
+ targetDir: expectedWorktree,
180
+ vcsFolderName,
181
+ quiet: true,
182
+ });
183
+ iReckon(lc, switchBackRes.currentBranch).willEqual('main');
184
+ iReckon(lc, switchBackRes.worktreePath).willEqual(testDir);
185
+ // Verify branch list displays ALL branches while on main after feature-ui commit
186
+ const branchListOnMain = await executeBranchCmd({
187
+ targetDir: testDir,
188
+ vcsFolderName,
189
+ quiet: true,
190
+ });
191
+ iReckon(lc, branchListOnMain.branches.length).willEqual(2);
192
+ iReckon(lc, branchListOnMain.branches.map(b => b.name)).includes('main');
193
+ iReckon(lc, branchListOnMain.branches.map(b => b.name)).includes('feature-ui');
194
+ // Switch back to feature-ui seamlessly
195
+ const switchAgainRes = await executeCheckoutCmd({
196
+ branchName: 'feature-ui',
197
+ targetDir: testDir,
198
+ vcsFolderName,
199
+ quiet: true,
200
+ });
201
+ iReckon(lc, switchAgainRes.currentBranch).willEqual('feature-ui');
202
+ }
203
+ finally {
204
+ await fs.rm(testDir, { recursive: true, force: true });
205
+ }
206
+ });
207
+ await ifWe(lc, `rejects checkout when branch does not exist or branchName missing`, async () => {
208
+ const testDir = path.join(process.cwd(), '.test_branch_checkout_4');
209
+ const vcsFolderName = '.vcsgib_test_bc_4';
210
+ try {
211
+ await executeInitCmd({
212
+ targetDir: testDir,
213
+ vcsFolderName,
214
+ quiet: true,
215
+ });
216
+ let err1 = false;
217
+ try {
218
+ await executeCheckoutCmd({
219
+ branchName: '',
220
+ targetDir: testDir,
221
+ vcsFolderName,
222
+ quiet: true,
223
+ });
224
+ }
225
+ catch (err) {
226
+ err1 = true;
227
+ iReckon(lc, err.message).includes('Branch name is required');
228
+ }
229
+ iReckon(lc, err1).isGonnaBeTrue();
230
+ let err2 = false;
231
+ try {
232
+ await executeCheckoutCmd({
233
+ branchName: 'non-existent-branch',
234
+ targetDir: testDir,
235
+ vcsFolderName,
236
+ quiet: true,
237
+ });
238
+ }
239
+ catch (err) {
240
+ err2 = true;
241
+ iReckon(lc, err.message).includes("does not exist");
242
+ }
243
+ iReckon(lc, err2).isGonnaBeTrue();
244
+ }
245
+ finally {
246
+ await fs.rm(testDir, { recursive: true, force: true });
247
+ }
248
+ });
249
+ await ifWe(lc, `lists branches silently on secondary branch without error noise`, async () => {
250
+ const testDir = path.join(process.cwd(), '.test_branch_checkout_secondary');
251
+ const vcsFolderName = '.vcsgib_test_bc_sec';
252
+ try {
253
+ await executeInitCmd({
254
+ targetDir: testDir,
255
+ vcsFolderName,
256
+ quiet: true,
257
+ });
258
+ // Create and checkout secondary branch feature-math
259
+ await executeBranchCmd({
260
+ branchName: 'feature-math',
261
+ targetDir: testDir,
262
+ vcsFolderName,
263
+ quiet: true,
264
+ });
265
+ await executeCheckoutCmd({
266
+ branchName: 'feature-math',
267
+ targetDir: testDir,
268
+ vcsFolderName,
269
+ quiet: true,
270
+ });
271
+ // Run branch list while on secondary branch
272
+ const listRes = await executeBranchCmd({
273
+ targetDir: testDir,
274
+ vcsFolderName,
275
+ quiet: true,
276
+ });
277
+ iReckon(lc, listRes.branches.length).willEqual(2);
278
+ const mathBranch = listRes.branches.find(b => b.name === 'feature-math');
279
+ const mainBranch = listRes.branches.find(b => b.name === 'main');
280
+ iReckon(lc, mathBranch?.isActive).isGonnaBeTrue();
281
+ iReckon(lc, mainBranch?.isActive).isGonnaBeFalse();
282
+ }
283
+ finally {
284
+ await fs.rm(testDir, { recursive: true, force: true });
285
+ }
286
+ });
287
+ });
288
+ //# sourceMappingURL=branch-checkout-cmd.respec.node.mjs.map