@dezkareid/osddt 1.8.0 → 1.10.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 CHANGED
@@ -184,17 +184,19 @@ Templates are generated by `npx @dezkareid/osddt setup` and placed in each agent
184
184
  | `osddt.plan` | Create a technical implementation plan from a specification |
185
185
  | `osddt.tasks` | Generate actionable tasks from an implementation plan |
186
186
  | `osddt.implement` | Execute tasks from the task list one by one |
187
+ | `osddt.fast` | Bootstrap all planning artifacts (spec, plan, tasks) in one shot |
187
188
  | `osddt.done` | Resolve project path, verify tasks, and move the feature to done |
188
189
 
189
190
  #### Template Workflow
190
191
 
191
- `osddt.research` and `osddt.start` are **peer entry points** use whichever fits your situation. Both lead to `osddt.spec`. If you close the coding session, execute `osddt.continue` to resume the workflow.
192
+ `osddt.research`, `osddt.start`, and `osddt.fast` are **entry points**. `osddt.research` and `osddt.start` are peer entry points for the step-by-step workflow. `osddt.fast` is an accelerated entry point that skips manual steps and generates all planning artifacts in a single invocation. If you close the coding session, execute `osddt.continue` to resume the workflow.
192
193
 
193
194
  **Standard steps:**
194
195
 
195
196
  1. Pick an entry point:
196
197
  - **`osddt.research <topic>`** — explore the codebase or gather external findings first, then proceed to spec.
197
198
  - **`osddt.start <feature>`** — jump straight to creating the branch and working directory, then write the spec.
199
+ - **`osddt.fast <description>`** — create the branch, spec, plan, and task list in one shot without any manual steps.
198
200
  2. **`osddt.spec <feature>`** — analyse requirements and write the feature specification.
199
201
  3. *(optional)* **`osddt.clarify <feature>`** — resolve any Open Questions in the spec and record decisions.
200
202
  4. **`osddt.plan <tech decisions>`** — create a technical implementation plan from the spec.
@@ -202,6 +204,8 @@ Templates are generated by `npx @dezkareid/osddt setup` and placed in each agent
202
204
  6. **`osddt.implement`** — execute tasks one by one until all are checked off.
203
205
  7. **`osddt.done`** — verify all tasks are complete and move the feature folder to `done/`.
204
206
 
207
+ > **Fast mode:** Steps 1–5 can be replaced by a single `osddt.fast <description>` invocation. The agent derives all decisions automatically and records them in an `## Assumptions` section of the plan for review before implementing.
208
+
205
209
  > **Note:** You can re-run any step to go back and revise it — except once `osddt.done` has been executed, the feature is considered finished and cannot be revisited.
206
210
 
207
211
  **If you close a session:**
package/README.md CHANGED
@@ -44,6 +44,7 @@ flowchart LR
44
44
  subgraph entry[Entry points]
45
45
  research([osddt.research])
46
46
  start([osddt.start])
47
+ fast([osddt.fast])
47
48
  end
48
49
 
49
50
  spec([osddt.spec])
@@ -55,6 +56,7 @@ flowchart LR
55
56
 
56
57
  research --> spec
57
58
  start --> spec
59
+ fast --> implement
58
60
  spec --> clarify
59
61
  clarify --> plan
60
62
  spec --> plan
@@ -93,6 +95,17 @@ flowchart LR
93
95
  /osddt.done
94
96
  ```
95
97
 
98
+ #### Fast mode (spec + plan + tasks in one shot)
99
+
100
+ ```
101
+ /osddt.fast add payment gateway
102
+ # → creates branch, writes spec, plan (with Assumptions), and task list automatically
103
+ /osddt.implement
104
+ /osddt.done
105
+ ```
106
+
107
+ > Review the `## Assumptions` section of `osddt.plan.md` before implementing. Run `/osddt.clarify` if any Open Questions in the spec need resolving first.
108
+
96
109
  #### Resuming after closing a session
97
110
 
98
111
  ```
@@ -115,6 +128,7 @@ flowchart LR
115
128
  | `osddt.plan` | Create a technical implementation plan from a specification |
116
129
  | `osddt.tasks` | Generate actionable tasks from an implementation plan |
117
130
  | `osddt.implement` | Execute tasks from the task list one by one |
131
+ | `osddt.fast` | Bootstrap all planning artifacts (spec, plan, tasks) in one shot |
118
132
  | `osddt.done` | Resolve project path, verify tasks, and move the feature to done |
119
133
 
120
134
  Generated files are placed in:
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function contextCommand(): Command;
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js CHANGED
@@ -99,6 +99,19 @@ function getNextStepToSpec(args) {
99
99
 
100
100
  > Add a short description of what you're building so the spec has the right starting point.`;
101
101
  }
102
+ function getCustomContextStep(npxCommand, commandName) {
103
+ return `## Custom Context
104
+
105
+ Run the following command and, if it returns content, use it as additional context before proceeding:
106
+
107
+ \`\`\`
108
+ ${npxCommand} context ${commandName}
109
+ \`\`\`
110
+
111
+ If the command returns no output, skip this section and continue.
112
+
113
+ `;
114
+ }
102
115
  const COMMAND_DEFINITIONS = [
103
116
  {
104
117
  name: 'osddt.continue',
@@ -122,7 +135,7 @@ Report which file was found, which phase that corresponds to, and the exact comm
122
135
 
123
136
  > **Open Questions check**: After reporting the phase, if the detected phase is **Spec done** or **Planning done**, also check whether \`osddt.spec.md\` contains any unanswered open questions (items in the **Open Questions** section with no corresponding entry in the **Decisions** section). If unanswered questions exist, inform the user and recommend running \`/osddt.clarify <feature-name>\` before (or in addition to) the suggested next command.
124
137
 
125
- ## Arguments
138
+ ${getCustomContextStep(npxCommand, 'continue')}## Arguments
126
139
 
127
140
  ${args}
128
141
  `,
@@ -164,7 +177,7 @@ The research file should include:
164
177
  - **Constraints & Risks**: Known limitations or risks uncovered during research
165
178
  - **Open Questions**: Ambiguities that the specification phase should resolve
166
179
 
167
- ## Arguments
180
+ ${getCustomContextStep(npxCommand, 'research')}## Arguments
168
181
 
169
182
  ${args}
170
183
 
@@ -204,7 +217,7 @@ Where \`<feature-name>\` is the last segment of the branch name (after the last
204
217
 
205
218
  5. Report the branch name and working directory that were created or resumed.
206
219
 
207
- ## Arguments
220
+ ${getCustomContextStep(npxCommand, 'start')}## Arguments
208
221
 
209
222
  ${args}
210
223
 
@@ -214,7 +227,7 @@ ${getNextStepToSpec(args)}
214
227
  {
215
228
  name: 'osddt.spec',
216
229
  description: 'Analyze requirements and write a feature specification',
217
- body: ({ args }) => `## Instructions
230
+ body: ({ args, npxCommand }) => `## Instructions
218
231
 
219
232
  1. Gather requirements from all available sources — combine them when multiple sources are present:
220
233
  - **Arguments** (${args}): use as the primary description of the feature, if provided.
@@ -242,7 +255,7 @@ The spec should include:
242
255
  > If \`osddt.research.md\` was found, add a **Research Summary** section that briefly references the key insights and user-facing constraints it identified.
243
256
  > If additional context was gathered from the conversation session, add a **Session Context** section summarising any extra details, decisions, or constraints discussed beyond what was passed as arguments.
244
257
 
245
- ## Arguments
258
+ ${getCustomContextStep(npxCommand, 'spec')}## Arguments
246
259
 
247
260
  ${args}
248
261
 
@@ -258,7 +271,7 @@ Run the following command to create the implementation plan:
258
271
  {
259
272
  name: 'osddt.clarify',
260
273
  description: 'Resolve open questions in the spec and record decisions',
261
- body: () => `## Instructions
274
+ body: ({ npxCommand }) => `## Instructions
262
275
 
263
276
  1. Check whether \`osddt.spec.md\` exists in the working directory:
264
277
  - If it **does not exist**, inform the user that no spec was found and suggest running \`/osddt.spec <brief feature description>\` first. Stop here.
@@ -287,12 +300,13 @@ Run the following command to create the implementation plan:
287
300
  \`\`\`
288
301
 
289
302
  > Note: if \`osddt.plan.md\` already exists, the plan should be regenerated to incorporate the decisions.
290
- `,
303
+
304
+ ${getCustomContextStep(npxCommand, 'clarify')}`,
291
305
  },
292
306
  {
293
307
  name: 'osddt.plan',
294
308
  description: 'Create a technical implementation plan from a specification',
295
- body: ({ args }) => `${RESOLVE_FEATURE_NAME}
309
+ body: ({ args, npxCommand }) => `${RESOLVE_FEATURE_NAME}
296
310
 
297
311
  ## Instructions
298
312
 
@@ -323,7 +337,7 @@ The plan should include:
323
337
  - **Risks & Mitigations**: Known risks and how to address them
324
338
  - **Out of Scope**: Explicitly what will not be built
325
339
 
326
- ## Arguments
340
+ ${getCustomContextStep(npxCommand, 'plan')}## Arguments
327
341
 
328
342
  ${args}
329
343
 
@@ -339,7 +353,7 @@ Run the following command to generate the task list:
339
353
  {
340
354
  name: 'osddt.tasks',
341
355
  description: 'Generate actionable tasks from an implementation plan',
342
- body: () => `${RESOLVE_FEATURE_NAME}
356
+ body: ({ npxCommand }) => `${RESOLVE_FEATURE_NAME}
343
357
 
344
358
  ## Instructions
345
359
 
@@ -361,7 +375,7 @@ The task list should include:
361
375
  - **Dependencies**: Note which tasks must complete before others
362
376
  - **Definition of Done**: Clear completion criteria per phase
363
377
 
364
- ## Next Step
378
+ ${getCustomContextStep(npxCommand, 'tasks')}## Next Step
365
379
 
366
380
  Run the following command to start implementing tasks:
367
381
 
@@ -373,7 +387,7 @@ Run the following command to start implementing tasks:
373
387
  {
374
388
  name: 'osddt.implement',
375
389
  description: 'Execute tasks from the task list one by one',
376
- body: () => `## Instructions
390
+ body: ({ npxCommand }) => `## Instructions
377
391
 
378
392
  1. Check whether \`osddt.tasks.md\` exists in the working directory:
379
393
  - If it **does not exist**, stop and ask the user to run \`/osddt.tasks\` first.
@@ -390,13 +404,95 @@ Run the following command to start implementing tasks:
390
404
  - Write tests for new functionality when applicable
391
405
  - Ask for clarification if requirements are ambiguous
392
406
 
393
- ## Next Step
407
+ ${getCustomContextStep(npxCommand, 'implement')}## Next Step
394
408
 
395
409
  Once all tasks are checked off, run the following command to mark the feature as done:
396
410
 
397
411
  \`\`\`
398
412
  /osddt.done
399
413
  \`\`\`
414
+ `,
415
+ },
416
+ {
417
+ name: 'osddt.fast',
418
+ description: 'Bootstrap all planning artifacts (spec, plan, tasks) from a single description',
419
+ body: ({ args, npxCommand }) => `${getRepoPreamble(npxCommand)}## Instructions
420
+
421
+ The argument provided is: ${args}
422
+
423
+ This command runs the full spec-driven setup sequence in one shot — branch creation, spec, plan, and task list — without pausing for user input. Follow each step below in order without asking the user for clarification or confirmation between steps.
424
+
425
+ ### Step 1 — Derive branch and feature name
426
+
427
+ Determine the branch name from ${args}:
428
+
429
+ 1. If ${args} looks like a branch name (no spaces, kebab-case or slash-separated), use it as-is.
430
+ 2. Otherwise treat ${args} as a human-readable feature description, convert it to a feature name, and use the format \`feat/<derived-name>\` as the branch name.
431
+
432
+ Apply the constraints below to the feature name (the segment after the last \`/\`):
433
+
434
+ ${FEATURE_NAME_RULES}
435
+
436
+ ### Step 2 — Create branch and working directory
437
+
438
+ 3. Check whether the branch already exists locally or remotely:
439
+ - If it **does not exist**, create and switch to it:
440
+ \`\`\`
441
+ git checkout -b <branch-name>
442
+ \`\`\`
443
+ - If it **already exists**, warn the user and ask whether to:
444
+ - **Resume** — switch to the existing branch (\`git checkout <branch-name>\`) and continue
445
+ - **Abort** — stop and do nothing
446
+
447
+ 4. ${WORKING_DIR_STEP}
448
+
449
+ Where \`<feature-name>\` is the last segment of the branch name (after the last \`/\`, or the full branch name if no \`/\` is present).
450
+
451
+ ### Step 3 — Generate spec
452
+
453
+ Write \`osddt.spec.md\` to the working directory. Base it entirely on ${args} and any codebase context you can gather. Do **not** ask the user any questions. If there are ambiguities, record them in an **Open Questions** section and continue.
454
+
455
+ The spec must include:
456
+ - **Overview**: What the feature is and why it is needed
457
+ - **Requirements**: Functional requirements expressed as user-observable behaviours
458
+ - **Scope**: In scope and out of scope in product terms
459
+ - **Acceptance Criteria**: Clear, testable criteria from a user or business perspective
460
+ - **Open Questions** (if any): Ambiguities to resolve later — do not block on these
461
+
462
+ ### Step 4 — Generate plan
463
+
464
+ Write \`osddt.plan.md\` to the working directory. Derive all technical decisions from the spec and codebase inspection. Do **not** ask the user for input.
465
+
466
+ The plan must include:
467
+ - **Assumptions**: Document every technical decision made automatically (e.g. library choices, architecture patterns) so the user can review them before implementing
468
+ - **Architecture Overview**: High-level design decisions
469
+ - **Implementation Phases**: Ordered phases with goals
470
+ - **Technical Dependencies**: Libraries, APIs, services needed
471
+ - **Risks & Mitigations**: Known risks and mitigations
472
+ - **Out of Scope**: What will not be built
473
+
474
+ ### Step 5 — Generate task list
475
+
476
+ Write \`osddt.tasks.md\` to the working directory based on \`osddt.plan.md\`.
477
+
478
+ The task list must include:
479
+ - A checklist of tasks grouped by phase: \`- [ ] [S/M/L] Description\`
480
+ - Dependencies between tasks noted where relevant
481
+ - A Definition of Done per phase
482
+
483
+ ### Step 6 — Report
484
+
485
+ Display the full contents of \`osddt.tasks.md\` to the user. Then prompt them to run:
486
+
487
+ \`\`\`
488
+ /osddt.implement
489
+ \`\`\`
490
+
491
+ > You can optionally run \`/osddt.clarify\` before implementing to resolve any Open Questions recorded in the spec.
492
+
493
+ ${getCustomContextStep(npxCommand, 'fast')}## Arguments
494
+
495
+ ${args}
400
496
  `,
401
497
  },
402
498
  {
@@ -415,7 +511,8 @@ ${npxCommand} done <feature-name> --dir <project-path>
415
511
  For example, \`working-on/feature-a\` will be moved to \`done/YYYY-MM-DD-feature-a\`.
416
512
 
417
513
  3. Report the result of the command, including the full destination path
418
- `,
514
+
515
+ ${getCustomContextStep(npxCommand, 'done')}`,
419
516
  },
420
517
  ];
421
518
 
@@ -712,6 +809,64 @@ function updateCommand() {
712
809
  return cmd;
713
810
  }
714
811
 
812
+ const CONTEXT_DIR = 'osddt-context';
813
+ function stubContent(name) {
814
+ return `<!-- osddt context: ${name}
815
+ The content of this file will be shown to the agent under the "## Custom Context" section
816
+ when the osddt.${name} command is invoked. Add your project-specific instructions below. -->
817
+ `;
818
+ }
819
+ async function runRead(name, cwd) {
820
+ const filePath = path.join(cwd, CONTEXT_DIR, `${name}.md`);
821
+ let content;
822
+ try {
823
+ content = await fs.readFile(filePath, 'utf-8');
824
+ }
825
+ catch (err) {
826
+ if (err.code === 'ENOENT') {
827
+ return;
828
+ }
829
+ throw err;
830
+ }
831
+ process.stdout.write(content);
832
+ }
833
+ async function runInit(cwd) {
834
+ const contextDir = path.join(cwd, CONTEXT_DIR);
835
+ await fs.ensureDir(contextDir);
836
+ for (const cmd of COMMAND_DEFINITIONS) {
837
+ const name = cmd.name.replace(/^osddt\./, '');
838
+ const filePath = path.join(contextDir, `${name}.md`);
839
+ if (await fs.pathExists(filePath)) {
840
+ console.log(` Skipped (exists): ${CONTEXT_DIR}/${name}.md`);
841
+ }
842
+ else {
843
+ await fs.writeFile(filePath, stubContent(name), 'utf-8');
844
+ console.log(` Created: ${CONTEXT_DIR}/${name}.md`);
845
+ }
846
+ }
847
+ }
848
+ function contextCommand() {
849
+ const cmd = new Command('context');
850
+ cmd
851
+ .description('Output a custom context file or scaffold context stubs')
852
+ .argument('[name]', 'command name to read context for (e.g. plan, spec)')
853
+ .option('-d, --dir <directory>', 'project directory', process.cwd())
854
+ .option('--init', 'scaffold osddt-context/ with stub files for all commands')
855
+ .action(async (name, options) => {
856
+ const targetDir = path.resolve(options.dir);
857
+ if (options.init) {
858
+ await runInit(targetDir);
859
+ }
860
+ else if (name) {
861
+ await runRead(name, targetDir);
862
+ }
863
+ else {
864
+ cmd.help();
865
+ }
866
+ });
867
+ return cmd;
868
+ }
869
+
715
870
  const program = new Command();
716
871
  program
717
872
  .name('osddt')
@@ -721,4 +876,5 @@ program.addCommand(setupCommand());
721
876
  program.addCommand(metaInfoCommand());
722
877
  program.addCommand(doneCommand());
723
878
  program.addCommand(updateCommand());
879
+ program.addCommand(contextCommand());
724
880
  program.parse(process.argv);
@@ -3,6 +3,7 @@ export declare const FEATURE_NAME_RULES = "### Feature Name Constraints\n\nWhen
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 declare const RESOLVE_FEATURE_NAME = "### Resolving the Feature Name\n\nUse the following logic to determine `<feature-name>`:\n\n1. If arguments were provided, derive the feature name from them:\n - If the argument looks like a branch name (no spaces, kebab-case or slash-separated), use the last segment (after the last `/`, or the full value if no `/` is present).\n - Otherwise treat it as a human-readable description and convert it to a feature name following the constraints in the Feature Name Constraints section.\n2. If **no arguments were provided**:\n - List all folders under `<project-path>/working-on/`.\n - If there is **only one folder**, use it automatically and inform the user.\n - If there are **multiple folders**, present the list to the user and ask them to pick one.\n - If there are **no folders**, inform the user that no in-progress features were found and stop.";
5
5
  export declare function getNextStepToSpec(args: ArgPlaceholder): string;
6
+ export declare function getCustomContextStep(npxCommand: string, commandName: string): string;
6
7
  export type ArgPlaceholder = '$ARGUMENTS' | '{{args}}';
7
8
  export interface CommandDefinitionContext {
8
9
  args: ArgPlaceholder;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dezkareid/osddt",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "description": "Package for Spec-Driven Development workflow",
5
5
  "keywords": [
6
6
  "spec-driven",