@mrpatronz/nexusflow 0.2.19 ā 1.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 +37 -7
- package/dist/analyzers/index.d.ts +23 -0
- package/dist/analyzers/index.d.ts.map +1 -1
- package/dist/analyzers/index.js +62 -0
- package/dist/analyzers/index.js.map +1 -1
- package/dist/commands/add-repo.d.ts +9 -0
- package/dist/commands/add-repo.d.ts.map +1 -1
- package/dist/commands/add-repo.js +12 -1
- package/dist/commands/add-repo.js.map +1 -1
- package/dist/commands/add-repo.test.d.ts +2 -0
- package/dist/commands/add-repo.test.d.ts.map +1 -0
- package/dist/commands/add-repo.test.js +30 -0
- package/dist/commands/add-repo.test.js.map +1 -0
- package/dist/commands/commands.test.js +26 -6
- package/dist/commands/commands.test.js.map +1 -1
- package/dist/commands/commit.d.ts +7 -1
- package/dist/commands/commit.d.ts.map +1 -1
- package/dist/commands/commit.js +31 -8
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/commit.test.d.ts +2 -0
- package/dist/commands/commit.test.d.ts.map +1 -0
- package/dist/commands/commit.test.js +54 -0
- package/dist/commands/commit.test.js.map +1 -0
- package/dist/commands/diff.d.ts +9 -2
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +36 -12
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +16 -20
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +11 -15
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/refresh.d.ts +4 -2
- package/dist/commands/refresh.d.ts.map +1 -1
- package/dist/commands/refresh.js +20 -36
- package/dist/commands/refresh.js.map +1 -1
- package/dist/commands/schedule.d.ts +35 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +151 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +28 -7
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/tui.js +1 -1
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/ui.d.ts +1 -0
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +5 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/core/adapters/local-storage.d.ts +7 -0
- package/dist/core/adapters/local-storage.d.ts.map +1 -1
- package/dist/core/adapters/local-storage.js +13 -4
- package/dist/core/adapters/local-storage.js.map +1 -1
- package/dist/core/adapters/storage.test.js +18 -0
- package/dist/core/adapters/storage.test.js.map +1 -1
- package/dist/core/analysis-cache.d.ts +58 -0
- package/dist/core/analysis-cache.d.ts.map +1 -0
- package/dist/core/analysis-cache.js +116 -0
- package/dist/core/analysis-cache.js.map +1 -0
- package/dist/core/analysis-cache.test.d.ts +2 -0
- package/dist/core/analysis-cache.test.d.ts.map +1 -0
- package/dist/core/analysis-cache.test.js +108 -0
- package/dist/core/analysis-cache.test.js.map +1 -0
- package/dist/core/refresh.d.ts +41 -0
- package/dist/core/refresh.d.ts.map +1 -0
- package/dist/core/refresh.js +56 -0
- package/dist/core/refresh.js.map +1 -0
- package/dist/core/scheduler.d.ts +117 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +361 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/scheduler.test.d.ts +2 -0
- package/dist/core/scheduler.test.d.ts.map +1 -0
- package/dist/core/scheduler.test.js +163 -0
- package/dist/core/scheduler.test.js.map +1 -0
- package/dist/core/sync.d.ts +6 -0
- package/dist/core/sync.d.ts.map +1 -1
- package/dist/core/sync.js +17 -12
- package/dist/core/sync.js.map +1 -1
- package/dist/core/workspace.d.ts +6 -0
- package/dist/core/workspace.d.ts.map +1 -1
- package/dist/core/workspace.js +32 -15
- package/dist/core/workspace.js.map +1 -1
- package/dist/core/workspace.test.d.ts +2 -0
- package/dist/core/workspace.test.d.ts.map +1 -0
- package/dist/core/workspace.test.js +42 -0
- package/dist/core/workspace.test.js.map +1 -0
- package/dist/generators/index.d.ts +7 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +14 -1
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/map-generator.d.ts.map +1 -1
- package/dist/generators/map-generator.js +4 -3
- package/dist/generators/map-generator.js.map +1 -1
- package/dist/generators/map-generator.test.js +4 -2
- package/dist/generators/map-generator.test.js.map +1 -1
- package/dist/gui/assets/index-ElroPpSP.js +26 -0
- package/dist/gui/index.html +1 -1
- package/dist/index.js +108 -4
- package/dist/index.js.map +1 -1
- package/dist/orchestration/index.d.ts +1 -1
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +1 -1
- package/dist/orchestration/index.js.map +1 -1
- package/dist/orchestration/runner.d.ts +16 -1
- package/dist/orchestration/runner.d.ts.map +1 -1
- package/dist/orchestration/runner.js +41 -5
- package/dist/orchestration/runner.js.map +1 -1
- package/dist/orchestration/runner.test.d.ts +2 -0
- package/dist/orchestration/runner.test.d.ts.map +1 -0
- package/dist/orchestration/runner.test.js +71 -0
- package/dist/orchestration/runner.test.js.map +1 -0
- package/dist/server.d.ts +17 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +275 -114
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +158 -1
- package/dist/server.test.js.map +1 -1
- package/dist/utils/multi-git.d.ts +21 -0
- package/dist/utils/multi-git.d.ts.map +1 -1
- package/dist/utils/multi-git.js +40 -4
- package/dist/utils/multi-git.js.map +1 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +8 -2
- package/dist/utils/prompts.js.map +1 -1
- package/package.json +13 -1
- package/.agents/skills/ccc/SKILL.md +0 -71
- package/.agents/skills/ccc/references/management.md +0 -110
- package/.agents/skills/ccc/references/settings.md +0 -126
- package/.github/dependabot.yml +0 -52
- package/.github/workflows/ci.yml +0 -44
- package/.github/workflows/dependabot-merge.yml +0 -53
- package/.github/workflows/release-desktop.yml +0 -67
- package/.github/workflows/release-npm.yml +0 -65
- package/.github/workflows/release-vscode.yml +0 -61
- package/.vscode/launch.json +0 -17
- package/.vscode/tasks.json +0 -17
- package/GETTING_STARTED.md +0 -114
- package/desktop/build-installer.js +0 -228
- package/desktop/build.js +0 -118
- package/desktop/installer/nexusflow.iss +0 -35
- package/desktop/neutralino.config.json +0 -39
- package/desktop/package-lock.json +0 -1060
- package/desktop/package.json +0 -14
- package/dist/gui/assets/index-D8iJPvnk.js +0 -26
- package/extension/media/icon.svg +0 -1
- package/extension/package-lock.json +0 -6044
- package/extension/package.json +0 -117
- package/extension/src/extension.ts +0 -653
- package/extension/tsconfig.json +0 -21
- package/gui/README.md +0 -73
- package/gui/e2e/dashboard.spec.ts +0 -61
- package/gui/e2e/wizard.spec.ts +0 -346
- package/gui/eslint.config.js +0 -26
- package/gui/index.html +0 -17
- package/gui/package-lock.json +0 -3137
- package/gui/package.json +0 -37
- package/gui/playwright.config.ts +0 -41
- package/gui/public/app_logo.png +0 -0
- package/gui/public/favicon.svg +0 -1
- package/gui/public/icons.svg +0 -24
- package/gui/src/App.css +0 -1
- package/gui/src/App.tsx +0 -3573
- package/gui/src/app/AppSidebar.tsx +0 -69
- package/gui/src/assets/hero.png +0 -0
- package/gui/src/assets/react.svg +0 -1
- package/gui/src/assets/vite.svg +0 -1
- package/gui/src/components/AddRepoPicker.tsx +0 -81
- package/gui/src/components/ui/Button.tsx +0 -40
- package/gui/src/components/ui/Card.tsx +0 -6
- package/gui/src/components/ui/EmptyState.tsx +0 -22
- package/gui/src/components/ui/Input.tsx +0 -21
- package/gui/src/components/ui/Menu.tsx +0 -71
- package/gui/src/components/ui/Modal.tsx +0 -39
- package/gui/src/components/ui/PageHeader.tsx +0 -21
- package/gui/src/components/ui/RepoStatusStrip.tsx +0 -33
- package/gui/src/components/ui/Skeleton.tsx +0 -5
- package/gui/src/components/ui/StatusPill.tsx +0 -36
- package/gui/src/components/ui/Tabs.tsx +0 -40
- package/gui/src/components/ui/cn.ts +0 -4
- package/gui/src/components/ui/index.ts +0 -16
- package/gui/src/features/changes/ChangesViewer.tsx +0 -388
- package/gui/src/features/knowledge/KnowledgeBase.tsx +0 -84
- package/gui/src/features/onboarding/OnboardingWizard.tsx +0 -230
- package/gui/src/features/plan/ImplementationPlan.tsx +0 -32
- package/gui/src/features/services/ServiceConsole.tsx +0 -215
- package/gui/src/features/sessions/SessionHistory.tsx +0 -195
- package/gui/src/index.css +0 -167
- package/gui/src/lib/status.ts +0 -24
- package/gui/src/main.tsx +0 -94
- package/gui/src/pages/DashboardPage.tsx +0 -129
- package/gui/src/pages/WorkspacesPage.tsx +0 -352
- package/gui/src/types.ts +0 -81
- package/gui/tsconfig.app.json +0 -25
- package/gui/tsconfig.json +0 -7
- package/gui/tsconfig.node.json +0 -24
- package/gui/vite.config.ts +0 -12
- package/resources/workflows/plan-implement-review.md +0 -8
- package/resources/workflows/research-verify.md +0 -6
- package/resources/workflows/solo-developer.md +0 -3
- package/scripts/simulate-workspaces.ts +0 -55
- package/skills-lock.json +0 -11
- package/src/analyzers/detect-apis.ts +0 -290
- package/src/analyzers/detect-deps.ts +0 -315
- package/src/analyzers/detect-existing.ts +0 -74
- package/src/analyzers/detect-ports.ts +0 -110
- package/src/analyzers/index.ts +0 -97
- package/src/analyzers/messaging-analyzer.ts +0 -254
- package/src/analyzers/readme-summarizer.ts +0 -102
- package/src/analyzers/run-analyzer.ts +0 -269
- package/src/analyzers/tech-stack.ts +0 -283
- package/src/commands/adapter.ts +0 -348
- package/src/commands/add-repo.ts +0 -156
- package/src/commands/commands.test.ts +0 -156
- package/src/commands/commit.ts +0 -131
- package/src/commands/config.ts +0 -52
- package/src/commands/create.ts +0 -204
- package/src/commands/desktop.ts +0 -128
- package/src/commands/diff.ts +0 -125
- package/src/commands/doctor.ts +0 -370
- package/src/commands/handoff.ts +0 -266
- package/src/commands/init.ts +0 -134
- package/src/commands/list.ts +0 -46
- package/src/commands/logs.ts +0 -63
- package/src/commands/mcp.ts +0 -94
- package/src/commands/open.ts +0 -129
- package/src/commands/refresh.ts +0 -137
- package/src/commands/remove.ts +0 -98
- package/src/commands/start.ts +0 -117
- package/src/commands/status.ts +0 -54
- package/src/commands/stop.ts +0 -55
- package/src/commands/sync.ts +0 -125
- package/src/commands/tui.ts +0 -484
- package/src/commands/ui.ts +0 -111
- package/src/core/adapters/local-storage.ts +0 -66
- package/src/core/adapters/obsidian-storage.ts +0 -151
- package/src/core/adapters/registry.ts +0 -44
- package/src/core/adapters/storage.test.ts +0 -174
- package/src/core/adapters/vault-storage.ts +0 -86
- package/src/core/config.test.ts +0 -96
- package/src/core/config.ts +0 -140
- package/src/core/graph.ts +0 -344
- package/src/core/plugins/index.ts +0 -17
- package/src/core/plugins/loader.ts +0 -36
- package/src/core/ports/storage.ts +0 -71
- package/src/core/scanner.test.ts +0 -61
- package/src/core/scanner.ts +0 -91
- package/src/core/storage.ts +0 -37
- package/src/core/sync.ts +0 -121
- package/src/core/workspace-state.test.ts +0 -108
- package/src/core/workspace-state.ts +0 -130
- package/src/core/workspace.ts +0 -487
- package/src/core/worktree.ts +0 -120
- package/src/generators/antigravity.ts +0 -32
- package/src/generators/base.ts +0 -243
- package/src/generators/claude.ts +0 -34
- package/src/generators/codex.ts +0 -48
- package/src/generators/copilot.ts +0 -56
- package/src/generators/cursor.ts +0 -44
- package/src/generators/diff-context.ts +0 -75
- package/src/generators/index.ts +0 -322
- package/src/generators/map-generator.test.ts +0 -159
- package/src/generators/map-generator.ts +0 -539
- package/src/generators/plan-generator.ts +0 -483
- package/src/generators/skills-generator.ts +0 -259
- package/src/index.ts +0 -539
- package/src/mcp/server.ts +0 -338
- package/src/orchestration/detect.ts +0 -313
- package/src/orchestration/index.ts +0 -7
- package/src/orchestration/runner.ts +0 -283
- package/src/server.test.ts +0 -618
- package/src/server.ts +0 -1402
- package/src/types.ts +0 -451
- package/src/utils/detect-ai.test.ts +0 -44
- package/src/utils/detect-ai.ts +0 -84
- package/src/utils/detect-editors.test.ts +0 -48
- package/src/utils/detect-editors.ts +0 -57
- package/src/utils/git.test.ts +0 -74
- package/src/utils/git.ts +0 -117
- package/src/utils/local-ai.test.ts +0 -130
- package/src/utils/local-ai.ts +0 -116
- package/src/utils/multi-git.test.ts +0 -158
- package/src/utils/multi-git.ts +0 -405
- package/src/utils/prompts.ts +0 -209
- package/src/utils/session-finder.ts +0 -483
- package/src/utils/system-scanner.test.ts +0 -89
- package/src/utils/system-scanner.ts +0 -96
- package/src/utils/update-check.ts +0 -286
- package/src/utils/workflow-advisor.ts +0 -118
- package/src/utils/workflows.test.ts +0 -114
- package/src/utils/workflows.ts +0 -178
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -14
package/README.md
CHANGED
|
@@ -18,10 +18,11 @@ NexusFlow combines multiple Git repositories into a single feature workspace and
|
|
|
18
18
|
|
|
19
19
|
- **Multi-repo workspaces** ā group any set of local Git repos under one feature branch using worktrees
|
|
20
20
|
- **AI context generation** ā automatically writes `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, and `.cursor/rules/nexusflow.mdc`
|
|
21
|
-
- **Codebase context packing** ā compress an entire multi-repo workspace into a single token-efficient XML file for web-based LLMs using Repomix
|
|
22
21
|
- **Smart codebase analysis** ā detects tech stacks, ports, API endpoints, dependencies, and existing AI configs across all projects
|
|
23
22
|
- **Teamwork Strategy Workflows** ā predefine coordination flows and subagent behaviors (e.g. plan-implement-review) and inspect them with local AI coding assistant harnesses
|
|
24
23
|
- **Session history & resumption** ā browse past conversation transcripts from Antigravity, Claude Code, OpenAI Codex, and GitHub Copilot, then resume where you left off
|
|
24
|
+
- **Incremental, token-efficient refresh** ā an analysis cache fingerprints each repo (HEAD + dirty files), so `refresh`/`sync` only re-analyze repos that changed and unchanged maps stay byte-identical (keeping your AI assistant's prompt cache warm)
|
|
25
|
+
- **Scheduled workspace jobs** ā recurring `sync`/`refresh` per workspace (e.g. every 2h) that run while the dashboard server is up, so context files stay fresh without manual runs
|
|
25
26
|
- **Service orchestration** ā start, stop, and tail logs for all services in a workspace with a single command
|
|
26
27
|
- **Interactive Web Dashboard** ā rich dark-themed GUI for managing workspaces, viewing sessions, and streaming logs
|
|
27
28
|
- **CLI-first** ā every action available from the terminal via the `nexusflow` command
|
|
@@ -110,18 +111,26 @@ Open this folder in your editor ā your AI assistant picks up the context ā i
|
|
|
110
111
|
| `nexusflow list` | List all existing workspaces (alias: `ls`) |
|
|
111
112
|
| `nexusflow open` | Re-open a workspace in your editor |
|
|
112
113
|
| `nexusflow init` | Configure NexusFlow settings |
|
|
113
|
-
| `nexusflow
|
|
114
|
-
| `nexusflow
|
|
114
|
+
| `nexusflow add-repo` | Add a repository to an existing workspace (alias: `add`) |
|
|
115
|
+
| `nexusflow remove` | Delete a workspace and prune its git worktrees (alias: `rm`) |
|
|
115
116
|
| `nexusflow start` | Start all services in a workspace (auto-detected) |
|
|
116
117
|
| `nexusflow stop` | Stop all running services |
|
|
117
118
|
| `nexusflow status` | Show running/stopped status and PIDs |
|
|
118
119
|
| `nexusflow logs` | Tail aggregated logs from all services |
|
|
119
|
-
| `nexusflow ui` | Launch the interactive Web Dashboard (port
|
|
120
|
-
| `nexusflow
|
|
121
|
-
| `nexusflow
|
|
120
|
+
| `nexusflow ui` | Launch the interactive Web Dashboard (`--port`, `--server-only`, `--strict-port`) |
|
|
121
|
+
| `nexusflow dashboard` | Instantly open the Web Dashboard in your browser (alias: `dash`) |
|
|
122
|
+
| `nexusflow tui` | Open the interactive terminal (TUI) dashboard |
|
|
123
|
+
| `nexusflow diff` | View changes across all sub-repositories, including unpushed commits (`--repo` to filter) |
|
|
124
|
+
| `nexusflow commit` | Commit and push changes across all modified repositories (`--repo`, `--no-push`, `--dry-run`) |
|
|
122
125
|
| `nexusflow sync` | Rebase all repositories in the workspace with default base branches |
|
|
123
|
-
| `nexusflow refresh`| Regenerate
|
|
126
|
+
| `nexusflow refresh`| Regenerate maps, plan, and AI context files ā only re-analyzes changed repos (`--force` for a full pass) |
|
|
127
|
+
| `nexusflow handoff` | Generate a compact handoff bundle (`nexusflow-handoff.md`) for session resumption |
|
|
128
|
+
| `nexusflow schedule` | Manage recurring workspace jobs: `add`, `list`, `remove`, `enable`, `disable`, `run` |
|
|
124
129
|
| `nexusflow doctor` | Run health checks and diagnostics to verify workspace integrity |
|
|
130
|
+
| `nexusflow config` | View and update configuration: `show`, `get <key>`, `set <key> <value>` |
|
|
131
|
+
| `nexusflow adapter` | Manage storage adapters: `list`, `use`, `info`, `init` |
|
|
132
|
+
| `nexusflow mcp` | Manage the MCP server for AI assistants: `run`, `setup` |
|
|
133
|
+
| `nexusflow desktop` | Launch the NexusFlow desktop application |
|
|
125
134
|
|
|
126
135
|
## š¤ Supported AI Assistants
|
|
127
136
|
|
|
@@ -185,6 +194,27 @@ nexusflow adapter use obsidian
|
|
|
185
194
|
nexusflow adapter init my-custom-plugin
|
|
186
195
|
```
|
|
187
196
|
|
|
197
|
+
## š Scheduled Workspace Jobs
|
|
198
|
+
|
|
199
|
+
Keep workspaces fresh without manual runs ā schedule recurring `sync` or `refresh` jobs per workspace:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Rebase + regenerate context every 2 hours
|
|
203
|
+
nexusflow schedule add --task sync --every 2h
|
|
204
|
+
|
|
205
|
+
# Nightly context refresh for a specific workspace
|
|
206
|
+
nexusflow schedule add ~/dev/workspaces/my-feature --task refresh --every 1d
|
|
207
|
+
|
|
208
|
+
# Inspect, pause, or run jobs
|
|
209
|
+
nexusflow schedule list
|
|
210
|
+
nexusflow schedule disable <id>
|
|
211
|
+
nexusflow schedule run <id>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Jobs are stored in `~/.nexusflow/schedules.json` and executed while a NexusFlow server is running ā start one with `nexusflow ui` (use `--daemon --server-only` for a background host). A job whose interval elapsed while no server was running simply runs on the next scheduler tick.
|
|
215
|
+
|
|
216
|
+
Scheduled runs are **token-efficient by design**: they use the same analysis cache as `nexusflow refresh`, so only repos whose content changed are re-analyzed, and unchanged context files are left byte-identical (no git churn, no invalidated AI prompt caches). The dashboard API exposes the same functionality under `/api/schedules`.
|
|
217
|
+
|
|
188
218
|
## š„ Teamwork Strategy Workflows
|
|
189
219
|
|
|
190
220
|
NexusFlow allows you to predefine orchestration workflows and cooperation rules that govern how multiple AI subagents coordinate when solving complex, multi-repo software engineering tasks.
|
|
@@ -20,6 +20,29 @@ export declare function analyzeRepo(repo: RepoInfo): Promise<ProjectAnalysis>;
|
|
|
20
20
|
* @returns Map of repo path to {@link ProjectAnalysis}.
|
|
21
21
|
*/
|
|
22
22
|
export declare function analyzeAllRepos(repos: RepoInfo[]): Promise<Map<string, ProjectAnalysis>>;
|
|
23
|
+
/** Result of a cache-aware analysis run. */
|
|
24
|
+
export interface CachedAnalysisResult {
|
|
25
|
+
/** Analysis per repo, keyed by repo path (same shape as analyzeAllRepos). */
|
|
26
|
+
analysis: Map<string, ProjectAnalysis>;
|
|
27
|
+
/** Names of repos that were re-analyzed because their content changed. */
|
|
28
|
+
analyzed: string[];
|
|
29
|
+
/** Names of repos whose cached analysis was reused. */
|
|
30
|
+
reused: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Cache-aware variant of {@link analyzeAllRepos}: reuses the analysis stored
|
|
34
|
+
* in the workspace's `.nexusflow-analysis-cache.json` for every repo whose
|
|
35
|
+
* git fingerprint (HEAD + dirty files) is unchanged, and only re-runs the
|
|
36
|
+
* analyzers for repos that actually changed.
|
|
37
|
+
*
|
|
38
|
+
* @param repos - Array of repos to analyze.
|
|
39
|
+
* @param workspacePath - Absolute path to the workspace root (cache location).
|
|
40
|
+
* @param options - Set `force` to ignore the cache and re-analyze everything.
|
|
41
|
+
* @returns The combined analysis map plus which repos were analyzed vs reused.
|
|
42
|
+
*/
|
|
43
|
+
export declare function analyzeAllReposCached(repos: RepoInfo[], workspacePath: string, options?: {
|
|
44
|
+
force?: boolean;
|
|
45
|
+
}): Promise<CachedAnalysisResult>;
|
|
23
46
|
export { detectTechStack } from './tech-stack.js';
|
|
24
47
|
export { detectApis } from './detect-apis.js';
|
|
25
48
|
export { detectDependencies, findInterRepoDependencies, detectNuGetFeeds } from './detect-deps.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe7D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CA6B1E;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAoBvC;AAED,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvC,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,QAAQ,EAAE,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,oBAAoB,CAAC,CAuD/B;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/analyzers/index.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import ora from 'ora';
|
|
8
|
+
import { loadAnalysisCache, saveAnalysisCache, getRepoFingerprint, } from '../core/analysis-cache.js';
|
|
8
9
|
import { detectTechStack } from './tech-stack.js';
|
|
9
10
|
import { detectApis } from './detect-apis.js';
|
|
10
11
|
import { detectDependencies, detectProducedPackages, detectNuGetFeeds } from './detect-deps.js';
|
|
@@ -74,6 +75,67 @@ export async function analyzeAllRepos(repos) {
|
|
|
74
75
|
spinner.succeed(`Analyzed ${chalk.bold(results.size)} projects`);
|
|
75
76
|
return results;
|
|
76
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Cache-aware variant of {@link analyzeAllRepos}: reuses the analysis stored
|
|
80
|
+
* in the workspace's `.nexusflow-analysis-cache.json` for every repo whose
|
|
81
|
+
* git fingerprint (HEAD + dirty files) is unchanged, and only re-runs the
|
|
82
|
+
* analyzers for repos that actually changed.
|
|
83
|
+
*
|
|
84
|
+
* @param repos - Array of repos to analyze.
|
|
85
|
+
* @param workspacePath - Absolute path to the workspace root (cache location).
|
|
86
|
+
* @param options - Set `force` to ignore the cache and re-analyze everything.
|
|
87
|
+
* @returns The combined analysis map plus which repos were analyzed vs reused.
|
|
88
|
+
*/
|
|
89
|
+
export async function analyzeAllReposCached(repos, workspacePath, options = {}) {
|
|
90
|
+
const cache = await loadAnalysisCache(workspacePath);
|
|
91
|
+
const results = new Map();
|
|
92
|
+
const analyzed = [];
|
|
93
|
+
const reused = [];
|
|
94
|
+
const spinner = ora('Analyzing projects...').start();
|
|
95
|
+
for (let i = 0; i < repos.length; i++) {
|
|
96
|
+
const repo = repos[i];
|
|
97
|
+
const fingerprint = await getRepoFingerprint(repo.path);
|
|
98
|
+
const cached = cache.repos[repo.name];
|
|
99
|
+
if (!options.force && fingerprint && cached && cached.fingerprint === fingerprint) {
|
|
100
|
+
results.set(repo.path, { ...cached.analysis, name: repo.name, path: repo.path });
|
|
101
|
+
reused.push(repo.name);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
spinner.text = `Analyzing ${chalk.bold(repo.name)} (${i + 1}/${repos.length})...`;
|
|
105
|
+
try {
|
|
106
|
+
const analysis = await analyzeRepo(repo);
|
|
107
|
+
results.set(repo.path, analysis);
|
|
108
|
+
analyzed.push(repo.name);
|
|
109
|
+
if (fingerprint) {
|
|
110
|
+
cache.repos[repo.name] = {
|
|
111
|
+
repoName: repo.name,
|
|
112
|
+
fingerprint,
|
|
113
|
+
analyzedAt: new Date().toISOString(),
|
|
114
|
+
analysis,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
120
|
+
spinner.warn(`Failed to analyze ${repo.name}: ${msg}`);
|
|
121
|
+
spinner.start();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
await saveAnalysisCache(workspacePath, cache, repos.map((r) => r.name));
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Cache persistence is best-effort; analysis results are still valid.
|
|
129
|
+
}
|
|
130
|
+
if (reused.length > 0) {
|
|
131
|
+
spinner.succeed(`Analyzed ${chalk.bold(analyzed.length)} project${analyzed.length === 1 ? '' : 's'}, ` +
|
|
132
|
+
`reused cached analysis for ${chalk.bold(reused.length)} unchanged`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
spinner.succeed(`Analyzed ${chalk.bold(results.size)} projects`);
|
|
136
|
+
}
|
|
137
|
+
return { analysis: results, analyzed, reused };
|
|
138
|
+
}
|
|
77
139
|
// Re-export individual analyzers
|
|
78
140
|
export { detectTechStack } from './tech-stack.js';
|
|
79
141
|
export { detectApis } from './detect-apis.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
* @module commands/add-repo
|
|
3
3
|
* Adds a repository to an existing NexusFlow workspace.
|
|
4
4
|
*/
|
|
5
|
+
import type { Feature, RepoInfo } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Returns the scanned repos that are not already part of the workspace.
|
|
8
|
+
*
|
|
9
|
+
* `feature.repos` holds worktree paths inside the workspace, whereas scanned
|
|
10
|
+
* repos carry their original source path ā so dedup must compare against
|
|
11
|
+
* `feature.originalRepos`, normalizing for path separators.
|
|
12
|
+
*/
|
|
13
|
+
export declare function filterAvailableRepos<T extends Pick<RepoInfo, 'path'>>(scanned: T[], feature: Pick<Feature, 'originalRepos'>): T[];
|
|
5
14
|
/**
|
|
6
15
|
* Executes the add-repo command.
|
|
7
16
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-repo.d.ts","sourceRoot":"","sources":["../../src/commands/add-repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"add-repo.d.ts","sourceRoot":"","sources":["../../src/commands/add-repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EACnE,OAAO,EAAE,CAAC,EAAE,EACZ,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,GACtC,CAAC,EAAE,CAKL;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAkIf"}
|
|
@@ -9,6 +9,17 @@ import * as path from 'node:path';
|
|
|
9
9
|
import { loadConfig } from '../core/config.js';
|
|
10
10
|
import { scanForRepos } from '../core/scanner.js';
|
|
11
11
|
import { listWorkspaces, loadFeatureConfig, addRepoToWorkspace } from '../core/workspace.js';
|
|
12
|
+
/**
|
|
13
|
+
* Returns the scanned repos that are not already part of the workspace.
|
|
14
|
+
*
|
|
15
|
+
* `feature.repos` holds worktree paths inside the workspace, whereas scanned
|
|
16
|
+
* repos carry their original source path ā so dedup must compare against
|
|
17
|
+
* `feature.originalRepos`, normalizing for path separators.
|
|
18
|
+
*/
|
|
19
|
+
export function filterAvailableRepos(scanned, feature) {
|
|
20
|
+
const originalRepoPaths = new Set((feature.originalRepos ?? []).map((p) => path.resolve(p)));
|
|
21
|
+
return scanned.filter((r) => !originalRepoPaths.has(path.resolve(r.path)));
|
|
22
|
+
}
|
|
12
23
|
/**
|
|
13
24
|
* Executes the add-repo command.
|
|
14
25
|
*
|
|
@@ -98,7 +109,7 @@ export async function addRepoCommand(repoPathArg, workspaceArg) {
|
|
|
98
109
|
console.error(error);
|
|
99
110
|
return;
|
|
100
111
|
}
|
|
101
|
-
const availableRepos = repos
|
|
112
|
+
const availableRepos = filterAvailableRepos(repos, feature);
|
|
102
113
|
if (availableRepos.length === 0) {
|
|
103
114
|
console.log(chalk.yellow('All scanned repositories are already in the workspace.\n'));
|
|
104
115
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-repo.js","sourceRoot":"","sources":["../../src/commands/add-repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAU,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"add-repo.js","sourceRoot":"","sources":["../../src/commands/add-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-repo.test.d.ts","sourceRoot":"","sources":["../../src/commands/add-repo.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { filterAvailableRepos } from './add-repo.js';
|
|
4
|
+
describe('filterAvailableRepos (A1.3)', () => {
|
|
5
|
+
const scanned = [
|
|
6
|
+
{ path: path.resolve('/dev/repo-a'), name: 'repo-a' },
|
|
7
|
+
{ path: path.resolve('/dev/repo-b'), name: 'repo-b' },
|
|
8
|
+
];
|
|
9
|
+
it('excludes repos already added, matching on the original source path', () => {
|
|
10
|
+
// feature.repos holds worktree paths; originalRepos holds source paths.
|
|
11
|
+
const feature = {
|
|
12
|
+
originalRepos: [path.resolve('/dev/repo-a')],
|
|
13
|
+
repos: [path.resolve('/mock/ws/repo-a')],
|
|
14
|
+
};
|
|
15
|
+
const available = filterAvailableRepos(scanned, feature);
|
|
16
|
+
expect(available.map((r) => r.name)).toEqual(['repo-b']);
|
|
17
|
+
});
|
|
18
|
+
it('returns all scanned repos when originalRepos is missing', () => {
|
|
19
|
+
const available = filterAvailableRepos(scanned, {});
|
|
20
|
+
expect(available.map((r) => r.name)).toEqual(['repo-a', 'repo-b']);
|
|
21
|
+
});
|
|
22
|
+
it('does not incorrectly match against worktree paths (the original bug)', () => {
|
|
23
|
+
// Only worktree paths recorded, no originalRepos ā nothing filtered,
|
|
24
|
+
// because scanned paths never equal worktree paths.
|
|
25
|
+
const feature = { repos: [path.resolve('/mock/ws/repo-a')] };
|
|
26
|
+
const available = filterAvailableRepos(scanned, feature);
|
|
27
|
+
expect(available).toHaveLength(2);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=add-repo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-repo.test.js","sourceRoot":"","sources":["../../src/commands/add-repo.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,OAAO,GAAG;QACd,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;QACrD,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;KACtD,CAAC;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,wEAAwE;QACxE,MAAM,OAAO,GAAG;YACd,aAAa,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC5C,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;SACzC,CAAC;QAEF,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,qEAAqE;QACrE,oDAAoD;QACpD,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAc,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -33,9 +33,13 @@ describe('NexusFlow CLI New Commands unit tests', () => {
|
|
|
33
33
|
createdAt: new Date().toISOString(),
|
|
34
34
|
};
|
|
35
35
|
vi.spyOn(workspace, 'loadFeatureConfig').mockResolvedValue(mockFeature);
|
|
36
|
+
vi.spyOn(workspace, 'resolveRepoInfos').mockResolvedValue([
|
|
37
|
+
{ name: 'repo-1', path: repo1Path, defaultBranch: 'main' },
|
|
38
|
+
]);
|
|
36
39
|
vi.spyOn(multiGit, 'getRepoStatus').mockResolvedValue({
|
|
37
40
|
hasChanges: true,
|
|
38
41
|
changedFiles: ['src/file1.ts'],
|
|
42
|
+
files: [{ code: ' M', path: 'src/file1.ts' }],
|
|
39
43
|
summary: '1 file changed',
|
|
40
44
|
});
|
|
41
45
|
const mockAnalysis = new Map();
|
|
@@ -49,7 +53,11 @@ describe('NexusFlow CLI New Commands unit tests', () => {
|
|
|
49
53
|
readmeSummary: 'README summary',
|
|
50
54
|
existingAIConfigs: [],
|
|
51
55
|
});
|
|
52
|
-
vi.spyOn(analyzers, '
|
|
56
|
+
vi.spyOn(analyzers, 'analyzeAllReposCached').mockResolvedValue({
|
|
57
|
+
analysis: mockAnalysis,
|
|
58
|
+
analyzed: ['repo-1'],
|
|
59
|
+
reused: [],
|
|
60
|
+
});
|
|
53
61
|
const writtenFiles = {};
|
|
54
62
|
vi.spyOn(fs, 'writeFile').mockImplementation(async (filePath, content) => {
|
|
55
63
|
writtenFiles[path.resolve(filePath)] = content;
|
|
@@ -80,12 +88,16 @@ describe('NexusFlow CLI New Commands unit tests', () => {
|
|
|
80
88
|
createdAt: new Date().toISOString(),
|
|
81
89
|
};
|
|
82
90
|
vi.spyOn(workspace, 'loadFeatureConfig').mockResolvedValue(mockFeature);
|
|
83
|
-
vi.spyOn(analyzers, '
|
|
91
|
+
vi.spyOn(analyzers, 'analyzeAllReposCached').mockResolvedValue({
|
|
92
|
+
analysis: new Map(),
|
|
93
|
+
analyzed: ['repo-1'],
|
|
94
|
+
reused: [],
|
|
95
|
+
});
|
|
84
96
|
vi.spyOn(generators, 'generateContextFiles').mockResolvedValue(undefined);
|
|
85
97
|
// Run refresh command with repo filter
|
|
86
98
|
await refreshCommand({ repo: 'repo-1' }, mockWorkspacePath);
|
|
87
|
-
expect(analyzers.
|
|
88
|
-
expect(generators.generateContextFiles).toHaveBeenCalledWith(expect.any(Object), expect.any(Array), mockWorkspacePath, 'repo-1', undefined);
|
|
99
|
+
expect(analyzers.analyzeAllReposCached).toHaveBeenCalled();
|
|
100
|
+
expect(generators.generateContextFiles).toHaveBeenCalledWith(expect.any(Object), expect.any(Array), mockWorkspacePath, 'repo-1', undefined, ['repo-1']);
|
|
89
101
|
});
|
|
90
102
|
});
|
|
91
103
|
describe('doctorCommand', () => {
|
|
@@ -101,10 +113,14 @@ describe('NexusFlow CLI New Commands unit tests', () => {
|
|
|
101
113
|
createdAt: new Date().toISOString(),
|
|
102
114
|
};
|
|
103
115
|
vi.spyOn(workspace, 'loadFeatureConfig').mockResolvedValue(mockFeature);
|
|
116
|
+
vi.spyOn(workspace, 'resolveRepoInfos').mockResolvedValue([
|
|
117
|
+
{ name: 'repo-1', path: repo1Path, defaultBranch: 'main' },
|
|
118
|
+
]);
|
|
104
119
|
vi.spyOn(fs, 'stat').mockResolvedValue({ isDirectory: () => true });
|
|
105
120
|
vi.spyOn(multiGit, 'getRepoStatus').mockResolvedValue({
|
|
106
121
|
hasChanges: false,
|
|
107
122
|
changedFiles: [],
|
|
123
|
+
files: [],
|
|
108
124
|
summary: 'Clean',
|
|
109
125
|
});
|
|
110
126
|
const mockAnalysis = new Map();
|
|
@@ -118,14 +134,18 @@ describe('NexusFlow CLI New Commands unit tests', () => {
|
|
|
118
134
|
readmeSummary: 'README summary',
|
|
119
135
|
existingAIConfigs: [],
|
|
120
136
|
});
|
|
121
|
-
vi.spyOn(analyzers, '
|
|
137
|
+
vi.spyOn(analyzers, 'analyzeAllReposCached').mockResolvedValue({
|
|
138
|
+
analysis: mockAnalysis,
|
|
139
|
+
analyzed: ['repo-1'],
|
|
140
|
+
reused: [],
|
|
141
|
+
});
|
|
122
142
|
vi.spyOn(fs, 'access').mockResolvedValue(undefined); // covers .code-workspace + artifact checks
|
|
123
143
|
vi.spyOn(fs, 'readFile').mockResolvedValue(JSON.stringify({ "search.useIgnoreFiles": false }));
|
|
124
144
|
// Run doctor command
|
|
125
145
|
await doctorCommand(mockWorkspacePath);
|
|
126
146
|
expect(workspace.loadFeatureConfig).toHaveBeenCalledWith(mockWorkspacePath);
|
|
127
147
|
expect(fs.stat).toHaveBeenCalledWith(repo1Path);
|
|
128
|
-
expect(analyzers.
|
|
148
|
+
expect(analyzers.analyzeAllReposCached).toHaveBeenCalled();
|
|
129
149
|
});
|
|
130
150
|
});
|
|
131
151
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.test.js","sourceRoot":"","sources":["../../src/commands/commands.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAC5B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjB,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAChC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AACjC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AAElC,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAEzD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;YACnG,MAAM,WAAW,GAAG;gBAClB,EAAE,EAAE,cAAc;gBAClB,UAAU,EAAE,qBAAqB;gBACjC,WAAW,EAAE,0BAA0B;gBACvC,KAAK,EAAE,CAAC,SAAS,CAAC;gBAClB,aAAa,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAC7C,UAAU,EAAE,CAAC,QAAiB,CAAC;gBAC/B,aAAa,EAAE,iBAAiB;gBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACxE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,iBAAiB,CAAC;gBACpD,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,CAAC,cAAc,CAAC;gBAC9B,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC1B,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE;gBAChG,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,EAAE;gBAChB,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,gBAAgB;gBAC/B,iBAAiB,EAAE,EAAE;aACtB,CAAC,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"commands.test.js","sourceRoot":"","sources":["../../src/commands/commands.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,14 @@
|
|
|
3
3
|
* Commits changes across all repositories in the workspace.
|
|
4
4
|
*/
|
|
5
5
|
interface CommitOptions {
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Commander stores the `--no-push` flag under `push` (default `true`);
|
|
8
|
+
* pushing is therefore suppressed when this is explicitly `false`.
|
|
9
|
+
*/
|
|
10
|
+
push?: boolean;
|
|
7
11
|
dryRun?: boolean;
|
|
12
|
+
/** Restrict the commit to these repos (by directory name). */
|
|
13
|
+
repo?: string[];
|
|
8
14
|
}
|
|
9
15
|
/**
|
|
10
16
|
* Executes the commit command.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,UAAU,aAAa;IACrB,
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,UAAU,aAAa;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAaD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
|
package/dist/commands/commit.js
CHANGED
|
@@ -8,7 +8,19 @@ import * as path from 'node:path';
|
|
|
8
8
|
import * as fs from 'node:fs/promises';
|
|
9
9
|
import { loadConfig } from '../core/config.js';
|
|
10
10
|
import { listWorkspaces, loadFeatureConfig } from '../core/workspace.js';
|
|
11
|
-
import { getWorkspaceRepos, getRepoStatus, commitAndPush } from '../utils/multi-git.js';
|
|
11
|
+
import { getWorkspaceRepos, getRepoStatus, getDiffSummary, commitAndPush } from '../utils/multi-git.js';
|
|
12
|
+
/**
|
|
13
|
+
* Renders a porcelain status code with a color matching its state:
|
|
14
|
+
* green for staged, yellow for unstaged, cyan for untracked.
|
|
15
|
+
*/
|
|
16
|
+
function renderStatusCode(file) {
|
|
17
|
+
const code = file.code.trim() || '??';
|
|
18
|
+
if (file.code === '??')
|
|
19
|
+
return chalk.cyan(code);
|
|
20
|
+
if (file.code[0] !== ' ' && file.code[0] !== '?')
|
|
21
|
+
return chalk.green(code);
|
|
22
|
+
return chalk.yellow(code);
|
|
23
|
+
}
|
|
12
24
|
/**
|
|
13
25
|
* Executes the commit command.
|
|
14
26
|
*
|
|
@@ -18,6 +30,7 @@ import { getWorkspaceRepos, getRepoStatus, commitAndPush } from '../utils/multi-
|
|
|
18
30
|
*/
|
|
19
31
|
export async function commitCommand(message, workspaceArg, options) {
|
|
20
32
|
console.log(chalk.bold.cyan('\nš¾ NexusFlow ā Committing Workspace Changes\n'));
|
|
33
|
+
const noPush = options?.push === false;
|
|
21
34
|
const workspacePath = await resolveWorkspace(workspaceArg);
|
|
22
35
|
if (!workspacePath)
|
|
23
36
|
return;
|
|
@@ -26,7 +39,16 @@ export async function commitCommand(message, workspaceArg, options) {
|
|
|
26
39
|
console.error(chalk.red('ā Failed to load workspace configuration.'));
|
|
27
40
|
return;
|
|
28
41
|
}
|
|
29
|
-
|
|
42
|
+
let repos = await getWorkspaceRepos(workspacePath);
|
|
43
|
+
if (options?.repo && options.repo.length > 0) {
|
|
44
|
+
const unknown = options.repo.filter((name) => !repos.some((r) => r.name === name));
|
|
45
|
+
if (unknown.length > 0) {
|
|
46
|
+
console.error(chalk.red(`ā Repositor${unknown.length === 1 ? 'y' : 'ies'} not in this workspace: ${unknown.join(', ')}`));
|
|
47
|
+
console.log(chalk.dim(` Available repos: ${repos.map((r) => r.name).join(', ')}`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
repos = repos.filter((r) => options.repo.includes(r.name));
|
|
51
|
+
}
|
|
30
52
|
const changedRepos = [];
|
|
31
53
|
for (const repo of repos) {
|
|
32
54
|
const status = await getRepoStatus(repo.path);
|
|
@@ -44,23 +66,24 @@ export async function commitCommand(message, workspaceArg, options) {
|
|
|
44
66
|
}
|
|
45
67
|
console.log();
|
|
46
68
|
for (const { repo, status } of changedRepos) {
|
|
69
|
+
const diff = await getDiffSummary(repo.path);
|
|
47
70
|
console.log(`Repository: ${chalk.bold(repo.name)}`);
|
|
48
|
-
console.log(chalk.dim(` Changes: ${status.summary}`));
|
|
49
|
-
for (const file of status.
|
|
50
|
-
console.log(` ${
|
|
71
|
+
console.log(chalk.dim(` Changes: ${status.summary} (${chalk.green(`+${diff.additions}`)} ${chalk.red(`ā${diff.deletions}`)})`));
|
|
72
|
+
for (const file of status.files) {
|
|
73
|
+
console.log(` ${renderStatusCode(file)} ${file.path}`);
|
|
51
74
|
}
|
|
52
75
|
if (options?.dryRun) {
|
|
53
|
-
console.log(chalk.dim(' [Dry Run] Would commit and ' + (
|
|
76
|
+
console.log(chalk.dim(' [Dry Run] Would commit and ' + (noPush ? 'not push' : 'push')));
|
|
54
77
|
continue;
|
|
55
78
|
}
|
|
56
79
|
const spinner = chalk.dim(' Committing...');
|
|
57
80
|
process.stdout.write(spinner);
|
|
58
81
|
const result = await commitAndPush(repo.path, message, repo.branchName, {
|
|
59
|
-
noPush
|
|
82
|
+
noPush,
|
|
60
83
|
});
|
|
61
84
|
process.stdout.write('\r' + ' '.repeat(spinner.length) + '\r');
|
|
62
85
|
if (result.success) {
|
|
63
|
-
const action =
|
|
86
|
+
const action = noPush ? 'Committed' : 'Committed & pushed';
|
|
64
87
|
console.log(` ${chalk.green('ā
')} ${action} (${chalk.cyan(result.commitHash || 'no hash')})`);
|
|
65
88
|
}
|
|
66
89
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.test.d.ts","sourceRoot":"","sources":["../../src/commands/commit.test.ts"],"names":[],"mappings":""}
|