conductor-init 0.0.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/LICENSE +201 -0
- package/README.md +166 -0
- package/dist/conductor/GEMINI.md +41 -0
- package/dist/conductor/commands/conductor/implement.toml +179 -0
- package/dist/conductor/commands/conductor/newTrack.toml +157 -0
- package/dist/conductor/commands/conductor/revert.toml +130 -0
- package/dist/conductor/commands/conductor/review.toml +158 -0
- package/dist/conductor/commands/conductor/setup.toml +456 -0
- package/dist/conductor/commands/conductor/status.toml +57 -0
- package/dist/conductor/templates/code_styleguides/cpp.md +113 -0
- package/dist/conductor/templates/code_styleguides/csharp.md +115 -0
- package/dist/conductor/templates/code_styleguides/dart.md +238 -0
- package/dist/conductor/templates/code_styleguides/general.md +23 -0
- package/dist/conductor/templates/code_styleguides/go.md +48 -0
- package/dist/conductor/templates/code_styleguides/html-css.md +49 -0
- package/dist/conductor/templates/code_styleguides/javascript.md +51 -0
- package/dist/conductor/templates/code_styleguides/python.md +37 -0
- package/dist/conductor/templates/code_styleguides/typescript.md +43 -0
- package/dist/conductor/templates/workflow.md +333 -0
- package/dist/index.js +57 -0
- package/package.json +85 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# Project Workflow
|
|
2
|
+
|
|
3
|
+
## Guiding Principles
|
|
4
|
+
|
|
5
|
+
1. **The Plan is the Source of Truth:** All work must be tracked in `plan.md`
|
|
6
|
+
2. **The Tech Stack is Deliberate:** Changes to the tech stack must be documented in `tech-stack.md` *before* implementation
|
|
7
|
+
3. **Test-Driven Development:** Write unit tests before implementing functionality
|
|
8
|
+
4. **High Code Coverage:** Aim for >80% code coverage for all modules
|
|
9
|
+
5. **User Experience First:** Every decision should prioritize user experience
|
|
10
|
+
6. **Non-Interactive & CI-Aware:** Prefer non-interactive commands. Use `CI=true` for watch-mode tools (tests, linters) to ensure single execution.
|
|
11
|
+
|
|
12
|
+
## Task Workflow
|
|
13
|
+
|
|
14
|
+
All tasks follow a strict lifecycle:
|
|
15
|
+
|
|
16
|
+
### Standard Task Workflow
|
|
17
|
+
|
|
18
|
+
1. **Select Task:** Choose the next available task from `plan.md` in sequential order
|
|
19
|
+
|
|
20
|
+
2. **Mark In Progress:** Before beginning work, edit `plan.md` and change the task from `[ ]` to `[~]`
|
|
21
|
+
|
|
22
|
+
3. **Write Failing Tests (Red Phase):**
|
|
23
|
+
- Create a new test file for the feature or bug fix.
|
|
24
|
+
- Write one or more unit tests that clearly define the expected behavior and acceptance criteria for the task.
|
|
25
|
+
- **CRITICAL:** Run the tests and confirm that they fail as expected. This is the "Red" phase of TDD. Do not proceed until you have failing tests.
|
|
26
|
+
|
|
27
|
+
4. **Implement to Pass Tests (Green Phase):**
|
|
28
|
+
- Write the minimum amount of application code necessary to make the failing tests pass.
|
|
29
|
+
- Run the test suite again and confirm that all tests now pass. This is the "Green" phase.
|
|
30
|
+
|
|
31
|
+
5. **Refactor (Optional but Recommended):**
|
|
32
|
+
- With the safety of passing tests, refactor the implementation code and the test code to improve clarity, remove duplication, and enhance performance without changing the external behavior.
|
|
33
|
+
- Rerun tests to ensure they still pass after refactoring.
|
|
34
|
+
|
|
35
|
+
6. **Verify Coverage:** Run coverage reports using the project's chosen tools. For example, in a Python project, this might look like:
|
|
36
|
+
```bash
|
|
37
|
+
pytest --cov=app --cov-report=html
|
|
38
|
+
```
|
|
39
|
+
Target: >80% coverage for new code. The specific tools and commands will vary by language and framework.
|
|
40
|
+
|
|
41
|
+
7. **Document Deviations:** If implementation differs from tech stack:
|
|
42
|
+
- **STOP** implementation
|
|
43
|
+
- Update `tech-stack.md` with new design
|
|
44
|
+
- Add dated note explaining the change
|
|
45
|
+
- Resume implementation
|
|
46
|
+
|
|
47
|
+
8. **Commit Code Changes:**
|
|
48
|
+
- Stage all code changes related to the task.
|
|
49
|
+
- Propose a clear, concise commit message e.g, `feat(ui): Create basic HTML structure for calculator`.
|
|
50
|
+
- Perform the commit.
|
|
51
|
+
|
|
52
|
+
9. **Attach Task Summary with Git Notes:**
|
|
53
|
+
- **Step 9.1: Get Commit Hash:** Obtain the hash of the *just-completed commit* (`git log -1 --format="%H"`).
|
|
54
|
+
- **Step 9.2: Draft Note Content:** Create a detailed summary for the completed task. This should include the task name, a summary of changes, a list of all created/modified files, and the core "why" for the change.
|
|
55
|
+
- **Step 9.3: Attach Note:** Use the `git notes` command to attach the summary to the commit.
|
|
56
|
+
```bash
|
|
57
|
+
# The note content from the previous step is passed via the -m flag.
|
|
58
|
+
git notes add -m "<note content>" <commit_hash>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
10. **Get and Record Task Commit SHA:**
|
|
62
|
+
- **Step 10.1: Update Plan:** Read `plan.md`, find the line for the completed task, update its status from `[~]` to `[x]`, and append the first 7 characters of the *just-completed commit's* commit hash.
|
|
63
|
+
- **Step 10.2: Write Plan:** Write the updated content back to `plan.md`.
|
|
64
|
+
|
|
65
|
+
11. **Commit Plan Update:**
|
|
66
|
+
- **Action:** Stage the modified `plan.md` file.
|
|
67
|
+
- **Action:** Commit this change with a descriptive message (e.g., `conductor(plan): Mark task 'Create user model' as complete`).
|
|
68
|
+
|
|
69
|
+
### Phase Completion Verification and Checkpointing Protocol
|
|
70
|
+
|
|
71
|
+
**Trigger:** This protocol is executed immediately after a task is completed that also concludes a phase in `plan.md`.
|
|
72
|
+
|
|
73
|
+
1. **Announce Protocol Start:** Inform the user that the phase is complete and the verification and checkpointing protocol has begun.
|
|
74
|
+
|
|
75
|
+
2. **Ensure Test Coverage for Phase Changes:**
|
|
76
|
+
- **Step 2.1: Determine Phase Scope:** To identify the files changed in this phase, you must first find the starting point. Read `plan.md` to find the Git commit SHA of the *previous* phase's checkpoint. If no previous checkpoint exists, the scope is all changes since the first commit.
|
|
77
|
+
- **Step 2.2: List Changed Files:** Execute `git diff --name-only <previous_checkpoint_sha> HEAD` to get a precise list of all files modified during this phase.
|
|
78
|
+
- **Step 2.3: Verify and Create Tests:** For each file in the list:
|
|
79
|
+
- **CRITICAL:** First, check its extension. Exclude non-code files (e.g., `.json`, `.md`, `.yaml`).
|
|
80
|
+
- For each remaining code file, verify a corresponding test file exists.
|
|
81
|
+
- If a test file is missing, you **must** create one. Before writing the test, **first, analyze other test files in the repository to determine the correct naming convention and testing style.** The new tests **must** validate the functionality described in this phase's tasks (`plan.md`).
|
|
82
|
+
|
|
83
|
+
3. **Execute Automated Tests with Proactive Debugging:**
|
|
84
|
+
- Before execution, you **must** announce the exact shell command you will use to run the tests.
|
|
85
|
+
- **Example Announcement:** "I will now run the automated test suite to verify the phase. **Command:** `CI=true npm test`"
|
|
86
|
+
- Execute the announced command.
|
|
87
|
+
- If tests fail, you **must** inform the user and begin debugging. You may attempt to propose a fix a **maximum of two times**. If the tests still fail after your second proposed fix, you **must stop**, report the persistent failure, and ask the user for guidance.
|
|
88
|
+
|
|
89
|
+
4. **Propose a Detailed, Actionable Manual Verification Plan:**
|
|
90
|
+
- **CRITICAL:** To generate the plan, first analyze `product.md`, `product-guidelines.md`, and `plan.md` to determine the user-facing goals of the completed phase.
|
|
91
|
+
- You **must** generate a step-by-step plan that walks the user through the verification process, including any necessary commands and specific, expected outcomes.
|
|
92
|
+
- The plan you present to the user **must** follow this format:
|
|
93
|
+
|
|
94
|
+
**For a Frontend Change:**
|
|
95
|
+
```
|
|
96
|
+
The automated tests have passed. For manual verification, please follow these steps:
|
|
97
|
+
|
|
98
|
+
**Manual Verification Steps:**
|
|
99
|
+
1. **Start the development server with the command:** `npm run dev`
|
|
100
|
+
2. **Open your browser to:** `http://localhost:3000`
|
|
101
|
+
3. **Confirm that you see:** The new user profile page, with the user's name and email displayed correctly.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**For a Backend Change:**
|
|
105
|
+
```
|
|
106
|
+
The automated tests have passed. For manual verification, please follow these steps:
|
|
107
|
+
|
|
108
|
+
**Manual Verification Steps:**
|
|
109
|
+
1. **Ensure the server is running.**
|
|
110
|
+
2. **Execute the following command in your terminal:** `curl -X POST http://localhost:8080/api/v1/users -d '{"name": "test"}'`
|
|
111
|
+
3. **Confirm that you receive:** A JSON response with a status of `201 Created`.
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
5. **Await Explicit User Feedback:**
|
|
115
|
+
- After presenting the detailed plan, ask the user for confirmation: "**Does this meet your expectations? Please confirm with yes or provide feedback on what needs to be changed.**"
|
|
116
|
+
- **PAUSE** and await the user's response. Do not proceed without an explicit yes or confirmation.
|
|
117
|
+
|
|
118
|
+
6. **Create Checkpoint Commit:**
|
|
119
|
+
- Stage all changes. If no changes occurred in this step, proceed with an empty commit.
|
|
120
|
+
- Perform the commit with a clear and concise message (e.g., `conductor(checkpoint): Checkpoint end of Phase X`).
|
|
121
|
+
|
|
122
|
+
7. **Attach Auditable Verification Report using Git Notes:**
|
|
123
|
+
- **Step 7.1: Draft Note Content:** Create a detailed verification report including the automated test command, the manual verification steps, and the user's confirmation.
|
|
124
|
+
- **Step 7.2: Attach Note:** Use the `git notes` command and the full commit hash from the previous step to attach the full report to the checkpoint commit.
|
|
125
|
+
|
|
126
|
+
8. **Get and Record Phase Checkpoint SHA:**
|
|
127
|
+
- **Step 8.1: Get Commit Hash:** Obtain the hash of the *just-created checkpoint commit* (`git log -1 --format="%H"`).
|
|
128
|
+
- **Step 8.2: Update Plan:** Read `plan.md`, find the heading for the completed phase, and append the first 7 characters of the commit hash in the format `[checkpoint: <sha>]`.
|
|
129
|
+
- **Step 8.3: Write Plan:** Write the updated content back to `plan.md`.
|
|
130
|
+
|
|
131
|
+
9. **Commit Plan Update:**
|
|
132
|
+
- **Action:** Stage the modified `plan.md` file.
|
|
133
|
+
- **Action:** Commit this change with a descriptive message following the format `conductor(plan): Mark phase '<PHASE NAME>' as complete`.
|
|
134
|
+
|
|
135
|
+
10. **Announce Completion:** Inform the user that the phase is complete and the checkpoint has been created, with the detailed verification report attached as a git note.
|
|
136
|
+
|
|
137
|
+
### Quality Gates
|
|
138
|
+
|
|
139
|
+
Before marking any task complete, verify:
|
|
140
|
+
|
|
141
|
+
- [ ] All tests pass
|
|
142
|
+
- [ ] Code coverage meets requirements (>80%)
|
|
143
|
+
- [ ] Code follows project's code style guidelines (as defined in `code_styleguides/`)
|
|
144
|
+
- [ ] All public functions/methods are documented (e.g., docstrings, JSDoc, GoDoc)
|
|
145
|
+
- [ ] Type safety is enforced (e.g., type hints, TypeScript types, Go types)
|
|
146
|
+
- [ ] No linting or static analysis errors (using the project's configured tools)
|
|
147
|
+
- [ ] Works correctly on mobile (if applicable)
|
|
148
|
+
- [ ] Documentation updated if needed
|
|
149
|
+
- [ ] No security vulnerabilities introduced
|
|
150
|
+
|
|
151
|
+
## Development Commands
|
|
152
|
+
|
|
153
|
+
**AI AGENT INSTRUCTION: This section should be adapted to the project's specific language, framework, and build tools.**
|
|
154
|
+
|
|
155
|
+
### Setup
|
|
156
|
+
```bash
|
|
157
|
+
# Example: Commands to set up the development environment (e.g., install dependencies, configure database)
|
|
158
|
+
# e.g., for a Node.js project: npm install
|
|
159
|
+
# e.g., for a Go project: go mod tidy
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Daily Development
|
|
163
|
+
```bash
|
|
164
|
+
# Example: Commands for common daily tasks (e.g., start dev server, run tests, lint, format)
|
|
165
|
+
# e.g., for a Node.js project: npm run dev, npm test, npm run lint
|
|
166
|
+
# e.g., for a Go project: go run main.go, go test ./..., go fmt ./...
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Before Committing
|
|
170
|
+
```bash
|
|
171
|
+
# Example: Commands to run all pre-commit checks (e.g., format, lint, type check, run tests)
|
|
172
|
+
# e.g., for a Node.js project: npm run check
|
|
173
|
+
# e.g., for a Go project: make check (if a Makefile exists)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Testing Requirements
|
|
177
|
+
|
|
178
|
+
### Unit Testing
|
|
179
|
+
- Every module must have corresponding tests.
|
|
180
|
+
- Use appropriate test setup/teardown mechanisms (e.g., fixtures, beforeEach/afterEach).
|
|
181
|
+
- Mock external dependencies.
|
|
182
|
+
- Test both success and failure cases.
|
|
183
|
+
|
|
184
|
+
### Integration Testing
|
|
185
|
+
- Test complete user flows
|
|
186
|
+
- Verify database transactions
|
|
187
|
+
- Test authentication and authorization
|
|
188
|
+
- Check form submissions
|
|
189
|
+
|
|
190
|
+
### Mobile Testing
|
|
191
|
+
- Test on actual iPhone when possible
|
|
192
|
+
- Use Safari developer tools
|
|
193
|
+
- Test touch interactions
|
|
194
|
+
- Verify responsive layouts
|
|
195
|
+
- Check performance on 3G/4G
|
|
196
|
+
|
|
197
|
+
## Code Review Process
|
|
198
|
+
|
|
199
|
+
### Self-Review Checklist
|
|
200
|
+
Before requesting review:
|
|
201
|
+
|
|
202
|
+
1. **Functionality**
|
|
203
|
+
- Feature works as specified
|
|
204
|
+
- Edge cases handled
|
|
205
|
+
- Error messages are user-friendly
|
|
206
|
+
|
|
207
|
+
2. **Code Quality**
|
|
208
|
+
- Follows style guide
|
|
209
|
+
- DRY principle applied
|
|
210
|
+
- Clear variable/function names
|
|
211
|
+
- Appropriate comments
|
|
212
|
+
|
|
213
|
+
3. **Testing**
|
|
214
|
+
- Unit tests comprehensive
|
|
215
|
+
- Integration tests pass
|
|
216
|
+
- Coverage adequate (>80%)
|
|
217
|
+
|
|
218
|
+
4. **Security**
|
|
219
|
+
- No hardcoded secrets
|
|
220
|
+
- Input validation present
|
|
221
|
+
- SQL injection prevented
|
|
222
|
+
- XSS protection in place
|
|
223
|
+
|
|
224
|
+
5. **Performance**
|
|
225
|
+
- Database queries optimized
|
|
226
|
+
- Images optimized
|
|
227
|
+
- Caching implemented where needed
|
|
228
|
+
|
|
229
|
+
6. **Mobile Experience**
|
|
230
|
+
- Touch targets adequate (44x44px)
|
|
231
|
+
- Text readable without zooming
|
|
232
|
+
- Performance acceptable on mobile
|
|
233
|
+
- Interactions feel native
|
|
234
|
+
|
|
235
|
+
## Commit Guidelines
|
|
236
|
+
|
|
237
|
+
### Message Format
|
|
238
|
+
```
|
|
239
|
+
<type>(<scope>): <description>
|
|
240
|
+
|
|
241
|
+
[optional body]
|
|
242
|
+
|
|
243
|
+
[optional footer]
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Types
|
|
247
|
+
- `feat`: New feature
|
|
248
|
+
- `fix`: Bug fix
|
|
249
|
+
- `docs`: Documentation only
|
|
250
|
+
- `style`: Formatting, missing semicolons, etc.
|
|
251
|
+
- `refactor`: Code change that neither fixes a bug nor adds a feature
|
|
252
|
+
- `test`: Adding missing tests
|
|
253
|
+
- `chore`: Maintenance tasks
|
|
254
|
+
|
|
255
|
+
### Examples
|
|
256
|
+
```bash
|
|
257
|
+
git commit -m "feat(auth): Add remember me functionality"
|
|
258
|
+
git commit -m "fix(posts): Correct excerpt generation for short posts"
|
|
259
|
+
git commit -m "test(comments): Add tests for emoji reaction limits"
|
|
260
|
+
git commit -m "style(mobile): Improve button touch targets"
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Definition of Done
|
|
264
|
+
|
|
265
|
+
A task is complete when:
|
|
266
|
+
|
|
267
|
+
1. All code implemented to specification
|
|
268
|
+
2. Unit tests written and passing
|
|
269
|
+
3. Code coverage meets project requirements
|
|
270
|
+
4. Documentation complete (if applicable)
|
|
271
|
+
5. Code passes all configured linting and static analysis checks
|
|
272
|
+
6. Works beautifully on mobile (if applicable)
|
|
273
|
+
7. Implementation notes added to `plan.md`
|
|
274
|
+
8. Changes committed with proper message
|
|
275
|
+
9. Git note with task summary attached to the commit
|
|
276
|
+
|
|
277
|
+
## Emergency Procedures
|
|
278
|
+
|
|
279
|
+
### Critical Bug in Production
|
|
280
|
+
1. Create hotfix branch from main
|
|
281
|
+
2. Write failing test for bug
|
|
282
|
+
3. Implement minimal fix
|
|
283
|
+
4. Test thoroughly including mobile
|
|
284
|
+
5. Deploy immediately
|
|
285
|
+
6. Document in plan.md
|
|
286
|
+
|
|
287
|
+
### Data Loss
|
|
288
|
+
1. Stop all write operations
|
|
289
|
+
2. Restore from latest backup
|
|
290
|
+
3. Verify data integrity
|
|
291
|
+
4. Document incident
|
|
292
|
+
5. Update backup procedures
|
|
293
|
+
|
|
294
|
+
### Security Breach
|
|
295
|
+
1. Rotate all secrets immediately
|
|
296
|
+
2. Review access logs
|
|
297
|
+
3. Patch vulnerability
|
|
298
|
+
4. Notify affected users (if any)
|
|
299
|
+
5. Document and update security procedures
|
|
300
|
+
|
|
301
|
+
## Deployment Workflow
|
|
302
|
+
|
|
303
|
+
### Pre-Deployment Checklist
|
|
304
|
+
- [ ] All tests passing
|
|
305
|
+
- [ ] Coverage >80%
|
|
306
|
+
- [ ] No linting errors
|
|
307
|
+
- [ ] Mobile testing complete
|
|
308
|
+
- [ ] Environment variables configured
|
|
309
|
+
- [ ] Database migrations ready
|
|
310
|
+
- [ ] Backup created
|
|
311
|
+
|
|
312
|
+
### Deployment Steps
|
|
313
|
+
1. Merge feature branch to main
|
|
314
|
+
2. Tag release with version
|
|
315
|
+
3. Push to deployment service
|
|
316
|
+
4. Run database migrations
|
|
317
|
+
5. Verify deployment
|
|
318
|
+
6. Test critical paths
|
|
319
|
+
7. Monitor for errors
|
|
320
|
+
|
|
321
|
+
### Post-Deployment
|
|
322
|
+
1. Monitor analytics
|
|
323
|
+
2. Check error logs
|
|
324
|
+
3. Gather user feedback
|
|
325
|
+
4. Plan next iteration
|
|
326
|
+
|
|
327
|
+
## Continuous Improvement
|
|
328
|
+
|
|
329
|
+
- Review workflow weekly
|
|
330
|
+
- Update based on pain points
|
|
331
|
+
- Document lessons learned
|
|
332
|
+
- Optimize for user happiness
|
|
333
|
+
- Keep things simple and maintainable
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import jt from"yargs";import{hideBin as Ot}from"yargs/helpers";import le from"@inquirer/select";var E={agentType:"opencode",agentDir:".opencode",commandsDir:"commands",displayName:"OpenCode",protocolFilename:"AGENTS.md",description:"The open source AI coding agent"};var N={agentType:"claude-code",agentDir:".claude",commandsDir:"commands",displayName:"Claude Code",protocolFilename:"CLAUDE.md",description:"Anthropic's coding assistant"};var D={agentType:"antigravity",agentDir:".agent",commandsDir:"workflows",displayName:"Antigravity",protocolFilename:"GEMINI.md",description:"Google's agentic coding assistant"};var F={agentType:"cursor",agentDir:".cursor",commandsDir:"commands",displayName:"Cursor",protocolFilename:"AGENTS.md",description:"Cursor IDE's AI agent"};import{parse as ct}from"smol-toml";import{readFile as rt}from"fs/promises";import{join as $e,resolve as Se}from"path";import{fileURLToPath as nt}from"url";import{homedir as it}from"os";import{execSync as ve}from"child_process";import{createHash as st}from"crypto";import $ from"fs-extra";var Ie=nt(new URL(".",import.meta.url)),P="https://github.com/gemini-cli-extensions/conductor",j="main";function Ge(o=P,e=j){let t=st("md5").update(`${o}#${e}`).digest("hex");return $e(it(),".gemini/cache/conductor",t)}async function at(o=P,e=j){let t=Ge(o,e);if($.existsSync(t))try{console.log(`Updating templates from ${o} [${e}]...`),ve("git pull --rebase",{cwd:t,stdio:["ignore","ignore","pipe"]})}catch(r){console.warn(`Failed to update templates (using cached version): ${r instanceof Error?r.message:String(r)}`)}else{await $.ensureDir(t),console.log(`Downloading templates from ${o} [${e}]...`);try{ve(`git clone ${o} --branch ${e} --depth 1 .`,{cwd:t,stdio:["ignore","ignore","pipe"]})}catch(r){throw await $.remove(t),new Error(`Failed to clone templates: ${r instanceof Error?r.message:String(r)}`)}}}function f(o,e){return o.replace(/\{(\w+)\}/g,(t,r)=>Object.prototype.hasOwnProperty.call(e,r)?e[r]:t)}function pt(){let o=Se(Ie,"conductor");return $.existsSync(o)?o:Se(Ie,"../conductor")}async function Te(o,e){if(!o){let t=pt();if(await $.pathExists(t))return console.log("use bundled Conductor templates"),t}return await at(o,e),Ge(o,e)}async function Ee(o,e){let t=$e(e,o);return rt(t,"utf-8")}var ne=class{process(e,t){let{installPath:r,agentType:n,fixedAgent:p}=t,a=ct(e);if(!a.prompt)return null;let c=a.prompt;c=c.replace(/__\$\$CODE_AGENT_INSTALL_PATH\$\$__/g,r);let g=f(c,{agent_type:n});return`---
|
|
3
|
+
description: ${a.description||""}
|
|
4
|
+
agent: ${p}
|
|
5
|
+
---
|
|
6
|
+
${g}`}},Ne=new ne;var O={agentType:"vscode-copilot",agentDir:".github",commandsDir:"prompts",displayName:"VS Code Copilot",protocolFilename:"AGENTS.md",description:"VS Code Copilot's Prompt Files",extension:".prompt.md",fixedAgent:"agent",strategy:{content:Ne}};var b={agentType:"codex",agentDir:".codex",commandsDir:"prompts",displayName:"Codex",protocolFilename:"AGENTS.md",description:"OpenAI Codex Agent",extension:".md"};var R={agentType:"windsurf",agentDir:".windsurf",commandsDir:"workflows",displayName:"Windsurf",protocolFilename:"AGENTS.md",description:"Windsurf Cascade AI Agent"};import{parse as gt}from"smol-toml";var ie=class{process(e,t){let{installPath:r,agentType:n,commandName:p}=t,a=gt(e);if(!a.prompt)return null;let c=a.prompt;c=c.replace(/__\$\$CODE_AGENT_INSTALL_PATH\$\$__/g,r);let g=f(c,{agent_type:n});return`# Conductor ${p?p.charAt(0).toUpperCase()+p.slice(1):"Command"}${a.description?`
|
|
7
|
+
|
|
8
|
+
`+a.description+`
|
|
9
|
+
|
|
10
|
+
`:`
|
|
11
|
+
|
|
12
|
+
`}${g}`}},De=new ie;var L={agentType:"cline",agentDir:".clinerules",commandsDir:"workflows",displayName:"Cline",protocolFilename:"AGENTS.md",description:"Cline AI coding assistant",strategy:{content:De}};import{join as mt}from"path";import lt from"fs-extra";import{parse as dt}from"smol-toml";var{writeFile:ft}=lt,se=class{process(e,t){let{installPath:r,agentType:n}=t;if(!dt(e).prompt)return null;let a=e.replace(/__\$\$CODE_AGENT_INSTALL_PATH\$\$__/g,r);return f(a,{agent_type:n})}},ae=class{async write(e){let{targetDir:t,agentDir:r,commandsDir:n,commandName:p,extension:a,content:c}=e,g=`${p}${a}`;await ft(mt(t,r,n,g),c)}},Fe=new se,Pe=new ae;var k={agentType:"gemini",agentDir:".gemini",commandsDir:"commands/conductor",displayName:"Gemini CLI",protocolFilename:"GEMINI.md",description:"Google Gemini CLI agent",extension:".toml",usesPrefix:!1,strategy:{content:Fe,file:Pe}};import{parse as ut}from"smol-toml";var pe=class{process(e,t){let{installPath:r,agentType:n,commandName:p}=t,a=ut(e);if(!a.prompt)return null;let c=a.prompt;c=c.replace(/__\$\$CODE_AGENT_INSTALL_PATH\$\$__/g,r);let g=f(c,{agent_type:n});return`# Conductor ${p?p.charAt(0).toUpperCase()+p.slice(1):"Command"}${a.description?`
|
|
13
|
+
|
|
14
|
+
`+a.description+`
|
|
15
|
+
|
|
16
|
+
`:`
|
|
17
|
+
|
|
18
|
+
`}${g}`}},je=new pe;var U={agentType:"kilo-code",agentDir:".kilocode",commandsDir:"workflows",displayName:"Kilo Code",protocolFilename:"AGENTS.md",description:"Kilo Code AI coding assistant",strategy:{content:je}};import{parse as yt}from"smol-toml";var ce=class{process(e,t){let{installPath:r,agentType:n,commandName:p}=t,a=yt(e);if(!a.prompt)return null;let c=a.prompt;c=c.replace("__$$CODE_AGENT_INSTALL_PATH$$__",r);let g=f(c,{agent_type:n});return`# Conductor ${p?p.charAt(0).toUpperCase()+p.slice(1):"Command"}${a.description?`
|
|
19
|
+
|
|
20
|
+
`+a.description+`
|
|
21
|
+
|
|
22
|
+
`:`
|
|
23
|
+
|
|
24
|
+
`}${g}`}},Oe=new ce;var H={agentType:"roo-code",agentDir:".roo",commandsDir:"commands",displayName:"Roo Code",protocolFilename:"AGENTS.md",description:"Roo Code AI coding assistant",strategy:{content:Oe}};import{parse as xt}from"smol-toml";var ge=class{process(e,t){let{installPath:r,agentType:n}=t,p=xt(e);if(!p.prompt)return null;let a=p.prompt;a=a.replace("__$$CODE_AGENT_INSTALL_PATH$$__",r);let c=f(a,{agent_type:n}),g="";return p.description&&(g=`---
|
|
25
|
+
description: "${p.description.replace(/"/g,'\\"')}"
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
`),`${g}${c}`}},be=new ge;var M={agentType:"qwen-code",agentDir:".qwen",commandsDir:"commands",displayName:"Qwen Code",protocolFilename:"AGENTS.md",description:"Qwen Code AI coding assistant",strategy:{content:be}};import{parse as Ct}from"smol-toml";var me=class{process(e,t){let{installPath:r,agentType:n}=t,p=Ct(e);if(!p.prompt)return null;let a=p.prompt;a=a.replace("__$$CODE_AGENT_INSTALL_PATH$$__",r);let c=f(a,{agent_type:n}),g="";return p.description&&(g=`---
|
|
29
|
+
description: "${p.description.replace(/"/g,'\\"')}"
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
`),`${g}${c}`}},Re=new me;var V={agentType:"factory-droid",agentDir:".factory",commandsDir:"commands",displayName:"Factory Droid",protocolFilename:"AGENTS.md",description:"Factory Droid AI coding assistant",strategy:{content:Re}};var S=[E,N,D,F,O,b,R,L,U,H,M,V,k];async function Le(o){let e=o==="codex",t=o==="cline";return await le({message:"Select installation method:",choices:e?[{name:"Global (User Home Directory)",value:"global"}]:[{name:"Project (Current Directory)",value:"project"}],default:e?"global":"project"})}async function ke(){let o=S.map(t=>{let{displayName:r,agentType:n,protocolFilename:p,agentDir:a,commandsDir:c,description:g}=t,d=g||`${r} agent`,y=`\x1B[90m(${p}, ${a}/${c})\x1B[0m`;return{name:`${r} ${y}`,value:n,description:d}});return await le({message:"Select your coding agent:",choices:o,default:"opencode",loop:!0})}async function Ue(){return await le({message:"Configure git ignore for Conductor files?",choices:[{name:"Add to .gitignore",value:"gitignore",description:"Add Conductor entries to the project's .gitignore file"},{name:"Add to .git/info/exclude",value:"exclude",description:"Add Conductor entries to .git/info/exclude (local only, not shared)"},{name:"Remove existing entries",value:"none",description:"Remove Conductor entries from both .gitignore and .git/info/exclude"},{name:"Don't configure git ignore",value:void 0,description:"Skip git ignore configuration"}],default:void 0})}import{join as _t}from"path";import At from"fs-extra";import{parse as ht}from"smol-toml";var G="conductor-";var{writeFile:wt}=At,fe=class{process(e,t){let{installPath:r,agentType:n}=t,p=ht(e);if(!p.prompt)return null;let a=p.prompt;a=a.replace(/__\$\$CODE_AGENT_INSTALL_PATH\$\$__/g,r),a=a.replace(/\/conductor:/g,`/${G}`);let c=f(a,{agent_type:n});return p.description?`---
|
|
33
|
+
description: ${p.description}
|
|
34
|
+
---
|
|
35
|
+
${c}`:c}},de=class{async write(e){let{targetDir:t,agentDir:r,commandsDir:n,commandName:p,extension:a,content:c}=e,g=`${G}${p}${a}`;await wt(_t(t,r,n,g),c)}},He=new fe,Me=new de;import{join as u}from"path";import St from"@inquirer/select";import Be from"fs-extra";var{existsSync:w,ensureDir:Ve,copy:ue}=Be,A=class{constructor(e){this.config=e}async validate(e,t){if(!w(e))throw new Error(`Target directory does not exist: ${e}`);let{agentDir:r,commandsDir:n,displayName:p,extension:a,usesPrefix:c}=this.config,y=`${c!==!1?G:""}setup${a||".md"}`,x=u(e,r,n,y),C=u(e,r,"conductor");if(w(C)&&w(x))throw new Error(`Conductor (${p}) is already installed in: ${e}`);return e}async generate(e,t,r,n,p){let{agentDir:a,commandsDir:c,agentType:g}=this.config,d=u(e,a),y=u(d,c),x=u(a,"conductor");t==="global"&&(x=`~/${a}/conductor`),await Ve(y),await Ve(u(d,"conductor"));let C=await Te(r,n);try{let m=u(C,"templates"),_=u(d,"conductor","templates");await ue(m,_)}catch(m){console.warn("Failed to copy templates directory:",m)}let{protocolFilename:v}=this.config;if(v)try{let m=u(C,"GEMINI.md"),_=u(e,v);if(w(m)){let h=!0;w(_)&&!p&&(h=await St({message:`The protocol file '${v}' already exists. Do you want to overwrite it?`,choices:[{value:!0,name:"Overwrite"},{value:!1,name:"Skip"}]})),h&&await ue(m,_)}}catch(m){console.warn("Failed to handle protocol file:",m)}let I=[];try{let m=u(C,"commands/conductor");if(w(m)){let _=await Be.readdir(m);Array.isArray(_)&&(I=_.filter(h=>h.endsWith(".toml")).map(h=>h.replace(/\.toml$/,"")))}}catch(m){console.warn("Failed to discover commands:",m)}I.length===0?(console.log("No commands discovered, using default commands"),I=["setup","newTrack","implement","status","revert","review"]):console.log(`Discovered commands: ${I.join(", ")}`);let tt=this.config.extension||".md",ot=this.config.fixedAgent;for(let m of I)try{let _=await Ee(u("commands","conductor",`${m}.toml`),C),he=(this.config.strategy?.content||He).process(_,{installPath:x,agentType:g,fixedAgent:ot,commandName:m});he&&await(this.config.strategy?.file||Me).write({targetDir:e,agentDir:a,commandsDir:c,commandName:m,extension:tt,content:he})}catch(_){console.warn(`Failed to process ${m}:`,_)}let Ae=u(C,"templates/workflow.md"),we=u(e,"conductor/workflow.md");if(w(we)&&w(Ae))try{await ue(Ae,we),console.log("\u2714 conductor/workflow.md synced")}catch(m){console.warn("Failed to handle workflow file:",m)}else console.warn("Workflow template not found, skipping workflow file sync")}};function l(o){return new A(o)}var B=class{generator=l(E);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var q=class{generator=l(N);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var z=class{generator=l(D);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var W=class{generator=l(F);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var X=class{generator=l(O);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};import{homedir as qe}from"os";var K=class{generator=l(b);validate(e,t){return t==="global"&&(e=qe()),this.generator.validate(e,t)}generate(e,t,r,n){return t==="global"&&(e=qe()),this.generator.generate(e,t,r,n)}};var Q=class{generator=l(R);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var Y=class{generator=l(L);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var J=class{generator=l(k);async validate(e,t){if(t==="global")throw new Error("Gemini CLI agent only supports project-level installation");return this.generator.validate(e,t)}async generate(e,t,r,n){if(t==="global")throw new Error("Gemini CLI agent only supports project-level installation");return this.generator.generate(e,t,r,n)}};var Z=class{generator=l(U);validate(e,t){return this.generator.validate(e,t)}generate(e,t,r,n){return this.generator.generate(e,t,r,n)}};var ee=class extends A{constructor(){super(H)}};var te=class extends A{constructor(){super(M)}};var oe=class extends A{constructor(){super(V)}};function ze(o){switch(o){case"claude-code":return new q;case"antigravity":return new z;case"cursor":return new W;case"vscode-copilot":return new X;case"codex":return new K;case"windsurf":return new Q;case"cline":return new Y;case"kilo-code":return new Z;case"roo-code":return new ee;case"qwen-code":return new te;case"factory-droid":return new oe;case"gemini":return new J;default:return new B}}import{resolve as Nt}from"path";import Dt from"@inquirer/select";import{join as ye}from"path";import{readFile as xe,writeFile as We,access as vt,mkdir as It}from"fs/promises";import{constants as $t}from"fs";var Xe="# Conductor";function Ke(o){let e=S.find(r=>r.agentType===o);if(!e)return[];let t=[];return e.agentDir&&t.push(e.agentDir),e.protocolFilename&&t.push(e.protocolFilename),t}function T(o){return o.replace(/\/+$/,"")}async function Ce(o){try{return await vt(o,$t.F_OK),!0}catch{return!1}}async function Gt(o,e){let t=[],r=[];if(!await Ce(o))return{existing:[],missing:[...e]};let p=(await xe(o,"utf-8")).split(`
|
|
36
|
+
`).map(a=>T(a.trim()));for(let a of e){let c=T(a);p.includes(c)?t.push(a):r.push(a)}return{existing:t,missing:r}}async function Qe(o,e){let{existing:t,missing:r}=await Gt(o,e);if(r.length===0)return{added:[],skipped:t};let n="";await Ce(o)&&(n=await xe(o,"utf-8")),n.length>0&&!n.endsWith(`
|
|
37
|
+
`)&&(n+=`
|
|
38
|
+
`),n+=`
|
|
39
|
+
${Xe}
|
|
40
|
+
`;for(let a of r)n+=`${a}
|
|
41
|
+
`;let p=ye(o,"..");return await It(p,{recursive:!0}),await We(o,n,"utf-8"),{added:r,skipped:t}}async function _e(o,e){if(!await Ce(o))return{removed:[]};let r=(await xe(o,"utf-8")).split(`
|
|
42
|
+
`),n=e.map(T),p=[],a=[];for(let y of r){let x=T(y.trim());if(x!==Xe){if(n.includes(x)){let C=e.find(v=>T(v)===x);C&&!p.includes(C)&&p.push(C);continue}a.push(y)}}let c=[],g=!1;for(let y of a){let x=y.trim()==="";x&&g||(c.push(y),g=x)}for(;c.length>0&&c[c.length-1].trim()==="";)c.pop();let d=c.length>0?c.join(`
|
|
43
|
+
`)+`
|
|
44
|
+
`:"";return await We(o,d,"utf-8"),{removed:p}}function re(o,e){return e==="gitignore"?ye(o,".gitignore"):ye(o,".git","info","exclude")}async function Ye(o,e,t){let r=Ke(t);return r.length===0?{action:"none",entries:[],message:`No git ignore entries found for agent ${t}`}:e==="none"?await Et(o,r):await Tt(o,e,r)}async function Tt(o,e,t){let r=re(o,e),n=await Qe(r,t);if(n.added.length===0)return{action:"skipped",entries:n.skipped,message:"Git ignore entries already present, skipping.",targetFiles:[r]};let p=e==="gitignore"?".gitignore":".git/info/exclude";return{action:"added",entries:n.added,message:`Added ${n.added.length} entries to ${p}: ${n.added.join(", ")}`,targetFiles:[r]}}async function Et(o,e){let t=re(o,"gitignore"),r=re(o,"exclude"),n=await _e(t,e),p=await _e(r,e),a=[...new Set([...n.removed,...p.removed])];if(a.length===0)return{action:"none",entries:[],message:"No Conductor git ignore entries found."};let c=[],g=[];return n.removed.length>0&&(c.push(t),g.push(`.gitignore (${n.removed.length})`)),p.removed.length>0&&(c.push(r),g.push(`.git/info/exclude (${p.removed.length})`)),{action:"removed",entries:a,message:`Removed entries from: ${g.join(", ")}`,targetFiles:c}}async function Je(o){let e=Nt(process.cwd(),o.path),t=o.force??!1;try{console.log(`Initializing Conductor in: ${e}`);let r;o.agent?(r=o.agent,console.log(`Using provided agent: ${r}`)):(console.log("Step 1: Prompting for agent selection..."),r=await ke(),console.log(`\u2714 Selected agent: ${r}`));let n;o.scope?(n=o.scope,console.log(`Using provided scope: ${n}`)):n=await Le(r),console.log(`\u2714 Selected scope: ${n}`);let p=o.gitIgnore;o.gitIgnore&&n==="global"?(console.warn("\u26A0 --git-ignore flag is only supported for project scope. Skipping git ignore configuration."),p=void 0):!o.gitIgnore&&n==="project"&&(p=await Ue());let a=ze(r);console.log(`
|
|
45
|
+
Step 3: Validating project directory...`);let c;try{c=await a.validate(e,n)}catch(g){if(g instanceof Error&&g.message.includes("already installed"))if(t)console.log("\u26A0 Force mode: Overwriting existing installation"),c=e;else if(await Dt({message:`${g.message}
|
|
46
|
+
Do you want to overwrite the existing installation?`,choices:[{value:!0,name:"Yes, overwrite"},{value:!1,name:"No, cancel"}]}))console.log("Overwriting existing installation..."),c=e;else{console.log("Installation cancelled.");return}else throw g}if(console.log(`\u2714 Validation complete: ${c}`),console.log(`
|
|
47
|
+
Step 4: Generating files...`),await a.generate(c,n,o.repo,o.branch,t),console.log("\u2714 Files generated"),p){console.log(`
|
|
48
|
+
Step 5: Configuring git ignore...`);let g=await Ye(c,p,r);console.log(`\u2714 ${g.message}`)}console.log(`
|
|
49
|
+
\u2714 Conductor initialized successfully!`)}catch(r){console.error(`
|
|
50
|
+
\u2718 Installation failed:`,r instanceof Error?r.message:r),process.exit(1)}}import Ft from"gradient-string";var Pt=`
|
|
51
|
+
__________ _ ______ __ __________________ ____ _____ ____________
|
|
52
|
+
/ ____/ __ \\/ | / / __ \\/ / / / ____/_ __/ __ \\/ __ \\ / _/ | / / _/_ __/
|
|
53
|
+
/ / / / / / |/ / / / / / / / / / / / / / / /_/ / / // |/ // / / /
|
|
54
|
+
/ /___/ /_/ / /| / /_/ / /_/ / /___ / / / /_/ / _, _/ _/ // /| // / / /
|
|
55
|
+
\\____/\\____/_/ |_/_____/\\____/\\____/ /_/ \\____/_/ |_| /___/_/ |_/___/ /_/
|
|
56
|
+
|
|
57
|
+
`;function Ze(){console.log(Ft("cyan","green")(Pt))}async function et(){!process.env.CONDUCTOR_NO_BANNER&&!process.argv.includes("completion")&&!process.argv.includes("--get-yargs-completions")&&Ze();let o=await jt(Ot(process.argv)).scriptName("conductor-init").usage("$0 [path] [options]").positional("path",{describe:"Directory to install Conductor",default:".",type:"string"}).option("agent",{alias:"a",describe:"Specify the coding agent",type:"string",choices:S.map(t=>t.agentType)}).option("repo",{alias:"r",describe:"Git repository URL for conductor. If used without value, defaults to official repository.",type:"string"}).coerce("repo",t=>t===""?P:t).option("branch",{alias:"b",describe:"Branch name for conductor repository",type:"string",default:j}).option("scope",{alias:"s",describe:"Installation scope (project or global)",type:"string",choices:["project","global"]}).option("git-ignore",{alias:"g",describe:"Configure git ignore for Conductor files (gitignore: add to .gitignore, exclude: add to .git/info/exclude, none: remove entries)",type:"string",choices:["gitignore","exclude","none"]}).coerce("git-ignore",t=>t===""?"exclude":t).option("force",{alias:"f",describe:"Force overwrite existing installation",type:"boolean",default:!1}).example("$0","Install with interactive prompts").example("$0 --agent claude-code","Install for Claude Code agent").example("$0 --git-ignore gitignore","Add Conductor files to .gitignore").example("$0 --git-ignore exclude","Add Conductor files to .git/info/exclude").example("$0 --git-ignore none","Remove Conductor entries from git ignore").help().alias("h","help").version().alias("v","version").completion("completion",!1).parseAsync(),e=o._[0];process.argv.includes("completion")||process.argv.includes("--get-yargs-completions")||await Je({...o,path:e||o.path||".",gitIgnore:o["git-ignore"],$0:"conductor-init",_:o._})}et().catch(o=>{console.error("Error:",o instanceof Error?o.message:o),process.exit(1)});
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "conductor-init",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Conductor Scaffolding CLI - Generate spec-driven, portable Gemini Conductor workflows for any coding agent",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"conductor",
|
|
8
|
+
"gemini-conductor",
|
|
9
|
+
"gemini",
|
|
10
|
+
"context-driven-development",
|
|
11
|
+
"spec-driven-development",
|
|
12
|
+
"slash-commands",
|
|
13
|
+
"workflows",
|
|
14
|
+
"opencode",
|
|
15
|
+
"claude-code",
|
|
16
|
+
"codex",
|
|
17
|
+
"antigravity",
|
|
18
|
+
"cursor",
|
|
19
|
+
"copilot",
|
|
20
|
+
"windsurf",
|
|
21
|
+
"cline",
|
|
22
|
+
"roo-code",
|
|
23
|
+
"kilo-code",
|
|
24
|
+
"qwen-code",
|
|
25
|
+
"gemini-cli-extensions",
|
|
26
|
+
"coding-agent",
|
|
27
|
+
"sdd",
|
|
28
|
+
"cdd"
|
|
29
|
+
],
|
|
30
|
+
"author": {
|
|
31
|
+
"name": "Jonkimi",
|
|
32
|
+
"url": "https://blog.jonkimi.com"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/Jonkimi/create-conductor-flow.git"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/Jonkimi/create-conductor-flow",
|
|
39
|
+
"packageManager": "pnpm@10.24.0",
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"type": "module",
|
|
47
|
+
"bin": {
|
|
48
|
+
"conductor-init": "dist/index.js"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist",
|
|
52
|
+
"README.md",
|
|
53
|
+
"LICENSE"
|
|
54
|
+
],
|
|
55
|
+
"scripts": {
|
|
56
|
+
"clean": "tsx scripts/clean.ts",
|
|
57
|
+
"test": "vitest run",
|
|
58
|
+
"test:watch": "vitest",
|
|
59
|
+
"coverage": "vitest run --coverage",
|
|
60
|
+
"prebuild": "tsx scripts/bundle-conductor.ts",
|
|
61
|
+
"update-readme": "tsx scripts/update-readme.ts",
|
|
62
|
+
"build": "tsup",
|
|
63
|
+
"start": "node dist/index.js",
|
|
64
|
+
"release": "tsx scripts/double-publish.ts"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@types/fs-extra": "^11.0.4",
|
|
68
|
+
"@types/gradient-string": "^1.1.6",
|
|
69
|
+
"@types/node": "^25.1.0",
|
|
70
|
+
"@types/yargs": "^17.0.35",
|
|
71
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
72
|
+
"release-it": "^19.2.4",
|
|
73
|
+
"tsup": "^8.5.1",
|
|
74
|
+
"tsx": "^4.21.0",
|
|
75
|
+
"typescript": "^5.9.3",
|
|
76
|
+
"vitest": "^4.0.18"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@inquirer/select": "^5.0.4",
|
|
80
|
+
"fs-extra": "^11.3.3",
|
|
81
|
+
"gradient-string": "^3.0.0",
|
|
82
|
+
"smol-toml": "^1.6.0",
|
|
83
|
+
"yargs": "^18.0.0"
|
|
84
|
+
}
|
|
85
|
+
}
|