@context-forge/cli 0.8.5 → 0.9.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 (141) hide show
  1. package/dist/commands/arch.d.ts +7 -0
  2. package/dist/commands/arch.d.ts.map +1 -0
  3. package/dist/commands/arch.js +169 -0
  4. package/dist/commands/arch.js.map +1 -0
  5. package/dist/commands/backup.d.ts +3 -0
  6. package/dist/commands/backup.d.ts.map +1 -0
  7. package/dist/commands/backup.js +27 -0
  8. package/dist/commands/backup.js.map +1 -0
  9. package/dist/commands/build.d.ts +24 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +146 -0
  12. package/dist/commands/build.js.map +1 -0
  13. package/dist/commands/check.d.ts +3 -0
  14. package/dist/commands/check.d.ts.map +1 -0
  15. package/dist/commands/check.js +250 -0
  16. package/dist/commands/check.js.map +1 -0
  17. package/dist/commands/commandInstaller.d.ts +28 -0
  18. package/dist/commands/commandInstaller.d.ts.map +1 -0
  19. package/dist/commands/commandInstaller.js +136 -0
  20. package/dist/commands/commandInstaller.js.map +1 -0
  21. package/dist/commands/config.d.ts +3 -0
  22. package/dist/commands/config.d.ts.map +1 -0
  23. package/dist/commands/config.js +116 -0
  24. package/dist/commands/config.js.map +1 -0
  25. package/dist/commands/future.d.ts +3 -0
  26. package/dist/commands/future.d.ts.map +1 -0
  27. package/dist/commands/future.js +96 -0
  28. package/dist/commands/future.js.map +1 -0
  29. package/dist/commands/guides.d.ts +9 -0
  30. package/dist/commands/guides.d.ts.map +1 -0
  31. package/dist/commands/guides.js +156 -0
  32. package/dist/commands/guides.js.map +1 -0
  33. package/dist/commands/init.d.ts +3 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +124 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/list.d.ts +3 -0
  38. package/dist/commands/list.d.ts.map +1 -0
  39. package/dist/commands/list.js +97 -0
  40. package/dist/commands/list.js.map +1 -0
  41. package/dist/commands/next.d.ts +3 -0
  42. package/dist/commands/next.d.ts.map +1 -0
  43. package/dist/commands/next.js +52 -0
  44. package/dist/commands/next.js.map +1 -0
  45. package/dist/commands/plan.d.ts +7 -0
  46. package/dist/commands/plan.d.ts.map +1 -0
  47. package/dist/commands/plan.js +102 -0
  48. package/dist/commands/plan.js.map +1 -0
  49. package/dist/commands/project.d.ts +25 -0
  50. package/dist/commands/project.d.ts.map +1 -0
  51. package/dist/commands/project.js +550 -0
  52. package/dist/commands/project.js.map +1 -0
  53. package/dist/commands/prompt.d.ts +3 -0
  54. package/dist/commands/prompt.d.ts.map +1 -0
  55. package/dist/commands/prompt.js +112 -0
  56. package/dist/commands/prompt.js.map +1 -0
  57. package/dist/commands/setup-ide.d.ts +15 -0
  58. package/dist/commands/setup-ide.d.ts.map +1 -0
  59. package/dist/commands/setup-ide.js +250 -0
  60. package/dist/commands/setup-ide.js.map +1 -0
  61. package/dist/commands/slice.d.ts +7 -0
  62. package/dist/commands/slice.d.ts.map +1 -0
  63. package/dist/commands/slice.js +151 -0
  64. package/dist/commands/slice.js.map +1 -0
  65. package/dist/commands/status.d.ts +3 -0
  66. package/dist/commands/status.d.ts.map +1 -0
  67. package/dist/commands/status.js +210 -0
  68. package/dist/commands/status.js.map +1 -0
  69. package/dist/commands/task.d.ts +13 -0
  70. package/dist/commands/task.d.ts.map +1 -0
  71. package/dist/commands/task.js +207 -0
  72. package/dist/commands/task.js.map +1 -0
  73. package/dist/commands/update.d.ts +27 -0
  74. package/dist/commands/update.d.ts.map +1 -0
  75. package/dist/commands/update.js +172 -0
  76. package/dist/commands/update.js.map +1 -0
  77. package/dist/commands/workflow.d.ts +3 -0
  78. package/dist/commands/workflow.d.ts.map +1 -0
  79. package/dist/commands/workflow.js +204 -0
  80. package/dist/commands/workflow.js.map +1 -0
  81. package/dist/commands/worktree.d.ts +3 -0
  82. package/dist/commands/worktree.d.ts.map +1 -0
  83. package/dist/commands/worktree.js +371 -0
  84. package/dist/commands/worktree.js.map +1 -0
  85. package/dist/index.d.ts +3 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +167 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/options.d.ts +16 -0
  90. package/dist/options.d.ts.map +1 -0
  91. package/dist/options.js +29 -0
  92. package/dist/options.js.map +1 -0
  93. package/dist/output/entryStatusDisplay.d.ts +12 -0
  94. package/dist/output/entryStatusDisplay.d.ts.map +1 -0
  95. package/dist/output/entryStatusDisplay.js +24 -0
  96. package/dist/output/entryStatusDisplay.js.map +1 -0
  97. package/dist/output/formatter.d.ts +6 -0
  98. package/dist/output/formatter.d.ts.map +1 -0
  99. package/dist/output/formatter.js +9 -0
  100. package/dist/output/formatter.js.map +1 -0
  101. package/dist/output/styles.d.ts +15 -0
  102. package/dist/output/styles.d.ts.map +1 -0
  103. package/dist/output/styles.js +16 -0
  104. package/dist/output/styles.js.map +1 -0
  105. package/dist/output/tables.d.ts +6 -0
  106. package/dist/output/tables.d.ts.map +1 -0
  107. package/dist/output/tables.js +45 -0
  108. package/dist/output/tables.js.map +1 -0
  109. package/dist/utils/archIndex.d.ts +7 -0
  110. package/dist/utils/archIndex.d.ts.map +1 -0
  111. package/dist/utils/archIndex.js +14 -0
  112. package/dist/utils/archIndex.js.map +1 -0
  113. package/dist/utils/breaking-changes.d.ts +14 -0
  114. package/dist/utils/breaking-changes.d.ts.map +1 -0
  115. package/dist/utils/breaking-changes.js +11 -0
  116. package/dist/utils/breaking-changes.js.map +1 -0
  117. package/dist/utils/commandCatalog.d.ts +25 -0
  118. package/dist/utils/commandCatalog.d.ts.map +1 -0
  119. package/dist/utils/commandCatalog.js +32 -0
  120. package/dist/utils/commandCatalog.js.map +1 -0
  121. package/dist/utils/confirm.d.ts +3 -0
  122. package/dist/utils/confirm.d.ts.map +1 -0
  123. package/dist/utils/confirm.js +12 -0
  124. package/dist/utils/confirm.js.map +1 -0
  125. package/dist/utils/errors.d.ts +22 -0
  126. package/dist/utils/errors.d.ts.map +1 -0
  127. package/dist/utils/errors.js +63 -0
  128. package/dist/utils/errors.js.map +1 -0
  129. package/dist/utils/phaseShorthand.d.ts +23 -0
  130. package/dist/utils/phaseShorthand.d.ts.map +1 -0
  131. package/dist/utils/phaseShorthand.js +68 -0
  132. package/dist/utils/phaseShorthand.js.map +1 -0
  133. package/dist/utils/project.d.ts +60 -0
  134. package/dist/utils/project.d.ts.map +1 -0
  135. package/dist/utils/project.js +140 -0
  136. package/dist/utils/project.js.map +1 -0
  137. package/dist/utils/worktree-overlay.d.ts +31 -0
  138. package/dist/utils/worktree-overlay.d.ts.map +1 -0
  139. package/dist/utils/worktree-overlay.js +63 -0
  140. package/dist/utils/worktree-overlay.js.map +1 -0
  141. package/package.json +2 -2
@@ -0,0 +1,140 @@
1
+ import { GitWorktreeDiscovery } from '@context-forge/core/node';
2
+ import { UserError } from './errors.js';
3
+ /**
4
+ * Find a project by exact ID or case-insensitive name.
5
+ * ID match takes priority over name match.
6
+ */
7
+ export async function findByNameOrId(nameOrId, store) {
8
+ const projects = await store.getAll();
9
+ // Exact ID match first
10
+ const byId = projects.find((p) => p.id === nameOrId);
11
+ if (byId)
12
+ return byId;
13
+ // Case-insensitive name match
14
+ const lower = nameOrId.toLowerCase();
15
+ const byName = projects.find((p) => p.name?.toLowerCase() === lower);
16
+ return byName ?? null;
17
+ }
18
+ /**
19
+ * Find the project whose projectPath or worktreePath best matches the current
20
+ * working directory. When multiple paths match (nested paths), the longest wins.
21
+ * Projects without a projectPath are skipped; worktrees without a worktreePath
22
+ * are also skipped.
23
+ */
24
+ export async function findProjectByCwd(store) {
25
+ const projects = await store.getAll();
26
+ const cwd = process.cwd();
27
+ const candidates = [];
28
+ for (const p of projects) {
29
+ // Existing: project root path
30
+ if (p.projectPath) {
31
+ candidates.push({ project: p, path: p.projectPath });
32
+ }
33
+ // New: worktree paths
34
+ for (const wt of p.worktrees ?? []) {
35
+ if (wt.worktreePath) {
36
+ candidates.push({ project: p, path: wt.worktreePath, worktreeId: wt.id });
37
+ }
38
+ }
39
+ }
40
+ const matches = candidates
41
+ .filter((c) => {
42
+ const path = c.path.endsWith('/') ? c.path.slice(0, -1) : c.path;
43
+ return cwd === path || cwd.startsWith(path + '/');
44
+ })
45
+ .sort((a, b) => {
46
+ // Longest path wins; on tie, prefer worktree match over project root
47
+ const lenDiff = b.path.length - a.path.length;
48
+ if (lenDiff !== 0)
49
+ return lenDiff;
50
+ if (a.worktreeId && !b.worktreeId)
51
+ return -1;
52
+ if (!a.worktreeId && b.worktreeId)
53
+ return 1;
54
+ return 0;
55
+ });
56
+ if (matches.length === 0)
57
+ return null;
58
+ return { project: matches[0].project, worktreeId: matches[0].worktreeId };
59
+ }
60
+ /**
61
+ * Resolves which project and (optionally) worktree to use via a three-step chain:
62
+ *
63
+ * 1. explicit --project flag → findByNameOrId
64
+ * 2. CWD detection → findProjectByCwd (worktree-aware)
65
+ * 3. Throw UserError with guidance
66
+ *
67
+ * When opts.worktree is provided and a project was resolved, also resolves the
68
+ * worktreeId via findWorktreeByNameOrId.
69
+ */
70
+ export async function resolveProjectWorktree(opts, store) {
71
+ const explicit = opts.project;
72
+ // Step 1: explicit --project flag
73
+ if (explicit) {
74
+ const project = await findByNameOrId(explicit, store);
75
+ if (!project) {
76
+ throw new UserError(`Project '${explicit}' not found.`, 'PROJECT_NOT_FOUND', `Check the spelling, or run cf project list to see available projects.`);
77
+ }
78
+ const resolved = { id: project.id, source: 'flag' };
79
+ if (opts.worktree) {
80
+ const wt = await findWorktreeByNameOrId(project.id, opts.worktree, store);
81
+ if (wt)
82
+ resolved.worktreeId = wt.id;
83
+ }
84
+ return resolved;
85
+ }
86
+ // Step 2: CWD detection (worktree-aware)
87
+ const cwdMatch = await findProjectByCwd(store);
88
+ if (cwdMatch) {
89
+ if (cwdMatch.worktreeId) {
90
+ return { id: cwdMatch.project.id, worktreeId: cwdMatch.worktreeId, source: 'worktree' };
91
+ }
92
+ return { id: cwdMatch.project.id, source: 'cwd' };
93
+ }
94
+ // Step 2b: CWD is a git worktree of a known project (not yet registered as a cf worktree)
95
+ try {
96
+ const discovery = new GitWorktreeDiscovery();
97
+ const gitWorktrees = await discovery.listWorktrees(process.cwd());
98
+ if (gitWorktrees.length > 0) {
99
+ const mainWorktreePath = gitWorktrees[0].path;
100
+ const projects = await store.getAll();
101
+ const matchingProject = projects.find((p) => p.projectPath === mainWorktreePath);
102
+ if (matchingProject) {
103
+ return { id: matchingProject.id, source: 'cwd' };
104
+ }
105
+ }
106
+ }
107
+ catch {
108
+ // Git unavailable or not a git repo — fall through
109
+ }
110
+ // Step 3: no resolution
111
+ throw new UserError('No project specified and no registered project found at current path.', 'PROJECT_NOT_FOUND', `cf init # register current directory as a project\n` +
112
+ ` --project <name> # specify a project explicitly\n` +
113
+ ` cf project list # see registered projects`);
114
+ }
115
+ /**
116
+ * Resolves which project to use via a three-step chain.
117
+ * Backwards-compatible wrapper around resolveProjectWorktree — drops worktreeId.
118
+ */
119
+ export async function resolveProjectId(explicit, store) {
120
+ const result = await resolveProjectWorktree({ project: explicit }, store);
121
+ return { id: result.id, source: result.source };
122
+ }
123
+ /**
124
+ * Find a worktree within a project by exact ID or case-insensitive name.
125
+ * ID match takes priority over name match. Returns undefined if not found.
126
+ */
127
+ export async function findWorktreeByNameOrId(projectId, nameOrId, store) {
128
+ const project = await store.getById(projectId);
129
+ if (!project)
130
+ return undefined;
131
+ const worktrees = project.worktrees ?? [];
132
+ // Exact ID match first
133
+ const byId = worktrees.find((wt) => wt.id === nameOrId);
134
+ if (byId)
135
+ return byId;
136
+ // Case-insensitive name match
137
+ const lower = nameOrId.toLowerCase();
138
+ return worktrees.find((wt) => wt.name.toLowerCase() === lower);
139
+ }
140
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export { applyWorktreeOverlay } from '@context-forge/core';
2
+ import type { ProjectData } from '@context-forge/core';
3
+ /**
4
+ * Resolve the filesystem path for file operations.
5
+ * Returns worktreePath when a worktree is resolved and has a path,
6
+ * otherwise returns projectPath.
7
+ */
8
+ export declare function resolveOperationPath(project: ProjectData, worktreeId?: string): string | undefined;
9
+ /**
10
+ * Get the index range for filtering, if applicable.
11
+ * Returns the worktree's indexRange for ALL worktrees (including default).
12
+ * Returns undefined only when no worktreeId, no worktrees array, or
13
+ * worktree not found (projects without worktrees — no filtering).
14
+ */
15
+ export declare function getWorktreeIndexRange(project: ProjectData, worktreeId?: string): [number, number] | undefined;
16
+ /**
17
+ * Get all unique filesystem paths for cross-worktree aggregation (--all mode).
18
+ * Collects projectPath + all worktreePath values into a deduplicated set.
19
+ */
20
+ export declare function resolveAllOperationPaths(project: ProjectData): string[];
21
+ /**
22
+ * Check if a worktree has rangeOverride enabled.
23
+ * Returns false when no worktreeId, no worktrees, or worktree not found.
24
+ */
25
+ export declare function getWorktreeRangeOverride(project: ProjectData, worktreeId?: string): boolean;
26
+ /**
27
+ * Check if a numeric index falls within an optional range.
28
+ * Returns true if no range is specified (no filtering).
29
+ */
30
+ export declare function isInIndexRange(index: number, range?: [number, number]): boolean;
31
+ //# sourceMappingURL=worktree-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-overlay.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAMpB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAK9B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,GACnB,MAAM,EAAE,CAOV;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACvB,OAAO,CAGT"}
@@ -0,0 +1,63 @@
1
+ // Re-export from core — canonical implementation lives in @context-forge/core
2
+ export { applyWorktreeOverlay } from '@context-forge/core';
3
+ /**
4
+ * Resolve the filesystem path for file operations.
5
+ * Returns worktreePath when a worktree is resolved and has a path,
6
+ * otherwise returns projectPath.
7
+ */
8
+ export function resolveOperationPath(project, worktreeId) {
9
+ if (worktreeId && project.worktrees) {
10
+ const wt = project.worktrees.find((w) => w.id === worktreeId);
11
+ if (wt?.worktreePath)
12
+ return wt.worktreePath;
13
+ }
14
+ return project.projectPath;
15
+ }
16
+ /**
17
+ * Get the index range for filtering, if applicable.
18
+ * Returns the worktree's indexRange for ALL worktrees (including default).
19
+ * Returns undefined only when no worktreeId, no worktrees array, or
20
+ * worktree not found (projects without worktrees — no filtering).
21
+ */
22
+ export function getWorktreeIndexRange(project, worktreeId) {
23
+ if (!worktreeId || !project.worktrees)
24
+ return undefined;
25
+ const wt = project.worktrees.find((w) => w.id === worktreeId);
26
+ if (!wt)
27
+ return undefined;
28
+ return wt.indexRange;
29
+ }
30
+ /**
31
+ * Get all unique filesystem paths for cross-worktree aggregation (--all mode).
32
+ * Collects projectPath + all worktreePath values into a deduplicated set.
33
+ */
34
+ export function resolveAllOperationPaths(project) {
35
+ const paths = new Set();
36
+ if (project.projectPath)
37
+ paths.add(project.projectPath);
38
+ for (const wt of project.worktrees ?? []) {
39
+ if (wt.worktreePath)
40
+ paths.add(wt.worktreePath);
41
+ }
42
+ return [...paths];
43
+ }
44
+ /**
45
+ * Check if a worktree has rangeOverride enabled.
46
+ * Returns false when no worktreeId, no worktrees, or worktree not found.
47
+ */
48
+ export function getWorktreeRangeOverride(project, worktreeId) {
49
+ if (!worktreeId || !project.worktrees)
50
+ return false;
51
+ const wt = project.worktrees.find((w) => w.id === worktreeId);
52
+ return wt?.rangeOverride === true;
53
+ }
54
+ /**
55
+ * Check if a numeric index falls within an optional range.
56
+ * Returns true if no range is specified (no filtering).
57
+ */
58
+ export function isInIndexRange(index, range) {
59
+ if (!range)
60
+ return true;
61
+ return index >= range[0] && index <= range[1];
62
+ }
63
+ //# sourceMappingURL=worktree-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-overlay.js","sourceRoot":"","sources":["../../src/utils/worktree-overlay.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAoB,EACpB,UAAmB;IAEnB,IAAI,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QAC9D,IAAI,EAAE,EAAE,YAAY;YAAE,OAAO,EAAE,CAAC,YAAY,CAAC;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAoB,EACpB,UAAmB;IAEnB,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,EAAE,CAAC,UAAU,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxD,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,EAAE,CAAC,YAAY;YAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAoB,EACpB,UAAmB;IAEnB,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC9D,OAAO,EAAE,EAAE,aAAa,KAAK,IAAI,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,KAAwB;IAExB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-forge/cli",
3
- "version": "0.8.5",
3
+ "version": "0.9.0",
4
4
  "description": "CLI for Context Forge — terminal access to context assembly, project management, workflow navigation, and configuration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "dependencies": {
33
33
  "chalk": "^5.4.1",
34
34
  "commander": "^13.1.0",
35
- "@context-forge/core": "0.8.5"
35
+ "@context-forge/core": "0.9.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^25.3.0",