@mrpatronz/nexusflow 2.2.0 → 2.3.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 +80 -17
- package/dist/commands/ui.d.ts +1 -0
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +24 -13
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/ui.test.d.ts +2 -0
- package/dist/commands/ui.test.d.ts.map +1 -0
- package/dist/commands/ui.test.js +58 -0
- package/dist/commands/ui.test.js.map +1 -0
- package/dist/core/workspace-skills-workflow.integration.test.d.ts +2 -0
- package/dist/core/workspace-skills-workflow.integration.test.d.ts.map +1 -0
- package/dist/core/workspace-skills-workflow.integration.test.js +162 -0
- package/dist/core/workspace-skills-workflow.integration.test.js.map +1 -0
- package/dist/core/worktree.test.js +1 -1
- package/dist/core/worktree.test.js.map +1 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +4 -8
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/skills-generator.d.ts +2 -2
- package/dist/generators/skills-generator.d.ts.map +1 -1
- package/dist/generators/skills-generator.js +84 -89
- package/dist/generators/skills-generator.js.map +1 -1
- package/dist/generators/skills-generator.test.d.ts +2 -0
- package/dist/generators/skills-generator.test.d.ts.map +1 -0
- package/dist/generators/skills-generator.test.js +79 -0
- package/dist/generators/skills-generator.test.js.map +1 -0
- package/dist/gui/assets/AgentsPage-BtrTgIyU.js +3 -0
- package/dist/gui/assets/{DashboardPage-CUspfCap.js → DashboardPage-CeUkMdxc.js} +1 -1
- package/dist/gui/assets/{GettingStartedPage-BqtgARZW.js → GettingStartedPage-YwJXpsc6.js} +1 -1
- package/dist/gui/assets/ProjectsPage-D8kEHb-m.js +1 -0
- package/dist/gui/assets/ScaffoldRepoInline-ij7JLzmx.js +1 -0
- package/dist/gui/assets/SettingsPage-BQhAP4go.js +1 -0
- package/dist/gui/assets/SkillsPage-DJ-dXfcC.js +6 -0
- package/dist/gui/assets/StartWorkPage-DGWZzF4H.js +1 -0
- package/dist/gui/assets/{StrategiesPage-D0Y6A4Tw.js → StrategiesPage-CLOjDRbX.js} +2 -2
- package/dist/gui/assets/WorkspaceLauncher-CjNI4vqn.js +1 -0
- package/dist/gui/assets/WorkspacesPage-MDzm2JUh.js +6 -0
- package/dist/gui/assets/alert-dialog-DjwFcE6b.js +1 -0
- package/dist/gui/assets/bot-wH0FKlic.js +1 -0
- package/dist/gui/assets/chevron-down-DDmhvRLr.js +1 -0
- package/dist/gui/assets/code-xml-Chu1p81J.js +1 -0
- package/dist/gui/assets/index-CfQEnn52.js +52 -0
- package/dist/gui/assets/index-k7inKaui.css +2 -0
- package/dist/gui/assets/{spinner-DXt6mnJk.js → spinner-BCEaGbib.js} +1 -1
- package/dist/gui/assets/terminal-gK6BMl3E.js +1 -0
- package/dist/gui/assets/{textarea-BLU5HXmZ.js → textarea-D3-elOAa.js} +1 -1
- package/dist/gui/assets/{useAriaLabelledBy-CjNlctb9.js → useAriaLabelledBy-DmwmZIqb.js} +1 -1
- package/dist/gui/assets/useCompositeListItem-CZnlZ-eF.js +1 -0
- package/dist/gui/assets/useValueChanged-BfI2s7NX.js +1 -0
- package/dist/gui/assets/zap-FQrDnrgb.js +1 -0
- package/dist/gui/index.html +6 -4
- package/dist/resources/agents-catalog.d.ts +7 -0
- package/dist/resources/agents-catalog.d.ts.map +1 -0
- package/dist/resources/agents-catalog.js +141 -0
- package/dist/resources/agents-catalog.js.map +1 -0
- package/dist/resources/agents-catalog.test.d.ts +2 -0
- package/dist/resources/agents-catalog.test.d.ts.map +1 -0
- package/dist/resources/agents-catalog.test.js +50 -0
- package/dist/resources/agents-catalog.test.js.map +1 -0
- package/dist/resources/codex-agent.d.ts +6 -0
- package/dist/resources/codex-agent.d.ts.map +1 -0
- package/dist/resources/codex-agent.js +55 -0
- package/dist/resources/codex-agent.js.map +1 -0
- package/dist/resources/codex-agent.test.d.ts +2 -0
- package/dist/resources/codex-agent.test.d.ts.map +1 -0
- package/dist/resources/codex-agent.test.js +27 -0
- package/dist/resources/codex-agent.test.js.map +1 -0
- package/dist/resources/contracts.d.ts +116 -0
- package/dist/resources/contracts.d.ts.map +1 -0
- package/dist/resources/contracts.js +103 -0
- package/dist/resources/contracts.js.map +1 -0
- package/dist/resources/fs-safety.d.ts +11 -0
- package/dist/resources/fs-safety.d.ts.map +1 -0
- package/dist/resources/fs-safety.js +77 -0
- package/dist/resources/fs-safety.js.map +1 -0
- package/dist/resources/materializer.d.ts +17 -0
- package/dist/resources/materializer.d.ts.map +1 -0
- package/dist/resources/materializer.js +439 -0
- package/dist/resources/materializer.js.map +1 -0
- package/dist/resources/materializer.test.d.ts +2 -0
- package/dist/resources/materializer.test.d.ts.map +1 -0
- package/dist/resources/materializer.test.js +149 -0
- package/dist/resources/materializer.test.js.map +1 -0
- package/dist/resources/service.d.ts +8 -0
- package/dist/resources/service.d.ts.map +1 -0
- package/dist/resources/service.js +45 -0
- package/dist/resources/service.js.map +1 -0
- package/dist/resources/service.test.d.ts +2 -0
- package/dist/resources/service.test.d.ts.map +1 -0
- package/dist/resources/service.test.js +58 -0
- package/dist/resources/service.test.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +310 -4
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +365 -5
- package/dist/server.test.js.map +1 -1
- package/dist/types.d.ts +107 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/resources.d.ts +2 -1
- package/dist/utils/resources.d.ts.map +1 -1
- package/dist/utils/resources.js +4 -3
- package/dist/utils/resources.js.map +1 -1
- package/dist/utils/session-finder.d.ts +6 -0
- package/dist/utils/session-finder.d.ts.map +1 -1
- package/dist/utils/session-finder.js +56 -0
- package/dist/utils/session-finder.js.map +1 -1
- package/dist/utils/session-finder.test.js +34 -1
- package/dist/utils/session-finder.test.js.map +1 -1
- package/dist/utils/skills-catalog.d.ts +77 -0
- package/dist/utils/skills-catalog.d.ts.map +1 -0
- package/dist/utils/skills-catalog.js +871 -0
- package/dist/utils/skills-catalog.js.map +1 -0
- package/dist/utils/skills-catalog.test.d.ts +2 -0
- package/dist/utils/skills-catalog.test.d.ts.map +1 -0
- package/dist/utils/skills-catalog.test.js +281 -0
- package/dist/utils/skills-catalog.test.js.map +1 -0
- package/dist/utils/workspace-launch.d.ts.map +1 -1
- package/dist/utils/workspace-launch.js +22 -1
- package/dist/utils/workspace-launch.js.map +1 -1
- package/dist/utils/workspace-launch.test.js +36 -2
- package/dist/utils/workspace-launch.test.js.map +1 -1
- package/package.json +4 -1
- package/dist/gui/assets/ProjectsPage-UBoQxI2G.js +0 -1
- package/dist/gui/assets/ScaffoldRepoInline-DqoourJe.js +0 -1
- package/dist/gui/assets/SettingsPage-BZl24tqD.js +0 -1
- package/dist/gui/assets/StartWorkPage-BGNFdBfj.js +0 -1
- package/dist/gui/assets/WorkspaceLauncher-Cxv0O_wt.js +0 -1
- package/dist/gui/assets/WorkspacesPage-Cvb1rOeh.js +0 -6
- package/dist/gui/assets/index-CllPiiFL.js +0 -52
- package/dist/gui/assets/index-DGCBhMAn.css +0 -2
- package/dist/gui/assets/useCompositeListItem-DWGFLKqA.js +0 -1
- /package/dist/{resources → static-resources}/workflows/plan-implement-review.md +0 -0
- /package/dist/{resources → static-resources}/workflows/research-verify.md +0 -0
- /package/dist/{resources → static-resources}/workflows/solo-developer.md +0 -0
package/README.md
CHANGED
|
@@ -23,8 +23,11 @@ NexusFlow combines multiple Git repositories into a single feature workspace and
|
|
|
23
23
|
- **AI context generation** — automatically writes `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, and `.cursor/rules/nexusflow.mdc`
|
|
24
24
|
- **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
|
|
25
25
|
- **Smart codebase analysis** — detects tech stacks, ports, API endpoints, dependencies, and existing AI configs across all projects
|
|
26
|
+
- **Resource Library** — create and administer reusable Agent Skill folders and Codex-native custom agents, then assign them to workspaces
|
|
27
|
+
- **Owned Resource Deployment** — installs portable skills to native discovery folders and Codex agents to `.codex/agents/`, refusing unmanaged collisions and preserving locally modified files
|
|
26
28
|
- **Teamwork Strategy Workflows** — predefine coordination flows and subagent behaviors (e.g. plan-implement-review) and inspect them with local AI coding assistant harnesses
|
|
27
29
|
- **Session history & resumption** — browse past conversation transcripts from Antigravity, Claude Code, OpenAI Codex, and GitHub Copilot, then resume where you left off
|
|
30
|
+
|
|
28
31
|
- **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)
|
|
29
32
|
- **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
|
|
30
33
|
- **Service orchestration** — start, stop, and tail logs for all services in a workspace with a single command
|
|
@@ -122,21 +125,29 @@ In isolated worktree mode:
|
|
|
122
125
|
|
|
123
126
|
```
|
|
124
127
|
~/dev/workspaces/feature/user-auth/
|
|
125
|
-
├── CLAUDE.md # Context for Claude
|
|
126
|
-
├── AGENTS.md #
|
|
128
|
+
├── CLAUDE.md # Context for Claude Code
|
|
129
|
+
├── AGENTS.md # Canonical context for Antigravity, Codex & agents
|
|
130
|
+
├── .agents/
|
|
131
|
+
│ └── skills/ # Skills for Google Antigravity (SKILL.md + assets)
|
|
132
|
+
├── .claude/
|
|
133
|
+
│ └── skills/ # Skills for Claude Code (SKILL.md + assets)
|
|
134
|
+
├── .codex/
|
|
135
|
+
│ └── skills/ # Skills for OpenAI Codex (SKILL.md + assets)
|
|
127
136
|
├── .github/
|
|
128
|
-
│
|
|
137
|
+
│ ├── copilot-instructions.md # Context for GitHub Copilot
|
|
138
|
+
│ └── instructions/ # Scoped skill instructions for Copilot
|
|
129
139
|
├── .cursor/
|
|
130
|
-
│ └── rules/
|
|
140
|
+
│ └── rules/ # Context & rules for Cursor (.mdc)
|
|
131
141
|
├── nexusflow.json # Feature config (branch, repos, etc.)
|
|
132
142
|
├── nexusflow-overview.md # AI-generated workspace analysis
|
|
143
|
+
├── nexusflow-knowledge.md # Persistent workspace memory (decisions & gotchas)
|
|
133
144
|
├── my-api/ # ← Git worktree on feature branch
|
|
134
145
|
└── my-frontend/ # ← Git worktree on feature branch
|
|
135
146
|
```
|
|
136
147
|
|
|
137
|
-
In-place workspaces keep the manifest and generated AI context files in the workspace directory while the code stays in the source repositories.
|
|
148
|
+
In-place workspaces keep the manifest, skills, and generated AI context files in the workspace directory while the code stays in the source repositories.
|
|
138
149
|
|
|
139
|
-
Open this folder in your editor → your AI assistant picks up the context → it understands *all* your repos.
|
|
150
|
+
Open this folder in your editor → your AI assistant picks up the context and skills → it understands *all* your repos.
|
|
140
151
|
|
|
141
152
|
## 🖥️ Commands
|
|
142
153
|
|
|
@@ -173,14 +184,16 @@ Open this folder in your editor → your AI assistant picks up the context → i
|
|
|
173
184
|
|
|
174
185
|
## 🤖 Supported AI Assistants
|
|
175
186
|
|
|
176
|
-
NexusFlow auto-detects which assistants are available on your machine and generates the right context files for each:
|
|
187
|
+
NexusFlow auto-detects which assistants are available on your machine and generates the right context files and skills for each:
|
|
177
188
|
|
|
178
|
-
| Assistant | Config File | How It's Detected |
|
|
189
|
+
| Assistant | Config File & Skills Target | How It's Detected |
|
|
179
190
|
|:---|:---|:---|
|
|
180
|
-
| **
|
|
181
|
-
| **
|
|
182
|
-
| **
|
|
183
|
-
| **
|
|
191
|
+
| **Google Antigravity** | `AGENTS.md` & `.agents/skills/` | `antigravity` in PATH |
|
|
192
|
+
| **Claude Code** | `CLAUDE.md` & `.claude/skills/` | `claude` in PATH |
|
|
193
|
+
| **OpenAI Codex** | `AGENTS.md`, `.agents/skills/` & `.codex/agents/` | `codex` in PATH |
|
|
194
|
+
| **GitHub Copilot** | `.github/copilot-instructions.md` & `.agents/skills/` | Always available |
|
|
195
|
+
| **Cursor** | `.cursor/rules/nexusflow.mdc` & `.agents/skills/` | `cursor` in PATH |
|
|
196
|
+
|
|
184
197
|
|
|
185
198
|
## 🔁 The Feature Loop: create → work → learn → finish
|
|
186
199
|
|
|
@@ -298,6 +311,45 @@ Jobs are stored in `~/.nexusflow/schedules.json` and executed while a NexusFlow
|
|
|
298
311
|
|
|
299
312
|
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`.
|
|
300
313
|
|
|
314
|
+
## 🧩 Resource Library
|
|
315
|
+
|
|
316
|
+
NexusFlow provides separate libraries for portable Agent Skills and Codex-native custom agents. Skills are complete directories; agents are validated native TOML definitions rather than skills disguised as personas.
|
|
317
|
+
|
|
318
|
+
Skills bundle metadata triggers (for AI autonomous discovery) with full Markdown execution playbooks, auxiliary reference runbooks (`references/`), and automation scripts (`scripts/`).
|
|
319
|
+
|
|
320
|
+
### Category Boxes & Visual Drag-and-Drop
|
|
321
|
+
|
|
322
|
+
Skills are grouped into clear visual accordion boxes by category. You can drag and drop skill cards between category boxes to re-categorize them, or use the quick menu on touch and mobile devices.
|
|
323
|
+
|
|
324
|
+
#### Built-in Category Templates & Skills:
|
|
325
|
+
- 🔀 **Pull Requests & Review**: `pr-review-toolkit`, `pr-description-gen`, `merge-conflict-resolver`
|
|
326
|
+
- 🧪 **Testing & Quality Assurance**: `verifier-workspace`, `e2e-runner`, `unit-test-coverage`
|
|
327
|
+
- 📦 **Cross-Repo & Release Ordering**: `nexusflow-local-package-loop`, `nexusflow-release-ordering`
|
|
328
|
+
- 🗄️ **Database & Migrations**: `schema-migration-validator`, `sql-fluff-linter`
|
|
329
|
+
- 🛡️ **Security & Auditing**: `secret-scanner`, `security-auditor`
|
|
330
|
+
|
|
331
|
+
#### Custom Categories & Workspace Scoping
|
|
332
|
+
- **Custom Categories**: Users can create, customize (colors, icons, descriptions), or delete custom categories. Custom overrides to built-in templates can be deleted at any time to restore default values.
|
|
333
|
+
- **Workspace Scoping**: Switch the scope dropdown to a feature workspace, edit a local draft, and save the complete selection with an optimistic revision check. Refresh the workspace to reconcile the saved selection.
|
|
334
|
+
|
|
335
|
+
### Codex Agent Administration
|
|
336
|
+
|
|
337
|
+
The Codex Agent Library supports creating, editing, importing, and deleting basic native agents with `name`, `description`, and `developer_instructions`, plus optional model, reasoning, and sandbox defaults. Selected agents are installed at `.codex/agents/<name>.toml`. Provider-neutral agent translation, agent teams, and collaboration kits are intentionally outside this feature.
|
|
338
|
+
|
|
339
|
+
### Cross-Harness Deployment
|
|
340
|
+
|
|
341
|
+
When a workspace is refreshed, NexusFlow reconciles enabled resources through `.nexusflow/resources.lock.json`. It refuses unmanaged target collisions, removes only unchanged NexusFlow-owned outputs, and reports modified-file conflicts instead of overwriting them.
|
|
342
|
+
|
|
343
|
+
| Assistant Harness | Deployment Path | Format |
|
|
344
|
+
|:---|:---|:---|
|
|
345
|
+
| **Google Antigravity** | `.agents/skills/<name>/SKILL.md` | YAML frontmatter + Markdown body + `references/` + `scripts/` |
|
|
346
|
+
| **Claude Code** | `.claude/skills/<name>/SKILL.md` | YAML frontmatter + Markdown body + `references/` + `scripts/` |
|
|
347
|
+
| **OpenAI Codex** | `.agents/skills/<name>/SKILL.md` | Complete portable Agent Skill directory |
|
|
348
|
+
| **Cursor** | `.agents/skills/<name>/SKILL.md` | Complete portable Agent Skill directory |
|
|
349
|
+
| **GitHub Copilot** | `.agents/skills/<name>/SKILL.md` | Complete portable Agent Skill directory |
|
|
350
|
+
|
|
351
|
+
Codex custom agents are separate resources and deploy to `.codex/agents/<name>.toml`.
|
|
352
|
+
|
|
301
353
|
## 👥 Teamwork Strategy Workflows
|
|
302
354
|
|
|
303
355
|
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.
|
|
@@ -322,12 +374,15 @@ The dashboard integrates an **AI Strategy Analysis** inspector:
|
|
|
322
374
|
The primary GUI is the Electron desktop app in `desktop/` (`npm install && npm start` there). It embeds the same dashboard the browser sees. For browser access, run `nexusflow dashboard`; `nexusflow ui` starts the underlying server without opening anything (add `--open` to launch a browser). For the platform rationale (Electron vs Tauri and friends), see [docs/desktop-platform.md](docs/desktop-platform.md). The dashboard is a full-featured dark-themed GUI:
|
|
323
375
|
|
|
324
376
|
- **Workspaces tab** — create, browse, and manage feature workspaces
|
|
325
|
-
- **
|
|
377
|
+
- **Skills & Agents tab** — manage reusable skills, categories, drag-and-drop boxes, and workspace skill assignments
|
|
378
|
+
- **Team Strategies tab** — inspect and author coordination workflows and multi-agent roles
|
|
379
|
+
- **Open with…** — launch the workspace directly in a detected Codex Desktop, Claude Desktop, VS Code, VS Code Insiders, Cursor, JetBrains IDE, or other supported editor; unavailable apps stay out of the primary picker
|
|
326
380
|
- **Chat tab** — use local CLI harnesses directly; Codex reuses `codex login` for workspace-write chat and GitHub Copilot reuses `copilot login` for read-only ACP chat, so NexusFlow does not need their API keys
|
|
327
381
|
- **Sessions tab** — view past AI conversation transcripts and resume sessions
|
|
328
382
|
- **Logs panel** — real-time aggregated service log output
|
|
329
383
|
- **Config panel** — edit NexusFlow settings from the browser
|
|
330
384
|
|
|
385
|
+
|
|
331
386
|
The deprecated `POST /api/open-editor` endpoint remains available to older GUI clients only for recognized graphical editors. Interactive terminal editors such as Vim, Neovim, Nano, and Emacs are not supported by that detached HTTP launch route because it cannot provide a TTY.
|
|
332
387
|
|
|
333
388
|
The dashboard runs a local [Hono](https://hono.dev) server on port 3000 and serves a [React](https://react.dev) + [Vite](https://vite.dev) frontend.
|
|
@@ -385,14 +440,17 @@ NexusFlow/
|
|
|
385
440
|
│ │ ├── detect-deps.ts # Dependency analysis
|
|
386
441
|
│ │ ├── detect-existing.ts# Existing AI config detection
|
|
387
442
|
│ │ └── readme-summarizer.ts# README content extraction
|
|
388
|
-
│ ├── generators/ # AI context file generators
|
|
443
|
+
│ ├── generators/ # AI context file & skill generators
|
|
389
444
|
│ │ ├── base.ts # Shared context builder
|
|
390
445
|
│ │ ├── claude.ts # CLAUDE.md generator
|
|
391
|
-
│ │ ├──
|
|
446
|
+
│ │ ├── antigravity.ts # Antigravity AGENTS.md generator
|
|
447
|
+
│ │ ├── codex.ts # Codex AGENTS.md generator
|
|
392
448
|
│ │ ├── copilot.ts # copilot-instructions.md generator
|
|
393
|
-
│ │
|
|
449
|
+
│ │ ├── cursor.ts # nexusflow.mdc generator
|
|
450
|
+
│ │ └── skills-generator.ts # Cross-harness skill deployment (.agents, .claude, .cursor, .codex)
|
|
394
451
|
│ ├── orchestration/ # Service start/stop/log management
|
|
395
452
|
│ └── utils/ # Helper utilities
|
|
453
|
+
│ ├── skills-catalog.ts # Skills & Categories catalog manager (~/.nexusflow/)
|
|
396
454
|
│ ├── git.ts # Git operations
|
|
397
455
|
│ ├── detect-ai.ts # AI assistant detection
|
|
398
456
|
│ ├── detect-editors.ts # Editor detection
|
|
@@ -400,11 +458,16 @@ NexusFlow/
|
|
|
400
458
|
│ └── prompts.ts # Interactive prompts
|
|
401
459
|
├── gui/ # React + Vite Web Dashboard
|
|
402
460
|
│ └── src/
|
|
403
|
-
│
|
|
461
|
+
│ ├── pages/
|
|
462
|
+
│ │ ├── WorkspacesPage.tsx # Workspaces & launch targets
|
|
463
|
+
│ │ ├── SkillsPage.tsx # Skills & Agents categorized drag-and-drop hub
|
|
464
|
+
│ │ └── StrategiesPage.tsx # Teamwork strategy inspector
|
|
465
|
+
│ └── App.tsx # Main application routing & layout
|
|
404
466
|
├── package.json
|
|
405
467
|
└── tsconfig.json
|
|
406
468
|
```
|
|
407
469
|
|
|
470
|
+
|
|
408
471
|
## 🤝 Contributing
|
|
409
472
|
|
|
410
473
|
Contributions are welcome! Here's how to get set up:
|
package/dist/commands/ui.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Starts the Hono dashboard server (the backend the desktop app embeds).
|
|
4
4
|
* Opening a browser is opt-in via --open.
|
|
5
5
|
*/
|
|
6
|
+
export declare function findAvailablePort(startPort: number): Promise<number>;
|
|
6
7
|
/**
|
|
7
8
|
* Starts the local dashboard server. Pass `open: true` to also launch the
|
|
8
9
|
* default browser. `serverOnly` is deprecated (server-only is the default)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuCH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1E;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEvJ"}
|
package/dist/commands/ui.js
CHANGED
|
@@ -37,6 +37,17 @@ function openBrowser(url) {
|
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
+
export async function findAvailablePort(startPort) {
|
|
41
|
+
let p = startPort;
|
|
42
|
+
while (p < startPort + 100) {
|
|
43
|
+
const active = await isPortActive(p);
|
|
44
|
+
if (!active) {
|
|
45
|
+
return p;
|
|
46
|
+
}
|
|
47
|
+
p++;
|
|
48
|
+
}
|
|
49
|
+
return startPort;
|
|
50
|
+
}
|
|
40
51
|
/**
|
|
41
52
|
* Starts the local dashboard server. Pass `open: true` to also launch the
|
|
42
53
|
* default browser. `serverOnly` is deprecated (server-only is the default)
|
|
@@ -45,25 +56,25 @@ function openBrowser(url) {
|
|
|
45
56
|
* @param options - CLI options, including optional port, daemon, and open.
|
|
46
57
|
*/
|
|
47
58
|
export async function uiCommand(options) {
|
|
48
|
-
const
|
|
49
|
-
const url = `http://localhost:${port}`;
|
|
59
|
+
const requestedPort = options.port ? parseInt(options.port, 10) : 3000;
|
|
50
60
|
console.log(chalk.bold.cyan('\n🖥️ NexusFlow — Web Dashboard\n'));
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
openBrowser(url);
|
|
61
|
+
let targetPort = requestedPort;
|
|
62
|
+
const isRequestedPortActive = await isPortActive(requestedPort);
|
|
63
|
+
if (isRequestedPortActive) {
|
|
64
|
+
if (options.strictPort) {
|
|
65
|
+
console.error(chalk.red(` ✖ Port ${requestedPort} is already in use (strictPort mode).`));
|
|
66
|
+
return;
|
|
58
67
|
}
|
|
59
|
-
|
|
68
|
+
targetPort = await findAvailablePort(requestedPort + 1);
|
|
69
|
+
console.log(chalk.yellow(` ℹ Port ${requestedPort} is currently in use. Selecting next available port: ${chalk.bold(targetPort)}`));
|
|
60
70
|
}
|
|
71
|
+
const url = `http://localhost:${targetPort}`;
|
|
61
72
|
// Handle Daemon mode (runs detached in the background)
|
|
62
73
|
if (options.daemon) {
|
|
63
74
|
console.log(chalk.dim(' Starting server in the background...'));
|
|
64
75
|
try {
|
|
65
76
|
const serverScript = fileURLToPath(new URL('../index.js', import.meta.url));
|
|
66
|
-
const daemonArgs = [serverScript, 'ui', '--port', String(
|
|
77
|
+
const daemonArgs = [serverScript, 'ui', '--port', String(targetPort), '--server-only'];
|
|
67
78
|
if (options.strictPort)
|
|
68
79
|
daemonArgs.push('--strict-port');
|
|
69
80
|
const child = spawn(process.execPath, daemonArgs, {
|
|
@@ -71,7 +82,7 @@ export async function uiCommand(options) {
|
|
|
71
82
|
stdio: 'ignore'
|
|
72
83
|
});
|
|
73
84
|
child.unref();
|
|
74
|
-
console.log(chalk.green(` ✔ Dashboard daemon successfully spawned.`));
|
|
85
|
+
console.log(chalk.green(` ✔ Dashboard daemon successfully spawned on port ${chalk.bold(targetPort)}.`));
|
|
75
86
|
if (options.open) {
|
|
76
87
|
console.log(chalk.dim(' Opening browser...'));
|
|
77
88
|
// Give the background process a brief moment to start listening
|
|
@@ -92,7 +103,7 @@ export async function uiCommand(options) {
|
|
|
92
103
|
// Standard foreground blocking mode
|
|
93
104
|
console.log(chalk.dim(' Starting local server...'));
|
|
94
105
|
try {
|
|
95
|
-
const { port: actualPort } = await startServer(
|
|
106
|
+
const { port: actualPort } = await startServer(targetPort, { strictPort: options.strictPort });
|
|
96
107
|
const actualUrl = `http://localhost:${actualPort}`;
|
|
97
108
|
console.log(chalk.green(` ✔ Dashboard running at: ${chalk.bold(actualUrl)}`));
|
|
98
109
|
console.log(chalk.dim(' Press Ctrl+C to stop.\n'));
|
package/dist/commands/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC;IAC3B,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACpB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,GAAG,YAAY,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.test.d.ts","sourceRoot":"","sources":["../../src/commands/ui.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import * as net from 'node:net';
|
|
3
|
+
import { findAvailablePort, uiCommand } from './ui.js';
|
|
4
|
+
import * as serverModule from '../server.js';
|
|
5
|
+
vi.mock('../server.js', () => ({
|
|
6
|
+
startServer: vi.fn().mockResolvedValue({ port: 3001, server: {} }),
|
|
7
|
+
}));
|
|
8
|
+
describe('uiCommand port selection', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.clearAllMocks();
|
|
11
|
+
});
|
|
12
|
+
it('finds an available port when requested port is available', async () => {
|
|
13
|
+
const port = await findAvailablePort(38900);
|
|
14
|
+
expect(typeof port).toBe('number');
|
|
15
|
+
expect(port).toBeGreaterThanOrEqual(38900);
|
|
16
|
+
});
|
|
17
|
+
it('selects the next available port if requested port is in use', async () => {
|
|
18
|
+
// Start a temporary dummy TCP server on a dynamic port
|
|
19
|
+
const dummyServer = net.createServer();
|
|
20
|
+
await new Promise((resolve) => {
|
|
21
|
+
dummyServer.listen(0, 'localhost', () => resolve());
|
|
22
|
+
});
|
|
23
|
+
const address = dummyServer.address();
|
|
24
|
+
const occupiedPort = address.port;
|
|
25
|
+
try {
|
|
26
|
+
// Find next available port starting from occupiedPort
|
|
27
|
+
const freePort = await findAvailablePort(occupiedPort);
|
|
28
|
+
expect(freePort).not.toBe(occupiedPort);
|
|
29
|
+
expect(freePort).toBeGreaterThan(occupiedPort);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await new Promise((resolve) => {
|
|
33
|
+
dummyServer.close(() => resolve());
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
it('uiCommand respects strictPort mode when port is occupied', async () => {
|
|
38
|
+
const dummyServer = net.createServer();
|
|
39
|
+
await new Promise((resolve) => {
|
|
40
|
+
dummyServer.listen(0, 'localhost', () => resolve());
|
|
41
|
+
});
|
|
42
|
+
const address = dummyServer.address();
|
|
43
|
+
const occupiedPort = address.port;
|
|
44
|
+
const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
45
|
+
try {
|
|
46
|
+
await uiCommand({ port: String(occupiedPort), strictPort: true });
|
|
47
|
+
expect(serverModule.startServer).not.toHaveBeenCalled();
|
|
48
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('already in use'));
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
consoleSpy.mockRestore();
|
|
52
|
+
await new Promise((resolve) => {
|
|
53
|
+
dummyServer.close(() => resolve());
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=ui.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.test.js","sourceRoot":"","sources":["../../src/commands/ui.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,cAAc,CAAC;AAE7C,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;CACnE,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,uDAAuD;QACvD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAqB,CAAC;QACzD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC;YACH,sDAAsD;YACtD,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAqB,CAAC;QACzD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;QAElC,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrF,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-skills-workflow.integration.test.d.ts","sourceRoot":"","sources":["../../src/core/workspace-skills-workflow.integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import fse from 'fs-extra';
|
|
6
|
+
import { generateContextFiles } from '../generators/index.js';
|
|
7
|
+
import { saveSkill, saveWorkspaceSkillsConfig, getAllSkills, DEFAULT_SKILLS, } from '../utils/skills-catalog.js';
|
|
8
|
+
describe('End-to-End Skills & Tooling Workflow Integration', () => {
|
|
9
|
+
let tempWorkspace;
|
|
10
|
+
let tempHome;
|
|
11
|
+
const originalEnv = process.env.NEXUSFLOW_HOME;
|
|
12
|
+
beforeEach(async () => {
|
|
13
|
+
tempWorkspace = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-e2e-ws-'));
|
|
14
|
+
tempHome = await fs.mkdtemp(path.join(os.tmpdir(), 'nexusflow-e2e-home-'));
|
|
15
|
+
process.env.NEXUSFLOW_HOME = tempHome;
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
if (originalEnv !== undefined) {
|
|
19
|
+
process.env.NEXUSFLOW_HOME = originalEnv;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
delete process.env.NEXUSFLOW_HOME;
|
|
23
|
+
}
|
|
24
|
+
await fse.remove(tempWorkspace);
|
|
25
|
+
await fse.remove(tempHome);
|
|
26
|
+
});
|
|
27
|
+
it('generates complete multi-harness tooling and skills when a workspace is created', async () => {
|
|
28
|
+
const assistants = ['antigravity', 'claude', 'cursor', 'copilot', 'codex'];
|
|
29
|
+
const mockAnalysis = new Map();
|
|
30
|
+
mockAnalysis.set('core-service', {
|
|
31
|
+
name: 'core-service',
|
|
32
|
+
path: path.join(tempWorkspace, 'core-service'),
|
|
33
|
+
techStack: {
|
|
34
|
+
languages: ['typescript'],
|
|
35
|
+
frameworks: [],
|
|
36
|
+
buildTools: ['tsc'],
|
|
37
|
+
projectType: 'backend',
|
|
38
|
+
},
|
|
39
|
+
dependencies: [{ name: '@acme/shared-lib', type: 'npm', version: '^1.0.0' }],
|
|
40
|
+
ports: [{ port: 3000, protocol: 'http', source: 'src/server.ts' }],
|
|
41
|
+
readmeSummary: 'Core backend service',
|
|
42
|
+
existingAIConfigs: [],
|
|
43
|
+
runConfig: {
|
|
44
|
+
entryPoints: [{ projectPath: 'core-service', type: 'npm', command: 'npm run start', port: 3000 }],
|
|
45
|
+
databases: [],
|
|
46
|
+
sharedInfraWarnings: [],
|
|
47
|
+
committedSecrets: [],
|
|
48
|
+
externalDependencies: [],
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
mockAnalysis.set('shared-lib', {
|
|
52
|
+
name: 'shared-lib',
|
|
53
|
+
path: path.join(tempWorkspace, 'shared-lib'),
|
|
54
|
+
techStack: {
|
|
55
|
+
languages: ['typescript'],
|
|
56
|
+
frameworks: [],
|
|
57
|
+
buildTools: ['tsc'],
|
|
58
|
+
projectType: 'library',
|
|
59
|
+
},
|
|
60
|
+
dependencies: [],
|
|
61
|
+
ports: [],
|
|
62
|
+
readmeSummary: 'Shared core utility library',
|
|
63
|
+
existingAIConfigs: [],
|
|
64
|
+
produces: [{ name: '@acme/shared-lib', type: 'npm', version: '1.0.0' }],
|
|
65
|
+
});
|
|
66
|
+
const ctx = {
|
|
67
|
+
feature: {
|
|
68
|
+
id: 'feature-order-flow',
|
|
69
|
+
branchName: 'feat/order-flow',
|
|
70
|
+
description: 'Implement multi-repo order flow with database migrations and PR checks',
|
|
71
|
+
repos: [path.join(tempWorkspace, 'core-service'), path.join(tempWorkspace, 'shared-lib')],
|
|
72
|
+
assistants,
|
|
73
|
+
workspacePath: tempWorkspace,
|
|
74
|
+
createdAt: new Date().toISOString(),
|
|
75
|
+
},
|
|
76
|
+
repos: [
|
|
77
|
+
{ name: 'core-service', path: path.join(tempWorkspace, 'core-service'), defaultBranch: 'main' },
|
|
78
|
+
{ name: 'shared-lib', path: path.join(tempWorkspace, 'shared-lib'), defaultBranch: 'main' },
|
|
79
|
+
],
|
|
80
|
+
analysis: mockAnalysis,
|
|
81
|
+
};
|
|
82
|
+
await saveWorkspaceSkillsConfig(tempWorkspace, {
|
|
83
|
+
enabledSkills: DEFAULT_SKILLS.map((skill) => skill.id),
|
|
84
|
+
});
|
|
85
|
+
// 1. Run the workspace generation pipeline
|
|
86
|
+
await generateContextFiles(ctx, assistants, tempWorkspace);
|
|
87
|
+
// 2. Verify Google Antigravity tooling (.agents/skills/)
|
|
88
|
+
const agyPrSkill = path.join(tempWorkspace, '.agents', 'skills', 'pr-review-toolkit', 'SKILL.md');
|
|
89
|
+
expect(await fse.pathExists(agyPrSkill)).toBe(true);
|
|
90
|
+
const agyContent = await fs.readFile(agyPrSkill, 'utf-8');
|
|
91
|
+
expect(agyContent).toContain('name: pr-review-toolkit');
|
|
92
|
+
expect(agyContent).not.toContain('allowed-tools:');
|
|
93
|
+
expect(agyContent).toContain('# Pull Request Review Toolkit');
|
|
94
|
+
// Dynamic cross-repo skills for Antigravity
|
|
95
|
+
const agyPkgLoop = path.join(tempWorkspace, '.agents', 'skills', 'nexusflow-local-package-loop', 'SKILL.md');
|
|
96
|
+
expect(await fse.pathExists(agyPkgLoop)).toBe(true);
|
|
97
|
+
const agyVerifier = path.join(tempWorkspace, '.agents', 'skills', 'verifier-workspace', 'SKILL.md');
|
|
98
|
+
expect(await fse.pathExists(agyVerifier)).toBe(true);
|
|
99
|
+
// 3. Verify Claude Code tooling (.claude/skills/ and CLAUDE.md)
|
|
100
|
+
const claudeSkill = path.join(tempWorkspace, '.claude', 'skills', 'pr-review-toolkit', 'SKILL.md');
|
|
101
|
+
expect(await fse.pathExists(claudeSkill)).toBe(true);
|
|
102
|
+
expect(await fse.pathExists(path.join(tempWorkspace, 'CLAUDE.md'))).toBe(true);
|
|
103
|
+
// Cursor, Copilot, Codex, and Antigravity share the complete portable
|
|
104
|
+
// package instead of receiving lossy rules or instruction-file conversions.
|
|
105
|
+
expect(await fse.pathExists(path.join(tempWorkspace, '.cursor', 'rules', 'pr-review-toolkit.mdc'))).toBe(false);
|
|
106
|
+
expect(await fse.pathExists(path.join(tempWorkspace, '.github', 'instructions', 'pr-review-toolkit.instructions.md'))).toBe(false);
|
|
107
|
+
expect(await fse.pathExists(path.join(tempWorkspace, '.codex', 'skills', 'pr-review-toolkit'))).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it('supports custom user skills with auxiliary references/scripts and workspace assignment filtering', async () => {
|
|
110
|
+
// 1. Author a custom skill in the catalog
|
|
111
|
+
await saveSkill({
|
|
112
|
+
name: 'k8s-deployer',
|
|
113
|
+
title: 'Kubernetes Deployer',
|
|
114
|
+
category: 'testing-qa',
|
|
115
|
+
description: 'Deploys microservices to local Minikube / Kind cluster',
|
|
116
|
+
tags: ['k8s', 'minikube', 'devops'],
|
|
117
|
+
allowedTools: ['run_command', 'view_file'],
|
|
118
|
+
content: '# Kubernetes Deployer\n\nRun helm upgrade --install.',
|
|
119
|
+
references: [{ name: 'values-local.yaml', relativePath: 'references/values-local.yaml', content: 'replicas: 1\n' }],
|
|
120
|
+
scripts: [{ name: 'deploy.sh', relativePath: 'scripts/deploy.sh', content: '#!/bin/bash\nhelm install app .\n' }],
|
|
121
|
+
});
|
|
122
|
+
// Verify catalog discovery
|
|
123
|
+
const catalog = await getAllSkills();
|
|
124
|
+
expect(catalog.some((s) => s.id === 'k8s-deployer')).toBe(true);
|
|
125
|
+
// 2. Selectively enable ONLY the custom skill in the workspace
|
|
126
|
+
await saveWorkspaceSkillsConfig(tempWorkspace, {
|
|
127
|
+
enabledSkills: ['k8s-deployer'],
|
|
128
|
+
});
|
|
129
|
+
const assistants = ['antigravity', 'claude', 'codex'];
|
|
130
|
+
const ctx = {
|
|
131
|
+
feature: {
|
|
132
|
+
id: 'k8s-feature',
|
|
133
|
+
branchName: 'feat/k8s',
|
|
134
|
+
description: 'Deploy to K8s',
|
|
135
|
+
repos: [],
|
|
136
|
+
assistants,
|
|
137
|
+
workspacePath: tempWorkspace,
|
|
138
|
+
createdAt: new Date().toISOString(),
|
|
139
|
+
},
|
|
140
|
+
repos: [],
|
|
141
|
+
};
|
|
142
|
+
// 3. Generate workspace files
|
|
143
|
+
await generateContextFiles(ctx, assistants, tempWorkspace);
|
|
144
|
+
// 4. Verify custom skill and supporting references/scripts are deployed
|
|
145
|
+
// Antigravity
|
|
146
|
+
const agyK8sSkill = path.join(tempWorkspace, '.agents', 'skills', 'k8s-deployer', 'SKILL.md');
|
|
147
|
+
const agyK8sRef = path.join(tempWorkspace, '.agents', 'skills', 'k8s-deployer', 'references', 'values-local.yaml');
|
|
148
|
+
const agyK8sScript = path.join(tempWorkspace, '.agents', 'skills', 'k8s-deployer', 'scripts', 'deploy.sh');
|
|
149
|
+
expect(await fse.pathExists(agyK8sSkill)).toBe(true);
|
|
150
|
+
expect(await fse.pathExists(agyK8sRef)).toBe(true);
|
|
151
|
+
expect(await fse.pathExists(agyK8sScript)).toBe(true);
|
|
152
|
+
expect(await fs.readFile(agyK8sRef, 'utf-8')).toBe('replicas: 1\n');
|
|
153
|
+
// Claude
|
|
154
|
+
const claudeK8sRef = path.join(tempWorkspace, '.claude', 'skills', 'k8s-deployer', 'references', 'values-local.yaml');
|
|
155
|
+
expect(await fse.pathExists(claudeK8sRef)).toBe(true);
|
|
156
|
+
// Codex uses the same .agents/skills package verified above.
|
|
157
|
+
// Verify un-enabled template skill was NOT deployed
|
|
158
|
+
const unEnabledSkill = path.join(tempWorkspace, '.agents', 'skills', 'pr-review-toolkit');
|
|
159
|
+
expect(await fse.pathExists(unEnabledSkill)).toBe(false);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=workspace-skills-workflow.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-skills-workflow.integration.test.js","sourceRoot":"","sources":["../../src/core/workspace-skills-workflow.integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,yBAAyB,EAEzB,YAAY,EACZ,cAAc,GACf,MAAM,4BAA4B,CAAC;AAGpC,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,IAAI,aAAqB,CAAC;IAC1B,IAAI,QAAgB,CAAC;IACrB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE/C,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC9E,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,WAAW,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAGH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,UAAU,GAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE1F,MAAM,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;QACxD,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE;YAC/B,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;YAC9C,SAAS,EAAE;gBACT,SAAS,EAAE,CAAC,YAAY,CAAC;gBACzB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,CAAC,KAAK,CAAC;gBACnB,WAAW,EAAE,SAAS;aACvB;YACD,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC5E,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;YAClE,aAAa,EAAE,sBAAsB;YACrC,iBAAiB,EAAE,EAAE;YACrB,SAAS,EAAE;gBACT,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACjG,SAAS,EAAE,EAAE;gBACb,mBAAmB,EAAE,EAAE;gBACvB,gBAAgB,EAAE,EAAE;gBACpB,oBAAoB,EAAE,EAAE;aACzB;SAEF,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE;YAC7B,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC;YAC5C,SAAS,EAAE;gBACT,SAAS,EAAE,CAAC,YAAY,CAAC;gBACzB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,CAAC,KAAK,CAAC;gBACnB,WAAW,EAAE,SAAS;aACvB;YACD,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,EAAE;YACT,aAAa,EAAE,6BAA6B;YAC5C,iBAAiB,EAAE,EAAE;YACrB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;SACxE,CAAC,CAAC;QAIH,MAAM,GAAG,GAAqB;YAC5B,OAAO,EAAE;gBACP,EAAE,EAAE,oBAAoB;gBACxB,UAAU,EAAE,iBAAiB;gBAC7B,WAAW,EAAE,wEAAwE;gBACrF,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBACzF,UAAU;gBACV,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE;gBAC/F,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE;aAC5F;YACD,QAAQ,EAAE,YAAY;SACvB,CAAC;QAEF,MAAM,yBAAyB,CAAC,aAAa,EAAE;YAC7C,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;SACvD,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAE3D,yDAAyD;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;QAClG,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAE9D,4CAA4C;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,8BAA8B,EAAE,UAAU,CAAC,CAAC;QAC7G,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;QACpG,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,gEAAgE;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;QACnG,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/E,sEAAsE;QACtE,4EAA4E;QAC5E,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChH,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,mCAAmC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnI,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,0CAA0C;QAC1C,MAAM,SAAS,CAAC;YACd,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,qBAAqB;YAC5B,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,wDAAwD;YACrE,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC;YACnC,YAAY,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;YAC1C,OAAO,EAAE,sDAAsD;YAC/D,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,YAAY,EAAE,8BAA8B,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;YACnH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC;SAClH,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhE,+DAA+D;QAC/D,MAAM,yBAAyB,CAAC,aAAa,EAAE;YAC7C,aAAa,EAAE,CAAC,cAAc,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,GAAG,GAAqB;YAC5B,OAAO,EAAE;gBACP,EAAE,EAAE,aAAa;gBACjB,UAAU,EAAE,UAAU;gBACtB,WAAW,EAAE,eAAe;gBAC5B,KAAK,EAAE,EAAE;gBACT,UAAU;gBACV,aAAa,EAAE,aAAa;gBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC;YACD,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,8BAA8B;QAC9B,MAAM,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAE3D,wEAAwE;QACxE,cAAc;QACd,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QAC9F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;QACnH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE3G,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEpE,SAAS;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;QACtH,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtD,6DAA6D;QAE7D,oDAAoD;QACpD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -29,7 +29,7 @@ async function initRepo(dir) {
|
|
|
29
29
|
await git(dir, 'add', '.');
|
|
30
30
|
await git(dir, 'commit', '-m', 'init');
|
|
31
31
|
}
|
|
32
|
-
describe.skipIf(!hasGit)('createWorktree / removeWorktree (real git)', () => {
|
|
32
|
+
describe.skipIf(!hasGit)('createWorktree / removeWorktree (real git)', { timeout: 30000 }, () => {
|
|
33
33
|
let base = '';
|
|
34
34
|
let mainRepo = '';
|
|
35
35
|
let counter = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.test.js","sourceRoot":"","sources":["../../src/core/worktree.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/D,yEAAyE;AACzE,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;IACnB,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,GAAG,IAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAC3D,MAAM,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,4CAA4C,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"worktree.test.js","sourceRoot":"","sources":["../../src/core/worktree.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwHjE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBlE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,WAAW,EAAE,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwHjE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBlE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,WAAW,EAAE,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAgIf;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC"}
|