@skillkit/cli 1.7.8 → 1.7.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@skillkit/cli.svg)](https://www.npmjs.com/package/@skillkit/cli)
4
4
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
5
5
 
6
- **Command-line interface for SkillKit** - install, manage, translate, and sync skills across 17 AI coding agents.
6
+ **Command-line interface for SkillKit** - install, manage, translate, and sync skills across 32 AI coding agents.
7
7
 
8
8
  ## Installation
9
9
 
@@ -243,7 +243,7 @@ const recs = await recommendCommand({
243
243
  | Gemini CLI | SKILL.md |
244
244
  | Windsurf | Markdown |
245
245
  | GitHub Copilot | Markdown |
246
- | + 11 more | SKILL.md |
246
+ | + 26 more | SKILL.md |
247
247
 
248
248
  ## Documentation
249
249
 
package/dist/index.d.ts CHANGED
@@ -821,6 +821,25 @@ declare class ManifestGenerateCommand extends Command {
821
821
  execute(): Promise<number>;
822
822
  }
823
823
 
824
+ declare class PrimerCommand extends Command {
825
+ static paths: string[][];
826
+ static usage: clipanion.Usage;
827
+ agent: string | undefined;
828
+ allAgents: boolean;
829
+ output: string | undefined;
830
+ dryRun: boolean;
831
+ analyzeOnly: boolean;
832
+ verbose: boolean;
833
+ includeExamples: boolean;
834
+ json: boolean;
835
+ directory: string | undefined;
836
+ execute(): Promise<number>;
837
+ private runAnalysis;
838
+ private runGenerate;
839
+ private parseAgents;
840
+ private printAnalysis;
841
+ }
842
+
824
843
  declare const loadSkillMetadata: typeof loadSkillMetadata$1;
825
844
  declare const saveSkillMetadata: typeof saveSkillMetadata$1;
826
845
  declare function getSearchDirs(agentType?: AgentType): string[];
@@ -828,4 +847,4 @@ declare function getInstallDir(global?: boolean, agentType?: AgentType): string;
828
847
  declare function getAgentConfigPath(agentType?: AgentType): string;
829
848
  declare function initProject(agentType?: AgentType): Promise<void>;
830
849
 
831
- export { AICommand, AgentCommand, AgentCreateCommand, AgentListCommand, AgentShowCommand, AgentSyncCommand, AgentTranslateCommand, AgentValidateCommand, AuditCommand, CICDCommand, CheckCommand, CommandCmd, ContextCommand, CreateCommand, DisableCommand, EnableCommand, FindCommand, FixCommand, HookCommand, InitCommand, InstallCommand, ListCommand, ManifestAddCommand, ManifestCommand, ManifestGenerateCommand, ManifestInitCommand, ManifestInstallCommand, ManifestRemoveCommand, MarketplaceCommand, MemoryCommand, MethodologyCommand, PauseCommand, PlanCommand, PluginCommand, PublishCommand, ReadCommand, RecommendCommand, RemoveCommand, ResumeCommand, RunCommand, SettingsCommand, StatusCommand, SyncCommand, TeamCommand, TestCommand, TranslateCommand, UICommand, UpdateCommand, ValidateCommand, WorkflowCreateCommand, WorkflowListCommand, WorkflowRunCommand, getAgentConfigPath, getInstallDir, getSearchDirs, initProject, loadSkillMetadata, saveSkillMetadata };
850
+ export { AICommand, AgentCommand, AgentCreateCommand, AgentListCommand, AgentShowCommand, AgentSyncCommand, AgentTranslateCommand, AgentValidateCommand, AuditCommand, CICDCommand, CheckCommand, CommandCmd, ContextCommand, CreateCommand, DisableCommand, EnableCommand, FindCommand, FixCommand, HookCommand, InitCommand, InstallCommand, ListCommand, ManifestAddCommand, ManifestCommand, ManifestGenerateCommand, ManifestInitCommand, ManifestInstallCommand, ManifestRemoveCommand, MarketplaceCommand, MemoryCommand, MethodologyCommand, PauseCommand, PlanCommand, PluginCommand, PrimerCommand, PublishCommand, ReadCommand, RecommendCommand, RemoveCommand, ResumeCommand, RunCommand, SettingsCommand, StatusCommand, SyncCommand, TeamCommand, TestCommand, TranslateCommand, UICommand, UpdateCommand, ValidateCommand, WorkflowCreateCommand, WorkflowListCommand, WorkflowRunCommand, getAgentConfigPath, getInstallDir, getSearchDirs, initProject, loadSkillMetadata, saveSkillMetadata };
package/dist/index.js CHANGED
@@ -711,7 +711,7 @@ var init_onboarding = __esm({
711
711
  init_summary();
712
712
  init_preferences();
713
713
  VERSION = "1.7.6";
714
- AGENT_COUNT = 17;
714
+ AGENT_COUNT = 32;
715
715
  }
716
716
  });
717
717
 
@@ -2568,7 +2568,7 @@ var UICommand = class extends Command12 {
2568
2568
 
2569
2569
  Features:
2570
2570
  - Browse and discover skills from the marketplace
2571
- - Manage installed skills across 17+ AI coding agents
2571
+ - Manage installed skills across 32 AI coding agents
2572
2572
  - Sync skills between agents
2573
2573
  - AI-powered recommendations
2574
2574
  - Team collaboration
@@ -5413,8 +5413,8 @@ ${learning.title}
5413
5413
  return 1;
5414
5414
  }
5415
5415
  const { existsSync: existsSync20, readFileSync: readFileSync10 } = await import("fs");
5416
- const { resolve: resolve18 } = await import("path");
5417
- const fullPath = resolve18(inputPath);
5416
+ const { resolve: resolve19 } = await import("path");
5417
+ const fullPath = resolve19(inputPath);
5418
5418
  if (!existsSync20(fullPath)) {
5419
5419
  console.error(chalk17.red(`File not found: ${fullPath}`));
5420
5420
  return 1;
@@ -135651,6 +135651,315 @@ var ManifestGenerateCommand = class extends Command40 {
135651
135651
  }
135652
135652
  };
135653
135653
 
135654
+ // src/commands/primer.ts
135655
+ import { Command as Command41, Option as Option40 } from "clipanion";
135656
+ import { resolve as resolve18 } from "path";
135657
+ import chalk28 from "chalk";
135658
+ import {
135659
+ AgentType as AgentTypeSchema,
135660
+ generatePrimer,
135661
+ analyzePrimer,
135662
+ AGENT_CONFIG
135663
+ } from "@skillkit/core";
135664
+ var PrimerCommand = class extends Command41 {
135665
+ static paths = [["primer"]];
135666
+ static usage = Command41.Usage({
135667
+ description: "Analyze codebase and generate AI instruction files for agents",
135668
+ details: `
135669
+ The primer command analyzes your codebase to detect languages, frameworks,
135670
+ patterns, and conventions, then generates customized instruction files
135671
+ for AI coding agents.
135672
+
135673
+ By default, it generates instructions for detected agents in your project.
135674
+ Use --all-agents to generate for all 32 supported agents.
135675
+
135676
+ Inspired by github.com/pierceboggan/primer but extended for all SkillKit agents.
135677
+ `,
135678
+ examples: [
135679
+ ["Generate for detected agents", "$0 primer"],
135680
+ ["Generate for all 32 agents", "$0 primer --all-agents"],
135681
+ ["Generate for specific agents", "$0 primer --agent claude-code,cursor,github-copilot"],
135682
+ ["Custom output directory", "$0 primer --output ./instructions"],
135683
+ ["Preview without writing files", "$0 primer --dry-run"],
135684
+ ["Only show analysis", "$0 primer --analyze-only"],
135685
+ ["Verbose output", "$0 primer --verbose"]
135686
+ ]
135687
+ });
135688
+ agent = Option40.String("--agent,-a", {
135689
+ description: "Comma-separated list of agents to generate for"
135690
+ });
135691
+ allAgents = Option40.Boolean("--all-agents,-A", false, {
135692
+ description: "Generate for all 32 supported agents"
135693
+ });
135694
+ output = Option40.String("--output,-o", {
135695
+ description: "Output directory for generated files"
135696
+ });
135697
+ dryRun = Option40.Boolean("--dry-run,-n", false, {
135698
+ description: "Preview what would be generated without writing files"
135699
+ });
135700
+ analyzeOnly = Option40.Boolean("--analyze-only", false, {
135701
+ description: "Only show codebase analysis, do not generate files"
135702
+ });
135703
+ verbose = Option40.Boolean("--verbose,-v", false, {
135704
+ description: "Show detailed output"
135705
+ });
135706
+ includeExamples = Option40.Boolean("--examples", false, {
135707
+ description: "Include code examples in generated instructions"
135708
+ });
135709
+ json = Option40.Boolean("--json,-j", false, {
135710
+ description: "Output analysis in JSON format"
135711
+ });
135712
+ directory = Option40.String("--dir,-d", {
135713
+ description: "Project directory to analyze (default: current directory)"
135714
+ });
135715
+ async execute() {
135716
+ const projectPath = resolve18(this.directory || process.cwd());
135717
+ if (this.analyzeOnly) {
135718
+ return this.runAnalysis(projectPath);
135719
+ }
135720
+ return this.runGenerate(projectPath);
135721
+ }
135722
+ async runAnalysis(projectPath) {
135723
+ console.log(chalk28.cyan("Analyzing codebase...\n"));
135724
+ try {
135725
+ const analysis = analyzePrimer(projectPath);
135726
+ if (this.json) {
135727
+ console.log(JSON.stringify(analysis, null, 2));
135728
+ return 0;
135729
+ }
135730
+ this.printAnalysis(analysis);
135731
+ return 0;
135732
+ } catch (error2) {
135733
+ console.error(chalk28.red("Analysis failed:"), error2 instanceof Error ? error2.message : error2);
135734
+ return 1;
135735
+ }
135736
+ }
135737
+ async runGenerate(projectPath) {
135738
+ const agents = this.parseAgents();
135739
+ console.log(chalk28.cyan("Analyzing codebase and generating AI instructions...\n"));
135740
+ try {
135741
+ const result = generatePrimer(projectPath, {
135742
+ agents,
135743
+ allAgents: this.allAgents,
135744
+ outputDir: this.output ? resolve18(this.output) : void 0,
135745
+ dryRun: this.dryRun,
135746
+ verbose: this.verbose,
135747
+ includeExamples: this.includeExamples
135748
+ });
135749
+ if (this.verbose) {
135750
+ this.printAnalysis(result.analysis);
135751
+ console.log();
135752
+ }
135753
+ if (result.generated.length === 0) {
135754
+ console.log(chalk28.yellow("No instruction files generated."));
135755
+ if (result.errors.length > 0) {
135756
+ for (const error2 of result.errors) {
135757
+ console.log(chalk28.red(` Error: ${error2}`));
135758
+ }
135759
+ }
135760
+ return 1;
135761
+ }
135762
+ console.log(chalk28.bold("Generated Instruction Files:\n"));
135763
+ for (const instruction of result.generated) {
135764
+ const status = this.dryRun ? chalk28.yellow("(dry-run)") : chalk28.green("created");
135765
+ console.log(` ${chalk28.green("\u25CF")} ${chalk28.bold(instruction.agent)}`);
135766
+ console.log(` ${chalk28.gray(instruction.filepath)} ${status}`);
135767
+ }
135768
+ console.log();
135769
+ if (result.warnings.length > 0) {
135770
+ console.log(chalk28.yellow("Warnings:"));
135771
+ for (const warning of result.warnings) {
135772
+ console.log(` ${chalk28.yellow("\u26A0")} ${warning}`);
135773
+ }
135774
+ console.log();
135775
+ }
135776
+ if (result.errors.length > 0) {
135777
+ console.log(chalk28.red("Errors:"));
135778
+ for (const error2 of result.errors) {
135779
+ console.log(` ${chalk28.red("\u2717")} ${error2}`);
135780
+ }
135781
+ console.log();
135782
+ }
135783
+ const summary = this.dryRun ? `Would generate ${result.generated.length} instruction file(s)` : `Generated ${result.generated.length} instruction file(s)`;
135784
+ console.log(chalk28.bold(summary));
135785
+ if (this.dryRun) {
135786
+ console.log(chalk28.gray("\n(Dry run - no files were written)"));
135787
+ }
135788
+ return result.success ? 0 : 1;
135789
+ } catch (error2) {
135790
+ console.error(chalk28.red("Generation failed:"), error2 instanceof Error ? error2.message : error2);
135791
+ return 1;
135792
+ }
135793
+ }
135794
+ parseAgents() {
135795
+ if (!this.agent) return void 0;
135796
+ const agents = [];
135797
+ const parts = this.agent.split(",").map((s) => s.trim());
135798
+ for (const part of parts) {
135799
+ const result = AgentTypeSchema.safeParse(part);
135800
+ if (result.success) {
135801
+ agents.push(result.data);
135802
+ } else {
135803
+ console.warn(chalk28.yellow(`Unknown agent: ${part}`));
135804
+ }
135805
+ }
135806
+ return agents.length > 0 ? agents : void 0;
135807
+ }
135808
+ printAnalysis(analysis) {
135809
+ const { project, languages, packageManagers, stack, structure, conventions, ci, docker, buildCommands, importantFiles } = analysis;
135810
+ console.log(chalk28.bold("Project Information"));
135811
+ console.log(` Name: ${chalk28.cyan(project.name)}`);
135812
+ if (project.description) {
135813
+ console.log(` Description: ${project.description}`);
135814
+ }
135815
+ if (project.type) {
135816
+ console.log(` Type: ${project.type}`);
135817
+ }
135818
+ if (project.version) {
135819
+ console.log(` Version: ${project.version}`);
135820
+ }
135821
+ console.log();
135822
+ if (languages.length > 0) {
135823
+ console.log(chalk28.bold("Languages"));
135824
+ for (const lang of languages) {
135825
+ const version = lang.version ? ` (${lang.version})` : "";
135826
+ console.log(` ${chalk28.green("\u25CF")} ${lang.name}${version}`);
135827
+ }
135828
+ console.log();
135829
+ }
135830
+ if (packageManagers.length > 0) {
135831
+ console.log(chalk28.bold("Package Managers"));
135832
+ console.log(` ${chalk28.cyan(packageManagers.join(", "))}`);
135833
+ console.log();
135834
+ }
135835
+ if (stack.frameworks.length > 0) {
135836
+ console.log(chalk28.bold("Frameworks"));
135837
+ for (const fw of stack.frameworks) {
135838
+ const version = fw.version ? ` (${fw.version})` : "";
135839
+ console.log(` ${chalk28.green("\u25CF")} ${fw.name}${version}`);
135840
+ }
135841
+ console.log();
135842
+ }
135843
+ if (stack.libraries.length > 0) {
135844
+ console.log(chalk28.bold("Libraries"));
135845
+ for (const lib of stack.libraries.slice(0, 10)) {
135846
+ const version = lib.version ? ` (${lib.version})` : "";
135847
+ console.log(` ${chalk28.green("\u25CF")} ${lib.name}${version}`);
135848
+ }
135849
+ if (stack.libraries.length > 10) {
135850
+ console.log(` ${chalk28.gray(`...and ${stack.libraries.length - 10} more`)}`);
135851
+ }
135852
+ console.log();
135853
+ }
135854
+ if (stack.styling.length > 0) {
135855
+ console.log(chalk28.bold("Styling"));
135856
+ for (const style of stack.styling) {
135857
+ console.log(` ${chalk28.green("\u25CF")} ${style.name}`);
135858
+ }
135859
+ console.log();
135860
+ }
135861
+ if (stack.testing.length > 0) {
135862
+ console.log(chalk28.bold("Testing"));
135863
+ for (const test of stack.testing) {
135864
+ console.log(` ${chalk28.green("\u25CF")} ${test.name}`);
135865
+ }
135866
+ console.log();
135867
+ }
135868
+ if (stack.databases.length > 0) {
135869
+ console.log(chalk28.bold("Databases"));
135870
+ for (const db of stack.databases) {
135871
+ console.log(` ${chalk28.green("\u25CF")} ${db.name}`);
135872
+ }
135873
+ console.log();
135874
+ }
135875
+ if (structure) {
135876
+ console.log(chalk28.bold("Project Structure"));
135877
+ if (structure.type) {
135878
+ console.log(` Type: ${structure.type}`);
135879
+ }
135880
+ if (structure.srcDir) {
135881
+ console.log(` Source: ${structure.srcDir}/`);
135882
+ }
135883
+ if (structure.testDir) {
135884
+ console.log(` Tests: ${structure.testDir}/`);
135885
+ }
135886
+ if (structure.hasWorkspaces) {
135887
+ console.log(` Monorepo: Yes`);
135888
+ if (structure.workspaces) {
135889
+ console.log(` Workspaces: ${structure.workspaces.join(", ")}`);
135890
+ }
135891
+ }
135892
+ console.log();
135893
+ }
135894
+ if (conventions && Object.keys(conventions).some((k) => conventions[k] !== void 0)) {
135895
+ console.log(chalk28.bold("Code Conventions"));
135896
+ if (conventions.indentation) {
135897
+ console.log(` Indentation: ${conventions.indentation}`);
135898
+ }
135899
+ if (conventions.quotes) {
135900
+ console.log(` Quotes: ${conventions.quotes}`);
135901
+ }
135902
+ if (conventions.semicolons !== void 0) {
135903
+ console.log(` Semicolons: ${conventions.semicolons ? "yes" : "no"}`);
135904
+ }
135905
+ if (conventions.trailingCommas) {
135906
+ console.log(` Trailing Commas: ${conventions.trailingCommas}`);
135907
+ }
135908
+ console.log();
135909
+ }
135910
+ if (ci && ci.hasCI) {
135911
+ console.log(chalk28.bold("CI/CD"));
135912
+ console.log(` Provider: ${ci.provider}`);
135913
+ if (ci.hasCD) {
135914
+ console.log(` Deployment: Yes`);
135915
+ }
135916
+ console.log();
135917
+ }
135918
+ if (docker && (docker.hasDockerfile || docker.hasCompose)) {
135919
+ console.log(chalk28.bold("Docker"));
135920
+ if (docker.hasDockerfile) {
135921
+ console.log(` Dockerfile: Yes`);
135922
+ if (docker.baseImage) {
135923
+ console.log(` Base Image: ${docker.baseImage}`);
135924
+ }
135925
+ }
135926
+ if (docker.hasCompose) {
135927
+ console.log(` Docker Compose: Yes`);
135928
+ }
135929
+ console.log();
135930
+ }
135931
+ if (buildCommands && Object.keys(buildCommands).some((k) => buildCommands[k])) {
135932
+ console.log(chalk28.bold("Build Commands"));
135933
+ if (buildCommands.install) {
135934
+ console.log(` Install: ${chalk28.gray(buildCommands.install)}`);
135935
+ }
135936
+ if (buildCommands.dev) {
135937
+ console.log(` Dev: ${chalk28.gray(buildCommands.dev)}`);
135938
+ }
135939
+ if (buildCommands.build) {
135940
+ console.log(` Build: ${chalk28.gray(buildCommands.build)}`);
135941
+ }
135942
+ if (buildCommands.test) {
135943
+ console.log(` Test: ${chalk28.gray(buildCommands.test)}`);
135944
+ }
135945
+ console.log();
135946
+ }
135947
+ if (importantFiles.length > 0 && this.verbose) {
135948
+ console.log(chalk28.bold("Important Files"));
135949
+ for (const file of importantFiles.slice(0, 15)) {
135950
+ console.log(` ${chalk28.gray(file)}`);
135951
+ }
135952
+ if (importantFiles.length > 15) {
135953
+ console.log(` ${chalk28.gray(`...and ${importantFiles.length - 15} more`)}`);
135954
+ }
135955
+ console.log();
135956
+ }
135957
+ console.log(chalk28.bold("Available Agents"));
135958
+ console.log(chalk28.gray(` Use --all-agents to generate for all ${Object.keys(AGENT_CONFIG).length} agents`));
135959
+ console.log(chalk28.gray(` Use --agent <name> to generate for specific agents`));
135960
+ }
135961
+ };
135962
+
135654
135963
  // src/index.ts
135655
135964
  init_helpers();
135656
135965
  export {
@@ -135688,6 +135997,7 @@ export {
135688
135997
  PauseCommand,
135689
135998
  PlanCommand,
135690
135999
  PluginCommand,
136000
+ PrimerCommand,
135691
136001
  PublishCommand,
135692
136002
  ReadCommand,
135693
136003
  RecommendCommand,