@proletariat/cli 0.3.57 → 0.3.59
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/dist/commands/{spec/view.d.ts → dashboard/index.d.ts} +4 -6
- package/dist/commands/dashboard/index.js +117 -0
- package/dist/commands/dashboard/index.js.map +1 -0
- package/dist/commands/execution/config.js +5 -4
- package/dist/commands/execution/config.js.map +1 -1
- package/dist/commands/execution/stop.js +4 -2
- package/dist/commands/execution/stop.js.map +1 -1
- package/dist/commands/execution/view.js +3 -0
- package/dist/commands/execution/view.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +40 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp-server.js +1 -2
- package/dist/commands/mcp-server.js.map +1 -1
- package/dist/commands/media/add.d.ts +19 -0
- package/dist/commands/media/add.js +94 -0
- package/dist/commands/media/add.js.map +1 -0
- package/dist/commands/{spec → media}/index.d.ts +1 -1
- package/dist/commands/media/index.js +85 -0
- package/dist/commands/media/index.js.map +1 -0
- package/dist/commands/{spec/link/remove.d.ts → media/list.d.ts} +3 -6
- package/dist/commands/media/list.js +89 -0
- package/dist/commands/media/list.js.map +1 -0
- package/dist/commands/media/preprocess.d.ts +19 -0
- package/dist/commands/media/preprocess.js +91 -0
- package/dist/commands/media/preprocess.js.map +1 -0
- package/dist/commands/{spec/delete.d.ts → media/remove.d.ts} +2 -2
- package/dist/commands/media/remove.js +101 -0
- package/dist/commands/media/remove.js.map +1 -0
- package/dist/commands/{spec/link/index.d.ts → media/show.d.ts} +3 -3
- package/dist/commands/media/show.js +122 -0
- package/dist/commands/media/show.js.map +1 -0
- package/dist/commands/orchestrator/start.js +5 -0
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/session/exec.d.ts +19 -0
- package/dist/commands/session/exec.js +205 -0
- package/dist/commands/session/exec.js.map +1 -0
- package/dist/commands/session/index.js +12 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/commands/{spec/link/depends.d.ts → session/inspect.d.ts} +4 -4
- package/dist/commands/session/inspect.js +316 -0
- package/dist/commands/session/inspect.js.map +1 -0
- package/dist/commands/session/peek.d.ts +15 -0
- package/dist/commands/session/peek.js +141 -8
- package/dist/commands/session/peek.js.map +1 -1
- package/dist/commands/session/poke.d.ts +4 -1
- package/dist/commands/session/poke.js +175 -20
- package/dist/commands/session/poke.js.map +1 -1
- package/dist/commands/session/restart.d.ts +20 -0
- package/dist/commands/session/restart.js +320 -0
- package/dist/commands/session/restart.js.map +1 -0
- package/dist/commands/tools/add.d.ts +20 -0
- package/dist/commands/tools/add.js +129 -0
- package/dist/commands/tools/add.js.map +1 -0
- package/dist/commands/tools/check.d.ts +10 -0
- package/dist/commands/tools/check.js +75 -0
- package/dist/commands/tools/check.js.map +1 -0
- package/dist/commands/tools/detect.d.ts +11 -0
- package/dist/commands/tools/detect.js +107 -0
- package/dist/commands/tools/detect.js.map +1 -0
- package/dist/commands/tools/index.d.ts +11 -0
- package/dist/commands/tools/index.js +87 -0
- package/dist/commands/tools/index.js.map +1 -0
- package/dist/commands/tools/remove.d.ts +13 -0
- package/dist/commands/tools/remove.js +55 -0
- package/dist/commands/tools/remove.js.map +1 -0
- package/dist/commands/trello/configure.d.ts +16 -0
- package/dist/commands/trello/configure.js +259 -0
- package/dist/commands/trello/configure.js.map +1 -0
- package/dist/commands/{spec/plan.d.ts → trello/import.d.ts} +3 -5
- package/dist/commands/trello/import.js +241 -0
- package/dist/commands/trello/import.js.map +1 -0
- package/dist/commands/{spec/ticket.d.ts → trello/sync.d.ts} +5 -6
- package/dist/commands/trello/sync.js +190 -0
- package/dist/commands/trello/sync.js.map +1 -0
- package/dist/commands/work/start.d.ts +2 -0
- package/dist/commands/work/start.js +27 -41
- package/dist/commands/work/start.js.map +1 -1
- package/dist/lib/dashboard/data.d.ts +64 -0
- package/dist/lib/dashboard/data.js +259 -0
- package/dist/lib/dashboard/data.js.map +1 -0
- package/dist/lib/dashboard/html.d.ts +7 -0
- package/dist/lib/dashboard/html.js +682 -0
- package/dist/lib/dashboard/html.js.map +1 -0
- package/dist/lib/dashboard/server.d.ts +20 -0
- package/dist/lib/dashboard/server.js +114 -0
- package/dist/lib/dashboard/server.js.map +1 -0
- package/dist/lib/database/index.d.ts +49 -1
- package/dist/lib/database/index.js +127 -0
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/execution/config.d.ts +8 -0
- package/dist/lib/execution/config.js +83 -4
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/runners.d.ts +60 -4
- package/dist/lib/execution/runners.js +398 -79
- package/dist/lib/execution/runners.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +4 -2
- package/dist/lib/execution/spawner.js +54 -47
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/types.d.ts +27 -5
- package/dist/lib/execution/types.js +24 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/external-issues/adapters.d.ts +17 -0
- package/dist/lib/external-issues/adapters.js +88 -0
- package/dist/lib/external-issues/adapters.js.map +1 -1
- package/dist/lib/external-issues/mapping-store.js +1 -1
- package/dist/lib/external-issues/shortcut.js +2 -1
- package/dist/lib/external-issues/shortcut.js.map +1 -1
- package/dist/lib/external-issues/trello.d.ts +80 -0
- package/dist/lib/external-issues/trello.js +266 -0
- package/dist/lib/external-issues/trello.js.map +1 -0
- package/dist/lib/external-issues/types.d.ts +3 -3
- package/dist/lib/external-issues/types.js +1 -1
- package/dist/lib/external-issues/types.js.map +1 -1
- package/dist/lib/linear/client.d.ts +4 -3
- package/dist/lib/linear/client.js +185 -122
- package/dist/lib/linear/client.js.map +1 -1
- package/dist/lib/mcp/tools/cli-passthrough.js +77 -0
- package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
- package/dist/lib/mcp/tools/index.d.ts +0 -1
- package/dist/lib/mcp/tools/index.js +0 -1
- package/dist/lib/mcp/tools/index.js.map +1 -1
- package/dist/lib/media/index.d.ts +91 -0
- package/dist/lib/media/index.js +475 -0
- package/dist/lib/media/index.js.map +1 -0
- package/dist/lib/onboarding/detect-tools.d.ts +15 -0
- package/dist/lib/onboarding/detect-tools.js +44 -0
- package/dist/lib/onboarding/detect-tools.js.map +1 -0
- package/dist/lib/onboarding/index.d.ts +2 -0
- package/dist/lib/onboarding/index.js +3 -0
- package/dist/lib/onboarding/index.js.map +1 -0
- package/dist/lib/onboarding/wizard.d.ts +25 -0
- package/dist/lib/onboarding/wizard.js +156 -0
- package/dist/lib/onboarding/wizard.js.map +1 -0
- package/dist/lib/pmo/schema.d.ts +2 -1
- package/dist/lib/pmo/schema.js +3 -1
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/runners/claude-code-runner.js +6 -0
- package/dist/lib/runners/claude-code-runner.js.map +1 -1
- package/dist/lib/tool-registry/detect.d.ts +20 -0
- package/dist/lib/tool-registry/detect.js +95 -0
- package/dist/lib/tool-registry/detect.js.map +1 -0
- package/dist/lib/tool-registry/index.d.ts +10 -0
- package/dist/lib/tool-registry/index.js +13 -0
- package/dist/lib/tool-registry/index.js.map +1 -0
- package/dist/lib/tool-registry/policy.d.ts +32 -0
- package/dist/lib/tool-registry/policy.js +97 -0
- package/dist/lib/tool-registry/policy.js.map +1 -0
- package/dist/lib/tool-registry/registry.d.ts +42 -0
- package/dist/lib/tool-registry/registry.js +120 -0
- package/dist/lib/tool-registry/registry.js.map +1 -0
- package/dist/lib/tool-registry/spawn.d.ts +50 -0
- package/dist/lib/tool-registry/spawn.js +103 -0
- package/dist/lib/tool-registry/spawn.js.map +1 -0
- package/dist/lib/tool-registry/types.d.ts +56 -0
- package/dist/lib/tool-registry/types.js +109 -0
- package/dist/lib/tool-registry/types.js.map +1 -0
- package/dist/lib/trello/client.d.ts +23 -0
- package/dist/lib/trello/client.js +114 -0
- package/dist/lib/trello/client.js.map +1 -0
- package/dist/lib/trello/config.d.ts +55 -0
- package/dist/lib/trello/config.js +127 -0
- package/dist/lib/trello/config.js.map +1 -0
- package/dist/lib/trello/index.d.ts +5 -0
- package/dist/lib/trello/index.js +5 -0
- package/dist/lib/trello/index.js.map +1 -0
- package/dist/lib/trello/mapper.d.ts +13 -0
- package/dist/lib/trello/mapper.js +71 -0
- package/dist/lib/trello/mapper.js.map +1 -0
- package/dist/lib/trello/sync.d.ts +13 -0
- package/dist/lib/trello/sync.js +38 -0
- package/dist/lib/trello/sync.js.map +1 -0
- package/dist/lib/trello/types.d.ts +53 -0
- package/dist/lib/trello/types.js +2 -0
- package/dist/lib/trello/types.js.map +1 -0
- package/dist/lib/work-source/client.js +17 -0
- package/dist/lib/work-source/client.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +6 -1
- package/dist/lib/work-source/config.js +30 -1
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/index.d.ts +1 -1
- package/dist/lib/work-source/index.js +1 -1
- package/dist/lib/work-source/index.js.map +1 -1
- package/oclif.manifest.json +6524 -6171
- package/package.json +6 -2
- package/dist/commands/spec/create.d.ts +0 -20
- package/dist/commands/spec/create.js +0 -171
- package/dist/commands/spec/create.js.map +0 -1
- package/dist/commands/spec/delete.js +0 -112
- package/dist/commands/spec/delete.js.map +0 -1
- package/dist/commands/spec/edit.d.ts +0 -23
- package/dist/commands/spec/edit.js +0 -262
- package/dist/commands/spec/edit.js.map +0 -1
- package/dist/commands/spec/index.js +0 -88
- package/dist/commands/spec/index.js.map +0 -1
- package/dist/commands/spec/link/depends.js +0 -87
- package/dist/commands/spec/link/depends.js.map +0 -1
- package/dist/commands/spec/link/index.js +0 -93
- package/dist/commands/spec/link/index.js.map +0 -1
- package/dist/commands/spec/link/remove.js +0 -91
- package/dist/commands/spec/link/remove.js.map +0 -1
- package/dist/commands/spec/list.d.ts +0 -14
- package/dist/commands/spec/list.js +0 -101
- package/dist/commands/spec/list.js.map +0 -1
- package/dist/commands/spec/plan.js +0 -102
- package/dist/commands/spec/plan.js.map +0 -1
- package/dist/commands/spec/ticket.js +0 -144
- package/dist/commands/spec/ticket.js.map +0 -1
- package/dist/commands/spec/view.js +0 -202
- package/dist/commands/spec/view.js.map +0 -1
- package/dist/lib/mcp/tools/spec.d.ts +0 -6
- package/dist/lib/mcp/tools/spec.js +0 -197
- package/dist/lib/mcp/tools/spec.js.map +0 -1
- package/dist/lib/pmo/spec-parser.d.ts +0 -25
- package/dist/lib/pmo/spec-parser.js +0 -206
- package/dist/lib/pmo/spec-parser.js.map +0 -1
- package/dist/lib/pmo/spec-types.d.ts +0 -43
- package/dist/lib/pmo/spec-types.js +0 -8
- package/dist/lib/pmo/spec-types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proletariat/cli",
|
|
3
3
|
"description": "Agent orchestration platform for AI labor - Spin up workers on demand for multi-agent development",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.59",
|
|
5
5
|
"author": "Chris McDermut",
|
|
6
6
|
"mcpName": "io.github.chrismcdermut/proletariat-cli",
|
|
7
7
|
"publishConfig": {
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
"bugs": "https://github.com/chrismcdermut/proletariat/issues",
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@inkjs/ui": "^2.0.0",
|
|
16
|
-
"@linear/sdk": "^76.0.0",
|
|
17
16
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
18
17
|
"@oclif/core": "^4",
|
|
19
18
|
"@oclif/plugin-autocomplete": "^3",
|
|
@@ -30,6 +29,7 @@
|
|
|
30
29
|
"ink": "^5.0.1",
|
|
31
30
|
"ink-select-input": "^6.0.0",
|
|
32
31
|
"inquirer": "^8.2.5",
|
|
32
|
+
"js-yaml": "^4.1.1",
|
|
33
33
|
"react": "^18.0.0",
|
|
34
34
|
"string-width": "^8.1.1",
|
|
35
35
|
"zod": "^4.3.6"
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"@types/ink-spinner": "^3.0.5",
|
|
44
44
|
"@types/inquirer": "^8.2.6",
|
|
45
45
|
"@types/jest": "^30.0.0",
|
|
46
|
+
"@types/js-yaml": "^4.0.9",
|
|
46
47
|
"@types/mocha": "^10",
|
|
47
48
|
"@types/node": "^20",
|
|
48
49
|
"@types/react": "^18",
|
|
@@ -126,6 +127,9 @@
|
|
|
126
127
|
"test": "mocha --forbid-only \"test/**/*.test.ts\"",
|
|
127
128
|
"test:unit": "mocha --forbid-only \"test/unit/**/*.test.ts\"",
|
|
128
129
|
"test:e2e": "mocha --forbid-only \"test/e2e/**/*.test.ts\"",
|
|
130
|
+
"test:smoke": "mocha --forbid-only --grep @smoke \"test/**/*.test.ts\"",
|
|
131
|
+
"test:smoke:unit": "mocha --forbid-only --grep @smoke \"test/unit/**/*.test.ts\"",
|
|
132
|
+
"test:smoke:e2e": "mocha --forbid-only --grep @smoke \"test/e2e/**/*.test.ts\"",
|
|
129
133
|
"test:e2e:pmo": "mocha --forbid-only \"test/e2e/pmo-*.test.ts\"",
|
|
130
134
|
"test:e2e:interactive": "mocha --forbid-only --timeout 120000 \"test/e2e/interactive-menu.test.ts\"",
|
|
131
135
|
"test:commands": "mocha --forbid-only \"test/commands/**/*.test.ts\"",
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
export default class SpecCreate extends PMOCommand {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static args: {
|
|
6
|
-
title: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
-
};
|
|
8
|
-
static flags: {
|
|
9
|
-
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
status: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
problem: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
-
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
-
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
|
-
};
|
|
19
|
-
execute(): Promise<void>;
|
|
20
|
-
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { Flags, Args } from '@oclif/core';
|
|
2
|
-
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
-
import { styles } from '../../lib/styles.js';
|
|
4
|
-
import { slugify } from '../../lib/pmo/utils.js';
|
|
5
|
-
import { shouldOutputJson, outputDryRunSuccessAsJson, outputDryRunErrorsAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
6
|
-
import { FlagResolver } from '../../lib/flags/index.js';
|
|
7
|
-
export default class SpecCreate extends PMOCommand {
|
|
8
|
-
static description = 'Create a new spec';
|
|
9
|
-
static examples = [
|
|
10
|
-
'<%= config.bin %> <%= command.id %> "User Authentication"',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> --title "API Design" --type product',
|
|
12
|
-
'<%= config.bin %> <%= command.id %> -i # Interactive mode',
|
|
13
|
-
'<%= config.bin %> <%= command.id %> --title "Test" --dry-run --json # Validate without creating',
|
|
14
|
-
];
|
|
15
|
-
static args = {
|
|
16
|
-
title: Args.string({
|
|
17
|
-
description: 'Spec title',
|
|
18
|
-
required: false,
|
|
19
|
-
}),
|
|
20
|
-
};
|
|
21
|
-
static flags = {
|
|
22
|
-
...pmoBaseFlags,
|
|
23
|
-
title: Flags.string({
|
|
24
|
-
char: 't',
|
|
25
|
-
description: 'Spec title [required for non-interactive]',
|
|
26
|
-
}),
|
|
27
|
-
status: Flags.string({
|
|
28
|
-
char: 's',
|
|
29
|
-
description: 'Spec status',
|
|
30
|
-
options: ['draft', 'active', 'implemented'],
|
|
31
|
-
default: 'draft',
|
|
32
|
-
}),
|
|
33
|
-
type: Flags.string({
|
|
34
|
-
description: 'Spec type',
|
|
35
|
-
options: ['product', 'platform', 'infra', 'integration'],
|
|
36
|
-
}),
|
|
37
|
-
problem: Flags.string({
|
|
38
|
-
description: 'Problem statement',
|
|
39
|
-
}),
|
|
40
|
-
interactive: Flags.boolean({
|
|
41
|
-
char: 'i',
|
|
42
|
-
description: 'Interactive mode',
|
|
43
|
-
default: false,
|
|
44
|
-
}),
|
|
45
|
-
'dry-run': Flags.boolean({
|
|
46
|
-
description: 'Validate inputs without creating spec (use with --json for structured output)',
|
|
47
|
-
default: false,
|
|
48
|
-
}),
|
|
49
|
-
};
|
|
50
|
-
async execute() {
|
|
51
|
-
const { args, flags } = await this.parse(SpecCreate);
|
|
52
|
-
// Check if JSON output mode is active
|
|
53
|
-
const jsonMode = shouldOutputJson(flags);
|
|
54
|
-
// Build choices for prompts
|
|
55
|
-
const typeChoices = [
|
|
56
|
-
{ name: 'Product (user-facing feature)', value: 'product' },
|
|
57
|
-
{ name: 'Platform (internal tooling)', value: 'platform' },
|
|
58
|
-
{ name: 'Infra (technical infrastructure)', value: 'infra' },
|
|
59
|
-
{ name: 'Integration (external service)', value: 'integration' },
|
|
60
|
-
{ name: 'None', value: '' },
|
|
61
|
-
];
|
|
62
|
-
const statusChoices = [
|
|
63
|
-
{ name: 'Draft (planning)', value: 'draft' },
|
|
64
|
-
{ name: 'Active (in progress)', value: 'active' },
|
|
65
|
-
{ name: 'Implemented (complete)', value: 'implemented' },
|
|
66
|
-
];
|
|
67
|
-
// Use FlagResolver for all fields
|
|
68
|
-
const resolver = new FlagResolver({
|
|
69
|
-
commandName: 'spec create',
|
|
70
|
-
baseCommand: 'prlt spec create',
|
|
71
|
-
jsonMode,
|
|
72
|
-
flags: {
|
|
73
|
-
title: args.title || flags.title,
|
|
74
|
-
type: flags.type,
|
|
75
|
-
status: flags.status || 'draft',
|
|
76
|
-
problem: flags.problem,
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
// Only prompt if interactive mode or no title provided
|
|
80
|
-
const needsPrompts = flags.interactive || (!args.title && !flags.title);
|
|
81
|
-
if (needsPrompts) {
|
|
82
|
-
resolver.addPrompt({
|
|
83
|
-
flagName: 'title',
|
|
84
|
-
type: 'input',
|
|
85
|
-
message: 'Spec title:',
|
|
86
|
-
validate: (value) => value.trim() ? true : 'Title cannot be empty',
|
|
87
|
-
when: (ctx) => !ctx.flags.title,
|
|
88
|
-
});
|
|
89
|
-
resolver.addPrompt({
|
|
90
|
-
flagName: 'type',
|
|
91
|
-
type: 'list',
|
|
92
|
-
message: 'Spec type:',
|
|
93
|
-
choices: () => typeChoices,
|
|
94
|
-
when: (ctx) => !ctx.flags.type && ctx.flags.title !== undefined,
|
|
95
|
-
});
|
|
96
|
-
resolver.addPrompt({
|
|
97
|
-
flagName: 'status',
|
|
98
|
-
type: 'list',
|
|
99
|
-
message: 'Status:',
|
|
100
|
-
choices: () => statusChoices,
|
|
101
|
-
default: 'draft',
|
|
102
|
-
when: (ctx) => ctx.flags.title !== undefined,
|
|
103
|
-
});
|
|
104
|
-
resolver.addPrompt({
|
|
105
|
-
flagName: 'problem',
|
|
106
|
-
type: 'multiline',
|
|
107
|
-
message: 'Problem statement (optional):',
|
|
108
|
-
when: (ctx) => ctx.flags.title !== undefined,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
const resolved = await resolver.resolve();
|
|
112
|
-
// Convert empty type to undefined
|
|
113
|
-
const specType = resolved.type === '' ? undefined : resolved.type;
|
|
114
|
-
// Generate ID from title
|
|
115
|
-
const specId = slugify(resolved.title);
|
|
116
|
-
// Check if spec already exists
|
|
117
|
-
const existing = await this.storage.getSpec(specId);
|
|
118
|
-
if (existing) {
|
|
119
|
-
if (flags['dry-run']) {
|
|
120
|
-
if (jsonMode) {
|
|
121
|
-
outputDryRunErrorsAsJson([{ field: 'id', error: `Spec "${specId}" already exists` }], createMetadata('spec create', flags));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
this.error(`Spec "${specId}" already exists.`);
|
|
125
|
-
}
|
|
126
|
-
// Handle dry-run: show what would be created without actually creating
|
|
127
|
-
if (flags['dry-run']) {
|
|
128
|
-
const wouldCreate = {
|
|
129
|
-
id: specId,
|
|
130
|
-
title: resolved.title,
|
|
131
|
-
status: resolved.status || 'draft',
|
|
132
|
-
...(specType && { type: specType }),
|
|
133
|
-
...(resolved.problem && { problem: resolved.problem }),
|
|
134
|
-
};
|
|
135
|
-
if (jsonMode) {
|
|
136
|
-
outputDryRunSuccessAsJson('spec', wouldCreate, createMetadata('spec create', flags));
|
|
137
|
-
}
|
|
138
|
-
// Human-readable dry-run output
|
|
139
|
-
this.log(styles.warning('\n[DRY RUN] Would create spec:'));
|
|
140
|
-
this.log(styles.muted(` ID: ${specId}`));
|
|
141
|
-
this.log(styles.muted(` Title: ${resolved.title}`));
|
|
142
|
-
this.log(styles.muted(` Status: ${resolved.status || 'draft'}`));
|
|
143
|
-
if (specType) {
|
|
144
|
-
this.log(styles.muted(` Type: ${specType}`));
|
|
145
|
-
}
|
|
146
|
-
if (resolved.problem) {
|
|
147
|
-
this.log(styles.muted(` Problem: ${resolved.problem}`));
|
|
148
|
-
}
|
|
149
|
-
this.log(styles.muted('\n(No spec was created)'));
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
// Create spec in database
|
|
153
|
-
const spec = await this.storage.createSpec({
|
|
154
|
-
id: specId,
|
|
155
|
-
title: resolved.title,
|
|
156
|
-
status: resolved.status || 'draft',
|
|
157
|
-
type: specType,
|
|
158
|
-
problem: resolved.problem || undefined,
|
|
159
|
-
});
|
|
160
|
-
this.log(styles.success(`\n✅ Created spec "${styles.emphasis(spec.title)}"`));
|
|
161
|
-
this.log(styles.muted(` ID: ${spec.id}`));
|
|
162
|
-
this.log(styles.muted(` Status: ${spec.status}`));
|
|
163
|
-
if (spec.type)
|
|
164
|
-
this.log(styles.muted(` Type: ${spec.type}`));
|
|
165
|
-
this.log(styles.muted(`\nNext steps:`));
|
|
166
|
-
this.log(styles.muted(` 1. prlt spec view ${spec.id}`));
|
|
167
|
-
this.log(styles.muted(` 2. prlt spec edit ${spec.id} (to add details)`));
|
|
168
|
-
this.log(styles.muted(` 3. prlt spec plan ${spec.id} (to generate tickets)`));
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=create.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/spec/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
-
import { styles } from '../../lib/styles.js';
|
|
4
|
-
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
|
-
import { FlagResolver } from '../../lib/flags/index.js';
|
|
6
|
-
export default class SpecDelete extends PMOCommand {
|
|
7
|
-
static description = 'Delete a spec';
|
|
8
|
-
static examples = [
|
|
9
|
-
'<%= config.bin %> <%= command.id %> my-spec',
|
|
10
|
-
'<%= config.bin %> <%= command.id %> my-spec --force',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> # Interactive selection',
|
|
12
|
-
];
|
|
13
|
-
static args = {
|
|
14
|
-
id: Args.string({
|
|
15
|
-
description: 'Spec ID to delete',
|
|
16
|
-
required: false,
|
|
17
|
-
}),
|
|
18
|
-
};
|
|
19
|
-
static flags = {
|
|
20
|
-
...pmoBaseFlags,
|
|
21
|
-
force: Flags.boolean({
|
|
22
|
-
char: 'f',
|
|
23
|
-
description: 'Skip confirmation prompt',
|
|
24
|
-
default: false,
|
|
25
|
-
}),
|
|
26
|
-
};
|
|
27
|
-
getPMOOptions() {
|
|
28
|
-
return { promptIfMultiple: false };
|
|
29
|
-
}
|
|
30
|
-
async execute() {
|
|
31
|
-
const { args, flags } = await this.parse(SpecDelete);
|
|
32
|
-
const jsonMode = shouldOutputJson(flags);
|
|
33
|
-
const handleError = (code, message) => {
|
|
34
|
-
if (jsonMode) {
|
|
35
|
-
outputErrorAsJson(code, message, createMetadata('spec delete', flags));
|
|
36
|
-
this.exit(1);
|
|
37
|
-
}
|
|
38
|
-
this.error(message);
|
|
39
|
-
};
|
|
40
|
-
let specId = args.id;
|
|
41
|
-
// Interactive selection if no ID provided
|
|
42
|
-
if (!specId) {
|
|
43
|
-
const specs = await this.storage.listSpecs();
|
|
44
|
-
if (specs.length === 0) {
|
|
45
|
-
return handleError('NO_SPECS', 'No specs found');
|
|
46
|
-
}
|
|
47
|
-
const resolver = new FlagResolver({
|
|
48
|
-
commandName: 'spec delete',
|
|
49
|
-
baseCommand: 'prlt spec delete',
|
|
50
|
-
jsonMode,
|
|
51
|
-
flags: {},
|
|
52
|
-
});
|
|
53
|
-
resolver.addPrompt({
|
|
54
|
-
flagName: 'spec',
|
|
55
|
-
type: 'list',
|
|
56
|
-
message: 'Select spec to delete:',
|
|
57
|
-
choices: () => specs.map(s => ({
|
|
58
|
-
name: `${s.title} [${s.status}]${s.type ? ` (${s.type})` : ''}`,
|
|
59
|
-
value: s.id,
|
|
60
|
-
})),
|
|
61
|
-
getCommand: (value) => `prlt spec delete ${value} --json`,
|
|
62
|
-
});
|
|
63
|
-
const resolved = await resolver.resolve();
|
|
64
|
-
specId = resolved.spec;
|
|
65
|
-
}
|
|
66
|
-
// Get spec details
|
|
67
|
-
const spec = await this.storage.getSpec(specId);
|
|
68
|
-
if (!spec) {
|
|
69
|
-
return handleError('SPEC_NOT_FOUND', `Spec not found: ${specId}`);
|
|
70
|
-
}
|
|
71
|
-
// Confirmation prompt
|
|
72
|
-
if (!flags.force) {
|
|
73
|
-
const resolver = new FlagResolver({
|
|
74
|
-
commandName: 'spec delete',
|
|
75
|
-
baseCommand: `prlt spec delete ${specId}`,
|
|
76
|
-
jsonMode,
|
|
77
|
-
flags: {},
|
|
78
|
-
});
|
|
79
|
-
resolver.addPrompt({
|
|
80
|
-
flagName: 'confirmed',
|
|
81
|
-
type: 'list',
|
|
82
|
-
message: `Delete spec "${spec.title}"?`,
|
|
83
|
-
choices: () => [
|
|
84
|
-
{ name: 'No', value: false },
|
|
85
|
-
{ name: 'Yes', value: true },
|
|
86
|
-
],
|
|
87
|
-
getCommand: (value) => value
|
|
88
|
-
? `prlt spec delete ${specId} --force --json`
|
|
89
|
-
: '',
|
|
90
|
-
});
|
|
91
|
-
const resolved = await resolver.resolve();
|
|
92
|
-
if (!resolved.confirmed) {
|
|
93
|
-
this.log(styles.muted('Cancelled'));
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// Delete the spec
|
|
98
|
-
await this.storage.deleteSpec(specId);
|
|
99
|
-
// JSON response for agents
|
|
100
|
-
if (jsonMode) {
|
|
101
|
-
outputSuccessAsJson({
|
|
102
|
-
specId: spec.id,
|
|
103
|
-
title: spec.title,
|
|
104
|
-
deleted: true,
|
|
105
|
-
}, createMetadata('spec delete', flags));
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
// Human-readable response
|
|
109
|
-
this.log(styles.success(`\nDeleted spec "${styles.emphasis(spec.title)}"`));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=delete.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/spec/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,UAAU;IAChD,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;IAErC,MAAM,CAAC,QAAQ,GAAG;QAChB,6CAA6C;QAC7C,qDAAqD;QACrD,8DAA8D;KAC/D,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC;YACd,WAAW,EAAE,mBAAmB;YAChC,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,YAAY;QACf,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0BAA0B;YACvC,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEQ,aAAa;QACrB,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,OAAe,EAAS,EAAE;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;gBACvE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QAErB,0CAA0C;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,WAAW,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAoB;gBACnD,WAAW,EAAE,aAAa;gBAC1B,WAAW,EAAE,kBAAkB;gBAC/B,QAAQ;gBACR,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YAEH,QAAQ,CAAC,SAAS,CAAC;gBACjB,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,wBAAwB;gBACjC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC/D,KAAK,EAAE,CAAC,CAAC,EAAE;iBACZ,CAAC,CAAC;gBACH,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,KAAK,SAAS;aAC1D,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC;QACzB,CAAC;QAED,mBAAmB;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,WAAW,CAAC,gBAAgB,EAAE,mBAAmB,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,IAAI,YAAY,CAA0B;gBACzD,WAAW,EAAE,aAAa;gBAC1B,WAAW,EAAE,oBAAoB,MAAM,EAAE;gBACzC,QAAQ;gBACR,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YAEH,QAAQ,CAAC,SAAS,CAAC;gBACjB,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,gBAAgB,IAAI,CAAC,KAAK,IAAI;gBACvC,OAAO,EAAE,GAAG,EAAE,CAAC;oBACb,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC5B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;iBAC7B;gBACD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;oBAC1B,CAAC,CAAC,oBAAoB,MAAM,iBAAiB;oBAC7C,CAAC,CAAC,EAAE;aACP,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAE1C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAO,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,IAAI,QAAQ,EAAE,CAAC;YACb,mBAAmB,CACjB;gBACE,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI;aACd,EACD,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,CACrC,CAAC;YACF,OAAO;QACT,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
-
export default class SpecEdit extends PMOCommand {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static args: {
|
|
6
|
-
spec: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
-
};
|
|
8
|
-
static flags: {
|
|
9
|
-
spec: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
-
title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
|
-
status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
-
problem: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
-
solution: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
-
decisions: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
-
interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
17
|
-
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
-
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
19
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
20
|
-
};
|
|
21
|
-
execute(): Promise<void>;
|
|
22
|
-
private promptForEdits;
|
|
23
|
-
}
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
import { Flags, Args } from '@oclif/core';
|
|
2
|
-
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
3
|
-
import { styles } from '../../lib/styles.js';
|
|
4
|
-
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
5
|
-
import { FlagResolver } from '../../lib/flags/index.js';
|
|
6
|
-
import { multiLineInput } from '../../lib/multiline-input.js';
|
|
7
|
-
export default class SpecEdit extends PMOCommand {
|
|
8
|
-
static description = 'Edit an existing spec';
|
|
9
|
-
static examples = [
|
|
10
|
-
'<%= config.bin %> <%= command.id %> user-authentication',
|
|
11
|
-
'<%= config.bin %> <%= command.id %> --spec api-design --title "New API Design"',
|
|
12
|
-
'<%= config.bin %> <%= command.id %> user-auth --status active',
|
|
13
|
-
'<%= config.bin %> <%= command.id %> user-auth --type product --problem "Need better auth"',
|
|
14
|
-
'<%= config.bin %> <%= command.id %> -i # Interactive mode',
|
|
15
|
-
];
|
|
16
|
-
static args = {
|
|
17
|
-
spec: Args.string({
|
|
18
|
-
description: 'Spec ID to edit',
|
|
19
|
-
required: false,
|
|
20
|
-
}),
|
|
21
|
-
};
|
|
22
|
-
static flags = {
|
|
23
|
-
...pmoBaseFlags,
|
|
24
|
-
spec: Flags.string({
|
|
25
|
-
char: 's',
|
|
26
|
-
description: 'Spec ID to edit',
|
|
27
|
-
}),
|
|
28
|
-
title: Flags.string({
|
|
29
|
-
char: 't',
|
|
30
|
-
description: 'New spec title',
|
|
31
|
-
}),
|
|
32
|
-
status: Flags.string({
|
|
33
|
-
description: 'Spec status',
|
|
34
|
-
options: ['draft', 'active', 'implemented'],
|
|
35
|
-
}),
|
|
36
|
-
type: Flags.string({
|
|
37
|
-
description: 'Spec type',
|
|
38
|
-
options: ['product', 'platform', 'infra', 'integration', 'none'],
|
|
39
|
-
}),
|
|
40
|
-
problem: Flags.string({
|
|
41
|
-
description: 'Problem statement',
|
|
42
|
-
}),
|
|
43
|
-
solution: Flags.string({
|
|
44
|
-
description: 'Solution description',
|
|
45
|
-
}),
|
|
46
|
-
decisions: Flags.string({
|
|
47
|
-
description: 'Design decisions',
|
|
48
|
-
}),
|
|
49
|
-
interactive: Flags.boolean({
|
|
50
|
-
char: 'i',
|
|
51
|
-
description: 'Interactive mode - prompts for all fields',
|
|
52
|
-
default: false,
|
|
53
|
-
}),
|
|
54
|
-
};
|
|
55
|
-
async execute() {
|
|
56
|
-
const { args, flags } = await this.parse(SpecEdit);
|
|
57
|
-
// Check if JSON output mode is active
|
|
58
|
-
const jsonMode = shouldOutputJson(flags);
|
|
59
|
-
// Helper to handle errors in JSON mode
|
|
60
|
-
const handleError = (code, message) => {
|
|
61
|
-
if (jsonMode) {
|
|
62
|
-
outputErrorAsJson(code, message, createMetadata('spec edit', flags));
|
|
63
|
-
this.exit(1);
|
|
64
|
-
}
|
|
65
|
-
this.error(message);
|
|
66
|
-
};
|
|
67
|
-
// Get spec ID from args or flags
|
|
68
|
-
let specId = args.spec || flags.spec;
|
|
69
|
-
if (!specId) {
|
|
70
|
-
// List specs for selection
|
|
71
|
-
const specs = await this.storage.listSpecs();
|
|
72
|
-
if (specs.length === 0) {
|
|
73
|
-
return handleError('NO_SPECS', 'No specs found. Create one first with: prlt spec create');
|
|
74
|
-
}
|
|
75
|
-
// Use FlagResolver for spec selection
|
|
76
|
-
const resolver = new FlagResolver({
|
|
77
|
-
commandName: 'spec edit',
|
|
78
|
-
baseCommand: 'prlt spec edit',
|
|
79
|
-
jsonMode,
|
|
80
|
-
flags: { spec: flags.spec },
|
|
81
|
-
});
|
|
82
|
-
resolver.addPrompt({
|
|
83
|
-
flagName: 'spec',
|
|
84
|
-
type: 'list',
|
|
85
|
-
message: 'Select spec to edit:',
|
|
86
|
-
choices: () => specs.map(s => ({
|
|
87
|
-
name: `${s.title} [${s.status}]${s.type ? ` (${s.type})` : ''}`,
|
|
88
|
-
value: s.id,
|
|
89
|
-
})),
|
|
90
|
-
});
|
|
91
|
-
const resolved = await resolver.resolve();
|
|
92
|
-
specId = resolved.spec;
|
|
93
|
-
}
|
|
94
|
-
// Get current spec
|
|
95
|
-
const spec = await this.storage.getSpec(specId);
|
|
96
|
-
if (!spec) {
|
|
97
|
-
return handleError('NOT_FOUND', `Spec "${specId}" not found.`);
|
|
98
|
-
}
|
|
99
|
-
// Build choices for prompts
|
|
100
|
-
const typeChoices = [
|
|
101
|
-
{ name: 'Product (user-facing feature)', value: 'product' },
|
|
102
|
-
{ name: 'Platform (internal tooling)', value: 'platform' },
|
|
103
|
-
{ name: 'Infra (technical infrastructure)', value: 'infra' },
|
|
104
|
-
{ name: 'Integration (external service)', value: 'integration' },
|
|
105
|
-
{ name: 'None', value: '' },
|
|
106
|
-
];
|
|
107
|
-
const statusChoices = [
|
|
108
|
-
{ name: 'Draft (planning)', value: 'draft' },
|
|
109
|
-
{ name: 'Active (in progress)', value: 'active' },
|
|
110
|
-
{ name: 'Implemented (complete)', value: 'implemented' },
|
|
111
|
-
];
|
|
112
|
-
// Determine what to update
|
|
113
|
-
let updates = {};
|
|
114
|
-
const hasFlags = flags.title || flags.status || flags.type || flags.problem ||
|
|
115
|
-
flags.solution || flags.decisions;
|
|
116
|
-
if (flags.interactive || !hasFlags) {
|
|
117
|
-
// In JSON mode without flags, output a form prompt instead of interactive prompts
|
|
118
|
-
if (jsonMode) {
|
|
119
|
-
const { outputPromptAsJson, buildFormPromptConfig } = await import('../../lib/prompt-json.js');
|
|
120
|
-
const formConfig = buildFormPromptConfig([
|
|
121
|
-
{ type: 'input', name: 'title', message: 'Title:', default: spec.title },
|
|
122
|
-
{ type: 'list', name: 'status', message: 'Status:', choices: statusChoices, default: spec.status },
|
|
123
|
-
{ type: 'list', name: 'type', message: 'Type:', choices: typeChoices, default: spec.type || '' },
|
|
124
|
-
{ type: 'multiline', name: 'problem', message: 'Problem statement:', default: spec.problem || '' },
|
|
125
|
-
{ type: 'multiline', name: 'solution', message: 'Solution:', default: spec.solution || '' },
|
|
126
|
-
{ type: 'multiline', name: 'decisions', message: 'Design decisions:', default: spec.decisions || '' },
|
|
127
|
-
]);
|
|
128
|
-
formConfig.context = {
|
|
129
|
-
hint: `Edit spec with: prlt spec edit ${specId} --title "..." --problem "..." --json`,
|
|
130
|
-
specId,
|
|
131
|
-
currentValues: { title: spec.title, status: spec.status, type: spec.type, problem: spec.problem, solution: spec.solution, decisions: spec.decisions },
|
|
132
|
-
};
|
|
133
|
-
outputPromptAsJson(formConfig, createMetadata('spec edit', flags));
|
|
134
|
-
return; // outputPromptAsJson exits, but TypeScript doesn't know
|
|
135
|
-
}
|
|
136
|
-
// Interactive mode - prompt for editable fields
|
|
137
|
-
updates = await this.promptForEdits(spec, typeChoices, statusChoices);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
// Use flag values
|
|
141
|
-
if (flags.title)
|
|
142
|
-
updates.title = flags.title;
|
|
143
|
-
if (flags.status)
|
|
144
|
-
updates.status = flags.status;
|
|
145
|
-
if (flags.type) {
|
|
146
|
-
updates.type = flags.type === 'none' ? undefined : flags.type;
|
|
147
|
-
}
|
|
148
|
-
if (flags.problem)
|
|
149
|
-
updates.problem = flags.problem;
|
|
150
|
-
if (flags.solution)
|
|
151
|
-
updates.solution = flags.solution;
|
|
152
|
-
if (flags.decisions)
|
|
153
|
-
updates.decisions = flags.decisions;
|
|
154
|
-
}
|
|
155
|
-
// Check if anything changed
|
|
156
|
-
if (Object.keys(updates).length === 0) {
|
|
157
|
-
this.log(styles.muted('\nNo changes made.'));
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
// Update the spec
|
|
161
|
-
const updatedSpec = await this.storage.updateSpec(specId, updates);
|
|
162
|
-
// Display updated spec
|
|
163
|
-
this.log(styles.success(`\n✅ Updated spec "${styles.emphasis(updatedSpec.title)}"`));
|
|
164
|
-
const changedFields = [];
|
|
165
|
-
if (updates.title)
|
|
166
|
-
changedFields.push(`Title: ${updatedSpec.title}`);
|
|
167
|
-
if (updates.status)
|
|
168
|
-
changedFields.push(`Status: ${updatedSpec.status}`);
|
|
169
|
-
if (updates.type !== undefined)
|
|
170
|
-
changedFields.push(`Type: ${updatedSpec.type || 'none'}`);
|
|
171
|
-
if (updates.problem !== undefined)
|
|
172
|
-
changedFields.push(`Problem: ${updates.problem ? 'updated' : '(cleared)'}`);
|
|
173
|
-
if (updates.solution !== undefined)
|
|
174
|
-
changedFields.push(`Solution: ${updates.solution ? 'updated' : '(cleared)'}`);
|
|
175
|
-
if (updates.decisions !== undefined)
|
|
176
|
-
changedFields.push(`Decisions: ${updates.decisions ? 'updated' : '(cleared)'}`);
|
|
177
|
-
for (const field of changedFields) {
|
|
178
|
-
this.log(styles.muted(` ${field}`));
|
|
179
|
-
}
|
|
180
|
-
this.log('');
|
|
181
|
-
this.log(styles.muted(`View spec: prlt spec view ${updatedSpec.id}`));
|
|
182
|
-
}
|
|
183
|
-
async promptForEdits(spec, typeChoices, statusChoices) {
|
|
184
|
-
// First prompt for title, status, and type
|
|
185
|
-
const basicAnswers = await this.prompt([
|
|
186
|
-
{
|
|
187
|
-
type: 'input',
|
|
188
|
-
name: 'title',
|
|
189
|
-
message: 'Title:',
|
|
190
|
-
default: spec.title,
|
|
191
|
-
validate: (input) => input.length > 0 || 'Title is required',
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
type: 'list',
|
|
195
|
-
name: 'status',
|
|
196
|
-
message: 'Status:',
|
|
197
|
-
choices: statusChoices,
|
|
198
|
-
default: spec.status,
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
type: 'list',
|
|
202
|
-
name: 'type',
|
|
203
|
-
message: 'Type:',
|
|
204
|
-
choices: typeChoices,
|
|
205
|
-
default: spec.type || '',
|
|
206
|
-
},
|
|
207
|
-
], null);
|
|
208
|
-
// Prompt for problem statement using multiline input
|
|
209
|
-
const problemResult = await multiLineInput({
|
|
210
|
-
message: 'Problem statement:',
|
|
211
|
-
default: spec.problem || '',
|
|
212
|
-
hint: 'Describe the problem this spec addresses. Ctrl+D to finish, Ctrl+C to cancel',
|
|
213
|
-
});
|
|
214
|
-
if (problemResult.cancelled) {
|
|
215
|
-
throw new Error('Edit cancelled');
|
|
216
|
-
}
|
|
217
|
-
// Prompt for solution using multiline input
|
|
218
|
-
const solutionResult = await multiLineInput({
|
|
219
|
-
message: 'Solution:',
|
|
220
|
-
default: spec.solution || '',
|
|
221
|
-
hint: 'Describe the proposed solution. Ctrl+D to finish, Ctrl+C to cancel',
|
|
222
|
-
});
|
|
223
|
-
if (solutionResult.cancelled) {
|
|
224
|
-
throw new Error('Edit cancelled');
|
|
225
|
-
}
|
|
226
|
-
// Prompt for decisions using multiline input
|
|
227
|
-
const decisionsResult = await multiLineInput({
|
|
228
|
-
message: 'Design decisions:',
|
|
229
|
-
default: spec.decisions || '',
|
|
230
|
-
hint: 'Document key design decisions. Ctrl+D to finish, Ctrl+C to cancel',
|
|
231
|
-
});
|
|
232
|
-
if (decisionsResult.cancelled) {
|
|
233
|
-
throw new Error('Edit cancelled');
|
|
234
|
-
}
|
|
235
|
-
// Build updates object with only changed fields
|
|
236
|
-
const updates = {};
|
|
237
|
-
if (basicAnswers.title !== spec.title) {
|
|
238
|
-
updates.title = basicAnswers.title;
|
|
239
|
-
}
|
|
240
|
-
if (basicAnswers.status !== spec.status) {
|
|
241
|
-
updates.status = basicAnswers.status;
|
|
242
|
-
}
|
|
243
|
-
const newType = basicAnswers.type === '' ? undefined : basicAnswers.type;
|
|
244
|
-
if (newType !== spec.type) {
|
|
245
|
-
updates.type = newType;
|
|
246
|
-
}
|
|
247
|
-
if (problemResult.value !== (spec.problem || '')) {
|
|
248
|
-
// Preserve empty string to allow clearing the field
|
|
249
|
-
updates.problem = problemResult.value;
|
|
250
|
-
}
|
|
251
|
-
if (solutionResult.value !== (spec.solution || '')) {
|
|
252
|
-
// Preserve empty string to allow clearing the field
|
|
253
|
-
updates.solution = solutionResult.value;
|
|
254
|
-
}
|
|
255
|
-
if (decisionsResult.value !== (spec.decisions || '')) {
|
|
256
|
-
// Preserve empty string to allow clearing the field
|
|
257
|
-
updates.decisions = decisionsResult.value;
|
|
258
|
-
}
|
|
259
|
-
return updates;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
//# sourceMappingURL=edit.js.map
|