@mrpatronz/nexusflow 1.3.3 → 1.6.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.
- package/README.md +50 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +85 -44
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +16 -73
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +58 -318
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/finish.d.ts +17 -0
- package/dist/commands/finish.d.ts.map +1 -0
- package/dist/commands/finish.js +173 -0
- package/dist/commands/finish.js.map +1 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +11 -6
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/knowledge.d.ts +36 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +184 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +2 -4
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/refresh.d.ts +2 -1
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +35 -2
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/strategy.d.ts +37 -0
- package/dist/commands/strategy.d.ts.map +1 -0
- package/dist/commands/strategy.js +198 -0
- package/dist/commands/strategy.js.map +1 -0
- package/dist/core/commit.d.ts +41 -0
- package/dist/core/commit.d.ts.map +1 -0
- package/dist/core/commit.js +53 -0
- package/dist/core/commit.js.map +1 -0
- package/dist/core/config.d.ts +3 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +60 -32
- package/dist/core/config.js.map +1 -1
- package/dist/core/config.test.js +24 -0
- package/dist/core/config.test.js.map +1 -1
- package/dist/core/diff.d.ts +27 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +50 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/doctor.d.ts +34 -0
- package/dist/core/doctor.d.ts.map +1 -0
- package/dist/core/doctor.js +276 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/finish.d.ts +56 -0
- package/dist/core/finish.d.ts.map +1 -0
- package/dist/core/finish.js +121 -0
- package/dist/core/finish.js.map +1 -0
- package/dist/core/finish.test.d.ts +2 -0
- package/dist/core/finish.test.d.ts.map +1 -0
- package/dist/core/finish.test.js +110 -0
- package/dist/core/finish.test.js.map +1 -0
- package/dist/core/knowledge.d.ts +96 -0
- package/dist/core/knowledge.d.ts.map +1 -0
- package/dist/core/knowledge.js +299 -0
- package/dist/core/knowledge.js.map +1 -0
- package/dist/core/knowledge.test.d.ts +2 -0
- package/dist/core/knowledge.test.d.ts.map +1 -0
- package/dist/core/knowledge.test.js +157 -0
- package/dist/core/knowledge.test.js.map +1 -0
- package/dist/core/refresh.test.d.ts +2 -0
- package/dist/core/refresh.test.d.ts.map +1 -0
- package/dist/core/refresh.test.js +67 -0
- package/dist/core/refresh.test.js.map +1 -0
- package/dist/core/status.d.ts +45 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +45 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/sync.test.d.ts +2 -0
- package/dist/core/sync.test.d.ts.map +1 -0
- package/dist/core/sync.test.js +86 -0
- package/dist/core/sync.test.js.map +1 -0
- package/dist/core/workspace.create.test.d.ts +2 -0
- package/dist/core/workspace.create.test.d.ts.map +1 -0
- package/dist/core/workspace.create.test.js +95 -0
- package/dist/core/workspace.create.test.js.map +1 -0
- package/dist/core/workspace.d.ts +9 -3
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +91 -13
- package/dist/core/workspace.js.map +1 -1
- package/dist/core/worktree.d.ts +11 -1
- package/dist/core/worktree.d.ts.map +1 -1
- package/dist/core/worktree.js +2 -0
- package/dist/core/worktree.js.map +1 -1
- package/dist/core/worktree.test.d.ts +2 -0
- package/dist/core/worktree.test.d.ts.map +1 -0
- package/dist/core/worktree.test.js +111 -0
- package/dist/core/worktree.test.js.map +1 -0
- package/dist/generators/base.js +1 -1
- package/dist/generators/index.d.ts +7 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +4 -1
- package/dist/generators/index.js.map +1 -1
- package/dist/index.js +205 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +51 -282
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +45 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +413 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +43 -26
- package/dist/server.js.map +1 -1
- package/dist/utils/debug.d.ts +17 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +25 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/detect-ai.d.ts +14 -6
- package/dist/utils/detect-ai.d.ts.map +1 -1
- package/dist/utils/detect-ai.js +22 -9
- package/dist/utils/detect-ai.js.map +1 -1
- package/dist/utils/detect-ai.test.js +33 -0
- package/dist/utils/detect-ai.test.js.map +1 -1
- package/dist/utils/git.d.ts +13 -2
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +64 -5
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/git.test.js +46 -8
- package/dist/utils/git.test.js.map +1 -1
- package/dist/utils/multi-git.d.ts +40 -0
- package/dist/utils/multi-git.d.ts.map +1 -1
- package/dist/utils/multi-git.js +80 -0
- package/dist/utils/multi-git.js.map +1 -1
- package/dist/utils/multi-git.test.js +54 -1
- package/dist/utils/multi-git.test.js.map +1 -1
- package/dist/utils/open-editor.d.ts +20 -0
- package/dist/utils/open-editor.d.ts.map +1 -0
- package/dist/utils/open-editor.js +44 -0
- package/dist/utils/open-editor.js.map +1 -0
- package/dist/utils/pr.d.ts +50 -0
- package/dist/utils/pr.d.ts.map +1 -0
- package/dist/utils/pr.js +144 -0
- package/dist/utils/pr.js.map +1 -0
- package/dist/utils/pr.test.d.ts +2 -0
- package/dist/utils/pr.test.d.ts.map +1 -0
- package/dist/utils/pr.test.js +47 -0
- package/dist/utils/pr.test.js.map +1 -0
- package/dist/utils/prompts.d.ts +22 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +145 -24
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/resolve-workspace.d.ts +30 -0
- package/dist/utils/resolve-workspace.d.ts.map +1 -0
- package/dist/utils/resolve-workspace.js +77 -0
- package/dist/utils/resolve-workspace.js.map +1 -0
- package/dist/utils/workflow-advisor.d.ts +2 -0
- package/dist/utils/workflow-advisor.d.ts.map +1 -1
- package/dist/utils/workflow-advisor.js +27 -4
- package/dist/utils/workflow-advisor.js.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -17,7 +17,10 @@ NexusFlow combines multiple Git repositories into a single feature workspace and
|
|
|
17
17
|
## ✨ Features
|
|
18
18
|
|
|
19
19
|
- **Multi-repo workspaces** — group any set of local Git repos under one feature branch using worktrees
|
|
20
|
+
- **The full feature loop** — `create` opens a workspace, `finish` closes it: commit + push every repo, open PRs (or print compare links), promote learnings, and optionally clean up
|
|
21
|
+
- **Knowledge that accumulates** — capture decisions and gotchas as you work with `nexusflow knowledge add`, then `promote` the reusable ones into per-repo memory that survives across features
|
|
20
22
|
- **AI context generation** — automatically writes `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, and `.cursor/rules/nexusflow.mdc`
|
|
23
|
+
- **Drive it from your assistant** — an MCP server exposes the whole loop (status, diff, commit, sync, refresh, doctor, knowledge, finish) so your AI can run it without leaving the session
|
|
21
24
|
- **Smart codebase analysis** — detects tech stacks, ports, API endpoints, dependencies, and existing AI configs across all projects
|
|
22
25
|
- **Teamwork Strategy Workflows** — predefine coordination flows and subagent behaviors (e.g. plan-implement-review) and inspect them with local AI coding assistant harnesses
|
|
23
26
|
- **Session history & resumption** — browse past conversation transcripts from Antigravity, Claude Code, OpenAI Codex, and GitHub Copilot, then resume where you left off
|
|
@@ -123,6 +126,8 @@ Open this folder in your editor → your AI assistant picks up the context → i
|
|
|
123
126
|
| `nexusflow diff` | View changes across all sub-repositories, including unpushed commits (`--repo` to filter) |
|
|
124
127
|
| `nexusflow commit` | Commit and push changes across all modified repositories (`--repo`, `--no-push`, `--dry-run`) |
|
|
125
128
|
| `nexusflow sync` | Rebase all repositories in the workspace with default base branches |
|
|
129
|
+
| `nexusflow finish` | Close out a feature: commit & push all repos, open PRs / print compare links, promote learnings, optionally remove the workspace (`-m`, `--no-pr`, `--no-knowledge`, `--cleanup`, `--dry-run`) |
|
|
130
|
+
| `nexusflow knowledge` | Capture & manage workspace learnings: `add` (decision/gotcha/progress/…), `show`, `promote` into per-repo base knowledge |
|
|
126
131
|
| `nexusflow refresh`| Regenerate maps, plan, and AI context files — only re-analyzes changed repos (`--force` for a full pass) |
|
|
127
132
|
| `nexusflow handoff` | Generate a compact handoff bundle (`nexusflow-handoff.md`) for session resumption |
|
|
128
133
|
| `nexusflow schedule` | Manage recurring workspace jobs: `add`, `list`, `remove`, `enable`, `disable`, `run` |
|
|
@@ -143,6 +148,51 @@ NexusFlow auto-detects which assistants are available on your machine and genera
|
|
|
143
148
|
| **GitHub Copilot** | `.github/copilot-instructions.md` | Always available |
|
|
144
149
|
| **Cursor** | `.cursor/rules/nexusflow.mdc` | `cursor` in PATH |
|
|
145
150
|
|
|
151
|
+
## 🔁 The Feature Loop: create → work → learn → finish
|
|
152
|
+
|
|
153
|
+
NexusFlow is built around a single loop:
|
|
154
|
+
|
|
155
|
+
1. **`nexusflow create`** — open a workspace of git worktrees on a feature branch with AI context files generated.
|
|
156
|
+
2. **Work** — your AI assistant edits code across repos. As it goes, it records learnings:
|
|
157
|
+
```bash
|
|
158
|
+
nexusflow knowledge add -t decision -m "Chose worktrees over submodules for isolation"
|
|
159
|
+
nexusflow knowledge add -t gotcha -m "fs.rm needs maxRetries on Windows (EBUSY)"
|
|
160
|
+
nexusflow knowledge add -t progress -m "Rollback-on-failure implemented"
|
|
161
|
+
```
|
|
162
|
+
Entries land under the right heading in `nexusflow-knowledge.md` (routed through your storage adapter — local, central vault, or Obsidian — so the GUI and the generators all see the same file). No hand-editing, no accidental overwrites.
|
|
163
|
+
3. **`nexusflow finish`** — close it out:
|
|
164
|
+
- Shows a preflight status table (branch, dirty files, unpushed commits) per repo.
|
|
165
|
+
- Commits any remaining changes (repos on the wrong branch or in a detached HEAD are skipped, never committed) and pushes every branch.
|
|
166
|
+
- Opens a PR per repo with the GitHub CLI when it's installed and authenticated; otherwise prints a ready-to-click **compare URL** for GitHub, GitLab, Azure DevOps, or Bitbucket.
|
|
167
|
+
- Offers to **promote** reusable learnings into each repo's persistent base knowledge (so they survive into the next feature).
|
|
168
|
+
- With `--cleanup`, removes the workspace once everything is confirmed pushed (never while you're `cd`'d inside it).
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
nexusflow finish --dry-run # preview what would happen
|
|
172
|
+
nexusflow finish -m "Ship feature" --cleanup
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## 🔌 MCP Server & Tools
|
|
176
|
+
|
|
177
|
+
`nexusflow mcp setup` registers NexusFlow's MCP server with Claude Desktop, Cursor, and VS Code so your assistant can drive the whole loop without leaving the session. The server exposes:
|
|
178
|
+
|
|
179
|
+
| Tool | What it does |
|
|
180
|
+
|:---|:---|
|
|
181
|
+
| `search_workspace` | `git grep` across every repo in the workspace |
|
|
182
|
+
| `workspace_status` | Per-repo branch / dirty / ahead-behind / remote status |
|
|
183
|
+
| `get_workspace_diff` | Changed files, insertions/deletions, and unpushed commits |
|
|
184
|
+
| `commit_workspace` | Commit (and push) all changed repos with one message |
|
|
185
|
+
| `sync_workspace` | Rebase every repo onto its base branch (auto-stashes dirty trees) |
|
|
186
|
+
| `refresh_context` | Regenerate maps/plan/context (only re-analyzes changed repos) |
|
|
187
|
+
| `run_doctor` | Structured workspace health diagnostics |
|
|
188
|
+
| `add_knowledge` | Record a decision / gotcha / progress note — the preferred way to persist learnings |
|
|
189
|
+
| `promote_knowledge` | Copy a learning into a repo's persistent base knowledge |
|
|
190
|
+
| `finish_workspace` | Commit, push, and return PR/compare links (never deletes anything) |
|
|
191
|
+
| `get_service_logs` | Tail a running service's logs |
|
|
192
|
+
| `delegate_to_local_agent` | Offload cheap/high-volume subtasks to a local SLM (when enabled) |
|
|
193
|
+
|
|
194
|
+
Read-only tools are annotated as such; `finish_workspace` deliberately cannot delete worktrees (cleanup stays a human-confirmed CLI action). Pass `--debug` (or set `NEXUSFLOW_DEBUG=1`) on any CLI command to surface diagnostic logging on stderr.
|
|
195
|
+
|
|
146
196
|
## 🕐 Session History & Resumption
|
|
147
197
|
|
|
148
198
|
NexusFlow can discover and display your past AI coding sessions across all supported assistants. This lets you:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH;;;;;;;;;GASG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgNnD"}
|
package/dist/commands/create.js
CHANGED
|
@@ -15,8 +15,11 @@ import { generateContextFiles } from '../generators/index.js';
|
|
|
15
15
|
import { analyzeAllRepos } from '../analyzers/index.js';
|
|
16
16
|
import { detectAIAssistants } from '../utils/detect-ai.js';
|
|
17
17
|
import { detectEditors } from '../utils/detect-editors.js';
|
|
18
|
-
import {
|
|
18
|
+
import { openInEditor } from '../utils/open-editor.js';
|
|
19
|
+
import { debugLog } from '../utils/debug.js';
|
|
20
|
+
import { promptBranchName, promptDescription, promptSelectRepos, promptSelectAI, promptSelectEditor, promptSelectStrategy, promptNewStrategy, } from '../utils/prompts.js';
|
|
19
21
|
import { suggestWorkflow } from '../utils/workflow-advisor.js';
|
|
22
|
+
import { getWorkflowTemplates, saveWorkflowTemplate } from '../utils/workflows.js';
|
|
20
23
|
/**
|
|
21
24
|
* Executes the full "create workspace" flow:
|
|
22
25
|
* 1. Prompt for branch name
|
|
@@ -63,15 +66,40 @@ export async function createCommand() {
|
|
|
63
66
|
? await confirm({ message: 'Enable Local AI Co-processor in this workspace context?', default: true })
|
|
64
67
|
: false;
|
|
65
68
|
// ── 5.5. Suggest workflow strategy ───────────────────────────────
|
|
66
|
-
const
|
|
69
|
+
const templates = await getWorkflowTemplates();
|
|
70
|
+
const selectedStrategyId = await promptSelectStrategy(templates);
|
|
67
71
|
let teamworkInstructions = '';
|
|
68
|
-
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
if (selectedStrategyId === 'auto') {
|
|
73
|
+
const workflowSpinner = ora('Suggesting teamwork collaboration strategy...').start();
|
|
74
|
+
try {
|
|
75
|
+
const suggestion = await suggestWorkflow(description, selectedRepos, config.localLlm);
|
|
76
|
+
teamworkInstructions = suggestion.customInstructions;
|
|
77
|
+
workflowSpinner.succeed(`Auto-selected strategy for ${chalk.bold(suggestion.difficulty)} difficulty task`);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
81
|
+
workflowSpinner.fail(`Failed to suggest teamwork strategy (${reason}) — continuing without one`);
|
|
82
|
+
debugLog('workflow-advisor', 'suggestWorkflow', err);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (selectedStrategyId === 'create_new') {
|
|
86
|
+
const { name, content } = await promptNewStrategy();
|
|
87
|
+
try {
|
|
88
|
+
const newTemplate = await saveWorkflowTemplate(name, content);
|
|
89
|
+
teamworkInstructions = newTemplate.content;
|
|
90
|
+
console.log(chalk.green(` ✔ Saved and selected new strategy: ${chalk.bold(newTemplate.name)}`));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.log(chalk.yellow(` ⚠ Failed to save strategy: ${String(err)}`));
|
|
94
|
+
teamworkInstructions = content;
|
|
95
|
+
}
|
|
72
96
|
}
|
|
73
|
-
|
|
74
|
-
|
|
97
|
+
else {
|
|
98
|
+
const selectedTemplate = templates.find((t) => t.id === selectedStrategyId);
|
|
99
|
+
if (selectedTemplate) {
|
|
100
|
+
teamworkInstructions = selectedTemplate.content;
|
|
101
|
+
console.log(chalk.green(` ✔ Selected strategy: ${chalk.bold(selectedTemplate.name)}`));
|
|
102
|
+
}
|
|
75
103
|
}
|
|
76
104
|
// ── 6. Create workspace ─────────────────────────────────────────────
|
|
77
105
|
const workspacePath = path.join(config.workspacesDir, branchName);
|
|
@@ -89,37 +117,46 @@ export async function createCommand() {
|
|
|
89
117
|
};
|
|
90
118
|
const wsSpinner = ora('Creating workspace with git worktrees...').start();
|
|
91
119
|
try {
|
|
92
|
-
await createWorkspace(feature, selectedRepos)
|
|
120
|
+
await createWorkspace(feature, selectedRepos, (repoName, index, total) => {
|
|
121
|
+
wsSpinner.text = `Creating worktrees… ${repoName} (${index + 1}/${total})`;
|
|
122
|
+
});
|
|
93
123
|
wsSpinner.succeed(`Workspace created at ${chalk.bold(workspacePath)}`);
|
|
94
124
|
}
|
|
95
125
|
catch (error) {
|
|
96
126
|
wsSpinner.fail('Failed to create workspace');
|
|
97
127
|
const message = error instanceof Error ? error.message : String(error);
|
|
98
128
|
console.error(chalk.red(` ${message}`));
|
|
129
|
+
console.log(chalk.dim(' Rolled back the partial workspace.'));
|
|
130
|
+
process.exitCode = 1;
|
|
99
131
|
return;
|
|
100
132
|
}
|
|
101
|
-
// ── 7. Analyze projects
|
|
102
|
-
|
|
133
|
+
// ── 7-8. Analyze projects & generate context ────────────────────────
|
|
134
|
+
// The worktrees are the product; if analysis/generation fails the workspace
|
|
135
|
+
// is still usable, so keep it and tell the user how to retry rather than
|
|
136
|
+
// exiting with an error.
|
|
103
137
|
const workspaceRepos = selectedRepos.map((repo) => ({
|
|
104
138
|
...repo,
|
|
105
139
|
path: path.join(workspacePath, repo.name),
|
|
106
140
|
}));
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
141
|
+
try {
|
|
142
|
+
console.log(chalk.cyan('\nAnalyzing projects...'));
|
|
143
|
+
const analysis = await analyzeAllRepos(workspaceRepos);
|
|
144
|
+
const ctx = { feature, repos: workspaceRepos, analysis, localLlm: config.localLlm };
|
|
145
|
+
console.log(chalk.cyan('\nGenerating AI context files...'));
|
|
146
|
+
await generateContextFiles(ctx, selectedAI, workspacePath);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
150
|
+
console.log(chalk.yellow(`\n⚠️ Workspace was created and is usable, but context generation failed (${message}).\n` +
|
|
151
|
+
` Run "nexusflow refresh" inside the workspace to retry.`));
|
|
152
|
+
}
|
|
113
153
|
// ── 8. Open in editor ───────────────────────────────────────────────
|
|
114
154
|
const detectedEditors = await detectEditors();
|
|
115
155
|
const editor = await promptSelectEditor(detectedEditors);
|
|
116
156
|
if (editor) {
|
|
117
157
|
const editorSpinner = ora(`Opening in ${editor.name}...`).start();
|
|
118
158
|
try {
|
|
119
|
-
await
|
|
120
|
-
stdio: 'ignore',
|
|
121
|
-
shell: process.platform === 'win32',
|
|
122
|
-
});
|
|
159
|
+
await openInEditor(editor.command, workspacePath);
|
|
123
160
|
editorSpinner.succeed(`Opened in ${editor.name}`);
|
|
124
161
|
}
|
|
125
162
|
catch {
|
|
@@ -138,29 +175,33 @@ export async function createCommand() {
|
|
|
138
175
|
// ── 9. Start AI Assistant Session ───────────────────────────────────
|
|
139
176
|
if (selectedAI.length > 0) {
|
|
140
177
|
const assistant = selectedAI[0];
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
178
|
+
const detected = detectedAI.find((a) => a.name === assistant);
|
|
179
|
+
const label = detected?.displayName ?? assistant;
|
|
180
|
+
// `command` is the single source of truth for a launchable terminal session
|
|
181
|
+
// (see detect-ai.ts). Some assistants are selectable but not launchable this
|
|
182
|
+
// way (e.g. Copilot without its CLI, or Cursor's GUI-only binary).
|
|
183
|
+
const launchCmd = detected?.command;
|
|
184
|
+
if (!launchCmd) {
|
|
185
|
+
console.log(chalk.dim(`\n ${label} has no launchable terminal CLI — open the workspace in it manually.`));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const confirmStart = await confirm({
|
|
189
|
+
message: `Do you want to start a session with ${label} inside the workspace now?`,
|
|
190
|
+
default: true,
|
|
191
|
+
});
|
|
192
|
+
if (confirmStart) {
|
|
193
|
+
console.log(chalk.cyan(`\n🚀 Starting ${label} session inside workspace...\n`));
|
|
194
|
+
try {
|
|
195
|
+
await execa(launchCmd, [], {
|
|
196
|
+
cwd: workspacePath,
|
|
197
|
+
stdio: 'inherit',
|
|
198
|
+
shell: process.platform === 'win32',
|
|
199
|
+
});
|
|
200
|
+
console.log(chalk.green(`\n👋 Exited ${label} session.`));
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
console.log(chalk.yellow(`\n⚠️ Could not start ${label}. Please start it manually:\n ${chalk.dim(`cd "${workspacePath}" && ${launchCmd}`)}`));
|
|
204
|
+
}
|
|
164
205
|
}
|
|
165
206
|
}
|
|
166
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEnF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAC/D,CAAC;IAEF,uEAAuE;IACvE,MAAM,UAAU,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE5C,uEAAuE;IACvE,MAAM,WAAW,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE9C,uEAAuE;IACvE,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,OAAO;IACT,CAAC;IAED,sEAAsE;IACtE,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACxE,CAAC;IAEF,uEAAuE;IACvE,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO;QAC9C,CAAC,CAAC,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,yDAAyD,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtG,CAAC,CAAC,KAAK,CAAC;IAEV,oEAAoE;IACpE,MAAM,SAAS,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC/C,MAAM,kBAAkB,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEjE,IAAI,oBAAoB,GAAG,EAAE,CAAC;IAE9B,IAAI,kBAAkB,KAAK,MAAM,EAAE,CAAC;QAClC,MAAM,eAAe,GAAG,GAAG,CAAC,+CAA+C,CAAC,CAAC,KAAK,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtF,oBAAoB,GAAG,UAAU,CAAC,kBAAkB,CAAC;YACrD,eAAe,CAAC,OAAO,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC7G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,eAAe,CAAC,IAAI,CAAC,wCAAwC,MAAM,4BAA4B,CAAC,CAAC;YACjG,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;SAAM,IAAI,kBAAkB,KAAK,YAAY,EAAE,CAAC;QAC/C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9D,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,oBAAoB,GAAG,OAAO,CAAC;QACjC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC;QAC5E,IAAI,gBAAgB,EAAE,CAAC;YACrB,oBAAoB,GAAG,gBAAgB,CAAC,OAAO,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClE,MAAM,OAAO,GAAY;QACvB,EAAE,EAAE,UAAU;QACd,UAAU;QACV,WAAW;QACX,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,UAAU,EAAE,UAAU;QACtB,aAAa;QACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe;QACf,oBAAoB;KACrB,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,CAAC,0CAA0C,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvE,SAAS,CAAC,IAAI,GAAG,uBAAuB,QAAQ,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QAC7E,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,4EAA4E;IAC5E,yEAAyE;IACzE,yBAAyB;IACzB,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,IAAI;QACP,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAC,CAAC;IACJ,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC,CAAC;QAEvD,MAAM,GAAG,GAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC5D,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,6EAA6E,OAAO,MAAM;YACxF,2DAA2D,CAC9D,CACF,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,MAAM,eAAe,GAAG,MAAM,aAAa,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAEzD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAClD,aAAa,CAAC,OAAO,CAAC,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,CAAC,IAAI,CAChB,kBAAkB,MAAM,CAAC,IAAI,uBAAuB,KAAK,CAAC,GAAG,CAAC,OAAO,aAAa,GAAG,CAAC,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAC3C,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CACT,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,aAAa,GAAG,CACzD,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,uEAAuE;IACvE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,QAAQ,EAAE,WAAW,IAAI,SAAS,CAAC;QACjD,4EAA4E;QAC5E,6EAA6E;QAC7E,mEAAmE;QACnE,MAAM,SAAS,GAAG,QAAQ,EAAE,OAAO,CAAC;QAEpC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,OAAO,KAAK,sEAAsE,CACnF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;gBACjC,OAAO,EAAE,uCAAuC,KAAK,4BAA4B;gBACjF,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,gCAAgC,CAAC,CAAC,CAAC;gBAEhF,IAAI,CAAC;oBACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE;wBACzB,GAAG,EAAE,aAAa;wBAClB,KAAK,EAAE,SAAS;wBAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;qBACpC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,KAAK,WAAW,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,yBAAyB,KAAK,kCAAkC,KAAK,CAAC,GAAG,CAAC,OAAO,aAAa,QAAQ,SAAS,EAAE,CAAC,EAAE,CAAC,CACnI,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,UAAU,WAAW;IACnB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D7F"}
|
package/dist/commands/diff.js
CHANGED
|
@@ -4,12 +4,9 @@
|
|
|
4
4
|
* commits that exist locally but have not been pushed yet.
|
|
5
5
|
*/
|
|
6
6
|
import chalk from 'chalk';
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import { loadConfig } from '../core/config.js';
|
|
11
|
-
import { listWorkspaces, loadFeatureConfig } from '../core/workspace.js';
|
|
12
|
-
import { getWorkspaceRepos, getRepoStatus, getDiffSummary, getUnpushedCount } from '../utils/multi-git.js';
|
|
7
|
+
import { loadFeatureConfig } from '../core/workspace.js';
|
|
8
|
+
import { getWorkspaceDiffReport } from '../core/diff.js';
|
|
9
|
+
import { resolveWorkspaceInteractive } from '../utils/resolve-workspace.js';
|
|
13
10
|
/**
|
|
14
11
|
* Executes the diff command.
|
|
15
12
|
*
|
|
@@ -18,7 +15,7 @@ import { getWorkspaceRepos, getRepoStatus, getDiffSummary, getUnpushedCount } fr
|
|
|
18
15
|
*/
|
|
19
16
|
export async function diffCommand(workspaceArg, options) {
|
|
20
17
|
console.log(chalk.bold.cyan('\n🔍 NexusFlow — Workspace Diff Summary\n'));
|
|
21
|
-
const workspacePath = await
|
|
18
|
+
const workspacePath = await resolveWorkspaceInteractive(workspaceArg, 'Select a workspace to view diff:');
|
|
22
19
|
if (!workspacePath)
|
|
23
20
|
return;
|
|
24
21
|
const feature = await loadFeatureConfig(workspacePath);
|
|
@@ -26,54 +23,33 @@ export async function diffCommand(workspaceArg, options) {
|
|
|
26
23
|
console.error(chalk.red('✖ Failed to load workspace configuration.'));
|
|
27
24
|
return;
|
|
28
25
|
}
|
|
29
|
-
let
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (unknown.length > 0) {
|
|
33
|
-
console.error(chalk.red(`✖ Repositor${unknown.length === 1 ? 'y' : 'ies'} not in this workspace: ${unknown.join(', ')}`));
|
|
34
|
-
console.log(chalk.dim(` Available repos: ${repos.map((r) => r.name).join(', ')}`));
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
repos = repos.filter((r) => options.repo.includes(r.name));
|
|
26
|
+
let results;
|
|
27
|
+
try {
|
|
28
|
+
results = await getWorkspaceDiffReport(workspacePath, options?.repo);
|
|
38
29
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const unpushed = await getUnpushedCount(repo.path, repo.branchName);
|
|
43
|
-
// A repo with no working-tree changes still matters when it has local
|
|
44
|
-
// commits that were never pushed — otherwise "all clean" hides them.
|
|
45
|
-
if (!status.hasChanges && !(unpushed && unpushed > 0)) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
const diff = status.hasChanges
|
|
49
|
-
? await getDiffSummary(repo.path)
|
|
50
|
-
: { summary: 'No working-tree changes', additions: 0, deletions: 0 };
|
|
51
|
-
results.push({
|
|
52
|
-
name: repo.name,
|
|
53
|
-
filesChanged: status.changedFiles.length,
|
|
54
|
-
additions: diff.additions,
|
|
55
|
-
deletions: diff.deletions,
|
|
56
|
-
unpushed,
|
|
57
|
-
summary: diff.summary,
|
|
58
|
-
});
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error(chalk.red(`✖ ${error instanceof Error ? error.message : String(error)}`));
|
|
32
|
+
return;
|
|
59
33
|
}
|
|
60
34
|
if (results.length === 0) {
|
|
61
35
|
console.log(chalk.green('✅ All repositories are clean and pushed.\n'));
|
|
62
36
|
return;
|
|
63
37
|
}
|
|
64
|
-
// Print unified table
|
|
65
|
-
|
|
38
|
+
// Print unified table. Size the name column to the actual repo names so
|
|
39
|
+
// long names (common in real workspaces) don't overrun the other columns.
|
|
40
|
+
const nameW = Math.max(10, ...results.map((r) => r.name.length)) + 1;
|
|
41
|
+
console.log(chalk.bold('Repository'.padEnd(nameW) + ' | ' +
|
|
66
42
|
'Files'.padEnd(6) + ' | ' +
|
|
67
43
|
'Additions'.padEnd(10) + ' | ' +
|
|
68
44
|
'Deletions'.padEnd(10) + ' | ' +
|
|
69
45
|
'Unpushed'.padEnd(8)));
|
|
70
|
-
console.log(chalk.dim('─'.repeat(
|
|
46
|
+
console.log(chalk.dim('─'.repeat(nameW + 45)));
|
|
71
47
|
for (const res of results) {
|
|
72
48
|
const fileStr = res.filesChanged.toString().padEnd(6);
|
|
73
49
|
const addStr = `+${res.additions}`.padEnd(10);
|
|
74
50
|
const delStr = `-${res.deletions}`.padEnd(10);
|
|
75
51
|
const unpushedStr = res.unpushed === null ? '?'.padEnd(8) : String(res.unpushed).padEnd(8);
|
|
76
|
-
console.log(chalk.bold(res.name.padEnd(
|
|
52
|
+
console.log(chalk.bold(res.name.padEnd(nameW)) + ' | ' +
|
|
77
53
|
fileStr + ' | ' +
|
|
78
54
|
chalk.green(addStr) + ' | ' +
|
|
79
55
|
chalk.red(delStr) + ' | ' +
|
|
@@ -89,37 +65,4 @@ export async function diffCommand(workspaceArg, options) {
|
|
|
89
65
|
}
|
|
90
66
|
console.log();
|
|
91
67
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Resolves workspace path.
|
|
94
|
-
*/
|
|
95
|
-
async function resolveWorkspace(workspaceArg) {
|
|
96
|
-
if (workspaceArg) {
|
|
97
|
-
const absolutePath = path.resolve(workspaceArg);
|
|
98
|
-
try {
|
|
99
|
-
await fs.access(path.join(absolutePath, 'nexusflow.json'));
|
|
100
|
-
return absolutePath;
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
console.error(chalk.red(`✖ Invalid workspace: No nexusflow.json found at ${absolutePath}`));
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const cwdFeature = await loadFeatureConfig(process.cwd());
|
|
108
|
-
if (cwdFeature)
|
|
109
|
-
return cwdFeature.workspacePath;
|
|
110
|
-
const config = await loadConfig();
|
|
111
|
-
const workspaces = await listWorkspaces(config.workspacesDir);
|
|
112
|
-
if (workspaces.length === 0) {
|
|
113
|
-
console.log(chalk.yellow('No workspaces found.\n'));
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
const selected = await select({
|
|
117
|
-
message: 'Select a workspace to view diff:',
|
|
118
|
-
choices: workspaces.map((ws) => ({
|
|
119
|
-
name: `${ws.branchName} ${chalk.dim(`(${ws.repos.length} repos)`)}`,
|
|
120
|
-
value: ws.workspacePath,
|
|
121
|
-
})),
|
|
122
|
-
});
|
|
123
|
-
return selected;
|
|
124
|
-
}
|
|
125
68
|
//# sourceMappingURL=diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDxE"}
|