@proletariat/cli 0.3.58 → 0.3.60

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.
Files changed (212) hide show
  1. package/dist/commands/{spec → dashboard}/index.d.ts +4 -4
  2. package/dist/commands/dashboard/index.js +117 -0
  3. package/dist/commands/dashboard/index.js.map +1 -0
  4. package/dist/commands/execution/config.js +5 -4
  5. package/dist/commands/execution/config.js.map +1 -1
  6. package/dist/commands/execution/stop.js +4 -2
  7. package/dist/commands/execution/stop.js.map +1 -1
  8. package/dist/commands/execution/view.js +3 -0
  9. package/dist/commands/execution/view.js.map +1 -1
  10. package/dist/commands/init.d.ts +1 -0
  11. package/dist/commands/init.js +40 -3
  12. package/dist/commands/init.js.map +1 -1
  13. package/dist/commands/mcp-server.js +1 -2
  14. package/dist/commands/mcp-server.js.map +1 -1
  15. package/dist/commands/{spec/link/index.d.ts → session/exec.d.ts} +5 -3
  16. package/dist/commands/session/exec.js +205 -0
  17. package/dist/commands/session/exec.js.map +1 -0
  18. package/dist/commands/session/index.js +12 -0
  19. package/dist/commands/session/index.js.map +1 -1
  20. package/dist/commands/{spec/delete.d.ts → session/inspect.d.ts} +3 -3
  21. package/dist/commands/session/inspect.js +316 -0
  22. package/dist/commands/session/inspect.js.map +1 -0
  23. package/dist/commands/session/peek.d.ts +15 -0
  24. package/dist/commands/session/peek.js +141 -8
  25. package/dist/commands/session/peek.js.map +1 -1
  26. package/dist/commands/session/poke.d.ts +4 -1
  27. package/dist/commands/session/poke.js +175 -20
  28. package/dist/commands/session/poke.js.map +1 -1
  29. package/dist/commands/{spec/link/depends.d.ts → session/restart.d.ts} +6 -4
  30. package/dist/commands/session/restart.js +320 -0
  31. package/dist/commands/session/restart.js.map +1 -0
  32. package/dist/commands/ticket/list.d.ts +10 -0
  33. package/dist/commands/ticket/list.js +126 -1
  34. package/dist/commands/ticket/list.js.map +1 -1
  35. package/dist/commands/tools/add.d.ts +20 -0
  36. package/dist/commands/tools/add.js +129 -0
  37. package/dist/commands/tools/add.js.map +1 -0
  38. package/dist/commands/tools/check.d.ts +10 -0
  39. package/dist/commands/tools/check.js +75 -0
  40. package/dist/commands/tools/check.js.map +1 -0
  41. package/dist/commands/tools/detect.d.ts +11 -0
  42. package/dist/commands/tools/detect.js +107 -0
  43. package/dist/commands/tools/detect.js.map +1 -0
  44. package/dist/commands/tools/index.d.ts +11 -0
  45. package/dist/commands/tools/index.js +87 -0
  46. package/dist/commands/tools/index.js.map +1 -0
  47. package/dist/commands/tools/remove.d.ts +13 -0
  48. package/dist/commands/tools/remove.js +55 -0
  49. package/dist/commands/tools/remove.js.map +1 -0
  50. package/dist/commands/{spec/view.d.ts → trello/configure.d.ts} +6 -6
  51. package/dist/commands/trello/configure.js +259 -0
  52. package/dist/commands/trello/configure.js.map +1 -0
  53. package/dist/commands/{spec/plan.d.ts → trello/import.d.ts} +3 -5
  54. package/dist/commands/trello/import.js +241 -0
  55. package/dist/commands/trello/import.js.map +1 -0
  56. package/dist/commands/{spec/ticket.d.ts → trello/sync.d.ts} +5 -6
  57. package/dist/commands/trello/sync.js +190 -0
  58. package/dist/commands/trello/sync.js.map +1 -0
  59. package/dist/commands/work/start.d.ts +1 -0
  60. package/dist/commands/work/start.js +17 -39
  61. package/dist/commands/work/start.js.map +1 -1
  62. package/dist/lib/dashboard/data.d.ts +64 -0
  63. package/dist/lib/dashboard/data.js +259 -0
  64. package/dist/lib/dashboard/data.js.map +1 -0
  65. package/dist/lib/dashboard/html.d.ts +7 -0
  66. package/dist/lib/dashboard/html.js +682 -0
  67. package/dist/lib/dashboard/html.js.map +1 -0
  68. package/dist/lib/dashboard/server.d.ts +20 -0
  69. package/dist/lib/dashboard/server.js +114 -0
  70. package/dist/lib/dashboard/server.js.map +1 -0
  71. package/dist/lib/events/events.d.ts +26 -2
  72. package/dist/lib/events/events.js +3 -2
  73. package/dist/lib/events/events.js.map +1 -1
  74. package/dist/lib/execution/config.d.ts +8 -0
  75. package/dist/lib/execution/config.js +83 -4
  76. package/dist/lib/execution/config.js.map +1 -1
  77. package/dist/lib/execution/runners.d.ts +36 -3
  78. package/dist/lib/execution/runners.js +216 -35
  79. package/dist/lib/execution/runners.js.map +1 -1
  80. package/dist/lib/execution/spawner.d.ts +2 -0
  81. package/dist/lib/execution/spawner.js +22 -31
  82. package/dist/lib/execution/spawner.js.map +1 -1
  83. package/dist/lib/execution/types.d.ts +26 -5
  84. package/dist/lib/execution/types.js +24 -0
  85. package/dist/lib/execution/types.js.map +1 -1
  86. package/dist/lib/external-issues/adapters.d.ts +17 -0
  87. package/dist/lib/external-issues/adapters.js +88 -0
  88. package/dist/lib/external-issues/adapters.js.map +1 -1
  89. package/dist/lib/external-issues/index.d.ts +1 -0
  90. package/dist/lib/external-issues/index.js +2 -0
  91. package/dist/lib/external-issues/index.js.map +1 -1
  92. package/dist/lib/external-issues/mapping-store.js +1 -1
  93. package/dist/lib/external-issues/outbound-sync.d.ts +79 -0
  94. package/dist/lib/external-issues/outbound-sync.js +296 -0
  95. package/dist/lib/external-issues/outbound-sync.js.map +1 -0
  96. package/dist/lib/external-issues/trello.d.ts +80 -0
  97. package/dist/lib/external-issues/trello.js +266 -0
  98. package/dist/lib/external-issues/trello.js.map +1 -0
  99. package/dist/lib/external-issues/types.d.ts +3 -3
  100. package/dist/lib/external-issues/types.js +1 -1
  101. package/dist/lib/external-issues/types.js.map +1 -1
  102. package/dist/lib/linear/client.d.ts +4 -3
  103. package/dist/lib/linear/client.js +185 -122
  104. package/dist/lib/linear/client.js.map +1 -1
  105. package/dist/lib/mcp/tools/cli-passthrough.js +77 -0
  106. package/dist/lib/mcp/tools/cli-passthrough.js.map +1 -1
  107. package/dist/lib/mcp/tools/index.d.ts +0 -1
  108. package/dist/lib/mcp/tools/index.js +0 -1
  109. package/dist/lib/mcp/tools/index.js.map +1 -1
  110. package/dist/lib/onboarding/detect-tools.d.ts +15 -0
  111. package/dist/lib/onboarding/detect-tools.js +44 -0
  112. package/dist/lib/onboarding/detect-tools.js.map +1 -0
  113. package/dist/lib/onboarding/index.d.ts +2 -0
  114. package/dist/lib/onboarding/index.js +3 -0
  115. package/dist/lib/onboarding/index.js.map +1 -0
  116. package/dist/lib/onboarding/wizard.d.ts +25 -0
  117. package/dist/lib/onboarding/wizard.js +156 -0
  118. package/dist/lib/onboarding/wizard.js.map +1 -0
  119. package/dist/lib/pmo/schema.d.ts +2 -1
  120. package/dist/lib/pmo/schema.js +3 -1
  121. package/dist/lib/pmo/schema.js.map +1 -1
  122. package/dist/lib/pmo/storage/tickets.d.ts +8 -0
  123. package/dist/lib/pmo/storage/tickets.js +56 -2
  124. package/dist/lib/pmo/storage/tickets.js.map +1 -1
  125. package/dist/lib/pmo/sync-manager.js +3 -0
  126. package/dist/lib/pmo/sync-manager.js.map +1 -1
  127. package/dist/lib/runners/claude-code-runner.js +6 -0
  128. package/dist/lib/runners/claude-code-runner.js.map +1 -1
  129. package/dist/lib/tool-registry/detect.d.ts +20 -0
  130. package/dist/lib/tool-registry/detect.js +95 -0
  131. package/dist/lib/tool-registry/detect.js.map +1 -0
  132. package/dist/lib/tool-registry/index.d.ts +10 -0
  133. package/dist/lib/tool-registry/index.js +13 -0
  134. package/dist/lib/tool-registry/index.js.map +1 -0
  135. package/dist/lib/tool-registry/policy.d.ts +32 -0
  136. package/dist/lib/tool-registry/policy.js +97 -0
  137. package/dist/lib/tool-registry/policy.js.map +1 -0
  138. package/dist/lib/tool-registry/registry.d.ts +42 -0
  139. package/dist/lib/tool-registry/registry.js +120 -0
  140. package/dist/lib/tool-registry/registry.js.map +1 -0
  141. package/dist/lib/tool-registry/spawn.d.ts +50 -0
  142. package/dist/lib/tool-registry/spawn.js +103 -0
  143. package/dist/lib/tool-registry/spawn.js.map +1 -0
  144. package/dist/lib/tool-registry/types.d.ts +56 -0
  145. package/dist/lib/tool-registry/types.js +109 -0
  146. package/dist/lib/tool-registry/types.js.map +1 -0
  147. package/dist/lib/trello/client.d.ts +23 -0
  148. package/dist/lib/trello/client.js +114 -0
  149. package/dist/lib/trello/client.js.map +1 -0
  150. package/dist/lib/trello/config.d.ts +55 -0
  151. package/dist/lib/trello/config.js +127 -0
  152. package/dist/lib/trello/config.js.map +1 -0
  153. package/dist/lib/trello/index.d.ts +5 -0
  154. package/dist/lib/trello/index.js +5 -0
  155. package/dist/lib/trello/index.js.map +1 -0
  156. package/dist/lib/trello/mapper.d.ts +13 -0
  157. package/dist/lib/trello/mapper.js +71 -0
  158. package/dist/lib/trello/mapper.js.map +1 -0
  159. package/dist/lib/trello/sync.d.ts +13 -0
  160. package/dist/lib/trello/sync.js +38 -0
  161. package/dist/lib/trello/sync.js.map +1 -0
  162. package/dist/lib/trello/types.d.ts +53 -0
  163. package/dist/lib/trello/types.js +2 -0
  164. package/dist/lib/trello/types.js.map +1 -0
  165. package/dist/lib/work-source/client.js +17 -0
  166. package/dist/lib/work-source/client.js.map +1 -1
  167. package/dist/lib/work-source/config.d.ts +1 -1
  168. package/dist/lib/work-source/config.js +23 -1
  169. package/dist/lib/work-source/config.js.map +1 -1
  170. package/dist/lib/work-source/index.d.ts +1 -0
  171. package/dist/lib/work-source/index.js +1 -0
  172. package/dist/lib/work-source/index.js.map +1 -1
  173. package/dist/lib/work-source/provider-sources.d.ts +113 -0
  174. package/dist/lib/work-source/provider-sources.js +227 -0
  175. package/dist/lib/work-source/provider-sources.js.map +1 -0
  176. package/oclif.manifest.json +4368 -4364
  177. package/package.json +6 -2
  178. package/dist/commands/spec/create.d.ts +0 -20
  179. package/dist/commands/spec/create.js +0 -171
  180. package/dist/commands/spec/create.js.map +0 -1
  181. package/dist/commands/spec/delete.js +0 -112
  182. package/dist/commands/spec/delete.js.map +0 -1
  183. package/dist/commands/spec/edit.d.ts +0 -23
  184. package/dist/commands/spec/edit.js +0 -262
  185. package/dist/commands/spec/edit.js.map +0 -1
  186. package/dist/commands/spec/index.js +0 -88
  187. package/dist/commands/spec/index.js.map +0 -1
  188. package/dist/commands/spec/link/depends.js +0 -87
  189. package/dist/commands/spec/link/depends.js.map +0 -1
  190. package/dist/commands/spec/link/index.js +0 -93
  191. package/dist/commands/spec/link/index.js.map +0 -1
  192. package/dist/commands/spec/link/remove.d.ts +0 -18
  193. package/dist/commands/spec/link/remove.js +0 -91
  194. package/dist/commands/spec/link/remove.js.map +0 -1
  195. package/dist/commands/spec/list.d.ts +0 -14
  196. package/dist/commands/spec/list.js +0 -101
  197. package/dist/commands/spec/list.js.map +0 -1
  198. package/dist/commands/spec/plan.js +0 -102
  199. package/dist/commands/spec/plan.js.map +0 -1
  200. package/dist/commands/spec/ticket.js +0 -144
  201. package/dist/commands/spec/ticket.js.map +0 -1
  202. package/dist/commands/spec/view.js +0 -202
  203. package/dist/commands/spec/view.js.map +0 -1
  204. package/dist/lib/mcp/tools/spec.d.ts +0 -6
  205. package/dist/lib/mcp/tools/spec.js +0 -197
  206. package/dist/lib/mcp/tools/spec.js.map +0 -1
  207. package/dist/lib/pmo/spec-parser.d.ts +0 -25
  208. package/dist/lib/pmo/spec-parser.js +0 -206
  209. package/dist/lib/pmo/spec-parser.js.map +0 -1
  210. package/dist/lib/pmo/spec-types.d.ts +0 -43
  211. package/dist/lib/pmo/spec-types.js +0 -8
  212. 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.58",
4
+ "version": "0.3.60",
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":"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"}
@@ -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