(
name: string | undefined,
options: WorksetCreateOptions
)
| 260 | } |
| 261 | |
| 262 | private async composeFromFlags( |
| 263 | name: string | undefined, |
| 264 | options: WorksetCreateOptions |
| 265 | ): Promise<Workset> { |
| 266 | if (!name) { |
| 267 | throw new StoreError('Pass a workset name.', 'workset_name_required', { |
| 268 | target: 'workset.name', |
| 269 | fix: 'openspec workset create <name> --member <path>', |
| 270 | }); |
| 271 | } |
| 272 | |
| 273 | validateWorksetName(name); |
| 274 | |
| 275 | const memberFlags = options.member ?? []; |
| 276 | if (memberFlags.length === 0) { |
| 277 | throw new StoreError( |
| 278 | 'Pass at least one member folder.', |
| 279 | 'workset_members_required', |
| 280 | { |
| 281 | target: 'workset.member', |
| 282 | fix: `openspec workset create ${name} --member <path> --member <name>=<path>`, |
| 283 | } |
| 284 | ); |
| 285 | } |
| 286 | |
| 287 | const members = await resolveMemberFlags(memberFlags); |
| 288 | // The opener table is read only when a tool is actually named - a |
| 289 | // tool-less scripted create must not fail on unrelated config rows. |
| 290 | const table = options.tool !== undefined ? readOpenerTable() : []; |
| 291 | if (options.tool !== undefined) { |
| 292 | const chosen = findOpener(table, options.tool); |
| 293 | if (chosen !== null && !isOpenerEnabled(chosen)) { |
| 294 | throw worksetCliOpenerDisabledError(chosen, name); |
| 295 | } |
| 296 | } |
| 297 | return finalizeWorkset(name, members, options.tool, table); |
| 298 | } |
| 299 | |
| 300 | async list(options: { json?: boolean } = {}): Promise<void> { |
| 301 | try { |
no test coverage detected