@dezkareid/osddt 1.0.0 → 1.2.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/AGENTS.md +238 -0
- package/README.md +4 -4
- package/dist/index.js +71 -21
- package/dist/templates/shared.d.ts +1 -1
- package/dist/utils/prompt.d.ts +2 -0
- package/package.json +8 -3
package/AGENTS.md
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Agent Instructions: Other Spec-Driven Development Tooling (OSDDT)
|
|
2
|
+
|
|
3
|
+
This project is a command line utility for spec-driven development. It is intended to be used in monorepos or single package repos.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
### Agents Support
|
|
8
|
+
Each agent has its own conventions for:
|
|
9
|
+
|
|
10
|
+
- **Command file formats** (Markdown, TOML, etc.)
|
|
11
|
+
- **Directory structures** (`.claude/commands/`, `.windsurf/workflows/`, etc.)
|
|
12
|
+
- **Command invocation patterns** (slash commands, CLI tools, etc.)
|
|
13
|
+
- **Argument passing conventions** (`$ARGUMENTS`, `{{args}}`, etc.)
|
|
14
|
+
|
|
15
|
+
| Agent | Directory | Format | CLI Tool | Description |
|
|
16
|
+
| -------------------------- | ---------------------- | -------- | --------------- | --------------------------- |
|
|
17
|
+
| **Claude Code** | `.claude/commands/` | Markdown | `claude` | Anthropic's Claude Code CLI |
|
|
18
|
+
| **Gemini CLI** | `.gemini/commands/` | TOML | `gemini` | Google's Gemini CLI |
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Command File Formats
|
|
22
|
+
|
|
23
|
+
#### Markdown Format
|
|
24
|
+
|
|
25
|
+
Used by: Claude, Cursor, opencode, Windsurf, Amazon Q Developer, Amp, SHAI, IBM Bob
|
|
26
|
+
|
|
27
|
+
**Standard format:**
|
|
28
|
+
|
|
29
|
+
```markdown
|
|
30
|
+
---
|
|
31
|
+
description: "Command description"
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
Command content with {SCRIPT} and $ARGUMENTS placeholders.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
#### TOML Format
|
|
38
|
+
|
|
39
|
+
Used by: Gemini
|
|
40
|
+
|
|
41
|
+
```toml
|
|
42
|
+
description = "Command description"
|
|
43
|
+
|
|
44
|
+
prompt = """
|
|
45
|
+
Command content with {SCRIPT} and {{args}} placeholders.
|
|
46
|
+
"""
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Directory Conventions
|
|
50
|
+
|
|
51
|
+
- **CLI agents**: Usually `.<agent-name>/commands/`
|
|
52
|
+
|
|
53
|
+
### Argument Patterns
|
|
54
|
+
|
|
55
|
+
Different agents use different argument placeholders:
|
|
56
|
+
|
|
57
|
+
- **Markdown/prompt-based**: `$ARGUMENTS`
|
|
58
|
+
- **TOML-based**: `{{args}}`
|
|
59
|
+
|
|
60
|
+
## Development
|
|
61
|
+
|
|
62
|
+
### Commit Rules
|
|
63
|
+
|
|
64
|
+
Always use Conventional Commits format for commit messages.
|
|
65
|
+
|
|
66
|
+
Never commit directly to `main` or `master`. If the current branch is one of them, propose creating a new branch before committing.
|
|
67
|
+
|
|
68
|
+
### Critical Dependency Versions
|
|
69
|
+
|
|
70
|
+
The following versions are established across the project's packages and should be respected when adding new dependencies or troubleshooting.
|
|
71
|
+
|
|
72
|
+
Always prefer use exact versions for dependencies. Do not use `^` or `~`.
|
|
73
|
+
|
|
74
|
+
#### Core Languages & Runtimes
|
|
75
|
+
- **TypeScript**: `5.9.3`
|
|
76
|
+
|
|
77
|
+
#### Build & Bundling Tools
|
|
78
|
+
- **Rollup**: `4.56.0`
|
|
79
|
+
|
|
80
|
+
#### Testing Frameworks
|
|
81
|
+
- **Vitest**: `4.0.18`
|
|
82
|
+
|
|
83
|
+
#### Linting & Formatting
|
|
84
|
+
- **ESLint**: `9.39.2`
|
|
85
|
+
- **Prettier**: `3.8.1`
|
|
86
|
+
|
|
87
|
+
#### Type Definitions
|
|
88
|
+
- **@types/node**: `25.0.10`
|
|
89
|
+
- **@types/fs-extra**: `11.0.4`
|
|
90
|
+
|
|
91
|
+
#### Key Libraries
|
|
92
|
+
- **Commander**: `12.0.0` (for CLI tools)
|
|
93
|
+
- **fs-extra**: `11.2.0`
|
|
94
|
+
- **globby**: `14.0.1`
|
|
95
|
+
|
|
96
|
+
### Project Structure & Conventions
|
|
97
|
+
- **Package Manager**: `pnpm` is the required package manager.
|
|
98
|
+
|
|
99
|
+
### Codebase Structure
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
osddt/
|
|
103
|
+
├── src/
|
|
104
|
+
│ ├── index.ts # CLI entry point — wires Commander program and registers all commands
|
|
105
|
+
│ ├── commands/
|
|
106
|
+
│ │ ├── setup.ts # `osddt setup` — prompts for agents & repo type, writes command files and .osddtrc
|
|
107
|
+
│ │ ├── meta-info.ts # `osddt meta-info` — outputs { branch, date } as JSON (consumed by generated templates)
|
|
108
|
+
│ │ └── done.ts # `osddt done <feature>` — moves working-on/<feature> → done/YYYY-MM-DD-<feature>
|
|
109
|
+
│ ├── templates/
|
|
110
|
+
│ │ ├── shared.ts # REPO_PREAMBLE, FEATURE_NAME_RULES, WORKING_DIR_STEP, and COMMAND_DEFINITIONS array
|
|
111
|
+
│ │ ├── claude.ts # Formats COMMAND_DEFINITIONS as Markdown (.claude/commands/osddt.<name>.md)
|
|
112
|
+
│ │ └── gemini.ts # Formats COMMAND_DEFINITIONS as TOML (.gemini/commands/osddt.<name>.toml)
|
|
113
|
+
│ └── utils/
|
|
114
|
+
│ └── prompt.ts # Inquirer prompts: askAgents() (checkbox) and askRepoType() (select)
|
|
115
|
+
├── dist/ # Compiled output (single ESM bundle, gitignored)
|
|
116
|
+
├── rollup.config.js # Bundles src/index.ts → dist/index.js (ESM, shebang injected)
|
|
117
|
+
├── tsconfig.json # TypeScript config
|
|
118
|
+
├── vitest.config.ts # Vitest config
|
|
119
|
+
├── package.json # Package name: @dezkareid/osddt, bin: osddt → dist/index.js
|
|
120
|
+
├── .osddtrc # Runtime config written by setup (repoType: "single" | "monorepo")
|
|
121
|
+
├── AGENTS.md / CLAUDE.md / GEMINI.md # Agent-specific instructions (kept in sync)
|
|
122
|
+
└── README.md # Public-facing documentation
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Key relationships
|
|
126
|
+
|
|
127
|
+
- **`shared.ts` is the single source of truth** for all command template content. Both `claude.ts` and `gemini.ts` import `COMMAND_DEFINITIONS` from it and only differ in file format (Markdown vs TOML) and argument placeholder (`$ARGUMENTS` vs `{{args}}`).
|
|
128
|
+
- **`setup.ts`** orchestrates the interactive setup: calls `askAgents()` → `askRepoType()` → writes selected agent files → writes `.osddtrc`.
|
|
129
|
+
- **`meta-info.ts`** is referenced inside the generated templates so agents can fetch live branch/date at invocation time (not baked in at build time).
|
|
130
|
+
- **Test files** (`.spec.ts`) live next to the source file they cover. Template tests are pure (no mocks); command tests mock `fs-extra` and `child_process`.
|
|
131
|
+
|
|
132
|
+
### CLI Commands
|
|
133
|
+
|
|
134
|
+
All commands available via `npx @dezkareid/osddt <command>`:
|
|
135
|
+
|
|
136
|
+
| Command | Description |
|
|
137
|
+
| ------------------------------ | ------------------------------------------------------------- |
|
|
138
|
+
| `@dezkareid/osddt setup` | Generate agent command files for Claude and Gemini |
|
|
139
|
+
| `@dezkareid/osddt meta-info` | Output current branch and date as JSON |
|
|
140
|
+
| `@dezkareid/osddt done <feature-name>` | Move `working-on/<feature>` to `done/<feature>` |
|
|
141
|
+
|
|
142
|
+
### Command Templates
|
|
143
|
+
|
|
144
|
+
Templates are generated by `npx @dezkareid/osddt setup` and placed in each agent's commands directory. Each template corresponds to a step in the spec-driven workflow.
|
|
145
|
+
|
|
146
|
+
| Template | Description |
|
|
147
|
+
| ------------------ | ------------------------------------------------------------------ |
|
|
148
|
+
| `osddt.continue` | Detect the current workflow phase and prompt the next command |
|
|
149
|
+
| `osddt.research` | Research a topic and write a research file to inform the spec |
|
|
150
|
+
| `osddt.start` | Start a new feature by creating a branch and working-on folder |
|
|
151
|
+
| `osddt.spec` | Analyze requirements and write a feature specification |
|
|
152
|
+
| `osddt.plan` | Create a technical implementation plan from a specification |
|
|
153
|
+
| `osddt.tasks` | Generate actionable tasks from an implementation plan |
|
|
154
|
+
| `osddt.implement` | Execute tasks from the task list one by one |
|
|
155
|
+
| `osddt.done` | Mark a feature as done and move it from working-on to done |
|
|
156
|
+
|
|
157
|
+
#### Template Workflow
|
|
158
|
+
|
|
159
|
+
`osddt.research` and `osddt.start` are **peer entry points** — use whichever fits your situation. Both lead to `osddt.spec`. Use `osddt.continue` to resume an in-progress feature from a new session.
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
osddt.continue ──────────────────────────────────────────────────────────────────────────────┐
|
|
163
|
+
│
|
|
164
|
+
osddt.research ──┐ │
|
|
165
|
+
├──► osddt.spec → osddt.plan → osddt.tasks → osddt.implement → osddt.done ◄─┘
|
|
166
|
+
osddt.start ──┘
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
- Use **`osddt.continue`** at the start of a new session to detect the current phase and get the exact command to run next. It inspects the `working-on/<feature-name>/` folder for phase files and reports which one was found.
|
|
170
|
+
- Use **`osddt.research`** when you want to explore the codebase and gather findings before writing the spec. It creates the `working-on/<feature-name>/` folder and writes `osddt.research.md`.
|
|
171
|
+
- Use **`osddt.start`** when you are ready to begin implementation directly. It creates the git branch and the `working-on/<feature-name>/` folder.
|
|
172
|
+
- Both `osddt.research` and `osddt.start` check whether the working directory already exists and ask to **Resume** or **Abort** if it does.
|
|
173
|
+
|
|
174
|
+
#### Generated File Locations
|
|
175
|
+
|
|
176
|
+
| Agent | Directory | File pattern |
|
|
177
|
+
| ----------- | ------------------- | -------------------------- |
|
|
178
|
+
| Claude Code | `.claude/commands/` | `osddt.<name>.md` |
|
|
179
|
+
| Gemini CLI | `.gemini/commands/` | `osddt.<name>.toml` |
|
|
180
|
+
|
|
181
|
+
#### osddt.continue behaviour
|
|
182
|
+
|
|
183
|
+
- **Input**: A feature name or branch name to locate the working directory.
|
|
184
|
+
- **Actions performed by the agent**:
|
|
185
|
+
1. Runs `npx @dezkareid/osddt meta-info` and reads `.osddtrc` to resolve the project path.
|
|
186
|
+
2. Checks the `working-on/<feature-name>/` folder for the following phase files **in order**: `osddt.tasks.md` (with unchecked tasks), `osddt.tasks.md` (all checked), `osddt.plan.md`, `osddt.spec.md`, `osddt.research.md`.
|
|
187
|
+
3. Reports the file found, the current phase, and the **exact command** the user should run next.
|
|
188
|
+
|
|
189
|
+
#### osddt.start behaviour
|
|
190
|
+
|
|
191
|
+
- **Input**: Either a human-readable feature description (e.g. `"Add user authentication"`) or an existing branch name (e.g. `feat/add-user-auth`).
|
|
192
|
+
- **Branch name resolution**: input is used as-is if it looks like a branch name; otherwise a name is derived (lowercased, hyphens, prefixed with `feat/`), subject to the 30-character feature name limit.
|
|
193
|
+
- **Actions performed by the agent**:
|
|
194
|
+
1. Checks for an existing branch — offers **Resume** (`git checkout`) or **Abort** if found, otherwise runs `git checkout -b <branch-name>`.
|
|
195
|
+
2. Reads `.osddtrc` to resolve the project path (single vs monorepo).
|
|
196
|
+
3. Checks for an existing `working-on/<feature-name>/` folder — offers **Resume** or **Abort** if found, otherwise creates it.
|
|
197
|
+
|
|
198
|
+
#### osddt.research behaviour
|
|
199
|
+
|
|
200
|
+
- **Input**: Either a human-readable topic description or a branch/feature name.
|
|
201
|
+
- **Actions performed by the agent**:
|
|
202
|
+
1. Derives the feature name (subject to the 30-character limit).
|
|
203
|
+
2. Checks for an existing `working-on/<feature-name>/` folder — offers **Resume** or **Abort** if found, otherwise creates it.
|
|
204
|
+
3. Researches the topic (codebase exploration, external references) and writes `osddt.research.md`.
|
|
205
|
+
|
|
206
|
+
### Template Data Convention
|
|
207
|
+
|
|
208
|
+
When a template needs dynamic information (e.g. current branch, date, repo config), **do not pass it as a build-time argument**. Instead:
|
|
209
|
+
|
|
210
|
+
1. Create an `npx @dezkareid/osddt <command>` that outputs the data (preferably as JSON).
|
|
211
|
+
2. Reference that command in the template body, instructing the agent to run it at invocation time.
|
|
212
|
+
|
|
213
|
+
This keeps generated files deterministic and ensures agents always get live values.
|
|
214
|
+
|
|
215
|
+
## Testing
|
|
216
|
+
|
|
217
|
+
### Approach
|
|
218
|
+
|
|
219
|
+
Tests are written using **Vitest** and follow **BDD (Behaviour-Driven Development)** conventions:
|
|
220
|
+
|
|
221
|
+
- Test files live next to the source files they cover, using the `.spec.ts` suffix.
|
|
222
|
+
- Tests are structured with `describe` blocks that express the context ("given …") and `it` blocks that express the expected behaviour ("should …").
|
|
223
|
+
- Side effects (filesystem, child processes, `process.exit`) are isolated with `vi.mock` / `vi.spyOn` so tests remain fast and deterministic.
|
|
224
|
+
- Pure functions (template generators) are tested without mocks.
|
|
225
|
+
|
|
226
|
+
### Running Tests
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Run the full test suite once
|
|
230
|
+
pnpm test
|
|
231
|
+
|
|
232
|
+
# Run in watch mode during development
|
|
233
|
+
pnpm run test:watch
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Documentation
|
|
237
|
+
|
|
238
|
+
When a command in templates or npx commands are added/updated/removed/renamed/deprecated, ask to update the AGENTS.md and README.md files.
|
package/README.md
CHANGED
|
@@ -5,13 +5,13 @@ Other spec driven development tool but for monorepo
|
|
|
5
5
|
|
|
6
6
|
| Command | Description |
|
|
7
7
|
| ------------------------------ | ------------------------------------------------------------- |
|
|
8
|
-
|
|
|
9
|
-
|
|
|
10
|
-
|
|
|
8
|
+
| `@dezkareid/osddt setup` | Generate agent command files for Claude and Gemini |
|
|
9
|
+
| `@dezkareid/osddt meta-info` | Output current branch and date as JSON |
|
|
10
|
+
| `@dezkareid/osddt done <feature-name>` | Move `working-on/<feature>` to `done/<feature>` |
|
|
11
11
|
|
|
12
12
|
## Command Templates
|
|
13
13
|
|
|
14
|
-
Run `osddt setup` once to generate the agent command files.
|
|
14
|
+
Run `npx @dezkareid/osddt setup` once to generate the agent command files.
|
|
15
15
|
|
|
16
16
|
`osddt.research` and `osddt.start` are **peer entry points** — use whichever fits your situation. Both lead to `osddt.spec`. Use `osddt.continue` to resume an in-progress feature from a new session.
|
|
17
17
|
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { Command } from 'commander';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs-extra';
|
|
5
5
|
import select from '@inquirer/select';
|
|
6
|
+
import checkbox from '@inquirer/checkbox';
|
|
6
7
|
import { execSync } from 'child_process';
|
|
7
8
|
|
|
8
9
|
const REPO_PREAMBLE = `## Context
|
|
@@ -10,7 +11,7 @@ const REPO_PREAMBLE = `## Context
|
|
|
10
11
|
Before proceeding, run the following command and parse the JSON output to get the current branch and date:
|
|
11
12
|
|
|
12
13
|
\`\`\`
|
|
13
|
-
npx osddt meta-info
|
|
14
|
+
npx @dezkareid/osddt meta-info
|
|
14
15
|
\`\`\`
|
|
15
16
|
|
|
16
17
|
## Repository Configuration
|
|
@@ -224,9 +225,15 @@ Run the following command to create the implementation plan:
|
|
|
224
225
|
body: (args) => `## Instructions
|
|
225
226
|
|
|
226
227
|
1. Read \`osddt.spec.md\` from the working directory
|
|
227
|
-
2.
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
2. Check whether \`osddt.plan.md\` already exists in the working directory:
|
|
229
|
+
- If it **does not exist**, proceed to generate it.
|
|
230
|
+
- If it **already exists**, ask the user whether to:
|
|
231
|
+
- **Regenerate** — discard the existing file and create a fresh plan from scratch
|
|
232
|
+
- **Update** — read the existing file and apply targeted changes based on ${args}
|
|
233
|
+
- **Do nothing** — stop here and leave the file as-is
|
|
234
|
+
3. Break down the implementation into logical phases and steps
|
|
235
|
+
4. Identify technical decisions, dependencies, and risks
|
|
236
|
+
5. Write the plan to \`osddt.plan.md\` in the working directory
|
|
230
237
|
|
|
231
238
|
## Plan Format
|
|
232
239
|
|
|
@@ -256,9 +263,15 @@ Run the following command to generate the task list:
|
|
|
256
263
|
body: (args) => `## Instructions
|
|
257
264
|
|
|
258
265
|
1. Read \`osddt.plan.md\` from the working directory
|
|
259
|
-
2.
|
|
260
|
-
|
|
261
|
-
|
|
266
|
+
2. Check whether \`osddt.tasks.md\` already exists in the working directory:
|
|
267
|
+
- If it **does not exist**, proceed to generate it.
|
|
268
|
+
- If it **already exists**, ask the user whether to:
|
|
269
|
+
- **Regenerate** — discard the existing file and create a fresh task list from scratch
|
|
270
|
+
- **Update** — read the existing file and apply targeted changes based on ${args}
|
|
271
|
+
- **Do nothing** — stop here and leave the file as-is
|
|
272
|
+
3. Break each phase into discrete, executable tasks
|
|
273
|
+
4. Estimate complexity (S/M/L) for each task
|
|
274
|
+
5. Write the task list to \`osddt.tasks.md\` in the working directory
|
|
262
275
|
|
|
263
276
|
## Tasks Format
|
|
264
277
|
|
|
@@ -286,11 +299,17 @@ Run the following command to start implementing tasks:
|
|
|
286
299
|
description: 'Execute tasks from the task list one by one',
|
|
287
300
|
body: (args) => `## Instructions
|
|
288
301
|
|
|
289
|
-
1.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
302
|
+
1. Check whether \`osddt.tasks.md\` exists in the working directory:
|
|
303
|
+
- If it **does not exist**, stop and ask the user to run \`/osddt.tasks ${args}\` first.
|
|
304
|
+
- If it **already exists**, ask the user whether to:
|
|
305
|
+
- **Continue** — find the next unchecked task and implement it (default)
|
|
306
|
+
- **Update tasks** — edit \`osddt.tasks.md\` before implementing (e.g. to add, remove, or reorder tasks)
|
|
307
|
+
- **Do nothing** — stop here without making any changes
|
|
308
|
+
2. Read \`osddt.tasks.md\` from the working directory
|
|
309
|
+
3. Find the next unchecked task (\`- [ ]\`)
|
|
310
|
+
4. Implement that task following the spec (\`osddt.spec.md\`) and plan (\`osddt.plan.md\`) in the working directory
|
|
311
|
+
5. Mark the task as complete (\`- [x]\`) in \`osddt.tasks.md\`
|
|
312
|
+
6. Report what was done and any issues encountered
|
|
294
313
|
|
|
295
314
|
## Guidelines
|
|
296
315
|
|
|
@@ -321,7 +340,7 @@ Once all tasks are checked off, run the following command to mark the feature as
|
|
|
321
340
|
2. Run the following command to move the feature folder from \`working-on\` to \`done\`:
|
|
322
341
|
|
|
323
342
|
\`\`\`
|
|
324
|
-
npx osddt done ${args}
|
|
343
|
+
npx @dezkareid/osddt done ${args}
|
|
325
344
|
\`\`\`
|
|
326
345
|
|
|
327
346
|
The command will automatically prefix the destination folder name with today's date in \`YYYY-MM-DD\` format.
|
|
@@ -385,6 +404,29 @@ async function askRepoType() {
|
|
|
385
404
|
],
|
|
386
405
|
});
|
|
387
406
|
}
|
|
407
|
+
async function askAgents() {
|
|
408
|
+
return checkbox({
|
|
409
|
+
message: 'Which AI assistant tools do you want to set up?',
|
|
410
|
+
choices: [
|
|
411
|
+
{
|
|
412
|
+
name: 'Claude Code',
|
|
413
|
+
value: 'claude',
|
|
414
|
+
checked: true,
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
name: 'Gemini CLI',
|
|
418
|
+
value: 'gemini',
|
|
419
|
+
checked: true,
|
|
420
|
+
},
|
|
421
|
+
],
|
|
422
|
+
validate(choices) {
|
|
423
|
+
if (choices.length === 0) {
|
|
424
|
+
return 'You must select at least one agent.';
|
|
425
|
+
}
|
|
426
|
+
return true;
|
|
427
|
+
},
|
|
428
|
+
});
|
|
429
|
+
}
|
|
388
430
|
|
|
389
431
|
async function writeCommandFile(file) {
|
|
390
432
|
await fs.ensureDir(path.dirname(file.filePath));
|
|
@@ -397,18 +439,26 @@ async function writeConfig(cwd, config) {
|
|
|
397
439
|
console.log(`\nSaved config: ${configPath}`);
|
|
398
440
|
}
|
|
399
441
|
async function runSetup(cwd) {
|
|
442
|
+
const agents = await askAgents();
|
|
443
|
+
console.log('');
|
|
400
444
|
const repoType = await askRepoType();
|
|
401
445
|
console.log('');
|
|
402
446
|
console.log('Setting up OSDDT command files...\n');
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
447
|
+
if (agents.includes('claude')) {
|
|
448
|
+
const claudeFiles = getClaudeTemplates(cwd);
|
|
449
|
+
console.log('Claude Code commands (.claude/commands/):');
|
|
450
|
+
for (const file of claudeFiles) {
|
|
451
|
+
await writeCommandFile(file);
|
|
452
|
+
}
|
|
453
|
+
console.log('');
|
|
408
454
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
455
|
+
if (agents.includes('gemini')) {
|
|
456
|
+
const geminiFiles = getGeminiTemplates(cwd);
|
|
457
|
+
console.log('Gemini CLI commands (.gemini/commands/):');
|
|
458
|
+
for (const file of geminiFiles) {
|
|
459
|
+
await writeCommandFile(file);
|
|
460
|
+
}
|
|
461
|
+
console.log('');
|
|
412
462
|
}
|
|
413
463
|
await writeConfig(cwd, { repoType });
|
|
414
464
|
console.log('\nSetup complete!');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const REPO_PREAMBLE = "## Context\n\nBefore proceeding, run the following command and parse the JSON output to get the current branch and date:\n\n```\nnpx osddt meta-info\n```\n\n## Repository Configuration\n\nBefore proceeding, read the `.osddtrc` file in the root of the repository to determine the project path.\n\n```json\n// .osddtrc example\n{ \"repoType\": \"monorepo\" | \"single\" }\n```\n\n- If `repoType` is `\"single\"`: the project path is the repository root.\n- If `repoType` is `\"monorepo\"`: ask the user which package to work on (e.g. `packages/my-package`), then use `<repo-root>/<package>` as the project path.\n\n## Working Directory\n\nAll generated files live under `<project-path>/working-on/<feature-name>/`. The `<feature-name>` is derived from the arguments provided. Create the directory if it does not exist.\n\n> All file paths in the instructions below are relative to `<project-path>/working-on/<feature-name>/`.\n\n";
|
|
1
|
+
export declare const REPO_PREAMBLE = "## Context\n\nBefore proceeding, run the following command and parse the JSON output to get the current branch and date:\n\n```\nnpx @dezkareid/osddt meta-info\n```\n\n## Repository Configuration\n\nBefore proceeding, read the `.osddtrc` file in the root of the repository to determine the project path.\n\n```json\n// .osddtrc example\n{ \"repoType\": \"monorepo\" | \"single\" }\n```\n\n- If `repoType` is `\"single\"`: the project path is the repository root.\n- If `repoType` is `\"monorepo\"`: ask the user which package to work on (e.g. `packages/my-package`), then use `<repo-root>/<package>` as the project path.\n\n## Working Directory\n\nAll generated files live under `<project-path>/working-on/<feature-name>/`. The `<feature-name>` is derived from the arguments provided. Create the directory if it does not exist.\n\n> All file paths in the instructions below are relative to `<project-path>/working-on/<feature-name>/`.\n\n";
|
|
2
2
|
export declare const FEATURE_NAME_RULES = "### Feature Name Constraints\n\nWhen deriving a feature name from a description:\n\n- Use only lowercase letters, digits, and hyphens (`a-z`, `0-9`, `-`)\n- Replace spaces and special characters with hyphens\n- Remove consecutive hyphens (e.g. `--` \u2192 `-`)\n- Remove leading and trailing hyphens\n- **Maximum length: 30 characters** \u2014 if the derived name exceeds 30 characters, truncate at the last hyphen boundary before or at the 30th character\n- If the input is already a valid branch name (no spaces, kebab-case or slash-separated), apply the 30-character limit to the last segment only (after the last `/`)\n- Reject (and ask the user to provide a shorter name) if no valid name can be derived after truncation\n\n**Examples:**\n\n| Input | Derived feature name |\n| ----------------------------------------------------- | ---------------------------- |\n| `Add user authentication` | `add-user-authentication` |\n| `Implement real-time notifications for dashboard` | `implement-real-time` |\n| `feat/add-user-authentication` | `add-user-authentication` |\n| `feat/implement-real-time-notifications-for-dashboard` | `implement-real-time` |\n";
|
|
3
3
|
export declare const WORKING_DIR_STEP = "Check whether the working directory `<project-path>/working-on/<feature-name>` already exists:\n - If it **does not exist**, create it:\n ```\n mkdir -p <project-path>/working-on/<feature-name>\n ```\n - If it **already exists**, warn the user and ask whether to:\n - **Resume** \u2014 continue into the existing folder (proceed to the next step without recreating it)\n - **Abort** \u2014 stop and do nothing";
|
|
4
4
|
export type ArgPlaceholder = '$ARGUMENTS' | '{{args}}';
|
package/dist/utils/prompt.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dezkareid/osddt",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Package for Spec-Driven Development workflow",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spec-driven",
|
|
@@ -8,7 +8,10 @@
|
|
|
8
8
|
],
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
-
"README.md"
|
|
11
|
+
"README.md",
|
|
12
|
+
"AGENTS.md",
|
|
13
|
+
"GEMINI.md",
|
|
14
|
+
"CLAUDE.md"
|
|
12
15
|
],
|
|
13
16
|
"publishConfig": {
|
|
14
17
|
"access": "public",
|
|
@@ -30,6 +33,7 @@
|
|
|
30
33
|
},
|
|
31
34
|
"main": "./dist/index.js",
|
|
32
35
|
"dependencies": {
|
|
36
|
+
"@inquirer/checkbox": "5.0.7",
|
|
33
37
|
"@inquirer/select": "5.0.7",
|
|
34
38
|
"commander": "12.0.0",
|
|
35
39
|
"fs-extra": "11.2.0",
|
|
@@ -51,6 +55,7 @@
|
|
|
51
55
|
"test": "vitest run",
|
|
52
56
|
"test:watch": "vitest",
|
|
53
57
|
"lint": "eslint src",
|
|
54
|
-
"format": "prettier --write src"
|
|
58
|
+
"format": "prettier --write src",
|
|
59
|
+
"setup-local": "pnpm run build && npx osddt setup"
|
|
55
60
|
}
|
|
56
61
|
}
|