@ibgib/vcs-gib 0.0.23 → 0.0.29

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 (72) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/VCS_CLI_USER_GUIDE.md +94 -89
  3. package/dist/AUTO-GENERATED-version.d.mts +1 -1
  4. package/dist/AUTO-GENERATED-version.mjs +1 -1
  5. package/dist/cli/cli-arg-parser.d.mts +1 -0
  6. package/dist/cli/cli-arg-parser.d.mts.map +1 -1
  7. package/dist/cli/cli-arg-parser.mjs +5 -1
  8. package/dist/cli/cli-arg-parser.mjs.map +1 -1
  9. package/dist/cli/cli-constants.d.mts +6 -0
  10. package/dist/cli/cli-constants.d.mts.map +1 -1
  11. package/dist/cli/cli-constants.mjs +12 -0
  12. package/dist/cli/cli-constants.mjs.map +1 -1
  13. package/dist/cli/commands/add-cmd.d.mts.map +1 -1
  14. package/dist/cli/commands/add-cmd.mjs +11 -3
  15. package/dist/cli/commands/add-cmd.mjs.map +1 -1
  16. package/dist/cli/commands/commit-cmd.d.mts +5 -4
  17. package/dist/cli/commands/commit-cmd.d.mts.map +1 -1
  18. package/dist/cli/commands/commit-cmd.mjs +155 -35
  19. package/dist/cli/commands/commit-cmd.mjs.map +1 -1
  20. package/dist/cli/commands/generate-comment-cmd.d.mts +19 -0
  21. package/dist/cli/commands/generate-comment-cmd.d.mts.map +1 -0
  22. package/dist/cli/commands/generate-comment-cmd.mjs +140 -0
  23. package/dist/cli/commands/generate-comment-cmd.mjs.map +1 -0
  24. package/dist/cli/commands/log-cmd.d.mts +12 -3
  25. package/dist/cli/commands/log-cmd.d.mts.map +1 -1
  26. package/dist/cli/commands/log-cmd.mjs +242 -39
  27. package/dist/cli/commands/log-cmd.mjs.map +1 -1
  28. package/dist/cli/commands/status-cmd.d.mts +5 -6
  29. package/dist/cli/commands/status-cmd.d.mts.map +1 -1
  30. package/dist/cli/commands/status-cmd.mjs +51 -205
  31. package/dist/cli/commands/status-cmd.mjs.map +1 -1
  32. package/dist/cli/vcs-cli-main.d.mts.map +1 -1
  33. package/dist/cli/vcs-cli-main.mjs +25 -4
  34. package/dist/cli/vcs-cli-main.mjs.map +1 -1
  35. package/dist/engine/branch/branch-helper.d.mts +14 -0
  36. package/dist/engine/branch/branch-helper.d.mts.map +1 -1
  37. package/dist/engine/branch/branch-helper.mjs +21 -0
  38. package/dist/engine/branch/branch-helper.mjs.map +1 -1
  39. package/dist/engine/index/index-helper.d.mts.map +1 -1
  40. package/dist/engine/index/index-helper.mjs +3 -0
  41. package/dist/engine/index/index-helper.mjs.map +1 -1
  42. package/dist/engine/item/item-helper.d.mts.map +1 -1
  43. package/dist/engine/item/item-helper.mjs +5 -2
  44. package/dist/engine/item/item-helper.mjs.map +1 -1
  45. package/dist/engine/merge/b2tfs-3way-graft-strategy.d.mts +28 -0
  46. package/dist/engine/merge/b2tfs-3way-graft-strategy.d.mts.map +1 -1
  47. package/dist/engine/merge/b2tfs-3way-graft-strategy.mjs +84 -12
  48. package/dist/engine/merge/b2tfs-3way-graft-strategy.mjs.map +1 -1
  49. package/dist/engine/status/status-helper.d.mts +90 -0
  50. package/dist/engine/status/status-helper.d.mts.map +1 -0
  51. package/dist/engine/status/status-helper.mjs +286 -0
  52. package/dist/engine/status/status-helper.mjs.map +1 -0
  53. package/package.json +3 -3
  54. package/src/AUTO-GENERATED-version.mts +1 -1
  55. package/src/cli/cli-arg-parser.mts +5 -0
  56. package/src/cli/cli-constants.mts +13 -0
  57. package/src/cli/commands/add-cmd.mts +11 -3
  58. package/src/cli/commands/branch-checkout-cmd.respec.mts +54 -0
  59. package/src/cli/commands/commit-cmd.mts +171 -44
  60. package/src/cli/commands/commit-log-cmd.respec.mts +216 -3
  61. package/src/cli/commands/generate-comment-cmd.mts +171 -0
  62. package/src/cli/commands/log-cmd.mts +294 -42
  63. package/src/cli/commands/status-cmd.mts +58 -256
  64. package/src/cli/vcs-cli-main.mts +25 -4
  65. package/src/engine/branch/branch-helper.mts +33 -0
  66. package/src/engine/index/index-helper.mts +3 -0
  67. package/src/engine/item/item-helper.mts +5 -2
  68. package/src/engine/merge/b2tfs-3way-graft-strategy.mts +89 -10
  69. package/src/engine/merge/b2tfs-sync-comments.respec.mts +399 -0
  70. package/src/engine/status/status-helper.mts +383 -0
  71. package/tsconfig.test.tsbuildinfo +1 -1
  72. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,286 @@
1
+ /**
2
+ * @module status-helper
3
+ *
4
+ * Pure status inspection helpers and pending `.ib.*.md` comment metadata detection.
5
+ */
6
+ import path from 'node:path';
7
+ import fs from 'node:fs/promises';
8
+ import crypto from 'node:crypto';
9
+ import { B2TFS_CHILD_ITEM_REL8N_NAME } from '../item/item-types.mjs';
10
+ import { getIbGibWithMetaspaceFallback } from '../item/item-helper.mjs';
11
+ import { isPathFiltered, parseFilterFileContent } from '../filter/glob-helper.mjs';
12
+ import { getB2tFSIndexIbGib } from '../index/index-helper.mjs';
13
+ import { getOrCreateBranchSpace } from '../branch/branch-space-helper.mjs';
14
+ import { resolveContextualBranchName } from '../branch/branch-helper.mjs';
15
+ /**
16
+ * Returns true if filename is a `.ib.*.md` comment metadata file.
17
+ */
18
+ export function isCommentMetadataFilename(filename) {
19
+ return filename.startsWith('.ib.') && filename.endsWith('.md') && filename.length > '.ib..md'.length;
20
+ }
21
+ /**
22
+ * Extracts the inner topic / filename from `.ib.<topic>.md`.
23
+ */
24
+ export function extractCommentTopicName(filename) {
25
+ if (!isCommentMetadataFilename(filename)) {
26
+ return '';
27
+ }
28
+ return filename.slice(4, -3); // strips leading '.ib.' and trailing '.md'
29
+ }
30
+ /**
31
+ * Pure helper to walk the branch graph items.
32
+ */
33
+ export async function walkBranchGraph({ item, space, metaspace, currentRelPath, outMap, }) {
34
+ if (!item || !item.data) {
35
+ return;
36
+ }
37
+ const { fsType, fileHash } = item.data;
38
+ if (currentRelPath) {
39
+ outMap.set(currentRelPath, { relPath: currentRelPath, fileHash, fsType });
40
+ }
41
+ if (fsType === 'folder') {
42
+ const childAddrs = item.rel8ns?.[B2TFS_CHILD_ITEM_REL8N_NAME] || [];
43
+ for (const childAddr of childAddrs) {
44
+ const childItem = await getIbGibWithMetaspaceFallback({
45
+ addr: childAddr,
46
+ space,
47
+ metaspace,
48
+ });
49
+ if (childItem && childItem.data) {
50
+ const childRelPath = currentRelPath
51
+ ? `${currentRelPath}/${childItem.data.name}`
52
+ : childItem.data.name;
53
+ await walkBranchGraph({
54
+ item: childItem,
55
+ space,
56
+ metaspace,
57
+ currentRelPath: childRelPath,
58
+ outMap,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * Pure helper to scan physical workspace, separating source files from `.ib.*.md` comment files.
66
+ */
67
+ export async function scanPhysicalWorkspace({ dirPath, baseDir, vcsFolderName, filterPatterns, outSourceMap, outCommentFiles, }) {
68
+ let entries = [];
69
+ try {
70
+ entries = await fs.readdir(dirPath, { withFileTypes: true });
71
+ }
72
+ catch {
73
+ return;
74
+ }
75
+ for (const entry of entries) {
76
+ const fullEntryPath = path.join(dirPath, entry.name);
77
+ const relPath = path.relative(baseDir, fullEntryPath).replace(/\\/g, '/');
78
+ // Ignore vcs storage folder, .git, and worktrees folder b
79
+ if (relPath === vcsFolderName || relPath.startsWith(vcsFolderName + '/') ||
80
+ relPath === '.git' || relPath.startsWith('.git/') ||
81
+ relPath === 'b' || relPath.startsWith('b/')) {
82
+ continue;
83
+ }
84
+ if (isPathFiltered({ relativePath: relPath, isDirectory: entry.isDirectory(), filterPatterns })) {
85
+ continue;
86
+ }
87
+ if (entry.isDirectory()) {
88
+ outSourceMap.set(relPath, { relPath, fullPath: fullEntryPath, isDirectory: true });
89
+ await scanPhysicalWorkspace({
90
+ dirPath: fullEntryPath,
91
+ baseDir,
92
+ vcsFolderName,
93
+ filterPatterns,
94
+ outSourceMap,
95
+ outCommentFiles,
96
+ });
97
+ }
98
+ else if (entry.isFile()) {
99
+ if (isCommentMetadataFilename(entry.name)) {
100
+ const parentRelPath = path.relative(baseDir, dirPath).replace(/\\/g, '/');
101
+ outCommentFiles.push({
102
+ relPath,
103
+ fullPath: fullEntryPath,
104
+ parentRelPath: parentRelPath === '.' ? '' : parentRelPath,
105
+ filename: entry.name,
106
+ });
107
+ }
108
+ else {
109
+ let fileHash;
110
+ try {
111
+ const fileData = await fs.readFile(fullEntryPath);
112
+ fileHash = crypto.createHash('sha256').update(fileData).digest('hex');
113
+ }
114
+ catch {
115
+ // File unreadable
116
+ }
117
+ outSourceMap.set(relPath, { relPath, fullPath: fullEntryPath, isDirectory: false, fileHash });
118
+ }
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Computes complete repository status, including staged, modified, deleted, untracked,
124
+ * and mapped pending `.ib.*.md` comment files.
125
+ */
126
+ export async function getRepoStatus({ metaspace, localSpace, vcsPath, repoRoot, targetDir = repoRoot, vcsFolderName = '.vcsgib', }) {
127
+ const indexIbGib = await getB2tFSIndexIbGib({ space: localSpace, vcsPath });
128
+ const branchName = resolveContextualBranchName({ targetDir, repoRoot, indexIbGib });
129
+ const activeWorktreeDir = branchName === 'main' ? repoRoot : path.join(repoRoot, 'b', branchName);
130
+ const { space: activeBranchSpace } = await getOrCreateBranchSpace({
131
+ metaspace,
132
+ vcsPath,
133
+ branchName,
134
+ });
135
+ const stagedMap = new Map();
136
+ const indexStagedPaths = indexIbGib?.data?.stagedPaths || {};
137
+ for (const [relPath, itemRec] of Object.entries(indexStagedPaths)) {
138
+ stagedMap.set(relPath, itemRec);
139
+ }
140
+ let rootItemAddr;
141
+ const branchAddrs = [
142
+ ...(indexIbGib?.rel8ns?.branch || []),
143
+ ...(indexIbGib?.rel8ns?.branch_tjp || []),
144
+ ];
145
+ if (branchAddrs.length > 0) {
146
+ let branchIbGibs = [];
147
+ for (const bAddr of branchAddrs) {
148
+ const bIbGib = await getIbGibWithMetaspaceFallback({
149
+ addr: bAddr,
150
+ space: activeBranchSpace,
151
+ metaspace,
152
+ });
153
+ if (bIbGib) {
154
+ branchIbGibs.push(bIbGib);
155
+ }
156
+ }
157
+ const activeBranchIbGib = branchIbGibs.find((b) => b?.data?.name === branchName) || branchIbGibs.at(0);
158
+ rootItemAddr = activeBranchIbGib?.rel8ns?.b2tFS_item?.at(0) || activeBranchIbGib?.rel8ns?.b2tfs_item?.at(0);
159
+ }
160
+ let filterPatterns = [];
161
+ const ignorePath = path.join(activeWorktreeDir, '.ibgibignore');
162
+ try {
163
+ const ignoreContent = await fs.readFile(ignorePath, 'utf8');
164
+ filterPatterns = parseFilterFileContent(ignoreContent);
165
+ }
166
+ catch {
167
+ // Ignore file missing is fine
168
+ }
169
+ const branchItemsMap = new Map();
170
+ if (rootItemAddr) {
171
+ const rootItem = await getIbGibWithMetaspaceFallback({
172
+ addr: rootItemAddr,
173
+ space: activeBranchSpace,
174
+ metaspace,
175
+ });
176
+ if (rootItem) {
177
+ await walkBranchGraph({
178
+ item: rootItem,
179
+ space: activeBranchSpace,
180
+ metaspace,
181
+ currentRelPath: '',
182
+ outMap: branchItemsMap,
183
+ });
184
+ }
185
+ }
186
+ const physicalItemsMap = new Map();
187
+ const rawCommentFiles = [];
188
+ await scanPhysicalWorkspace({
189
+ dirPath: activeWorktreeDir,
190
+ baseDir: activeWorktreeDir,
191
+ vcsFolderName,
192
+ filterPatterns,
193
+ outSourceMap: physicalItemsMap,
194
+ outCommentFiles: rawCommentFiles,
195
+ });
196
+ const staged = [];
197
+ const modified = [];
198
+ const deleted = [];
199
+ const untracked = [];
200
+ for (const [relPath, stagedRec] of stagedMap.entries()) {
201
+ staged.push({
202
+ path: relPath,
203
+ fsType: stagedRec.fsType || 'file',
204
+ status: 'staged',
205
+ });
206
+ }
207
+ for (const [relPath, physItem] of physicalItemsMap.entries()) {
208
+ if (stagedMap.has(relPath)) {
209
+ continue;
210
+ }
211
+ const branchItem = branchItemsMap.get(relPath);
212
+ if (!branchItem) {
213
+ untracked.push({
214
+ path: relPath,
215
+ fsType: physItem.isDirectory ? 'folder' : 'file',
216
+ status: 'untracked',
217
+ });
218
+ }
219
+ else {
220
+ if (!physItem.isDirectory && physItem.fileHash && branchItem.fileHash && physItem.fileHash !== branchItem.fileHash) {
221
+ modified.push({
222
+ path: relPath,
223
+ fsType: 'file',
224
+ status: 'modified',
225
+ });
226
+ }
227
+ }
228
+ }
229
+ for (const [relPath, branchItem] of branchItemsMap.entries()) {
230
+ if (!relPath || relPath === '.' || relPath === '') {
231
+ continue;
232
+ }
233
+ if (!physicalItemsMap.has(relPath) && !stagedMap.has(relPath)) {
234
+ deleted.push({
235
+ path: relPath,
236
+ fsType: branchItem.fsType,
237
+ status: 'deleted',
238
+ });
239
+ }
240
+ }
241
+ // Map raw comment files to targets (file or folder)
242
+ const pendingComments = [];
243
+ for (const raw of rawCommentFiles) {
244
+ const topicName = extractCommentTopicName(raw.filename);
245
+ const candidateFileRelPath = raw.parentRelPath ? `${raw.parentRelPath}/${topicName}` : topicName;
246
+ let targetType = 'folder';
247
+ let targetRelPath = raw.parentRelPath;
248
+ if (physicalItemsMap.has(candidateFileRelPath) && !physicalItemsMap.get(candidateFileRelPath)?.isDirectory) {
249
+ targetType = 'file';
250
+ targetRelPath = candidateFileRelPath;
251
+ }
252
+ else if (branchItemsMap.has(candidateFileRelPath) && branchItemsMap.get(candidateFileRelPath)?.fsType === 'file') {
253
+ targetType = 'file';
254
+ targetRelPath = candidateFileRelPath;
255
+ }
256
+ else if (stagedMap.has(candidateFileRelPath)) {
257
+ targetType = 'file';
258
+ targetRelPath = candidateFileRelPath;
259
+ }
260
+ let content = '';
261
+ try {
262
+ content = await fs.readFile(raw.fullPath, 'utf8');
263
+ }
264
+ catch {
265
+ // Unreadable comment file
266
+ }
267
+ pendingComments.push({
268
+ commentRelPath: raw.relPath,
269
+ commentFullPath: raw.fullPath,
270
+ targetRelPath,
271
+ targetType,
272
+ topicName,
273
+ content,
274
+ });
275
+ }
276
+ return {
277
+ branchName,
278
+ activeWorktreeDir,
279
+ staged,
280
+ modified,
281
+ deleted,
282
+ untracked,
283
+ pendingComments,
284
+ };
285
+ }
286
+ //# sourceMappingURL=status-helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-helper.mjs","sourceRoot":"","sources":["../../../src/engine/status/status-helper.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibgib/vcs-gib",
3
- "version": "0.0.23",
3
+ "version": "0.0.29",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -22,7 +22,7 @@
22
22
  "@ibgib/helper-gib": "^0.0.37",
23
23
  "@ibgib/ts-gib": "^0.5.34",
24
24
  "@ibgib/encrypt-gib": "^0.3.1",
25
- "@ibgib/core-gib": "^0.1.74",
26
- "@ibgib/node-gib": "^0.0.19"
25
+ "@ibgib/core-gib": "^0.1.76",
26
+ "@ibgib/node-gib": "^0.0.21"
27
27
  }
28
28
  }
@@ -2,4 +2,4 @@
2
2
  * @module AUTO-GENERATED-version
3
3
  * Auto-generated version constant. Do NOT edit directly.
4
4
  */
5
- export const AUTO_GENERATED_VERSION = '0.0.23';
5
+ export const AUTO_GENERATED_VERSION = '0.0.29';
@@ -18,6 +18,7 @@ import {
18
18
  VCS_PARAM_YES,
19
19
  VCS_PARAM_STAGED,
20
20
  VCS_PARAM_WORKTREE,
21
+ VCS_PARAM_COMMENTS,
21
22
  } from './cli-constants.mjs';
22
23
 
23
24
  export type VcsSubcommand = typeof VCS_SUBCOMMANDS[keyof typeof VCS_SUBCOMMANDS];
@@ -36,6 +37,7 @@ export interface ParsedVcsArgs {
36
37
  yes?: boolean;
37
38
  staged?: boolean;
38
39
  worktree?: boolean;
40
+ comments?: boolean;
39
41
  };
40
42
  rawArgs: string[];
41
43
  }
@@ -104,6 +106,9 @@ export function parseVcsArgs(argv: string[]): ParsedVcsArgs {
104
106
  } else if (matchesParam(arg, VCS_PARAM_WORKTREE)) {
105
107
  flags.worktree = true;
106
108
  i++;
109
+ } else if (matchesParam(arg, VCS_PARAM_COMMENTS)) {
110
+ flags.comments = true;
111
+ i++;
107
112
  } else if (!arg.startsWith('-')) {
108
113
  if (command === VCS_SUBCOMMANDS.HELP) {
109
114
  const normalized = arg.toLowerCase();
@@ -19,10 +19,23 @@ export const VCS_SUBCOMMANDS = {
19
19
  MERGE: 'merge',
20
20
  RESET: 'reset',
21
21
  RESTORE: 'restore',
22
+ GENERATE_COMMENT: 'generate-comment',
23
+ GEN_COMMENT: 'gen-comment',
24
+ GEN_MSG: 'gen-msg',
25
+ GCOMM: 'gcomm',
26
+ GMSG: 'gmsg',
22
27
  HELP: 'help',
23
28
  VERSION: 'version',
24
29
  } as const;
25
30
 
31
+ export const VCS_PARAM_COMMENTS: RCLIParamInfo = {
32
+ name: 'comments',
33
+ synonyms: ['c'],
34
+ description: 'Show full pending comment texts in status',
35
+ isFlag: true,
36
+ argTypeName: 'boolean',
37
+ };
38
+
26
39
  export const VCS_PARAM_MESSAGE: RCLIParamInfo = {
27
40
  name: 'message',
28
41
  synonyms: ['m'],
@@ -20,6 +20,8 @@ import { putInSpace, persistTransformResult } from '@ibgib/core-gib/dist/witness
20
20
 
21
21
  import { bootstrapVcsMetaspace } from '../../bootstrap/node-bootstrap.mjs';
22
22
  import { getOrCreateBranchSpace } from '../../engine/branch/branch-space-helper.mjs';
23
+ import { resolveContextualBranchName } from '../../engine/branch/branch-helper.mjs';
24
+ import { isCommentMetadataFilename } from '../../engine/status/status-helper.mjs';
23
25
  import { getB2tFSItemIb } from '../../engine/item/item-atom-helper.mjs';
24
26
  import { B2tFSItemIbGib_V1, B2TFS_CHILD_ITEM_REL8N_NAME } from '../../engine/item/item-types.mjs';
25
27
  import { getIbGibWithMetaspaceFallback, createB2tFSItemIbGib, evolveB2tFSItemIbGib } from '../../engine/item/item-helper.mjs';
@@ -78,7 +80,11 @@ export async function executeAddCmd({
78
80
  throw new Error(`Repository not initialized. Run 'vcs init' first. (E: 2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e)`);
79
81
  }
80
82
 
81
- const activeBranch = indexIbGib.data?.activeBranch || 'main';
83
+ const activeBranch = resolveContextualBranchName({
84
+ targetDir: absTargetDir,
85
+ repoRoot,
86
+ indexIbGib,
87
+ });
82
88
  const activeWorktreeDir = activeBranch === 'main' ? repoRoot : path.join(repoRoot, 'b', activeBranch);
83
89
 
84
90
  // Target active branch space b2s_<activeBranch>
@@ -186,7 +192,7 @@ export async function executeAddCmd({
186
192
  throw new Error(`No files matched glob pattern: ${relOrAbs} (E: e23d4c5f6a7b8c9d0e1f2a3b4c5d6e7f)`);
187
193
  }
188
194
  } else {
189
- const fullPath = path.resolve(targetDir, relOrAbs);
195
+ const fullPath = path.isAbsolute(relOrAbs) ? relOrAbs : path.resolve(absTargetDir, relOrAbs);
190
196
  let stat;
191
197
  try {
192
198
  stat = await fs.stat(fullPath);
@@ -420,7 +426,9 @@ async function addCmd_collectFilesRecursively({
420
426
  outFiles,
421
427
  });
422
428
  } else if (entry.isFile()) {
423
- outFiles.push(fullPath);
429
+ if (!isCommentMetadataFilename(entry.name)) {
430
+ outFiles.push(fullPath);
431
+ }
424
432
  }
425
433
  }
426
434
  }
@@ -19,6 +19,7 @@ import { executeBranchCmd } from './branch-cmd.mjs';
19
19
  import { executeCheckoutCmd } from './checkout-cmd.mjs';
20
20
  import { executeMergeCmd } from './merge-cmd.mjs';
21
21
  import { executeStatusCmd } from './status-cmd.mjs';
22
+ import { executeLogCmd } from './log-cmd.mjs';
22
23
  import { logCheckpoint } from '../../test/test-helpers.mjs';
23
24
 
24
25
  const lc = `[apps/vcs-gib/src/cli/commands/branch-checkout-cmd.respec.node.mts]`;
@@ -501,5 +502,58 @@ await respecfully(lc, `vcs branch, checkout, and merge Command Handlers`, async
501
502
  await fs.rm(testDir, { recursive: true, force: true });
502
503
  }
503
504
  });
505
+
506
+ await ifWe(lc, `resolves contextual branch for log and status inside secondary branch worktree`, async () => {
507
+ const testDir = path.join(process.cwd(), '.test_contextual_worktree_branch');
508
+ const vcsFolderName = '.vcsgib_test_cwb';
509
+ try {
510
+ await executeInitCmd({ targetDir: testDir, vcsFolderName, quiet: true });
511
+
512
+ await fs.writeFile(path.join(testDir, 'app.ts'), 'console.log("main");\n', 'utf8');
513
+ await executeAddCmd({ paths: [path.join(testDir, 'app.ts')], targetDir: testDir, vcsFolderName, quiet: true });
514
+ await executeCommitCmd({ message: 'Main initial commit', targetDir: testDir, vcsFolderName, quiet: true });
515
+
516
+ // Create and switch to feature branch
517
+ await executeBranchCmd({
518
+ branchName: 'feature-calc',
519
+ targetDir: testDir,
520
+ vcsFolderName,
521
+ quiet: true,
522
+ });
523
+ const checkoutRes = await executeCheckoutCmd({
524
+ branchName: 'feature-calc',
525
+ targetDir: testDir,
526
+ vcsFolderName,
527
+ quiet: true,
528
+ });
529
+ const featureWorktree = checkoutRes.worktreePath;
530
+ iReckon(lc, featureWorktree).isGonnaBeTruthy();
531
+
532
+ // Commit on feature branch inside worktree
533
+ await fs.writeFile(path.join(featureWorktree!, 'calc.ts'), 'export const add = (a, b) => a + b;\n', 'utf8');
534
+ await executeAddCmd({ paths: [path.join(featureWorktree!, 'calc.ts')], targetDir: featureWorktree!, vcsFolderName, quiet: true });
535
+ await executeCommitCmd({ message: 'Add calc on feature-calc', targetDir: featureWorktree!, vcsFolderName, quiet: true });
536
+
537
+ // Checkout main again so index.activeBranch is 'main'
538
+ await executeCheckoutCmd({ branchName: 'main', targetDir: testDir, vcsFolderName, quiet: true });
539
+
540
+ // Now query log from inside featureWorktree
541
+ const featureLogRes = await executeLogCmd({ targetDir: featureWorktree!, vcsFolderName, quiet: true });
542
+ iReckon(lc, featureLogRes.branchName).willEqual('feature-calc');
543
+ const featureMessages = featureLogRes.commits.map(c => c.message);
544
+ iReckon(lc, featureMessages.some(m => m.includes('Add calc on feature-calc'))).isGonnaBeTrue();
545
+
546
+ // Query status from inside featureWorktree
547
+ const featureStatusRes = await executeStatusCmd({ targetDir: featureWorktree!, vcsFolderName, quiet: true });
548
+ iReckon(lc, featureStatusRes.branchName).willEqual('feature-calc');
549
+
550
+ // Query log from main repoRoot
551
+ const mainLogRes = await executeLogCmd({ targetDir: testDir, vcsFolderName, quiet: true });
552
+ iReckon(lc, mainLogRes.branchName).willEqual('main');
553
+ } finally {
554
+ await fs.rm(testDir, { recursive: true, force: true });
555
+ }
556
+ });
504
557
  });
505
558
 
559
+