@claude-collective/cli 0.26.0 → 0.29.4
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/CHANGELOG.md +125 -0
- package/README.md +47 -13
- package/config/stacks.yaml +330 -93
- package/dist/chunk-56ERY7H7.js +29 -0
- package/dist/chunk-56ERY7H7.js.map +1 -0
- package/dist/{chunk-OBXAY23Y.js → chunk-5I6VY2E7.js} +5 -5
- package/dist/chunk-5I6VY2E7.js.map +1 -0
- package/dist/{chunk-ZDREFYD2.js → chunk-5WIHSJRO.js} +234 -59
- package/dist/chunk-5WIHSJRO.js.map +1 -0
- package/dist/{chunk-GGFOD5PK.js → chunk-6F3ZKDVE.js} +122 -66
- package/dist/chunk-6F3ZKDVE.js.map +1 -0
- package/dist/{chunk-DBRUQQUF.js → chunk-7GHTQSWI.js} +5 -1
- package/dist/{chunk-DBRUQQUF.js.map → chunk-7GHTQSWI.js.map} +1 -1
- package/dist/chunk-7ICBJZV2.js +63 -0
- package/dist/chunk-7ICBJZV2.js.map +1 -0
- package/dist/{chunk-3X5D7RM5.js → chunk-7UKQZSWT.js} +15 -4
- package/dist/chunk-7UKQZSWT.js.map +1 -0
- package/dist/{chunk-F4RD5FYM.js → chunk-A4T4YSV4.js} +5 -2
- package/dist/chunk-A4T4YSV4.js.map +1 -0
- package/dist/{chunk-VVYNZZUX.js → chunk-AG5YGYJT.js} +9 -5
- package/dist/chunk-AG5YGYJT.js.map +1 -0
- package/dist/chunk-AJFSCLJ7.js +81 -0
- package/dist/chunk-AJFSCLJ7.js.map +1 -0
- package/dist/{chunk-NQJ47R4N.js → chunk-CQZAKMPJ.js} +66 -14
- package/dist/chunk-CQZAKMPJ.js.map +1 -0
- package/dist/chunk-DIRH4PDF.js +24 -0
- package/dist/chunk-DIRH4PDF.js.map +1 -0
- package/dist/{chunk-R7B63JAP.js → chunk-DUIYVKFK.js} +123 -86
- package/dist/chunk-DUIYVKFK.js.map +1 -0
- package/dist/chunk-EP6J44I4.js +142 -0
- package/dist/chunk-EP6J44I4.js.map +1 -0
- package/dist/{chunk-TDZE4TDG.js → chunk-EUPMWSM3.js} +92 -29
- package/dist/chunk-EUPMWSM3.js.map +1 -0
- package/dist/chunk-FUPBGSRA.js +66 -0
- package/dist/chunk-FUPBGSRA.js.map +1 -0
- package/dist/{chunk-U7HFKR74.js → chunk-FY5D4KIC.js} +5 -2
- package/dist/chunk-FY5D4KIC.js.map +1 -0
- package/dist/chunk-G5WXKKQM.js +233 -0
- package/dist/chunk-G5WXKKQM.js.map +1 -0
- package/dist/{chunk-KWYO3M5Q.js → chunk-GVVEPVR7.js} +25 -24
- package/dist/chunk-GVVEPVR7.js.map +1 -0
- package/dist/chunk-IFODQTCX.js +162 -0
- package/dist/chunk-IFODQTCX.js.map +1 -0
- package/dist/chunk-IQUBOWWU.js +366 -0
- package/dist/chunk-IQUBOWWU.js.map +1 -0
- package/dist/{chunk-ETCVEV3S.js → chunk-IRG52AN5.js} +242 -155
- package/dist/chunk-IRG52AN5.js.map +1 -0
- package/dist/chunk-MQAYAISQ.js +88 -0
- package/dist/chunk-MQAYAISQ.js.map +1 -0
- package/dist/{chunk-4357L7VK.js → chunk-N73GQTCK.js} +37 -104
- package/dist/chunk-N73GQTCK.js.map +1 -0
- package/dist/{chunk-H7SSBSPR.js → chunk-OA5RCL2L.js} +8 -5
- package/dist/chunk-OA5RCL2L.js.map +1 -0
- package/dist/{chunk-I3YYG5IO.js → chunk-PNXFJPXF.js} +3 -3
- package/dist/{chunk-MCTSHLAF.js → chunk-RI5QEK5W.js} +41 -14
- package/dist/chunk-RI5QEK5W.js.map +1 -0
- package/dist/chunk-RXC7AF7N.js +31 -0
- package/dist/chunk-RXC7AF7N.js.map +1 -0
- package/dist/{chunk-ETQ3BPGU.js → chunk-SSHG7MEE.js} +1252 -728
- package/dist/chunk-SSHG7MEE.js.map +1 -0
- package/dist/{chunk-4S4FCAA2.js → chunk-VTUPUKFD.js} +26 -31
- package/dist/chunk-VTUPUKFD.js.map +1 -0
- package/dist/{chunk-XENOESJZ.js → chunk-WLQUQXWO.js} +10 -67
- package/dist/chunk-WLQUQXWO.js.map +1 -0
- package/dist/chunk-WPED6CL3.js +105 -0
- package/dist/chunk-WPED6CL3.js.map +1 -0
- package/dist/{chunk-R5KJVI54.js → chunk-XPMEGGJK.js} +97 -76
- package/dist/chunk-XPMEGGJK.js.map +1 -0
- package/dist/chunk-XZKVOPCR.js +75 -0
- package/dist/chunk-XZKVOPCR.js.map +1 -0
- package/dist/{chunk-ZW2PELOH.js → chunk-ZX5DM4D5.js} +106 -69
- package/dist/chunk-ZX5DM4D5.js.map +1 -0
- package/dist/commands/build/marketplace.js +21 -20
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +7 -11
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +8 -13
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +109 -135
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +4 -5
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/index.js +5 -6
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +4 -5
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/set-project.js +4 -5
- package/dist/commands/config/set-project.js.map +1 -1
- package/dist/commands/config/show.js +5 -6
- package/dist/commands/config/unset-project.js +4 -5
- package/dist/commands/config/unset-project.js.map +1 -1
- package/dist/commands/diff.js +26 -11
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +13 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +71 -42
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +34 -14
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +93 -52
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +27 -9
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +98 -48
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +10 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +8 -11
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/skill.js +17 -18
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +23 -9
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +23 -20
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +28 -21
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +30 -22
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +103 -39
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version/bump.js +4 -5
- package/dist/commands/version/bump.js.map +1 -1
- package/dist/commands/version/index.js +4 -5
- package/dist/commands/version/index.js.map +1 -1
- package/dist/commands/version/set.js +4 -5
- package/dist/commands/version/set.js.map +1 -1
- package/dist/commands/version/show.js +4 -5
- package/dist/commands/version/show.js.map +1 -1
- package/dist/components/common/confirm.test.js +2 -2
- package/dist/components/common/confirm.test.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +4 -2
- package/dist/components/wizard/category-grid.js +3 -1
- package/dist/components/wizard/category-grid.test.js +63 -64
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +13 -0
- package/dist/components/wizard/help-modal.js +10 -0
- package/dist/components/wizard/help-modal.js.map +1 -0
- package/dist/components/wizard/menu-item.js +2 -1
- package/dist/components/wizard/search-modal.js +3 -1
- package/dist/components/wizard/search-modal.test.js +4 -2
- package/dist/components/wizard/search-modal.test.js.map +1 -1
- package/dist/components/wizard/section-progress.js +2 -1
- package/dist/components/wizard/section-progress.test.js +2 -1
- package/dist/components/wizard/section-progress.test.js.map +1 -1
- package/dist/components/wizard/source-grid.js +6 -2
- package/dist/components/wizard/source-grid.test.js +49 -45
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +15 -0
- package/dist/components/wizard/stack-selection.js.map +1 -0
- package/dist/components/wizard/step-approach.js +8 -6
- package/dist/components/wizard/step-approach.test.js +11 -9
- package/dist/components/wizard/step-approach.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +9 -13
- package/dist/components/wizard/step-build.test.js +27 -45
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +2 -1
- package/dist/components/wizard/step-confirm.test.js +6 -5
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -1
- package/dist/components/wizard/step-refine.test.js +3 -2
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +8 -6
- package/dist/components/wizard/step-settings.test.js +12 -10
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +11 -9
- package/dist/components/wizard/step-sources.test.js +16 -15
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +9 -6
- package/dist/components/wizard/step-stack.test.js +15 -12
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -1
- package/dist/components/wizard/wizard-layout.js +7 -9
- package/dist/components/wizard/wizard-tabs.js +2 -1
- package/dist/components/wizard/wizard-tabs.test.js +2 -1
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
- package/dist/components/wizard/wizard.js +26 -20
- package/dist/config/stacks.yaml +330 -93
- package/dist/hooks/init.js +3 -4
- package/dist/hooks/init.js.map +1 -1
- package/dist/source-manager-TV2YGPAN.js +15 -0
- package/dist/source-manager-TV2YGPAN.js.map +1 -0
- package/dist/stores/wizard-store.js +4 -3
- package/dist/stores/wizard-store.test.js +272 -25
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +2 -1
- package/src/schemas/agent-frontmatter.schema.json +84 -0
- package/src/schemas/agent.schema.json +93 -0
- package/src/schemas/hooks.schema.json +47 -0
- package/src/schemas/marketplace.schema.json +119 -0
- package/src/schemas/metadata.schema.json +113 -0
- package/src/schemas/plugin.schema.json +130 -0
- package/src/schemas/project-config.schema.json +125 -0
- package/src/schemas/project-source-config.schema.json +81 -0
- package/src/schemas/skill-frontmatter.schema.json +42 -0
- package/src/schemas/skills-matrix.schema.json +467 -0
- package/src/schemas/stack.schema.json +191 -0
- package/src/schemas/stacks.schema.json +111 -0
- package/dist/chunk-3X5D7RM5.js.map +0 -1
- package/dist/chunk-4357L7VK.js.map +0 -1
- package/dist/chunk-4S4FCAA2.js.map +0 -1
- package/dist/chunk-7UPXT32F.js +0 -197
- package/dist/chunk-7UPXT32F.js.map +0 -1
- package/dist/chunk-ETCVEV3S.js.map +0 -1
- package/dist/chunk-ETQ3BPGU.js.map +0 -1
- package/dist/chunk-F4RD5FYM.js.map +0 -1
- package/dist/chunk-GGFOD5PK.js.map +0 -1
- package/dist/chunk-H7SSBSPR.js.map +0 -1
- package/dist/chunk-HWD32NP7.js +0 -19
- package/dist/chunk-HWD32NP7.js.map +0 -1
- package/dist/chunk-KWYO3M5Q.js.map +0 -1
- package/dist/chunk-MCTSHLAF.js.map +0 -1
- package/dist/chunk-NQJ47R4N.js.map +0 -1
- package/dist/chunk-O6ZTD7ZI.js +0 -70
- package/dist/chunk-O6ZTD7ZI.js.map +0 -1
- package/dist/chunk-OBXAY23Y.js.map +0 -1
- package/dist/chunk-R5KJVI54.js.map +0 -1
- package/dist/chunk-R7B63JAP.js.map +0 -1
- package/dist/chunk-TDZE4TDG.js.map +0 -1
- package/dist/chunk-TMED5DQ2.js +0 -210
- package/dist/chunk-TMED5DQ2.js.map +0 -1
- package/dist/chunk-U7HFKR74.js.map +0 -1
- package/dist/chunk-UEMRJI2K.js +0 -146
- package/dist/chunk-UEMRJI2K.js.map +0 -1
- package/dist/chunk-UNN7523L.js +0 -78
- package/dist/chunk-UNN7523L.js.map +0 -1
- package/dist/chunk-VVYNZZUX.js.map +0 -1
- package/dist/chunk-XENOESJZ.js.map +0 -1
- package/dist/chunk-ZDREFYD2.js.map +0 -1
- package/dist/chunk-ZW2PELOH.js.map +0 -1
- package/dist/source-manager-EYO3F2DV.js +0 -16
- /package/dist/{chunk-I3YYG5IO.js.map → chunk-PNXFJPXF.js.map} +0 -0
- /package/dist/{source-manager-EYO3F2DV.js.map → components/wizard/domain-selection.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { validateAllSchemas, printValidationResults } from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugins/index.js\";\n\nexport default class Validate extends BaseCommand {\n static summary = \"Validate YAML files against schemas or validate compiled plugins\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, or validates compiled plugin structure and content. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static args = {\n path: Args.string({\n description: \"Path to plugin or plugins directory to validate\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Validate all plugins in directory\",\n default: false,\n }),\n plugins: Flags.boolean({\n char: \"p\",\n description: \"Validate plugins instead of schemas\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Validate);\n\n if (args.path || flags.plugins) {\n await this.validatePlugins(args.path, flags.verbose, flags.all);\n } else {\n await this.validateSchemas();\n }\n }\n\n private async validateSchemas(): Promise<void> {\n this.log(\"\");\n this.log(\"Validating all schemas\");\n this.log(\"\");\n\n try {\n const result = await validateAllSchemas();\n\n const summary = result.valid\n ? `Done: ${result.summary.validFiles}/${result.summary.totalFiles} files valid`\n : `Done: ${result.summary.invalidFiles} invalid files`;\n\n this.log(summary);\n printValidationResults(result);\n\n if (!result.valid) {\n this.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validatePlugins(\n pluginPath: string | undefined,\n verbose: boolean,\n all: boolean,\n ): Promise<void> {\n const targetPath = pluginPath ? path.resolve(pluginPath) : process.cwd();\n\n if (all) {\n await this.validateAllPluginsInDirectory(targetPath, verbose);\n } else {\n await this.validateSinglePlugin(targetPath, verbose);\n }\n }\n\n private async validateAllPluginsInDirectory(targetPath: string, verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating all plugins in: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validateAllPlugins(targetPath);\n\n const summary = result.valid\n ? `Done: ${result.summary.valid}/${result.summary.total} plugins valid`\n : `Done: ${result.summary.invalid} invalid plugins`;\n\n this.log(summary);\n\n this.log(\"\");\n this.log(\" Plugin Validation Summary:\");\n this.log(\" -------------------------\");\n this.log(` Total plugins: ${result.summary.total}`);\n this.log(` Valid: ${result.summary.valid}`);\n this.log(` Invalid: ${result.summary.invalid}`);\n this.log(` With warnings: ${result.summary.withWarnings}`);\n\n for (const { name, result: pluginResult } of result.results) {\n printPluginValidationResult(name, pluginResult, verbose);\n }\n\n if (result.valid) {\n this.log(\"\");\n this.logSuccess(\"All plugins validated successfully\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSinglePlugin(targetPath: string, verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating plugin: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validatePlugin(targetPath);\n\n const summary = result.valid ? \"Done: Plugin is valid\" : \"Done: Plugin has errors\";\n\n this.log(summary);\n\n printPluginValidationResult(path.basename(targetPath), result, true);\n\n if (result.valid && result.warnings.length === 0) {\n this.log(\"\");\n this.logSuccess(\"Plugin validated successfully\");\n this.log(\"\");\n } else if (result.valid) {\n this.log(\"\");\n this.logWarning(\"Plugin valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(\"Validation failed\", { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.error(`Validation failed: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import { sumBy } from \"remeda\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { extractFrontmatter } from \"../utils/frontmatter\";\nimport {\n skillsMatrixConfigSchema,\n metadataValidationSchema,\n stackConfigValidationSchema,\n skillFrontmatterValidationSchema,\n agentYamlGenerationSchema,\n} from \"./schemas\";\n\nexport type FileValidationError = {\n file: string;\n errors: string[];\n};\n\nexport type SchemaValidationResult = {\n schemaName: string;\n valid: boolean;\n totalFiles: number;\n validFiles: number;\n invalidFiles: FileValidationError[];\n};\n\nexport type FullValidationResult = {\n valid: boolean;\n results: SchemaValidationResult[];\n summary: {\n totalSchemas: number;\n totalFiles: number;\n validFiles: number;\n invalidFiles: number;\n };\n};\n\ntype ContentExtractor = (content: string) => unknown | null;\n\ntype ValidationTarget = {\n name: string;\n schema: z.ZodType<unknown>;\n pattern: string;\n baseDir: string;\n extractor?: ContentExtractor;\n};\n\nconst VALIDATION_TARGETS: ValidationTarget[] = [\n {\n name: \"Skills Matrix\",\n schema: skillsMatrixConfigSchema,\n pattern: \"skills-matrix.yaml\",\n baseDir: \"src/config\",\n },\n {\n name: \"Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: \"**/metadata.yaml\",\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: \"**/skills/**/metadata.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: stackConfigValidationSchema,\n pattern: \"*/config.yaml\",\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: agentYamlGenerationSchema,\n pattern: \"**/agent.yaml\",\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: \"**/SKILL.md\",\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: \"**/skills/**/SKILL.md\",\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n];\n\nfunction formatZodErrors(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n if (issue.code === \"unrecognized_keys\") {\n return `Unrecognized key: \"${issue.keys.join('\", \"')}\"`;\n }\n return path ? `${path}: ${issue.message}` : issue.message;\n });\n}\n\nasync function validateFile(\n filePath: string,\n schema: z.ZodType<unknown>,\n extractor?: ContentExtractor,\n): Promise<{ valid: boolean; errors: string[] }> {\n try {\n if (!(await fileExists(filePath))) {\n return { valid: false, errors: [`File not found: ${filePath}`] };\n }\n\n const content = await readFile(filePath);\n\n let parsed: unknown;\n if (extractor) {\n parsed = extractor(content);\n if (parsed === null) {\n return {\n valid: false,\n errors: [\"Failed to extract content (no valid frontmatter found)\"],\n };\n }\n } else {\n parsed = parseYaml(content);\n }\n\n const result = schema.safeParse(parsed);\n\n if (result.success) {\n return { valid: true, errors: [] };\n }\n\n return { valid: false, errors: formatZodErrors(result.error) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { valid: false, errors: [`Failed to parse content: ${message}`] };\n }\n}\n\nasync function validateTarget(\n target: ValidationTarget,\n rootDir: string = process.cwd(),\n): Promise<SchemaValidationResult> {\n const baseDir = path.join(rootDir, target.baseDir);\n const pattern = path.join(baseDir, target.pattern);\n const files = await fg(pattern, { absolute: true });\n\n const result: SchemaValidationResult = {\n schemaName: target.name,\n valid: true,\n totalFiles: files.length,\n validFiles: 0,\n invalidFiles: [],\n };\n\n if (files.length === 0) {\n return result;\n }\n\n for (const file of files) {\n const validation = await validateFile(file, target.schema, target.extractor);\n const relativePath = path.relative(rootDir, file);\n\n if (validation.valid) {\n result.validFiles++;\n } else {\n result.valid = false;\n result.invalidFiles.push({\n file: relativePath,\n errors: validation.errors,\n });\n }\n }\n\n return result;\n}\n\nexport async function validateAllSchemas(\n rootDir: string = process.cwd(),\n): Promise<FullValidationResult> {\n const results: SchemaValidationResult[] = [];\n\n for (const target of VALIDATION_TARGETS) {\n const result = await validateTarget(target, rootDir);\n results.push(result);\n }\n\n const summary = {\n totalSchemas: results.length,\n totalFiles: sumBy(results, (r) => r.totalFiles),\n validFiles: sumBy(results, (r) => r.validFiles),\n invalidFiles: sumBy(results, (r) => r.invalidFiles.length),\n };\n\n return {\n valid: results.every((r) => r.valid),\n results,\n summary,\n };\n}\n\nexport function printValidationResults(result: FullValidationResult): void {\n console.log(`\\n Schema Validation Summary:`);\n console.log(` ─────────────────────────`);\n console.log(` Total schemas checked: ${result.summary.totalSchemas}`);\n console.log(` Total files: ${result.summary.totalFiles}`);\n console.log(` Valid: ${result.summary.validFiles}`);\n console.log(` Invalid: ${result.summary.invalidFiles}`);\n\n for (const schemaResult of result.results) {\n if (schemaResult.totalFiles === 0) continue;\n\n const status = schemaResult.valid ? \"✓\" : \"✗\";\n console.log(\n `\\n ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`,\n );\n\n if (schemaResult.invalidFiles.length > 0) {\n for (const file of schemaResult.invalidFiles) {\n console.log(`\\n ${file.file}:`);\n file.errors.forEach((e) => console.log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n console.log(`\\n ✓ All schemas validated successfully\\n`);\n } else {\n console.log(`\\n ✗ Validation failed\\n`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAOA,WAAU;;;ACDjB;AAAA,SAAS,aAAa;AAEtB,OAAO,UAAU;AAEjB,SAAS,SAAS,iBAAiB;AACnC,OAAO,QAAQ;AA4Cf,IAAM,qBAAyC;AAAA,EAC7C;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,SAAS,gBAAgB,OAA6B;AACpD,SAAO,MAAM,OAAO,IAAI,CAAC,UAAU;AACjC,UAAMC,QAAO,MAAM,KAAK,KAAK,GAAG;AAChC,QAAI,MAAM,SAAS,qBAAqB;AACtC,aAAO,sBAAsB,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,IACtD;AACA,WAAOA,QAAO,GAAGA,KAAI,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,EACpD,CAAC;AACH;AAEA,eAAe,aACb,UACA,QACA,WAC+C;AAC/C,MAAI;AACF,QAAI,CAAE,MAAM,WAAW,QAAQ,GAAI;AACjC,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,mBAAmB,QAAQ,EAAE,EAAE;AAAA,IACjE;AAEA,UAAM,UAAU,MAAM,SAAS,QAAQ;AAEvC,QAAI;AACJ,QAAI,WAAW;AACb,eAAS,UAAU,OAAO;AAC1B,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,CAAC,wDAAwD;AAAA,QACnE;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,UAAU,OAAO;AAAA,IAC5B;AAEA,UAAM,SAAS,OAAO,UAAU,MAAM;AAEtC,QAAI,OAAO,SAAS;AAClB,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AAAA,IACnC;AAEA,WAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB,OAAO,KAAK,EAAE;AAAA,EAC/D,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,4BAA4B,OAAO,EAAE,EAAE;AAAA,EACzE;AACF;AAEA,eAAe,eACb,QACA,UAAkB,QAAQ,IAAI,GACG;AACjC,QAAM,UAAU,KAAK,KAAK,SAAS,OAAO,OAAO;AACjD,QAAM,UAAU,KAAK,KAAK,SAAS,OAAO,OAAO;AACjD,QAAM,QAAQ,MAAM,GAAG,SAAS,EAAE,UAAU,KAAK,CAAC;AAElD,QAAM,SAAiC;AAAA,IACrC,YAAY,OAAO;AAAA,IACnB,OAAO;AAAA,IACP,YAAY,MAAM;AAAA,IAClB,YAAY;AAAA,IACZ,cAAc,CAAC;AAAA,EACjB;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,MAAM,aAAa,MAAM,OAAO,QAAQ,OAAO,SAAS;AAC3E,UAAM,eAAe,KAAK,SAAS,SAAS,IAAI;AAEhD,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ;AACf,aAAO,aAAa,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,mBACpB,UAAkB,QAAQ,IAAI,GACC;AAC/B,QAAM,UAAoC,CAAC;AAE3C,aAAW,UAAU,oBAAoB;AACvC,UAAM,SAAS,MAAM,eAAe,QAAQ,OAAO;AACnD,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,QAAM,UAAU;AAAA,IACd,cAAc,QAAQ;AAAA,IACtB,YAAY,MAAM,SAAS,CAAC,MAAM,EAAE,UAAU;AAAA,IAC9C,YAAY,MAAM,SAAS,CAAC,MAAM,EAAE,UAAU;AAAA,IAC9C,cAAc,MAAM,SAAS,CAAC,MAAM,EAAE,aAAa,MAAM;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,QAAoC;AACzE,UAAQ,IAAI;AAAA,6BAAgC;AAC5C,UAAQ,IAAI,0JAA6B;AACzC,UAAQ,IAAI,4BAA4B,OAAO,QAAQ,YAAY,EAAE;AACrE,UAAQ,IAAI,kBAAkB,OAAO,QAAQ,UAAU,EAAE;AACzD,UAAQ,IAAI,YAAY,OAAO,QAAQ,UAAU,EAAE;AACnD,UAAQ,IAAI,cAAc,OAAO,QAAQ,YAAY,EAAE;AAEvD,aAAW,gBAAgB,OAAO,SAAS;AACzC,QAAI,aAAa,eAAe,EAAG;AAEnC,UAAM,SAAS,aAAa,QAAQ,WAAM;AAC1C,YAAQ;AAAA,MACN;AAAA,IAAO,MAAM,IAAI,aAAa,UAAU,KAAK,aAAa,UAAU,IAAI,aAAa,UAAU;AAAA,IACjG;AAEA,QAAI,aAAa,aAAa,SAAS,GAAG;AACxC,iBAAW,QAAQ,aAAa,cAAc;AAC5C,gBAAQ,IAAI;AAAA,MAAS,KAAK,IAAI,GAAG;AACjC,aAAK,OAAO,QAAQ,CAAC,MAAM,QAAQ,IAAI,WAAW,CAAC,EAAE,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,YAAQ,IAAI;AAAA;AAAA,CAA4C;AAAA,EAC1D,OAAO;AACL,YAAQ,IAAI;AAAA;AAAA,CAA2B;AAAA,EACzC;AACF;;;ADhOA,IAAqB,WAArB,MAAqB,kBAAiB,YAAY;AAAA,EAChD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAIF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,KAAK,MAAM,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,SAAS,MAAM,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,SAAQ;AAEjD,QAAI,KAAK,QAAQ,MAAM,SAAS;AAC9B,YAAM,KAAK,gBAAgB,KAAK,MAAM,MAAM,SAAS,MAAM,GAAG;AAAA,IAChE,OAAO;AACL,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,kBAAiC;AAC7C,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,wBAAwB;AACjC,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB;AAExC,YAAM,UAAU,OAAO,QACnB,SAAS,OAAO,QAAQ,UAAU,IAAI,OAAO,QAAQ,UAAU,iBAC/D,SAAS,OAAO,QAAQ,YAAY;AAExC,WAAK,IAAI,OAAO;AAChB,6BAAuB,MAAM;AAE7B,UAAI,CAAC,OAAO,OAAO;AACjB,aAAK,KAAK,WAAW,KAAK;AAAA,MAC5B;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,YACA,SACA,KACe;AACf,UAAM,aAAa,aAAaC,MAAK,QAAQ,UAAU,IAAI,QAAQ,IAAI;AAEvE,QAAI,KAAK;AACP,YAAM,KAAK,8BAA8B,YAAY,OAAO;AAAA,IAC9D,OAAO;AACL,YAAM,KAAK,qBAAqB,YAAY,OAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAc,8BAA8B,YAAoB,SAAiC;AAC/F,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,8BAA8B,UAAU,EAAE;AACnD,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,UAAU;AAElD,YAAM,UAAU,OAAO,QACnB,SAAS,OAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,KAAK,mBACrD,SAAS,OAAO,QAAQ,OAAO;AAEnC,WAAK,IAAI,OAAO;AAEhB,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,8BAA8B;AACvC,WAAK,IAAI,6BAA6B;AACtC,WAAK,IAAI,oBAAoB,OAAO,QAAQ,KAAK,EAAE;AACnD,WAAK,IAAI,YAAY,OAAO,QAAQ,KAAK,EAAE;AAC3C,WAAK,IAAI,cAAc,OAAO,QAAQ,OAAO,EAAE;AAC/C,WAAK,IAAI,oBAAoB,OAAO,QAAQ,YAAY,EAAE;AAE1D,iBAAW,EAAE,MAAM,QAAQ,aAAa,KAAK,OAAO,SAAS;AAC3D,oCAA4B,MAAM,cAAc,OAAO;AAAA,MACzD;AAEA,UAAI,OAAO,OAAO;AAChB,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,oCAAoC;AACpD,aAAK,IAAI,EAAE;AAAA,MACb,OAAO;AACL,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,qBAAqB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,YAAoB,SAAiC;AACtF,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,sBAAsB,UAAU,EAAE;AAC3C,SAAK,IAAI,EAAE;AAEX,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,UAAU;AAE9C,YAAM,UAAU,OAAO,QAAQ,0BAA0B;AAEzD,WAAK,IAAI,OAAO;AAEhB,kCAA4BA,MAAK,SAAS,UAAU,GAAG,QAAQ,IAAI;AAEnE,UAAI,OAAO,SAAS,OAAO,SAAS,WAAW,GAAG;AAChD,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,+BAA+B;AAC/C,aAAK,IAAI,EAAE;AAAA,MACb,WAAW,OAAO,OAAO;AACvB,aAAK,IAAI,EAAE;AACX,aAAK,WAAW,4BAA4B;AAC5C,aAAK,IAAI,EAAE;AAAA,MACb,OAAO;AACL,aAAK,IAAI,EAAE;AACX,aAAK,MAAM,qBAAqB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAK,MAAM,sBAAsB,OAAO,IAAI,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACxE;AAAA,EACF;AACF;","names":["path","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/validate.ts","../../src/cli/lib/schema-validator.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport { BaseCommand } from \"../base-command.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { ERROR_MESSAGES } from \"../utils/messages.js\";\nimport { validateAllSchemas, printValidationResults } from \"../lib/schema-validator.js\";\nimport {\n validatePlugin,\n validateAllPlugins,\n printPluginValidationResult,\n} from \"../lib/plugins/index.js\";\n\nexport default class Validate extends BaseCommand {\n static summary = \"Validate YAML files against schemas or validate compiled plugins\";\n static description =\n \"Validates skill/agent YAML files against JSON schemas, or validates compiled plugin structure and content. \" +\n \"Without arguments, validates all YAML files in the current directory against their schemas. \" +\n \"With a path argument or --plugins flag, validates plugin(s) instead.\";\n\n static examples = [\n {\n description: \"Validate all YAML schemas\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Validate a specific plugin\",\n command: \"<%= config.bin %> <%= command.id %> ./path/to/plugin\",\n },\n {\n description: \"Validate all plugins in a directory\",\n command: \"<%= config.bin %> <%= command.id %> ./plugins --all\",\n },\n {\n description: \"Validate plugins with verbose output\",\n command: \"<%= config.bin %> <%= command.id %> --plugins --verbose\",\n },\n ];\n\n static args = {\n path: Args.string({\n description: \"Path to plugin or plugins directory to validate\",\n required: false,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n verbose: Flags.boolean({\n char: \"v\",\n description: \"Enable verbose logging\",\n default: false,\n }),\n all: Flags.boolean({\n char: \"a\",\n description: \"Validate all plugins in directory\",\n default: false,\n }),\n plugins: Flags.boolean({\n char: \"p\",\n description: \"Validate plugins instead of schemas\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Validate);\n\n if (args.path || flags.plugins) {\n await this.validatePlugins(args.path, flags.verbose, flags.all);\n } else {\n await this.validateSchemas();\n }\n }\n\n private async validateSchemas(): Promise<void> {\n this.log(\"\");\n this.log(\"Validating all schemas\");\n this.log(\"\");\n\n try {\n const result = await validateAllSchemas();\n\n const summary = result.valid\n ? `Done: ${result.summary.validFiles}/${result.summary.totalFiles} files valid`\n : `Done: ${result.summary.invalidFiles} invalid files`;\n\n this.log(summary);\n printValidationResults(result);\n\n if (!result.valid) {\n this.exit(EXIT_CODES.ERROR);\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validatePlugins(\n pluginPath: string | undefined,\n verbose: boolean,\n all: boolean,\n ): Promise<void> {\n const targetPath = pluginPath ? path.resolve(pluginPath) : process.cwd();\n\n if (all) {\n await this.validateAllPluginsInDirectory(targetPath, verbose);\n } else {\n await this.validateSinglePlugin(targetPath, verbose);\n }\n }\n\n private async validateAllPluginsInDirectory(targetPath: string, verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating all plugins in: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validateAllPlugins(targetPath);\n\n const summary = result.valid\n ? `Done: ${result.summary.valid}/${result.summary.total} plugins valid`\n : `Done: ${result.summary.invalid} invalid plugins`;\n\n this.log(summary);\n\n this.log(\"\");\n this.log(\" Plugin Validation Summary:\");\n this.log(\" -------------------------\");\n this.log(` Total plugins: ${result.summary.total}`);\n this.log(` Valid: ${result.summary.valid}`);\n this.log(` Invalid: ${result.summary.invalid}`);\n this.log(` With warnings: ${result.summary.withWarnings}`);\n\n for (const { name, result: pluginResult } of result.results) {\n printPluginValidationResult(name, pluginResult, verbose);\n }\n\n if (result.valid) {\n this.log(\"\");\n this.logSuccess(\"All plugins validated successfully\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n\n private async validateSinglePlugin(targetPath: string, _verbose: boolean): Promise<void> {\n this.log(\"\");\n this.log(`Validating plugin: ${targetPath}`);\n this.log(\"\");\n\n try {\n const result = await validatePlugin(targetPath);\n\n const summary = result.valid ? \"Done: Plugin is valid\" : \"Done: Plugin has errors\";\n\n this.log(summary);\n\n printPluginValidationResult(path.basename(targetPath), result, true);\n\n if (result.valid && result.warnings.length === 0) {\n this.log(\"\");\n this.logSuccess(\"Plugin validated successfully\");\n this.log(\"\");\n } else if (result.valid) {\n this.log(\"\");\n this.logWarning(\"Plugin valid with warnings\");\n this.log(\"\");\n } else {\n this.log(\"\");\n this.error(ERROR_MESSAGES.VALIDATION_FAILED, { exit: EXIT_CODES.ERROR });\n }\n } catch (error) {\n const message = getErrorMessage(error);\n this.error(`${ERROR_MESSAGES.VALIDATION_FAILED}: ${message}`, { exit: EXIT_CODES.ERROR });\n }\n }\n}\n","import { sumBy } from \"remeda\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport { getErrorMessage } from \"../utils/errors\";\nimport { readFile, fileExists } from \"../utils/fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport fg from \"fast-glob\";\nimport { extractFrontmatter } from \"../utils/frontmatter\";\nimport { log } from \"../utils/logger\";\nimport {\n skillsMatrixConfigSchema,\n metadataValidationSchema,\n stackConfigValidationSchema,\n skillFrontmatterValidationSchema,\n agentFrontmatterValidationSchema,\n agentYamlGenerationSchema,\n stacksConfigSchema,\n projectSourceConfigSchema,\n pluginManifestSchema,\n} from \"./schemas\";\nimport { CLAUDE_DIR, CLAUDE_SRC_DIR, STANDARD_FILES } from \"../consts\";\n\ntype FileValidationError = {\n file: string;\n errors: string[];\n};\n\ntype SchemaValidationResult = {\n schemaName: string;\n valid: boolean;\n totalFiles: number;\n validFiles: number;\n invalidFiles: FileValidationError[];\n};\n\nexport type FullValidationResult = {\n valid: boolean;\n results: SchemaValidationResult[];\n summary: {\n totalSchemas: number;\n totalFiles: number;\n validFiles: number;\n invalidFiles: number;\n };\n};\n\ntype ContentExtractor = (content: string) => unknown | null;\n\ntype ValidationTarget = {\n name: string;\n schema: z.ZodType<unknown>;\n pattern: string;\n baseDir: string;\n extractor?: ContentExtractor;\n};\n\nconst VALIDATION_TARGETS: ValidationTarget[] = [\n {\n name: \"Skills Matrix\",\n schema: skillsMatrixConfigSchema,\n pattern: STANDARD_FILES.SKILLS_MATRIX_YAML,\n baseDir: \"src/config\",\n },\n {\n name: \"Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `**/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: \"src/skills\",\n },\n {\n name: \"Stack Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `**/skills/**/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: \"src/stacks\",\n },\n {\n name: \"Stack Config\",\n schema: stackConfigValidationSchema,\n pattern: `*/${STANDARD_FILES.CONFIG_YAML}`,\n baseDir: \"src/stacks\",\n },\n {\n name: \"Agent Definition\",\n schema: agentYamlGenerationSchema,\n pattern: `**/${STANDARD_FILES.AGENT_YAML}`,\n baseDir: \"src/agents\",\n },\n {\n name: \"Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `**/${STANDARD_FILES.SKILL_MD}`,\n baseDir: \"src/skills\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stack Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `**/skills/**/${STANDARD_FILES.SKILL_MD}`,\n baseDir: \"src/stacks\",\n extractor: extractFrontmatter,\n },\n {\n name: \"Stacks Config\",\n schema: stacksConfigSchema,\n pattern: \"stacks.yaml\",\n baseDir: \"config\",\n },\n {\n name: \"Project Source Config\",\n schema: projectSourceConfigSchema,\n pattern: STANDARD_FILES.CONFIG_YAML,\n baseDir: CLAUDE_SRC_DIR,\n },\n {\n name: \"Project Skill Metadata\",\n schema: metadataValidationSchema,\n pattern: `*/${STANDARD_FILES.METADATA_YAML}`,\n baseDir: `${CLAUDE_DIR}/skills`,\n },\n {\n name: \"Project Skill Frontmatter\",\n schema: skillFrontmatterValidationSchema,\n pattern: `*/${STANDARD_FILES.SKILL_MD}`,\n baseDir: `${CLAUDE_DIR}/skills`,\n extractor: extractFrontmatter,\n },\n {\n name: \"Project Agent Frontmatter\",\n schema: agentFrontmatterValidationSchema,\n pattern: \"*.md\",\n baseDir: `${CLAUDE_DIR}/agents`,\n extractor: extractFrontmatter,\n },\n {\n name: \"Plugin Manifest\",\n schema: pluginManifestSchema,\n pattern: `*/${STANDARD_FILES.PLUGIN_JSON}`,\n baseDir: `${CLAUDE_DIR}/plugins`,\n extractor: (content: string) => JSON.parse(content) as unknown,\n },\n];\n\nfunction formatZodErrors(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n if (issue.code === \"unrecognized_keys\") {\n return `Unrecognized key: \"${issue.keys.join('\", \"')}\"`;\n }\n return path ? `${path}: ${issue.message}` : issue.message;\n });\n}\n\nasync function validateFile(\n filePath: string,\n schema: z.ZodType<unknown>,\n extractor?: ContentExtractor,\n): Promise<{ valid: boolean; errors: string[] }> {\n try {\n if (!(await fileExists(filePath))) {\n return { valid: false, errors: [`File not found: ${filePath}`] };\n }\n\n const content = await readFile(filePath);\n\n let parsed: unknown;\n if (extractor) {\n parsed = extractor(content);\n if (parsed === null) {\n return {\n valid: false,\n errors: [\"Failed to extract content (no valid frontmatter found)\"],\n };\n }\n } else {\n parsed = parseYaml(content);\n }\n\n const result = schema.safeParse(parsed);\n\n if (result.success) {\n return { valid: true, errors: [] };\n }\n\n return { valid: false, errors: formatZodErrors(result.error) };\n } catch (error) {\n const message = getErrorMessage(error);\n return { valid: false, errors: [`Failed to parse content: ${message}`] };\n }\n}\n\nasync function validateTarget(\n target: ValidationTarget,\n rootDir: string = process.cwd(),\n): Promise<SchemaValidationResult> {\n const baseDir = path.join(rootDir, target.baseDir);\n const pattern = path.join(baseDir, target.pattern);\n const files = await fg(pattern, { absolute: true });\n\n const result: SchemaValidationResult = {\n schemaName: target.name,\n valid: true,\n totalFiles: files.length,\n validFiles: 0,\n invalidFiles: [],\n };\n\n if (files.length === 0) {\n return result;\n }\n\n for (const file of files) {\n const validation = await validateFile(file, target.schema, target.extractor);\n const relativePath = path.relative(rootDir, file);\n\n if (validation.valid) {\n result.validFiles++;\n } else {\n result.valid = false;\n result.invalidFiles.push({\n file: relativePath,\n errors: validation.errors,\n });\n }\n }\n\n return result;\n}\n\nexport async function validateAllSchemas(\n rootDir: string = process.cwd(),\n): Promise<FullValidationResult> {\n const results: SchemaValidationResult[] = [];\n\n for (const target of VALIDATION_TARGETS) {\n const result = await validateTarget(target, rootDir);\n results.push(result);\n }\n\n const summary = {\n totalSchemas: results.length,\n totalFiles: sumBy(results, (r) => r.totalFiles),\n validFiles: sumBy(results, (r) => r.validFiles),\n invalidFiles: sumBy(results, (r) => r.invalidFiles.length),\n };\n\n return {\n valid: results.every((r) => r.valid),\n results,\n summary,\n };\n}\n\nexport function printValidationResults(result: FullValidationResult): void {\n log(\"\\n Schema Validation Summary:\");\n log(\" ─────────────────────────\");\n log(` Total schemas checked: ${result.summary.totalSchemas}`);\n log(` Total files: ${result.summary.totalFiles}`);\n log(` Valid: ${result.summary.validFiles}`);\n log(` Invalid: ${result.summary.invalidFiles}`);\n\n for (const schemaResult of result.results) {\n if (schemaResult.totalFiles === 0) continue;\n\n const status = schemaResult.valid ? \"✓\" : \"✗\";\n log(\n `\\n ${status} ${schemaResult.schemaName}: ${schemaResult.validFiles}/${schemaResult.totalFiles} valid`,\n );\n\n if (schemaResult.invalidFiles.length > 0) {\n for (const file of schemaResult.invalidFiles) {\n log(`\\n ${file.file}:`);\n file.errors.forEach((e) => log(` - ${e}`));\n }\n }\n }\n\n if (result.valid) {\n log(\"\\n ✓ All schemas validated successfully\\n\");\n } else {\n log(\"\\n ✗ Validation failed\\n\");\n }\n}\n"],"mappings":"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","names":["path","path","path"]}
|
|
@@ -2,20 +2,19 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseCommand,
|
|
4
4
|
EXIT_CODES
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-5I6VY2E7.js";
|
|
6
6
|
import {
|
|
7
7
|
bumpPluginVersion,
|
|
8
8
|
findPluginManifest
|
|
9
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-SSHG7MEE.js";
|
|
10
10
|
import {
|
|
11
11
|
pluginManifestSchema,
|
|
12
12
|
readFile
|
|
13
|
-
} from "../../chunk-
|
|
14
|
-
import "../../chunk-HWD32NP7.js";
|
|
13
|
+
} from "../../chunk-5WIHSJRO.js";
|
|
15
14
|
import {
|
|
16
15
|
PLUGIN_MANIFEST_DIR,
|
|
17
16
|
PLUGIN_MANIFEST_FILE
|
|
18
|
-
} from "../../chunk-
|
|
17
|
+
} from "../../chunk-IFODQTCX.js";
|
|
19
18
|
import {
|
|
20
19
|
init_esm_shims
|
|
21
20
|
} from "../../chunk-AWKZ5BDL.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/version/bump.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/version/bump.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport {\n bumpPluginVersion,\n type VersionBumpType,\n findPluginManifest,\n} from \"../../lib/plugins/index.js\";\nimport { pluginManifestSchema } from \"../../lib/schemas.js\";\nimport { readFile } from \"../../utils/fs.js\";\n\nexport default class VersionBump extends BaseCommand {\n static summary = \"Bump plugin version\";\n static description =\n \"Increment the plugin version by the specified type (major, minor, or patch).\";\n\n static args = {\n type: Args.string({\n description: \"Version bump type\",\n required: true,\n options: [\"major\", \"minor\", \"patch\"],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> patch\",\n \"<%= config.bin %> <%= command.id %> minor\",\n \"<%= config.bin %> <%= command.id %> major\",\n \"<%= config.bin %> <%= command.id %> patch --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionBump);\n const bumpType = args.type as VersionBumpType;\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(`[DRY RUN] Would bump ${pluginName} version: ${oldVersion} -> ${bumpType}`);\n return;\n }\n\n const newVersion = await bumpPluginVersion(pluginDir, bumpType);\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to bump plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,YAAY;AACrB,OAAO,UAAU;AAajB,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAEF,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,CAAC,SAAS,SAAS,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,YAAW;AACpD,UAAM,WAAW,KAAK;AAEtB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,qBAAqB,MAAM,KAAK,MAAM,OAAO,CAAC;AAC/D,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK,IAAI,wBAAwB,UAAU,aAAa,UAAU,OAAO,QAAQ,EAAE;AACnF;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,kBAAkB,WAAW,QAAQ;AAC9D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseCommand,
|
|
4
4
|
EXIT_CODES
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-5I6VY2E7.js";
|
|
6
6
|
import {
|
|
7
7
|
findPluginManifest,
|
|
8
8
|
getPluginVersion
|
|
9
|
-
} from "../../chunk-
|
|
10
|
-
import "../../chunk-
|
|
11
|
-
import "../../chunk-HWD32NP7.js";
|
|
9
|
+
} from "../../chunk-SSHG7MEE.js";
|
|
10
|
+
import "../../chunk-5WIHSJRO.js";
|
|
12
11
|
import {
|
|
13
12
|
PLUGIN_MANIFEST_DIR,
|
|
14
13
|
PLUGIN_MANIFEST_FILE
|
|
15
|
-
} from "../../chunk-
|
|
14
|
+
} from "../../chunk-IFODQTCX.js";
|
|
16
15
|
import {
|
|
17
16
|
init_esm_shims
|
|
18
17
|
} from "../../chunk-AWKZ5BDL.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/version/index.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion, findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\n\nexport default class Version extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description = \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(Version);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/version/index.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport { getPluginVersion, findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport path from \"path\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\n\nexport default class Version extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description = \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(Version);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAGA,OAAO,UAAU;AAGjB,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC/C,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,QAAO;AACxB,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
|
@@ -2,20 +2,19 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseCommand,
|
|
4
4
|
EXIT_CODES
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-5I6VY2E7.js";
|
|
6
6
|
import {
|
|
7
7
|
findPluginManifest
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-SSHG7MEE.js";
|
|
9
9
|
import {
|
|
10
10
|
pluginManifestSchema,
|
|
11
11
|
readFile,
|
|
12
12
|
writeFile
|
|
13
|
-
} from "../../chunk-
|
|
14
|
-
import "../../chunk-HWD32NP7.js";
|
|
13
|
+
} from "../../chunk-5WIHSJRO.js";
|
|
15
14
|
import {
|
|
16
15
|
PLUGIN_MANIFEST_DIR,
|
|
17
16
|
PLUGIN_MANIFEST_FILE
|
|
18
|
-
} from "../../chunk-
|
|
17
|
+
} from "../../chunk-IFODQTCX.js";
|
|
19
18
|
import {
|
|
20
19
|
init_esm_shims
|
|
21
20
|
} from "../../chunk-AWKZ5BDL.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/version/set.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/version/set.ts"],"sourcesContent":["import { Args } from \"@oclif/core\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { findPluginManifest } from \"../../lib/plugins/index.js\";\nimport { pluginManifestSchema } from \"../../lib/schemas.js\";\nimport { readFile, writeFile } from \"../../utils/fs.js\";\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)$/;\n\nfunction isValidSemver(version: string): boolean {\n return SEMVER_REGEX.test(version);\n}\n\nexport default class VersionSet extends BaseCommand {\n static summary = \"Set plugin version to a specific value\";\n static description = \"Set the plugin version to an explicit semantic version (e.g., 1.2.3).\";\n\n static args = {\n version: Args.string({\n description: \"Version to set (semantic version format: X.Y.Z)\",\n required: true,\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\n \"<%= config.bin %> <%= command.id %> 1.0.0\",\n \"<%= config.bin %> <%= command.id %> 2.1.3\",\n \"<%= config.bin %> <%= command.id %> 1.0.0 --dry-run\",\n ];\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(VersionSet);\n const newVersion = args.version;\n\n if (!isValidSemver(newVersion)) {\n this.error(\n `Invalid version format: \"${newVersion}\". Must be semantic version (e.g., 1.0.0)`,\n { exit: EXIT_CODES.INVALID_ARGS },\n );\n }\n\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n try {\n const content = await readFile(manifestPath);\n const manifest = pluginManifestSchema.parse(JSON.parse(content));\n const oldVersion = manifest.version || \"1.0.0\";\n const pluginName = manifest.name || \"unknown\";\n\n if (flags[\"dry-run\"]) {\n this.log(`[DRY RUN] Would set ${pluginName} version: ${oldVersion} -> ${newVersion}`);\n return;\n }\n\n manifest.version = newVersion;\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2));\n\n this.log(`${pluginName}: ${oldVersion} -> ${newVersion}`);\n } catch (error) {\n this.error(`Failed to set plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,YAAY;AASrB,IAAM,eAAe;AAErB,SAAS,cAAc,SAA0B;AAC/C,SAAO,aAAa,KAAK,OAAO;AAClC;AAEA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACZ,SAAS,KAAK,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AACnD,UAAM,aAAa,KAAK;AAExB,QAAI,CAAC,cAAc,UAAU,GAAG;AAC9B,WAAK;AAAA,QACH,4BAA4B,UAAU;AAAA,QACtC,EAAE,MAAM,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,YAAM,WAAW,qBAAqB,MAAM,KAAK,MAAM,OAAO,CAAC;AAC/D,YAAM,aAAa,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS,QAAQ;AAEpC,UAAI,MAAM,SAAS,GAAG;AACpB,aAAK,IAAI,uBAAuB,UAAU,aAAa,UAAU,OAAO,UAAU,EAAE;AACpF;AAAA,MACF;AAEA,eAAS,UAAU;AACnB,YAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAE/D,WAAK,IAAI,GAAG,UAAU,KAAK,UAAU,OAAO,UAAU,EAAE;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,MAAM,iCAAiC,KAAK,IAAI;AAAA,QACnD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseCommand,
|
|
4
4
|
EXIT_CODES
|
|
5
|
-
} from "../../chunk-
|
|
5
|
+
} from "../../chunk-5I6VY2E7.js";
|
|
6
6
|
import {
|
|
7
7
|
findPluginManifest,
|
|
8
8
|
getPluginVersion
|
|
9
|
-
} from "../../chunk-
|
|
10
|
-
import "../../chunk-
|
|
11
|
-
import "../../chunk-HWD32NP7.js";
|
|
9
|
+
} from "../../chunk-SSHG7MEE.js";
|
|
10
|
+
import "../../chunk-5WIHSJRO.js";
|
|
12
11
|
import {
|
|
13
12
|
PLUGIN_MANIFEST_DIR,
|
|
14
13
|
PLUGIN_MANIFEST_FILE
|
|
15
|
-
} from "../../chunk-
|
|
14
|
+
} from "../../chunk-IFODQTCX.js";
|
|
16
15
|
import {
|
|
17
16
|
init_esm_shims
|
|
18
17
|
} from "../../chunk-AWKZ5BDL.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/commands/version/show.ts"],"sourcesContent":["import { BaseCommand } from \"../../base-command.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/version/show.ts"],"sourcesContent":["import path from \"path\";\n\nimport { BaseCommand } from \"../../base-command.js\";\nimport { PLUGIN_MANIFEST_DIR, PLUGIN_MANIFEST_FILE } from \"../../consts.js\";\nimport { EXIT_CODES } from \"../../lib/exit-codes.js\";\nimport { getPluginVersion, findPluginManifest } from \"../../lib/plugins/index.js\";\n\nexport default class VersionShow extends BaseCommand {\n static summary = \"Show current plugin version\";\n static description = \"Display the current version of the plugin in the current directory.\";\n\n static flags = {\n ...BaseCommand.baseFlags,\n };\n\n static examples = [\"<%= config.bin %> <%= command.id %>\"];\n\n async run(): Promise<void> {\n await this.parse(VersionShow);\n const manifestPath = await findPluginManifest(process.cwd());\n\n if (!manifestPath) {\n this.error(\n `No plugin.json found in current directory or parents\\nExpected location: ${PLUGIN_MANIFEST_DIR}/${PLUGIN_MANIFEST_FILE}`,\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n const pluginDir = path.dirname(path.dirname(manifestPath));\n\n try {\n const version = await getPluginVersion(pluginDir);\n this.log(version);\n } catch (error) {\n this.error(`Failed to read plugin version: ${error}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA,OAAO,UAAU;AAOjB,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAO,UAAU;AAAA,EACjB,OAAO,cAAc;AAAA,EAErB,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,EACjB;AAAA,EAEA,OAAO,WAAW,CAAC,qCAAqC;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,YAAW;AAC5B,UAAM,eAAe,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AAE3D,QAAI,CAAC,cAAc;AACjB,WAAK;AAAA,QACH;AAAA,qBAA4E,mBAAmB,IAAI,oBAAoB;AAAA,QACvH,EAAE,MAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAEzD,QAAI;AACF,YAAM,UAAU,MAAM,iBAAiB,SAAS;AAChD,WAAK,IAAI,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,WAAK,MAAM,kCAAkC,KAAK,IAAI;AAAA,QACpD,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
+
CONFIRM_INPUT_DELAY_MS,
|
|
3
4
|
ENTER,
|
|
4
5
|
KEY_N,
|
|
5
6
|
KEY_Y,
|
|
6
7
|
RENDER_DELAY_MS,
|
|
7
8
|
delay
|
|
8
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-7GHTQSWI.js";
|
|
9
10
|
import {
|
|
10
11
|
render
|
|
11
12
|
} from "../../chunk-REJGRCVQ.js";
|
|
@@ -26,7 +27,6 @@ import {
|
|
|
26
27
|
// src/cli/components/common/confirm.test.tsx
|
|
27
28
|
init_esm_shims();
|
|
28
29
|
import { jsx } from "react/jsx-runtime";
|
|
29
|
-
var CONFIRM_INPUT_DELAY_MS = 100;
|
|
30
30
|
describe("Confirm component", () => {
|
|
31
31
|
let cleanup;
|
|
32
32
|
afterEach(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/common/confirm.test.tsx"],"sourcesContent":["// ConfirmInput requires longer delays than other components for useInput processing\nimport
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/common/confirm.test.tsx"],"sourcesContent":["// ConfirmInput requires longer delays than other components for useInput processing\nimport { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { Confirm } from \"./confirm\";\nimport {\n KEY_Y,\n KEY_N,\n ENTER,\n RENDER_DELAY_MS,\n CONFIRM_INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\ndescribe(\"Confirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the message\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Do you want to proceed?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Do you want to proceed?\");\n });\n\n it(\"should show y/n prompt\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Continue?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ConfirmInput shows (Y/n) or (y/N) depending on default\n expect(output?.toLowerCase()).toMatch(/[yn]/);\n });\n\n it(\"should show Y/n when default is confirm (true)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Y/n\");\n });\n\n it(\"should show y/N when default is cancel (false)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={() => {}}\n onCancel={() => {}}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"y/N\");\n });\n });\n\n describe(\"keyboard interactions\", () => {\n it(\"should call onConfirm when pressing y\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n // Wait for component to mount and set up input handler\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_Y);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when pressing n\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_N);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should call onConfirm when default is true and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={true}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when default is false and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should handle uppercase Y\", async () => {\n const onConfirm = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"Y\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n });\n\n it(\"should handle uppercase N\", async () => {\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"N\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n });\n });\n\n describe(\"default value\", () => {\n it(\"should default to false when not specified\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is false, N is capitalized (y/N)\n expect(output).toContain(\"y/N\");\n });\n\n it(\"should render with specified default value of true\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is true, Y is capitalized (Y/n)\n expect(output).toContain(\"Y/n\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SkillSearch
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-6F3ZKDVE.js";
|
|
5
|
+
import "../../chunk-AJFSCLJ7.js";
|
|
6
|
+
import "../../chunk-RXC7AF7N.js";
|
|
7
|
+
import "../../chunk-IFODQTCX.js";
|
|
6
8
|
import "../../chunk-AWKZ5BDL.js";
|
|
7
9
|
export {
|
|
8
10
|
SkillSearch
|