@context-forge/cli 0.2.2 → 0.3.1

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.
package/README.md CHANGED
@@ -2,29 +2,39 @@
2
2
 
3
3
  Terminal interface for Context Forge — context assembly, project management, workflow navigation, and configuration.
4
4
 
5
- ## Installation
6
-
7
- From the monorepo root:
5
+ ## How It Works
8
6
 
9
- ```bash
10
- pnpm install
11
- pnpm --filter @context-forge/cli build
12
- ```
7
+ `cf` works like `git` — install it globally and it automatically detects your project based on your current working directory. No configuration files to manage per-project; just `cd` into any registered project and run commands.
13
8
 
14
- The `cf` binary is available via the workspace. For global install (future):
9
+ ## Installation
15
10
 
16
11
  ```bash
12
+ # Install globally
17
13
  npm install -g @context-forge/cli
14
+
15
+ # Initialize a project (from the project root)
16
+ cd ~/repos/my-project
17
+ cf init
18
+
19
+ # Install the ai-project-guide templates (recommended)
20
+ cf guides install
21
+
22
+ # Install Claude Code slash commands (recommended)
23
+ cf install-commands
18
24
  ```
19
25
 
26
+ `cf init` registers the current directory as a Context Forge project. `cf guides install` bootstraps the [ai-project-guide](https://github.com/ecorkran/ai-project-guide) prompt templates that Context Forge's context engine is designed around. `cf install-commands` adds `/cf:*` slash commands to Claude Code.
27
+
20
28
  ## Quick Start
21
29
 
22
30
  ```bash
23
- # Set your default project (by name or ID)
24
- cf config set default_project orchestration
31
+ # All commands are discoverable
32
+ cf --help
33
+ cf project --help
34
+ #etc.
25
35
 
26
- # Check project status (auto-detects from CWD)
27
- cd ~/repos/orchestration && cf status
36
+ # Check project status
37
+ cf status
28
38
 
29
39
  # Generate a context prompt and copy to clipboard
30
40
  cf build | pbcopy
@@ -32,6 +42,16 @@ cf build | pbcopy
32
42
  # Generate with phase override
33
43
  cf build --phase task-breakdown
34
44
 
45
+ # Set project fields
46
+ cf set phase 6
47
+ cf set slice 175
48
+
49
+ # Confirm updates (if you like)
50
+ cf status
51
+
52
+ # Detailed information
53
+ cf project get
54
+
35
55
  # View available prompt templates
36
56
  cf prompt list
37
57
 
@@ -39,24 +59,53 @@ cf prompt list
39
59
  cf prompt get P5
40
60
  ```
41
61
 
42
- ## Commands
62
+ ## Claude Code Slash Commands
63
+
64
+ When installed via `cf install-commands`, these slash commands are available directly in Claude Code sessions:
65
+
66
+ | Command | Description |
67
+ |---------|-------------|
68
+ | `/cf:build` | Build a context prompt (accepts `--phase`, `--slice` flags) |
69
+ | `/cf:status` | Show project workflow status |
70
+ | `/cf:get` | Show all project fields |
71
+ | `/cf:set` | Set a project field (e.g., `/cf:set phase 6`) |
72
+ | `/cf:prompt` | Get or list prompt templates (e.g., `/cf:prompt P5` or `/cf:prompt list`) |
73
+ | `/cf:project` | Manage projects (e.g., `/cf:project list`, `/cf:project --schema`) |
74
+ | `/cf:next` | Show recommended next action |
75
+
76
+ Each command runs `cf` under the hood — same CWD-based project resolution, same output.
77
+
78
+ ## Commands Reference
43
79
 
44
80
  | Command | Usage | Description |
45
81
  |---------|-------|-------------|
82
+ | `cf init` | `cf init` | Register the current directory as a Context Forge project |
46
83
  | `cf status` | `cf status [--project <id>] [--json]` | Show workflow status for the active project |
47
84
  | `cf next` | `cf next [--project <id>] [--json]` | Show recommended next action |
48
85
  | `cf build` | `cf build [--project <id>] [--phase] [--slice] [--instruction] [--tasks] [--additional]` | Generate context prompt to stdout |
86
+ | `cf set` | `cf set <field> <value>` | Set a project field (shortcut for `cf project set`) |
87
+ | `cf get` | `cf get [--json]` | Show all project fields (shortcut for `cf project get`) |
49
88
  | `cf config` | `cf config list\|get\|set` | Manage configuration |
50
- | `cf project` | `cf project list\|get\|set` | Manage projects |
89
+ | `cf project` | `cf project list\|get\|set\|rm` | Manage projects |
51
90
  | `cf future` | `cf future [--project <id>] [--status <filter>] [--json]` | Show consolidated future work |
52
- | `cf check` | `cf check [--fix] [--json]` | Run consistency checks (stub — depends on slice 166) |
91
+ | `cf check` | `cf check [--fix] [--json]` | Run consistency checks |
53
92
  | `cf prompt` | `cf prompt list\|get <phase>` | Access prompt templates with variable substitution |
93
+ | `cf guides` | `cf guides install\|status\|update` | Manage ai-project-guide templates |
54
94
 
55
95
  ## Common Options
56
96
 
57
- - `--project <name|id>` — Override the default project by name or ID (available on most commands)
97
+ - `--project <name|id>` — Override the active project by name or ID
58
98
  - `--json` — Output as JSON (not applicable to `build` and `prompt get`)
59
99
 
100
+ ## Project Resolution
101
+
102
+ `cf` resolves which project to operate on using a priority chain:
103
+
104
+ 1. **`--project` flag** — highest priority. Accepts project name or ID.
105
+ 2. **CWD detection** — if the current directory is inside a registered project's path, that project is used automatically.
106
+
107
+ This means you can manage multiple projects just by `cd`-ing between them — no switching commands needed.
108
+
60
109
  ## Phase Shorthands
61
110
 
62
111
  `cf prompt get` and `cf build --phase` accept phase shorthands:
@@ -73,23 +122,23 @@ cf prompt get P5
73
122
 
74
123
  Shorthands are derived at runtime from the project's prompt asset file.
75
124
 
76
- ## Project Resolution
125
+ ## Phase / Instruction Auto-Set
77
126
 
78
- `cf` resolves which project to operate on using a three-level chain:
127
+ Setting the development phase automatically updates `instruction` to match:
79
128
 
80
- 1. **`--project` flag** — highest priority. Accepts project name or ID.
81
- 2. **CWD detection** — if the current directory is inside a registered project's path, that project is used automatically.
82
- 3. **`default_project` config** fallback when no flag or CWD match.
83
-
84
- `cf status` displays which method was used: `(--project flag)`, `(from CWD)`, or `(default)`.
129
+ ```bash
130
+ cf set phase 6
131
+ # Updated phase = Phase 6: Implementation on project my-project
132
+ # Updated instruction = Phase 6: Implementation (auto-set from phase)
133
+ ```
85
134
 
86
- **Planned config key:** `default_additional_instruction` not yet implemented. Will allow setting a default additional instruction appended to `cf build` output.
135
+ Setting `instruction` directly does not change `developmentPhase`.
87
136
 
88
137
  ## Architecture
89
138
 
90
139
  The CLI wraps `@context-forge/core` directly (no MCP layer), following the same pattern as the Electron package. All core services are imported from `@context-forge/core/node`.
91
140
 
92
- ## Development
141
+ ## Development (monorepo)
93
142
 
94
143
  ```bash
95
144
  pnpm --filter @context-forge/cli build # Compile TypeScript
@@ -100,12 +149,20 @@ pnpm --filter @context-forge/cli typecheck # Type check
100
149
 
101
150
  ## Changelog
102
151
 
152
+ ### v0.3.0
153
+
154
+ - **Template variable completion** — artifact fields (`fileArch`, `fileSlicePlan`, `fileHLD`, `fileSpec`) and aliases (`arch`, `plan`, `hld`, `spec`) available in prompt templates, with index extraction (`archIndex`, `planIndex`)
155
+ - **Consolidated project context** — `cf build` output uses clean key-value `### Project Context` block instead of bracket-wrapped format; `template` field removed; schema field names used throughout
156
+ - **Unified opening statement** — always "Working on {name}..." regardless of workType
157
+ - **Phase auto-sets instruction** — `cf set phase N` also updates `instruction` to match
158
+ - **Top-level shortcuts** — `cf set` and `cf get` work as shortcuts for `cf project set/get`
159
+
103
160
  ### v0.2.0
104
161
 
105
162
  - **CWD-based project detection** — `cf` auto-detects the project from your current directory
106
- - **Name-based resolution** — use `--project orchestration` or `cf config set default_project orchestration` with project names instead of IDs
107
- - **Resolution indicators** — `cf status` shows how the project was resolved (`from CWD`, `default`, `--project flag`)
108
- - **Compact `cf project list`** — Name/Path/Slice/Default columns with `●` default indicator and `~` path shortening
163
+ - **Name-based resolution** — use `--project orchestration` with project names instead of IDs
164
+ - **Resolution indicators** — `cf status` shows how the project was resolved (`from CWD`, `--project flag`)
165
+ - **Compact `cf project list`** — Name/Path/Slice columns with `*` active indicator and `~` path shortening
109
166
  - **Tighter output formatting** — consistent label alignment, suppressed empty fields, standardized error messages
110
167
 
111
168
  ### v0.1.0
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Build a Context Forge context prompt (accepts optional --phase, --slice flags)
3
+ argument-hint: [--phase <phase>] [--slice <slice>]
4
+ allowed-tools: Bash(cf:*)
5
+ ---
6
+
7
+ Present the following context prompt exactly as shown, with no additional commentary or interpretation:
8
+
9
+ !`cf build $ARGUMENTS`
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Show all fields for the active Context Forge project
3
+ allowed-tools: Bash(cf:*)
4
+ ---
5
+
6
+ Present the following project details exactly as shown, with no additional commentary or interpretation:
7
+
8
+ !`cf get`
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Show recommended next action for the current Context Forge project
3
+ allowed-tools: Bash(cf:*)
4
+ ---
5
+
6
+ Present the following recommendation exactly as shown, with no additional commentary or interpretation:
7
+
8
+ !`cf next`
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Manage Context Forge projects (e.g., /cf:project list, /cf:project --schema)
3
+ argument-hint: [list | get | set <field> <value> | rm | --schema]
4
+ allowed-tools: Bash(cf:*)
5
+ ---
6
+
7
+ Present the following output exactly as shown, with no additional commentary or interpretation:
8
+
9
+ !`cf project $ARGUMENTS`
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Get or list Context Forge prompt templates (e.g., /cf:prompt P5 or /cf:prompt list)
3
+ argument-hint: [phase-name | list]
4
+ allowed-tools: Bash(cf:*)
5
+ ---
6
+
7
+ Present the following output exactly as shown, with no additional commentary or interpretation:
8
+
9
+ !`cf prompt get $ARGUMENTS 2>/dev/null || cf prompt list`
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Set a field on the active Context Forge project (e.g., /cf:set phase 4)
3
+ argument-hint: <field> <value>
4
+ allowed-tools: Bash(cf:*)
5
+ ---
6
+
7
+ Present the following output exactly as shown, with no additional commentary or interpretation:
8
+
9
+ !`cf set $ARGUMENTS`
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Show Context Forge project status (phase, slice, task progress)
3
+ allowed-tools: Bash(cf:*)
4
+ ---
5
+
6
+ Present the following project status exactly as shown, with no additional commentary or interpretation:
7
+
8
+ !`cf status`
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiD3D"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoD3D"}
@@ -28,8 +28,10 @@ export function registerBuildCommand(program) {
28
28
  process.stderr.write(`Building context for ${project.name}...\n`);
29
29
  // Apply overrides to a working copy
30
30
  const workingCopy = { ...project };
31
- if (opts.phase)
31
+ if (opts.phase) {
32
32
  workingCopy.developmentPhase = opts.phase;
33
+ workingCopy.instruction = opts.phase;
34
+ }
33
35
  if (opts.slice)
34
36
  workingCopy.fileSlice = opts.slice;
35
37
  if (opts.instruction)
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAWlD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SAChD,MAAM,CAAC,6BAA6B,EAAE,2BAA2B,CAAC;SAClE,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,IAAe,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,mDAAmD,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzB,MAAM,IAAI,SAAS,CACjB,YAAY,OAAO,CAAC,IAAI,oCAAoC;oBAC1D,+CAA+C,CAClD,CAAC;YACJ,CAAC;YAED,iEAAiE;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;YAElE,oCAAoC;YACpC,MAAM,WAAW,GAAgB,EAAE,GAAG,OAAO,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK;gBAAE,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1D,IAAI,IAAI,CAAC,KAAK;gBAAE,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YACnD,IAAI,IAAI,CAAC,WAAW;gBAAE,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACjE,IAAI,IAAI,CAAC,KAAK;gBAAE,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YAEnD,MAAM,EAAE,UAAU,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,WAAY,CAAC,CAAC;YACvE,IAAI,aAAa,GAAG,MAAM,UAAU,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;YAE7E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,aAAa,GAAG,GAAG,aAAa,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3D,CAAC;YAED,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAWlD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SAChD,MAAM,CAAC,6BAA6B,EAAE,2BAA2B,CAAC;SAClE,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,IAAe,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,mDAAmD,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzB,MAAM,IAAI,SAAS,CACjB,YAAY,OAAO,CAAC,IAAI,oCAAoC;oBAC1D,+CAA+C,CAClD,CAAC;YACJ,CAAC;YAED,iEAAiE;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;YAElE,oCAAoC;YACpC,MAAM,WAAW,GAAgB,EAAE,GAAG,OAAO,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC1C,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;YACvC,CAAC;YACD,IAAI,IAAI,CAAC,KAAK;gBAAE,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YACnD,IAAI,IAAI,CAAC,WAAW;gBAAE,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACjE,IAAI,IAAI,CAAC,KAAK;gBAAE,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;YAEnD,MAAM,EAAE,UAAU,EAAE,GAAG,qBAAqB,CAAC,WAAW,CAAC,WAAY,CAAC,CAAC;YACvE,IAAI,aAAa,GAAG,MAAM,UAAU,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;YAE7E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,aAAa,GAAG,GAAG,aAAa,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3D,CAAC;YAED,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ /** Resolve the bundled commands/ directory relative to this script's location. */
3
+ export declare function getSourceCommandsDir(): string;
4
+ /**
5
+ * Copy command files from the bundled commands/cf/ directory to the target.
6
+ * Creates directories as needed. Overwrites existing files (idempotent).
7
+ *
8
+ * @returns List of installed filenames.
9
+ */
10
+ export declare function installCommands(targetDir: string): string[];
11
+ /**
12
+ * Remove managed command files from the target.
13
+ * Preserves user-added files. Removes the cf/ directory only if empty.
14
+ * No error if files or directory don't exist (idempotent).
15
+ *
16
+ * @returns List of removed filenames.
17
+ */
18
+ export declare function uninstallCommands(targetDir: string): string[];
19
+ export declare function registerInstallCommandsCommand(program: Command): void;
20
+ export declare function registerUninstallCommandsCommand(program: Command): void;
21
+ //# sourceMappingURL=commandInstaller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandInstaller.d.ts","sourceRoot":"","sources":["../../src/commands/commandInstaller.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,kFAAkF;AAClF,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAY3D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB7D;AAOD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiBrE;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBvE"}
@@ -0,0 +1,109 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { success, dim } from '../output/styles.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ /** Known command files managed by install/uninstall. */
9
+ const MANAGED_FILES = ['status.md', 'build.md', 'next.md', 'prompt.md', 'get.md', 'set.md', 'project.md'];
10
+ /** Resolve the bundled commands/ directory relative to this script's location. */
11
+ export function getSourceCommandsDir() {
12
+ // In dist: dist/commands/commandInstaller.js → ../../commands/
13
+ const resolved = path.resolve(__dirname, '..', '..', 'commands');
14
+ if (!fs.existsSync(resolved)) {
15
+ throw new Error(`Cannot locate bundled commands directory at ${resolved}. ` +
16
+ 'Ensure the package includes a commands/ directory.');
17
+ }
18
+ return resolved;
19
+ }
20
+ /**
21
+ * Copy command files from the bundled commands/cf/ directory to the target.
22
+ * Creates directories as needed. Overwrites existing files (idempotent).
23
+ *
24
+ * @returns List of installed filenames.
25
+ */
26
+ export function installCommands(targetDir) {
27
+ const sourceDir = path.join(getSourceCommandsDir(), 'cf');
28
+ const targetCfDir = path.join(targetDir, 'cf');
29
+ fs.mkdirSync(targetCfDir, { recursive: true });
30
+ const files = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.md'));
31
+ for (const file of files) {
32
+ fs.copyFileSync(path.join(sourceDir, file), path.join(targetCfDir, file));
33
+ }
34
+ return files;
35
+ }
36
+ /**
37
+ * Remove managed command files from the target.
38
+ * Preserves user-added files. Removes the cf/ directory only if empty.
39
+ * No error if files or directory don't exist (idempotent).
40
+ *
41
+ * @returns List of removed filenames.
42
+ */
43
+ export function uninstallCommands(targetDir) {
44
+ const targetCfDir = path.join(targetDir, 'cf');
45
+ const removed = [];
46
+ for (const file of MANAGED_FILES) {
47
+ const filePath = path.join(targetCfDir, file);
48
+ if (fs.existsSync(filePath)) {
49
+ fs.rmSync(filePath);
50
+ removed.push(file);
51
+ }
52
+ }
53
+ // Remove cf/ directory if it exists and is now empty
54
+ if (fs.existsSync(targetCfDir)) {
55
+ const remaining = fs.readdirSync(targetCfDir);
56
+ if (remaining.length === 0) {
57
+ fs.rmdirSync(targetCfDir);
58
+ }
59
+ }
60
+ return removed;
61
+ }
62
+ /** Default target directory for command installation. */
63
+ function defaultTarget() {
64
+ return path.join(os.homedir(), '.claude', 'commands');
65
+ }
66
+ export function registerInstallCommandsCommand(program) {
67
+ program
68
+ .command('install-commands')
69
+ .description('Install Claude Code slash commands for Context Forge')
70
+ .option('--target <dir>', 'Target directory', defaultTarget())
71
+ .action((opts) => {
72
+ try {
73
+ const installed = installCommands(opts.target);
74
+ console.log(success(`Installed ${installed.length} commands to ${opts.target}/cf/`));
75
+ for (const file of installed) {
76
+ console.log(` ${dim('/cf:' + file.replace('.md', ''))}`);
77
+ }
78
+ }
79
+ catch (err) {
80
+ console.error(`Error: ${err.message}`);
81
+ process.exit(1);
82
+ }
83
+ });
84
+ }
85
+ export function registerUninstallCommandsCommand(program) {
86
+ program
87
+ .command('uninstall-commands')
88
+ .description('Remove Claude Code slash commands for Context Forge')
89
+ .option('--target <dir>', 'Target directory', defaultTarget())
90
+ .action((opts) => {
91
+ try {
92
+ const removed = uninstallCommands(opts.target);
93
+ if (removed.length === 0) {
94
+ console.log(dim('No commands found to remove.'));
95
+ }
96
+ else {
97
+ console.log(success(`Removed ${removed.length} commands from ${opts.target}/cf/`));
98
+ for (const file of removed) {
99
+ console.log(` ${dim('/cf:' + file.replace('.md', ''))}`);
100
+ }
101
+ }
102
+ }
103
+ catch (err) {
104
+ console.error(`Error: ${err.message}`);
105
+ process.exit(1);
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=commandInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandInstaller.js","sourceRoot":"","sources":["../../src/commands/commandInstaller.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
1
  import { Command } from 'commander';
2
+ /** Generate help text showing settable fields grouped by category. */
3
+ export declare function buildSettableFieldsHelp(): string;
4
+ /** Shared action handler for `cf set` and `cf project set`. */
5
+ export declare function projectSetAction(field: string, val: string, opts: {
6
+ project?: string;
7
+ }): Promise<void>;
8
+ /** Shared action handler for `cf get` and `cf project get`. */
9
+ export declare function projectGetAction(opts: {
10
+ json?: boolean;
11
+ project?: string;
12
+ }): Promise<void>;
2
13
  export declare function registerProjectCommand(program: Command): void;
3
14
  //# sourceMappingURL=project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4DpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4M7D"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,sEAAsE;AACtE,wBAAgB,uBAAuB,IAAI,MAAM,CA0BhD;AAED,+DAA+D;AAC/D,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED,+DAA+D;AAC/D,wBAAsB,gBAAgB,CACpC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2H7D"}
@@ -1,8 +1,8 @@
1
1
  import * as os from 'node:os';
2
2
  import * as readline from 'node:readline';
3
- import { FileProjectStore, ConfigManager } from '@context-forge/core/node';
3
+ import { FileProjectStore, ConfigManager, resolveFileByIndex } from '@context-forge/core/node';
4
4
  import { resolveFieldName, resolvePhaseValue, validateFieldValue, PROJECT_FIELDS, FIELD_GROUPS, } from '@context-forge/core';
5
- import { resolveProjectId, findByNameOrId } from '../utils/project.js';
5
+ import { resolveProjectId, findByNameOrId, findProjectByCwd } from '../utils/project.js';
6
6
  import { handleError, UserError } from '../utils/errors.js';
7
7
  import { printJson } from '../output/formatter.js';
8
8
  import { renderTable } from '../output/tables.js';
@@ -23,26 +23,162 @@ function displaySchema() {
23
23
  artifacts: 'Artifacts',
24
24
  workflow: 'Workflow',
25
25
  metadata: 'Metadata',
26
+ custom: 'Custom',
26
27
  };
27
- console.log(label('\nProject Schema'));
28
- console.log('══════════════');
28
+ const rows = [];
29
+ const rowPrefixes = [];
30
+ const enumFields = [];
29
31
  for (const group of FIELD_GROUPS) {
30
32
  const groupFields = PROJECT_FIELDS.filter((f) => f.group === group);
31
- console.log(`\n${label(groupLabels[group])}`);
33
+ // Group separator row
34
+ rows.push([label(groupLabels[group]), '', '']);
35
+ rowPrefixes.push(' ');
32
36
  for (const f of groupFields) {
37
+ const alias = f.aliases.length > 0 ? f.aliases.join(', ') : '';
33
38
  const flags = [];
34
39
  if (f.required)
35
40
  flags.push('required');
36
41
  if (f.readonly)
37
42
  flags.push('readonly');
38
- const flagStr = flags.length > 0 ? ` (${flags.join(', ')})` : '';
39
- console.log(` ${f.field.padEnd(18)}${f.type.padEnd(10)}${flagStr} ${f.description}`);
40
- if (f.aliases.length > 0) {
41
- console.log(`${''.padEnd(20)}Aliases: ${f.aliases.join(', ')}`);
42
- }
43
+ const desc = flags.length > 0 ? `${f.description} ${dim(`(${flags.join(', ')})`)}` : f.description;
44
+ rows.push([f.field, alias, desc]);
45
+ rowPrefixes.push(' ');
43
46
  if (f.enumValues) {
44
- console.log(`${''.padEnd(20)}Values: ${f.enumValues.join(', ')}`);
47
+ enumFields.push({ name: f.aliases[0] ?? f.field, values: f.enumValues });
48
+ }
49
+ }
50
+ }
51
+ console.log(label('\nProject Schema') + dim(' (all fields are strings)'));
52
+ console.log('══════════════');
53
+ console.log(renderTable(['Field', 'Alias', 'Description'], rows, rowPrefixes));
54
+ if (enumFields.length > 0) {
55
+ console.log(dim('\n Allowed values:'));
56
+ for (const { name, values } of enumFields) {
57
+ console.log(dim(` ${name}: ${values.join(' | ')}`));
58
+ }
59
+ }
60
+ }
61
+ /** Generate help text showing settable fields grouped by category. */
62
+ export function buildSettableFieldsHelp() {
63
+ const groupLabels = {
64
+ identity: 'Identity',
65
+ artifacts: 'Artifacts',
66
+ workflow: 'Workflow',
67
+ metadata: 'Metadata',
68
+ custom: 'Custom',
69
+ };
70
+ const lines = ['', 'Settable fields:'];
71
+ for (const group of FIELD_GROUPS) {
72
+ const groupFields = PROJECT_FIELDS.filter((f) => f.group === group && !f.readonly);
73
+ if (groupFields.length === 0)
74
+ continue;
75
+ lines.push(` ${groupLabels[group]}`);
76
+ for (const f of groupFields) {
77
+ const aliasStr = f.aliases.length > 0 ? ` (${f.aliases.join(', ')})` : '';
78
+ lines.push(` ${(f.field + aliasStr).padEnd(30)} ${f.description}`);
79
+ }
80
+ }
81
+ lines.push('', "Run 'cf project --schema' for full details including allowed values.");
82
+ return lines.join('\n');
83
+ }
84
+ /** Shared action handler for `cf set` and `cf project set`. */
85
+ export async function projectSetAction(field, val, opts) {
86
+ const resolvedField = resolveFieldName(field);
87
+ if (!resolvedField) {
88
+ throw new UserError(`Unknown field: '${field}'. Run 'cf project --schema' to see available fields.`);
89
+ }
90
+ const fieldDef = PROJECT_FIELDS.find((f) => f.field === resolvedField);
91
+ if (fieldDef?.readonly) {
92
+ throw new UserError(`Field '${resolvedField}' is read-only and cannot be set.`);
93
+ }
94
+ let resolvedValue = val;
95
+ if (resolvedField === 'developmentPhase' || resolvedField === 'instruction') {
96
+ const phaseVal = resolvePhaseValue(val);
97
+ if (!phaseVal) {
98
+ const allowed = fieldDef?.enumValues?.join(', ') ?? '';
99
+ throw new UserError(`Invalid value "${val}" for field "${resolvedField}". Allowed values: ${allowed}`);
100
+ }
101
+ resolvedValue = phaseVal;
102
+ }
103
+ const validation = validateFieldValue(resolvedField, resolvedValue);
104
+ if (!validation.valid) {
105
+ throw new UserError(validation.error);
106
+ }
107
+ const store = new FileProjectStore();
108
+ const { id } = await resolveProjectId(opts.project, store);
109
+ const existing = await store.getById(id);
110
+ if (!existing) {
111
+ throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
112
+ }
113
+ // Index-based file resolution: cf set slice 171 → scans for matching file
114
+ if (fieldDef?.group === 'artifacts' && /^\d+$/.test(resolvedValue) && existing.projectPath) {
115
+ try {
116
+ const resolved = resolveFileByIndex(existing.projectPath, resolvedField, resolvedValue);
117
+ if (resolved !== null) {
118
+ resolvedValue = resolved;
119
+ }
120
+ }
121
+ catch (err) {
122
+ throw new UserError(err.message);
123
+ }
124
+ }
125
+ // customData fields use dot-notation; merge into the nested object
126
+ if (resolvedField.startsWith('customData.')) {
127
+ const subField = resolvedField.split('.')[1];
128
+ const merged = { ...existing.customData, [subField]: resolvedValue };
129
+ await store.update(id, { customData: merged });
130
+ }
131
+ else if (resolvedField === 'developmentPhase') {
132
+ // Auto-set instruction to match when phase changes
133
+ await store.update(id, { [resolvedField]: resolvedValue, instruction: resolvedValue });
134
+ }
135
+ else {
136
+ await store.update(id, { [resolvedField]: resolvedValue });
137
+ }
138
+ // Show alias-friendly name in confirmation
139
+ const displayName = fieldDef?.aliases[0] ?? resolvedField;
140
+ console.log(success(`Updated ${displayName} = ${resolvedValue} on project ${existing.name}`));
141
+ if (resolvedField === 'developmentPhase') {
142
+ console.log(success(`Updated instruction = ${resolvedValue} (auto-set from phase)`));
143
+ }
144
+ }
145
+ /** Shared action handler for `cf get` and `cf project get`. */
146
+ export async function projectGetAction(opts) {
147
+ const store = new FileProjectStore();
148
+ const { id } = await resolveProjectId(opts.project, store);
149
+ const project = await store.getById(id);
150
+ if (!project) {
151
+ throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
152
+ }
153
+ if (opts.json) {
154
+ printJson(project);
155
+ return;
156
+ }
157
+ const groupLabels = {
158
+ identity: 'Identity',
159
+ artifacts: 'Artifacts',
160
+ workflow: 'Workflow',
161
+ metadata: 'Metadata',
162
+ custom: 'Custom',
163
+ };
164
+ const projectRecord = project;
165
+ const customData = project.customData;
166
+ for (const group of FIELD_GROUPS) {
167
+ const groupFields = PROJECT_FIELDS.filter((f) => f.group === group);
168
+ console.log(`\n${label(groupLabels[group])}`);
169
+ for (const f of groupFields) {
170
+ // Read from customData sub-object for dot-notation fields
171
+ let v;
172
+ if (f.field.startsWith('customData.')) {
173
+ const subField = f.field.split('.')[1];
174
+ v = customData?.[subField];
45
175
  }
176
+ else {
177
+ v = projectRecord[f.field];
178
+ }
179
+ const hasValue = v !== undefined && v !== null && v !== '';
180
+ const display = hasValue ? valueStyle(String(v)) : dim('—');
181
+ console.log(` ${label(`${f.label}:`.padEnd(16))}${display}`);
46
182
  }
47
183
  }
48
184
  }
@@ -74,23 +210,29 @@ export function registerProjectCommand(program) {
74
210
  if (defaultRef) {
75
211
  defaultProject = await findByNameOrId(defaultRef, store);
76
212
  }
213
+ const cwdProject = await findProjectByCwd(store);
214
+ const activeId = cwdProject?.id ?? defaultProject?.id ?? null;
77
215
  if (opts.json) {
78
216
  printJson(projects.map((p) => ({
79
217
  id: p.id,
80
218
  name: p.name,
81
219
  projectPath: p.projectPath,
82
220
  fileSlice: p.fileSlice,
83
- isDefault: defaultProject?.id === p.id,
221
+ isActive: p.id === activeId,
84
222
  })));
85
223
  return;
86
224
  }
87
- const rows = projects.map((p) => [
88
- p.name,
89
- shortenPath(p.projectPath ?? ''),
90
- p.fileSlice,
91
- defaultProject?.id === p.id ? '' : '',
92
- ]);
93
- console.log(renderTable(['Name', 'Path', 'Slice', 'Default'], rows));
225
+ const rows = projects.map((p) => {
226
+ const active = p.id === activeId;
227
+ const name = p.name;
228
+ const path = shortenPath(p.projectPath ?? '');
229
+ const slice = p.fileSlice ?? '';
230
+ return active
231
+ ? [success(name), success(path), success(slice)]
232
+ : [name, path, slice];
233
+ });
234
+ const prefixes = projects.map((p) => p.id === activeId ? success('* ') : ' ');
235
+ console.log(renderTable(['Name', 'Path', 'Slice'], rows, prefixes));
94
236
  }
95
237
  catch (err) {
96
238
  handleError(err);
@@ -103,96 +245,24 @@ export function registerProjectCommand(program) {
103
245
  .option('--project <id>', 'Project ID (overrides default)')
104
246
  .action(async (opts) => {
105
247
  try {
106
- const store = new FileProjectStore();
107
- const { id } = await resolveProjectId(opts.project, store);
108
- const project = await store.getById(id);
109
- if (!project) {
110
- throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
111
- }
112
- if (opts.json) {
113
- printJson(project);
114
- return;
115
- }
116
- // Grouped display — iterate by group, skip empty groups
117
- const groupLabels = {
118
- identity: 'Identity',
119
- artifacts: 'Artifacts',
120
- workflow: 'Workflow',
121
- metadata: 'Metadata',
122
- };
123
- const projectRecord = project;
124
- for (const group of FIELD_GROUPS) {
125
- const groupFields = PROJECT_FIELDS.filter((f) => f.group === group);
126
- const populated = groupFields.filter((f) => {
127
- const val = projectRecord[f.field];
128
- return val !== undefined && val !== null && val !== '';
129
- });
130
- if (populated.length === 0)
131
- continue;
132
- console.log(`\n${label(groupLabels[group])}`);
133
- for (const f of populated) {
134
- const val = String(projectRecord[f.field]);
135
- console.log(` ${label(`${f.label}:`.padEnd(16))}${valueStyle(val)}`);
136
- }
137
- }
138
- // Display customData sub-fields if populated
139
- const custom = project.customData;
140
- if (custom) {
141
- const customEntries = [
142
- ['Recent Events', custom.recentEvents ?? ''],
143
- ['Notes', custom.additionalNotes ?? ''],
144
- ['Tools', custom.availableTools ?? ''],
145
- ];
146
- const populated = customEntries.filter(([, v]) => v);
147
- if (populated.length > 0) {
148
- console.log(`\n${label('Custom Data')}`);
149
- for (const [k, v] of populated) {
150
- console.log(` ${label(`${k}:`.padEnd(16))}${valueStyle(v)}`);
151
- }
152
- }
153
- }
248
+ await projectGetAction(opts);
154
249
  }
155
250
  catch (err) {
156
251
  handleError(err);
157
252
  }
158
253
  });
159
254
  cmd
160
- .command('set <field> <value>')
255
+ .command('set [field] [value]')
161
256
  .description('Update a field on the active project')
162
257
  .option('--project <id>', 'Project ID (overrides default)')
258
+ .addHelpText('after', buildSettableFieldsHelp)
163
259
  .action(async (field, val, opts) => {
260
+ if (!field || !val) {
261
+ console.log(`Usage: cf project set [options] <field> <value> — run cf project set --help for details`);
262
+ return;
263
+ }
164
264
  try {
165
- const resolvedField = resolveFieldName(field);
166
- if (!resolvedField) {
167
- throw new UserError(`Unknown field: '${field}'. Run 'cf project --schema' to see available fields.`);
168
- }
169
- const fieldDef = PROJECT_FIELDS.find((f) => f.field === resolvedField);
170
- if (fieldDef?.readonly) {
171
- throw new UserError(`Field '${resolvedField}' is read-only and cannot be set.`);
172
- }
173
- // Resolve phase/instruction values (number, short name, or full string)
174
- let resolvedValue = val;
175
- if (resolvedField === 'developmentPhase' || resolvedField === 'instruction') {
176
- const phaseVal = resolvePhaseValue(val);
177
- if (!phaseVal) {
178
- const allowed = fieldDef?.enumValues?.join(', ') ?? '';
179
- throw new UserError(`Invalid value "${val}" for field "${resolvedField}". Allowed values: ${allowed}`);
180
- }
181
- resolvedValue = phaseVal;
182
- }
183
- // Validate against enum constraints
184
- const validation = validateFieldValue(resolvedField, resolvedValue);
185
- if (!validation.valid) {
186
- throw new UserError(validation.error);
187
- }
188
- const store = new FileProjectStore();
189
- const { id } = await resolveProjectId(opts.project, store);
190
- const existing = await store.getById(id);
191
- if (!existing) {
192
- throw new UserError(`Project not found: '${id}'. Run cf project list to see available projects.`);
193
- }
194
- await store.update(id, { [resolvedField]: resolvedValue });
195
- console.log(success(`Updated ${resolvedField} = ${resolvedValue} on project ${existing.name}`));
265
+ await projectSetAction(field, val, opts);
196
266
  }
197
267
  catch (err) {
198
268
  handleError(err);
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE/E,uEAAuE;AACvE,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC;AACX,CAAC;AAGD,sDAAsD;AACtD,SAAS,aAAa;IACpB,MAAM,WAAW,GAA+B;QAC9C,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,UAAU;KACrB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAE9C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAEvF,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;SAClD,MAAM,CAAC,CAAC,IAA0B,EAAE,EAAE;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,YAAY,CAAC,gCAAgC,GAAG,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACnH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YAEtC,wEAAwE;YACxE,MAAM,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAe,CAAC;YACrE,IAAI,cAAc,GAAuB,IAAI,CAAC;YAC9C,IAAI,UAAU,EAAE,CAAC;gBACf,cAAc,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,SAAS,EAAE,cAAc,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;iBACvC,CAAC,CAAC,CAAC,CAAC;gBACL,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC/B,CAAC,CAAC,IAAI;gBACN,WAAW,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;gBAChC,CAAC,CAAC,SAAS;gBACX,cAAc,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;aACvC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAA0C,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,mDAAmD,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,wDAAwD;YACxD,MAAM,WAAW,GAA+B;gBAC9C,QAAQ,EAAE,UAAU;gBACpB,SAAS,EAAE,WAAW;gBACtB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;aACrB,CAAC;YAEF,MAAM,aAAa,GAAG,OAA6C,CAAC;YAEpE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBACpE,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;oBACzC,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACnC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBACzD,CAAC,CAAC,CAAC;gBAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAErC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAE9C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,6CAA6C;YAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAClC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,aAAa,GAAuB;oBACxC,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;oBAC5C,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;oBACvC,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;iBACvC,CAAC;gBACF,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;oBACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAChE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,GAAW,EAAE,IAA0B,EAAE,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,SAAS,CACjB,mBAAmB,KAAK,uDAAuD,CAChF,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC;YACvE,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;gBACvB,MAAM,IAAI,SAAS,CAAC,UAAU,aAAa,mCAAmC,CAAC,CAAC;YAClF,CAAC;YAED,wEAAwE;YACxE,IAAI,aAAa,GAAG,GAAG,CAAC;YACxB,IAAI,aAAa,KAAK,kBAAkB,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;gBAC5E,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACvD,MAAM,IAAI,SAAS,CACjB,kBAAkB,GAAG,gBAAgB,aAAa,sBAAsB,OAAO,EAAE,CAClF,CAAC;gBACJ,CAAC;gBACD,aAAa,GAAG,QAAQ,CAAC;YAC3B,CAAC;YAED,oCAAoC;YACpC,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,mDAAmD,CAAC,CAAC;YACpG,CAAC;YAED,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,aAAa,MAAM,aAAa,eAAe,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,QAA4B,EAAE,IAAyC,EAAE,EAAE;QACxF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,gBAAgB,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE,mDAAmD,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,mBAAmB,OAAO,CAAC,IAAI,QAAQ,OAAO,CAAC,WAAW,IAAI,SAAS,iEAAiE,CACzI,CAAC;gBACF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,6EAA6E;AAC7E,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';
3
3
  import chalk from 'chalk';
4
4
  import { Command } from 'commander';
5
5
  import { registerConfigCommand } from './commands/config.js';
6
- import { registerProjectCommand } from './commands/project.js';
6
+ import { registerProjectCommand, projectSetAction, projectGetAction, buildSettableFieldsHelp } from './commands/project.js';
7
7
  import { registerStatusCommand } from './commands/status.js';
8
8
  import { registerNextCommand } from './commands/next.js';
9
9
  import { registerBuildCommand } from './commands/build.js';
@@ -12,6 +12,7 @@ import { registerCheckCommand } from './commands/check.js';
12
12
  import { registerPromptCommand } from './commands/prompt.js';
13
13
  import { registerInitCommand } from './commands/init.js';
14
14
  import { registerGuidesCommand } from './commands/guides.js';
15
+ import { registerInstallCommandsCommand, registerUninstallCommandsCommand } from './commands/commandInstaller.js';
15
16
  import { handleError } from './utils/errors.js';
16
17
  const require = createRequire(import.meta.url);
17
18
  const { version } = require('../package.json');
@@ -40,6 +41,39 @@ registerCheckCommand(program);
40
41
  registerPromptCommand(program);
41
42
  registerInitCommand(program);
42
43
  registerGuidesCommand(program);
44
+ registerInstallCommandsCommand(program);
45
+ registerUninstallCommandsCommand(program);
46
+ // Top-level shortcuts for project get/set
47
+ program
48
+ .command('set [field] [value]')
49
+ .description('Set a field on the active project (shortcut for cf project set)')
50
+ .option('--project <name|id>', 'Project name or ID (overrides default)')
51
+ .addHelpText('after', buildSettableFieldsHelp)
52
+ .action(async (field, val, opts) => {
53
+ if (!field || !val) {
54
+ console.log(`Usage: cf set [options] <field> <value> — run cf set --help for details`);
55
+ return;
56
+ }
57
+ try {
58
+ await projectSetAction(field, val, opts);
59
+ }
60
+ catch (err) {
61
+ handleError(err);
62
+ }
63
+ });
64
+ program
65
+ .command('get')
66
+ .description('Show details for the active project (shortcut for cf project get)')
67
+ .option('--json', 'Output as JSON')
68
+ .option('--project <name|id>', 'Project name or ID (overrides default)')
69
+ .action(async (opts) => {
70
+ try {
71
+ await projectGetAction(opts);
72
+ }
73
+ catch (err) {
74
+ handleError(err);
75
+ }
76
+ });
43
77
  // Catch unhandled errors at top level
44
78
  process.on('uncaughtException', handleError);
45
79
  process.on('unhandledRejection', handleError);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sGAAsG,CAAC;KACnH,aAAa,CAAC;IACb,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACpC,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5C,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;IAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACzC,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IAC9C,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG;IAClC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;CACpC,CAAC;KACD,WAAW,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,qCAAqC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,8DAA8D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,oEAAoE,CAAC,CAAC;AAEvR,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,sCAAsC;AACtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC7C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAE9C,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  * Render a borderless table with bold/cyan headers and an underline separator.
3
3
  * Matches orchestration CLI style: no cell borders, column-aligned with padding.
4
4
  */
5
- export declare function renderTable(headers: string[], rows: string[][]): string;
5
+ export declare function renderTable(headers: string[], rows: string[][], rowPrefixes?: string[]): string;
6
6
  //# sourceMappingURL=tables.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/output/tables.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAmCvE"}
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/output/tables.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,WAAW,CAAC,EAAE,MAAM,EAAE,GACrB,MAAM,CAsCR"}
@@ -3,26 +3,29 @@ import chalk from 'chalk';
3
3
  * Render a borderless table with bold/cyan headers and an underline separator.
4
4
  * Matches orchestration CLI style: no cell borders, column-aligned with padding.
5
5
  */
6
- export function renderTable(headers, rows) {
6
+ export function renderTable(headers, rows, rowPrefixes) {
7
7
  // Calculate column widths from headers and data
8
8
  const colWidths = headers.map((h, i) => {
9
9
  const dataMax = rows.reduce((max, row) => Math.max(max, stripAnsi(row[i] ?? '').length), 0);
10
10
  return Math.max(stripAnsi(h).length, dataMax);
11
11
  });
12
12
  const pad = 2; // spacing between columns
13
+ const indent = ' ';
13
14
  const lines = [];
14
15
  // Header row — bold cyan
15
16
  const headerLine = headers
16
17
  .map((h, i) => chalk.bold.cyan(h.padEnd(colWidths[i])))
17
18
  .join(' '.repeat(pad));
18
- lines.push(' ' + headerLine);
19
+ lines.push(indent + headerLine);
19
20
  // Underline — thin dash under each column
20
21
  const underline = colWidths
21
22
  .map((w) => '─'.repeat(w))
22
23
  .join(' '.repeat(pad));
23
- lines.push(' ' + chalk.dim(underline));
24
+ lines.push(indent + chalk.dim(underline));
24
25
  // Data rows
25
- for (const row of rows) {
26
+ for (let r = 0; r < rows.length; r++) {
27
+ const row = rows[r];
28
+ const prefix = rowPrefixes ? rowPrefixes[r] : indent;
26
29
  const rowLine = row
27
30
  .map((cell, i) => {
28
31
  const visible = stripAnsi(cell ?? '');
@@ -30,7 +33,7 @@ export function renderTable(headers, rows) {
30
33
  return (cell ?? '') + ' '.repeat(Math.max(0, padding));
31
34
  })
32
35
  .join(' '.repeat(pad));
33
- lines.push(' ' + rowLine);
36
+ lines.push(prefix + rowLine);
34
37
  }
35
38
  return lines.join('\n');
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/output/tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC7D,gDAAgD;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,0BAA0B;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,SAAS,GAAG,SAAS;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAExC,YAAY;IACZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACf,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9C,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+DAA+D;AAC/D,SAAS,SAAS,CAAC,GAAW;IAC5B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/output/tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,OAAiB,EACjB,IAAgB,EAChB,WAAsB;IAEtB,gDAAgD;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,0BAA0B;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAEhC,0CAA0C;IAC1C,MAAM,SAAS,GAAG,SAAS;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAE1C,YAAY;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG;aAChB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACf,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9C,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+DAA+D;AAC/D,SAAS,SAAS,CAAC,GAAW;IAC5B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-forge/cli",
3
- "version": "0.2.2",
3
+ "version": "0.3.1",
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",
@@ -9,6 +9,7 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
+ "commands",
12
13
  "README.md"
13
14
  ],
14
15
  "keywords": [
@@ -31,7 +32,7 @@
31
32
  "dependencies": {
32
33
  "chalk": "^5.4.1",
33
34
  "commander": "^13.1.0",
34
- "@context-forge/core": "0.2.2"
35
+ "@context-forge/core": "0.3.1"
35
36
  },
36
37
  "devDependencies": {
37
38
  "@types/node": "^25.3.0",