@clawplays/ospec-cli 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -21
- package/dist/cli.js +1 -1
- package/dist/commands/ChangesCommand.js +3 -0
- package/dist/commands/InitCommand.js +2 -1
- package/dist/commands/NewCommand.js +20 -0
- package/dist/commands/PluginsCommand.js +4 -3
- package/dist/commands/SkillCommand.js +3 -1
- package/dist/commands/StatusCommand.js +23 -9
- package/dist/utils/helpers.d.ts +3 -5
- package/dist/utils/helpers.js +21 -5
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -31,21 +31,24 @@ OSpec is a document-driven workflow for AI-assisted development, helping you def
|
|
|
31
31
|
<a href="https://github.com/clawplays/ospec/issues">Issues</a>
|
|
32
32
|
</p>
|
|
33
33
|
|
|
34
|
-
##
|
|
34
|
+
## Why OSpec?
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
npm install -g @clawplays/ospec-cli
|
|
38
|
-
```
|
|
36
|
+
AI coding assistants are powerful, but requirements that live only in chat history are hard to inspect, review, and close out cleanly. OSpec adds a lightweight workflow layer so the repository can hold the change context before code is written and after the work ships.
|
|
39
37
|
|
|
40
|
-
|
|
38
|
+
- Align before code — keep proposal, tasks, state, verification, and review visible in the repo
|
|
39
|
+
- Keep each requirement explicit — the default path moves one requirement through one active change
|
|
40
|
+
- Stay lightweight — keep the normal flow short with `init -> change -> verify/finalize`
|
|
41
|
+
- Use the assistants you already have — OSpec is built for Codex, Claude Code, and direct CLI workflows
|
|
42
|
+
|
|
43
|
+
## Install With npm
|
|
41
44
|
|
|
42
45
|
```bash
|
|
43
|
-
ospec
|
|
46
|
+
npm install -g @clawplays/ospec-cli
|
|
44
47
|
```
|
|
45
48
|
|
|
46
|
-
##
|
|
49
|
+
## Quick Start
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
OSpec only takes 3 steps:
|
|
49
52
|
|
|
50
53
|
1. initialize OSpec in your project directory
|
|
51
54
|
2. create and advance one change for a requirement, document update, or bug fix
|
|
@@ -56,13 +59,13 @@ Most teams only need 3 steps to use OSpec:
|
|
|
56
59
|
Recommended prompt:
|
|
57
60
|
|
|
58
61
|
```text
|
|
59
|
-
|
|
62
|
+
OSpec, initialize this project.
|
|
60
63
|
```
|
|
61
64
|
|
|
62
65
|
Claude / Codex skill mode:
|
|
63
66
|
|
|
64
67
|
```text
|
|
65
|
-
|
|
68
|
+
$ospec initialize this project.
|
|
66
69
|
```
|
|
67
70
|
|
|
68
71
|
<details>
|
|
@@ -96,17 +99,15 @@ Use this for requirement delivery, documentation updates, refactors, and bug fix
|
|
|
96
99
|
Recommended prompt:
|
|
97
100
|
|
|
98
101
|
```text
|
|
99
|
-
|
|
102
|
+
OSpec, create and advance a change for this requirement.
|
|
100
103
|
```
|
|
101
104
|
|
|
102
105
|
Claude / Codex skill mode:
|
|
103
106
|
|
|
104
107
|
```text
|
|
105
|
-
|
|
108
|
+
$ospec-change create and advance a change for this requirement.
|
|
106
109
|
```
|
|
107
110
|
|
|
108
|
-

|
|
109
|
-
|
|
110
111
|
<details>
|
|
111
112
|
<summary>Command line</summary>
|
|
112
113
|
|
|
@@ -125,13 +126,13 @@ After the requirement has passed deployment, testing, QA, or other acceptance ch
|
|
|
125
126
|
Recommended prompt:
|
|
126
127
|
|
|
127
128
|
```text
|
|
128
|
-
|
|
129
|
+
OSpec, archive this accepted change.
|
|
129
130
|
```
|
|
130
131
|
|
|
131
132
|
Claude / Codex skill mode:
|
|
132
133
|
|
|
133
134
|
```text
|
|
134
|
-
|
|
135
|
+
$ospec archive this accepted change.
|
|
135
136
|
```
|
|
136
137
|
|
|
137
138
|
<details>
|
|
@@ -151,12 +152,20 @@ Archive notes:
|
|
|
151
152
|
|
|
152
153
|
</details>
|
|
153
154
|
|
|
155
|
+
## Update With npm
|
|
156
|
+
|
|
157
|
+
For an existing OSpec project, after upgrading the CLI with npm, run this in the project directory to refresh the project's OSpec files:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
ospec update
|
|
161
|
+
```
|
|
162
|
+
|
|
154
163
|
## How The OSpec Workflow Works
|
|
155
164
|
|
|
156
165
|
```text
|
|
157
166
|
┌─────────────────────────────────────────────────────────────────┐
|
|
158
167
|
│ 1. USER REQUEST │
|
|
159
|
-
│ "
|
|
168
|
+
│ "OSpec, create and advance a change for this task." │
|
|
160
169
|
└─────────────────────────────────────────────────────────────────┘
|
|
161
170
|
│
|
|
162
171
|
▼
|
|
@@ -224,13 +233,13 @@ Use Stitch for page design review and preview collaboration, especially for land
|
|
|
224
233
|
AI conversation:
|
|
225
234
|
|
|
226
235
|
```text
|
|
227
|
-
|
|
236
|
+
OSpec, enable the Stitch plugin and connect using Codex/Gemini.
|
|
228
237
|
```
|
|
229
238
|
|
|
230
239
|
Claude / Codex skill mode:
|
|
231
240
|
|
|
232
241
|
```text
|
|
233
|
-
|
|
242
|
+
$ospec enable the Stitch plugin and connect using Codex/Gemini.
|
|
234
243
|
```
|
|
235
244
|
|
|
236
245
|
<details>
|
|
@@ -249,13 +258,13 @@ Use Checkpoint for app flow validation and automated checks, especially for subm
|
|
|
249
258
|
AI conversation:
|
|
250
259
|
|
|
251
260
|
```text
|
|
252
|
-
|
|
261
|
+
OSpec, enable the Checkpoint plugin.
|
|
253
262
|
```
|
|
254
263
|
|
|
255
264
|
Claude / Codex skill mode:
|
|
256
265
|
|
|
257
266
|
```text
|
|
258
|
-
|
|
267
|
+
$ospec enable the Checkpoint plugin.
|
|
259
268
|
```
|
|
260
269
|
|
|
261
270
|
<details>
|
package/dist/cli.js
CHANGED
|
@@ -224,7 +224,7 @@ const services_1 = require("./services");
|
|
|
224
224
|
|
|
225
225
|
|
|
226
226
|
|
|
227
|
-
const CLI_VERSION = '0.3.
|
|
227
|
+
const CLI_VERSION = '0.3.7';
|
|
228
228
|
|
|
229
229
|
function showInitUsage() {
|
|
230
230
|
console.log('Usage: ospec init [root-dir] [--summary "..."] [--tech-stack node,react] [--architecture "..."] [--document-language en-US|zh-CN|ja-JP|ar]');
|
|
@@ -21,6 +21,9 @@ class ChangesCommand extends BaseCommand_1.BaseCommand {
|
|
|
21
21
|
console.log(`Total: ${report.totalActiveChanges}`);
|
|
22
22
|
console.log(`Queued: ${queuedChanges.length}`);
|
|
23
23
|
console.log(`PASS ${report.totals.pass} | WARN ${report.totals.warn} | FAIL ${report.totals.fail}`);
|
|
24
|
+
if (report.totalActiveChanges > 1) {
|
|
25
|
+
console.log('WORKFLOW WARN multiple active changes detected. The default workflow expects one active change, and queue runner commands will fail until the repository is back to single-active mode.');
|
|
26
|
+
}
|
|
24
27
|
console.log('');
|
|
25
28
|
if (report.changes.length === 0) {
|
|
26
29
|
console.log('No active changes.');
|
|
@@ -37,6 +37,7 @@ exports.InitCommand = void 0;
|
|
|
37
37
|
const os_1 = require("os");
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const services_1 = require("../services");
|
|
40
|
+
const helpers_1 = require("../utils/helpers");
|
|
40
41
|
const BaseCommand_1 = require("./BaseCommand");
|
|
41
42
|
const SkillCommand_1 = require("./SkillCommand");
|
|
42
43
|
class InitCommand extends BaseCommand_1.BaseCommand {
|
|
@@ -73,7 +74,7 @@ class InitCommand extends BaseCommand_1.BaseCommand {
|
|
|
73
74
|
if (result.firstChangeSuggestion) {
|
|
74
75
|
this.info(` Suggested first change: ${result.firstChangeSuggestion.name}`);
|
|
75
76
|
}
|
|
76
|
-
this.info(` Next: ospec new <change-name>
|
|
77
|
+
this.info(` Next: ${(0, helpers_1.formatCliCommand)('ospec', 'new', '<change-name>', targetDir)}`);
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
|
79
80
|
this.error(`Failed to initialize project: ${error}`);
|
|
@@ -37,6 +37,7 @@ exports.NewCommand = void 0;
|
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
38
|
const constants_1 = require("../core/constants");
|
|
39
39
|
const services_1 = require("../services");
|
|
40
|
+
const helpers_1 = require("../utils/helpers");
|
|
40
41
|
const PathUtils_1 = require("../utils/PathUtils");
|
|
41
42
|
const PluginWorkflowComposer_1 = require("../workflow/PluginWorkflowComposer");
|
|
42
43
|
const BaseCommand_1 = require("./BaseCommand");
|
|
@@ -50,6 +51,7 @@ class NewCommand extends BaseCommand_1.BaseCommand {
|
|
|
50
51
|
const featureDir = PathUtils_1.PathUtils.getChangeDir(targetDir, placement, featureName);
|
|
51
52
|
this.logger.info(`Creating ${placement === constants_1.DIR_NAMES.QUEUED ? 'queued change' : 'change'}: ${featureName}`);
|
|
52
53
|
await this.ensureChangeNameAvailable(targetDir, featureName);
|
|
54
|
+
await this.ensureSingleActiveMode(targetDir, placement, featureName);
|
|
53
55
|
await services_1.services.fileService.ensureDir(path.join(targetDir, constants_1.DIR_NAMES.CHANGES, placement));
|
|
54
56
|
await services_1.services.fileService.ensureDir(featureDir);
|
|
55
57
|
const config = await services_1.services.configManager.loadConfig(targetDir);
|
|
@@ -229,6 +231,24 @@ class NewCommand extends BaseCommand_1.BaseCommand {
|
|
|
229
231
|
}
|
|
230
232
|
throw new Error(`Change ${featureName} already exists in ${conflicts.join(' and ')}. Continue the existing change instead of creating a duplicate.`);
|
|
231
233
|
}
|
|
234
|
+
async ensureSingleActiveMode(targetDir, placement, featureName) {
|
|
235
|
+
if (placement !== constants_1.DIR_NAMES.ACTIVE) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const activeNames = await services_1.services.projectService.listActiveChangeNames(targetDir);
|
|
239
|
+
if (activeNames.length === 0) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (activeNames.length === 1) {
|
|
243
|
+
const activeName = activeNames[0];
|
|
244
|
+
const activeChangePath = path.join(targetDir, constants_1.DIR_NAMES.CHANGES, constants_1.DIR_NAMES.ACTIVE, activeName);
|
|
245
|
+
const progressCommand = (0, helpers_1.formatCliCommand)('ospec', 'progress', activeChangePath);
|
|
246
|
+
const queueCommand = (0, helpers_1.formatCliCommand)('ospec', 'queue', 'add', featureName, targetDir);
|
|
247
|
+
throw new Error(`A single active change is the default workflow, but "${activeName}" is already active. Continue it with "${progressCommand}" or create queued work explicitly with "${queueCommand}".`);
|
|
248
|
+
}
|
|
249
|
+
const queueCommand = (0, helpers_1.formatCliCommand)('ospec', 'queue', 'add', featureName, targetDir);
|
|
250
|
+
throw new Error(`A single active change is the default workflow, but ${activeNames.length} active changes already exist: ${activeNames.join(', ')}. Resolve the repository back to one active change before creating another, or add new work with "${queueCommand}".`);
|
|
251
|
+
}
|
|
232
252
|
async writePluginArtifacts(featureDir, activatedSteps) {
|
|
233
253
|
const checkpointSteps = activatedSteps.filter(step => step === 'checkpoint_ui_review' || step === 'checkpoint_flow_check');
|
|
234
254
|
if (checkpointSteps.length > 0) {
|
|
@@ -5,6 +5,7 @@ const child_process_1 = require("child_process");
|
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const gray_matter_1 = require("gray-matter");
|
|
7
7
|
const constants_1 = require("../core/constants");
|
|
8
|
+
const helpers_1 = require("../utils/helpers");
|
|
8
9
|
const BaseCommand_1 = require("./BaseCommand");
|
|
9
10
|
const services_1 = require("../services");
|
|
10
11
|
const subcommandHelp_1 = require("../utils/subcommandHelp");
|
|
@@ -162,7 +163,7 @@ class PluginsCommand extends BaseCommand_1.BaseCommand {
|
|
|
162
163
|
if (plugin.runner.extraEnvCount > 0) {
|
|
163
164
|
console.log(` Extra env entries: ${plugin.runner.extraEnvCount}`);
|
|
164
165
|
}
|
|
165
|
-
console.log(` Doctor: ospec plugins doctor
|
|
166
|
+
console.log(` Doctor: ${(0, helpers_1.formatCliCommand)('ospec', 'plugins', 'doctor', plugin.name, projectPath)}`);
|
|
166
167
|
}
|
|
167
168
|
console.log();
|
|
168
169
|
});
|
|
@@ -231,7 +232,7 @@ class PluginsCommand extends BaseCommand_1.BaseCommand {
|
|
|
231
232
|
this.info(` codex model: ${this.getStitchCodexConfig(nextConfig.plugins.stitch).model || '(cli default)'}`);
|
|
232
233
|
if (enabled) {
|
|
233
234
|
this.info(` token env: ${nextConfig.plugins.stitch.runner.token_env || '(not required)'}`);
|
|
234
|
-
this.info(` doctor: ospec plugins doctor stitch
|
|
235
|
+
this.info(` doctor: ${(0, helpers_1.formatCliCommand)('ospec', 'plugins', 'doctor', 'stitch', projectPath)}`);
|
|
235
236
|
}
|
|
236
237
|
this.info(' Affects new changes by default; update existing changes manually if needed');
|
|
237
238
|
return;
|
|
@@ -311,7 +312,7 @@ class PluginsCommand extends BaseCommand_1.BaseCommand {
|
|
|
311
312
|
this.info(` runner.command: ${nextConfig.plugins.checkpoint.runner.command || '(built-in adapter)'}`);
|
|
312
313
|
this.info(` stitch integration: ${nextConfig.plugins.checkpoint.stitch_integration.enabled ? 'enabled' : 'disabled'}`);
|
|
313
314
|
if (enabled) {
|
|
314
|
-
this.info(` doctor: ospec plugins doctor checkpoint
|
|
315
|
+
this.info(` doctor: ${(0, helpers_1.formatCliCommand)('ospec', 'plugins', 'doctor', 'checkpoint', projectPath)}`);
|
|
315
316
|
}
|
|
316
317
|
this.info(' Affects new changes by default; update existing changes manually if needed');
|
|
317
318
|
return;
|
|
@@ -16,6 +16,8 @@ const path_1 = __importDefault(require("path"));
|
|
|
16
16
|
|
|
17
17
|
const services_1 = require("../services");
|
|
18
18
|
|
|
19
|
+
const helpers_1 = require("../utils/helpers");
|
|
20
|
+
|
|
19
21
|
const subcommandHelp_1 = require("../utils/subcommandHelp");
|
|
20
22
|
|
|
21
23
|
const BaseCommand_1 = require("./BaseCommand");
|
|
@@ -554,7 +556,7 @@ class SkillCommand extends BaseCommand_1.BaseCommand {
|
|
|
554
556
|
|
|
555
557
|
if (!result.inSync) {
|
|
556
558
|
|
|
557
|
-
console.log(`\nRecommendation: run "ospec skill
|
|
559
|
+
console.log(`\nRecommendation: run "${(0, helpers_1.formatCliCommand)('ospec', 'skill', this.getInstallAction(provider), result.skillName, selection.targetDir)}" to sync this skill.`);
|
|
558
560
|
|
|
559
561
|
}
|
|
560
562
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StatusCommand = void 0;
|
|
4
|
+
const path = require("path");
|
|
4
5
|
const services_1 = require("../services");
|
|
6
|
+
const helpers_1 = require("../utils/helpers");
|
|
5
7
|
const BaseCommand_1 = require("./BaseCommand");
|
|
6
8
|
class StatusCommand extends BaseCommand_1.BaseCommand {
|
|
7
9
|
async execute(projectPath) {
|
|
@@ -85,6 +87,9 @@ class StatusCommand extends BaseCommand_1.BaseCommand {
|
|
|
85
87
|
console.log(` ${status}: ${count}`);
|
|
86
88
|
}
|
|
87
89
|
console.log(`Protocol summary: PASS ${changes.totals.pass} | WARN ${changes.totals.warn} | FAIL ${changes.totals.fail}`);
|
|
90
|
+
if (execution.totalActiveChanges > 1) {
|
|
91
|
+
console.log('Workflow warning: multiple active changes detected. The default workflow expects one active change unless you are explicitly managing extra work as queued changes.');
|
|
92
|
+
}
|
|
88
93
|
if (execution.activeChanges.length > 0) {
|
|
89
94
|
console.log('\nCurrent changes:');
|
|
90
95
|
for (const change of execution.activeChanges) {
|
|
@@ -120,37 +125,46 @@ class StatusCommand extends BaseCommand_1.BaseCommand {
|
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
127
|
getRecommendedNextSteps(projectPath, structure, docs, execution, queuedChanges, runReport) {
|
|
128
|
+
const formatCommand = (...args) => (0, helpers_1.formatCliCommand)('ospec', ...args);
|
|
123
129
|
if (!structure.initialized) {
|
|
124
130
|
return [
|
|
125
|
-
`Run "
|
|
131
|
+
`Run "${formatCommand('init', projectPath)}" to initialize the repository to a change-ready state.`,
|
|
126
132
|
];
|
|
127
133
|
}
|
|
128
134
|
if (docs.missingRequired.length > 0 || docs.coverage < 100) {
|
|
129
135
|
return [
|
|
130
136
|
'The repository is initialized, but the project knowledge layer is still incomplete.',
|
|
131
|
-
`Run "
|
|
132
|
-
`If you only want to refresh or repair docs without rerunning full init messaging, use "
|
|
137
|
+
`Run "${formatCommand('init', projectPath)}" to reconcile the repository back to change-ready state and regenerate missing project knowledge docs.`,
|
|
138
|
+
`If you only want to refresh or repair docs without rerunning full init messaging, use "${formatCommand('docs', 'generate', projectPath)}".`,
|
|
133
139
|
];
|
|
134
140
|
}
|
|
135
141
|
if (execution.totalActiveChanges === 0 && queuedChanges.length === 0) {
|
|
136
142
|
return [
|
|
137
|
-
`Or run "
|
|
143
|
+
`Or run "${formatCommand('new', '<change-name>', projectPath)}" if you want to create the first change from CLI.`,
|
|
138
144
|
];
|
|
139
145
|
}
|
|
140
146
|
if (execution.totalActiveChanges === 0 && queuedChanges.length > 0) {
|
|
141
147
|
return [
|
|
142
148
|
`There is no active change right now, but ${queuedChanges.length} queued change(s) are waiting.`,
|
|
143
|
-
`Run "
|
|
144
|
-
`Or run "
|
|
149
|
+
`Run "${formatCommand('queue', 'next', projectPath)}" if you want to activate the next queued change manually.`,
|
|
150
|
+
`Or run "${formatCommand('run', 'start', projectPath)}" to begin explicit queue tracking.`,
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
if (execution.totalActiveChanges > 1) {
|
|
154
|
+
return [
|
|
155
|
+
`Multiple active changes are present. The default workflow expects one active change, but ${execution.totalActiveChanges} were found.`,
|
|
156
|
+
`Resolve the repository back to a single active change before using "${formatCommand('run', 'start', projectPath)}".`,
|
|
157
|
+
`For additional work, create queued changes explicitly with "${formatCommand('queue', 'add', '<change-name>', projectPath)}".`,
|
|
145
158
|
];
|
|
146
159
|
}
|
|
147
160
|
const currentChange = execution.activeChanges[0];
|
|
161
|
+
const currentChangePath = path.join(projectPath, 'changes', 'active', currentChange.name);
|
|
148
162
|
const nextSteps = [
|
|
149
|
-
`Continue the active change "${currentChange.name}" with "
|
|
150
|
-
`Run "
|
|
163
|
+
`Continue the active change "${currentChange.name}" with "${formatCommand('progress', currentChangePath)}".`,
|
|
164
|
+
`Run "${formatCommand('verify', currentChangePath)}" before trying to archive it.`,
|
|
151
165
|
];
|
|
152
166
|
if (queuedChanges.length > 0) {
|
|
153
|
-
nextSteps.push(`There are ${queuedChanges.length} queued change(s) waiting behind the active one. Use "
|
|
167
|
+
nextSteps.push(`There are ${queuedChanges.length} queued change(s) waiting behind the active one. Use "${formatCommand('run', runReport.currentRun ? 'step' : 'start', projectPath)}" when you want explicit queue progression.`);
|
|
154
168
|
}
|
|
155
169
|
return nextSteps;
|
|
156
170
|
}
|
package/dist/utils/helpers.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
//# sourceMappingURL=helpers.d.ts.map
|
|
1
|
+
export declare function quoteCliArg(value: string): string;
|
|
2
|
+
export declare function formatCliCommand(...args: Array<string | null | undefined>): string;
|
|
3
|
+
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/utils/helpers.js
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatCliCommand = exports.quoteCliArg = void 0;
|
|
4
|
+
function quoteCliArg(value) {
|
|
5
|
+
const text = String(value ?? '');
|
|
6
|
+
if (text.length === 0) {
|
|
7
|
+
return '""';
|
|
8
|
+
}
|
|
9
|
+
return /\s/.test(text) ? `"${text.replace(/"/g, '\\"')}"` : text;
|
|
10
|
+
}
|
|
11
|
+
exports.quoteCliArg = quoteCliArg;
|
|
12
|
+
function formatCliCommand(...args) {
|
|
13
|
+
return args
|
|
14
|
+
.filter((arg) => arg !== undefined && arg !== null && arg !== '')
|
|
15
|
+
.map((arg, index) => {
|
|
16
|
+
const text = String(arg);
|
|
17
|
+
return index === 0 ? text : quoteCliArg(text);
|
|
18
|
+
})
|
|
19
|
+
.join(' ');
|
|
20
|
+
}
|
|
21
|
+
exports.formatCliCommand = formatCliCommand;
|
|
22
|
+
//# sourceMappingURL=helpers.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawplays/ospec-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "CLI tool for enforcing ospec workflow",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"index:rebuild": "node dist/tools/build-index.js",
|
|
22
22
|
"validate": "node dist/cli/commands/validate.js",
|
|
23
23
|
"release:smoke": "node scripts/release-smoke.js",
|
|
24
|
+
"release:notes": "node scripts/release-notes.js",
|
|
24
25
|
"release:sync-version": "node scripts/sync-version.js",
|
|
25
26
|
"release:bump:patch": "npm version patch --no-git-tag-version",
|
|
26
27
|
"release:bump:minor": "npm version minor --no-git-tag-version",
|