@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 +5 -1
- package/README.md +14 -0
- package/dist/commands/context.d.ts +2 -0
- package/dist/commands/context.spec.d.ts +1 -0
- package/dist/index.js +170 -14
- package/dist/templates/shared.d.ts +1 -0
- package/package.json +1 -1
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.
|
|
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 @@
|
|
|
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;
|