@devmunna/agent-skillkit 0.1.0

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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/bin/ai-skills.js +5 -0
  4. package/dist/cli/commands/add.d.ts +2 -0
  5. package/dist/cli/commands/add.d.ts.map +1 -0
  6. package/dist/cli/commands/add.js +66 -0
  7. package/dist/cli/commands/add.js.map +1 -0
  8. package/dist/cli/commands/doctor.d.ts +2 -0
  9. package/dist/cli/commands/doctor.d.ts.map +1 -0
  10. package/dist/cli/commands/doctor.js +33 -0
  11. package/dist/cli/commands/doctor.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +10 -0
  13. package/dist/cli/commands/init.d.ts.map +1 -0
  14. package/dist/cli/commands/init.js +145 -0
  15. package/dist/cli/commands/init.js.map +1 -0
  16. package/dist/cli/commands/list.d.ts +5 -0
  17. package/dist/cli/commands/list.d.ts.map +1 -0
  18. package/dist/cli/commands/list.js +55 -0
  19. package/dist/cli/commands/list.js.map +1 -0
  20. package/dist/cli/commands/update.d.ts +2 -0
  21. package/dist/cli/commands/update.d.ts.map +1 -0
  22. package/dist/cli/commands/update.js +49 -0
  23. package/dist/cli/commands/update.js.map +1 -0
  24. package/dist/cli/commands/validate.d.ts +2 -0
  25. package/dist/cli/commands/validate.d.ts.map +1 -0
  26. package/dist/cli/commands/validate.js +22 -0
  27. package/dist/cli/commands/validate.js.map +1 -0
  28. package/dist/cli/index.d.ts +2 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +49 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/prompts/agent-selector.d.ts +3 -0
  33. package/dist/cli/prompts/agent-selector.d.ts.map +1 -0
  34. package/dist/cli/prompts/agent-selector.js +23 -0
  35. package/dist/cli/prompts/agent-selector.js.map +1 -0
  36. package/dist/cli/prompts/stack-selector.d.ts +3 -0
  37. package/dist/cli/prompts/stack-selector.d.ts.map +1 -0
  38. package/dist/cli/prompts/stack-selector.js +60 -0
  39. package/dist/cli/prompts/stack-selector.js.map +1 -0
  40. package/dist/core/config-manager.d.ts +20 -0
  41. package/dist/core/config-manager.d.ts.map +1 -0
  42. package/dist/core/config-manager.js +107 -0
  43. package/dist/core/config-manager.js.map +1 -0
  44. package/dist/core/detector.d.ts +3 -0
  45. package/dist/core/detector.d.ts.map +1 -0
  46. package/dist/core/detector.js +50 -0
  47. package/dist/core/detector.js.map +1 -0
  48. package/dist/core/doctor.d.ts +12 -0
  49. package/dist/core/doctor.d.ts.map +1 -0
  50. package/dist/core/doctor.js +102 -0
  51. package/dist/core/doctor.js.map +1 -0
  52. package/dist/core/skill-registry.d.ts +11 -0
  53. package/dist/core/skill-registry.d.ts.map +1 -0
  54. package/dist/core/skill-registry.js +174 -0
  55. package/dist/core/skill-registry.js.map +1 -0
  56. package/dist/core/skill-resolver.d.ts +3 -0
  57. package/dist/core/skill-resolver.d.ts.map +1 -0
  58. package/dist/core/skill-resolver.js +36 -0
  59. package/dist/core/skill-resolver.js.map +1 -0
  60. package/dist/core/validator.d.ts +13 -0
  61. package/dist/core/validator.d.ts.map +1 -0
  62. package/dist/core/validator.js +99 -0
  63. package/dist/core/validator.js.map +1 -0
  64. package/dist/generators/agent-installer.d.ts +5 -0
  65. package/dist/generators/agent-installer.d.ts.map +1 -0
  66. package/dist/generators/agent-installer.js +20 -0
  67. package/dist/generators/agent-installer.js.map +1 -0
  68. package/dist/generators/agents-md.d.ts +3 -0
  69. package/dist/generators/agents-md.d.ts.map +1 -0
  70. package/dist/generators/agents-md.js +70 -0
  71. package/dist/generators/agents-md.js.map +1 -0
  72. package/dist/generators/claude-md.d.ts +3 -0
  73. package/dist/generators/claude-md.d.ts.map +1 -0
  74. package/dist/generators/claude-md.js +47 -0
  75. package/dist/generators/claude-md.js.map +1 -0
  76. package/dist/generators/skill-generator.d.ts +5 -0
  77. package/dist/generators/skill-generator.d.ts.map +1 -0
  78. package/dist/generators/skill-generator.js +34 -0
  79. package/dist/generators/skill-generator.js.map +1 -0
  80. package/dist/generators/workflows.d.ts +3 -0
  81. package/dist/generators/workflows.d.ts.map +1 -0
  82. package/dist/generators/workflows.js +57 -0
  83. package/dist/generators/workflows.js.map +1 -0
  84. package/dist/index.d.ts +13 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +13 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/types/index.d.ts +55 -0
  89. package/dist/types/index.d.ts.map +1 -0
  90. package/dist/types/index.js +2 -0
  91. package/dist/types/index.js.map +1 -0
  92. package/dist/utils/file-utils.d.ts +12 -0
  93. package/dist/utils/file-utils.d.ts.map +1 -0
  94. package/dist/utils/file-utils.js +39 -0
  95. package/dist/utils/file-utils.js.map +1 -0
  96. package/dist/utils/logger.d.ts +10 -0
  97. package/dist/utils/logger.d.ts.map +1 -0
  98. package/dist/utils/logger.js +11 -0
  99. package/dist/utils/logger.js.map +1 -0
  100. package/package.json +73 -0
  101. package/skills/clean-architecture/SKILL.md +324 -0
  102. package/skills/express-mvc-prisma/SKILL.md +168 -0
  103. package/skills/express-mvc-prisma/references/auth.md +190 -0
  104. package/skills/express-mvc-prisma/references/boilerplate.md +196 -0
  105. package/skills/express-mvc-prisma/references/error-handling.md +121 -0
  106. package/skills/express-mvc-prisma/references/module-scaffold.md +253 -0
  107. package/skills/express-mvc-prisma/references/prisma-setup.md +97 -0
  108. package/skills/express-mvc-prisma/references/response-helpers.md +157 -0
  109. package/skills/express-mvc-prisma/references/zod-validation.md +157 -0
  110. package/skills/fastify-rest/SKILL.md +287 -0
  111. package/skills/mongoose-odm/SKILL.md +281 -0
  112. package/skills/nextjs-fullstack/SKILL.md +328 -0
  113. package/skills/nextjs-fullstack/references/auth.md +270 -0
  114. package/skills/nextjs-fullstack/references/caching.md +157 -0
  115. package/skills/nextjs-fullstack/references/route-handlers.md +194 -0
  116. package/skills/nextjs-fullstack/references/server-actions.md +214 -0
  117. package/skills/nextjs-fullstack/references/server-components.md +190 -0
  118. package/skills/node-base/SKILL.md +139 -0
  119. package/skills/prisma-orm/SKILL.md +334 -0
  120. package/skills/react-feature-arch/SKILL.md +208 -0
  121. package/skills/react-feature-arch/references/api-layer.md +110 -0
  122. package/skills/react-feature-arch/references/components.md +192 -0
  123. package/skills/react-feature-arch/references/data-fetching.md +198 -0
  124. package/skills/react-feature-arch/references/forms.md +194 -0
  125. package/skills/react-feature-arch/references/routing.md +148 -0
  126. package/skills/react-feature-arch/references/state-management.md +107 -0
  127. package/skills/tailwind-css/SKILL.md +236 -0
  128. package/skills/tailwind-css/references/components.md +340 -0
  129. package/skills/tailwind-css/references/design-tokens.md +230 -0
  130. package/skills/tailwind-css/references/patterns.md +375 -0
  131. package/skills/tailwind-css/references/setup.md +165 -0
  132. package/skills/zod-validation/SKILL.md +267 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 devmunna
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,147 @@
1
+ # Agent Skillkit
2
+
3
+ Install stack-aware AI agent development skills for Claude Code and Codex.
4
+
5
+ `@devmunna/agent-skillkit` copies curated `SKILL.md` packages into a project, adds shared agent instructions, and keeps installed skills refreshable as the package evolves.
6
+
7
+ ## Quick Start
8
+
9
+ ```bash
10
+ npx @devmunna/agent-skillkit init
11
+ ```
12
+
13
+ The installer asks which agent to support:
14
+
15
+ - Claude Code: installs skills to `.ai-skills/skills` and updates `CLAUDE.md`
16
+ - Codex: installs skills to `.agents/skills` and writes shared `AGENTS.md`
17
+
18
+ ## Non-Interactive Use
19
+
20
+ ```bash
21
+ npx @devmunna/agent-skillkit init --agent codex --profile express-prisma --yes
22
+ npx @devmunna/agent-skillkit init --agent claude --agent codex --stack react --stack tailwind --yes
23
+ npx @devmunna/agent-skillkit init --agent codex --skill node-base --skill zod-validation --yes
24
+ ```
25
+
26
+ ## Commands
27
+
28
+ ```bash
29
+ ai-skills init # Install skills for a selected agent and stack
30
+ ai-skills add # Add more skills to the configured agents
31
+ ai-skills list # List installed or available skills
32
+ ai-skills update # Refresh installed skills from the current package version
33
+ ai-skills validate # Validate the package skill catalog and files
34
+ ai-skills doctor # Inspect the current project installation
35
+ ```
36
+
37
+ ## Profiles
38
+
39
+ Profiles install a tested combination of skills:
40
+
41
+ - `express-prisma`
42
+ - `fastify-api`
43
+ - `next-fullstack`
44
+ - `react-spa`
45
+ - `mern`
46
+ - `node-base`
47
+
48
+ ## Agent Behavior
49
+
50
+ The package is designed to reduce token usage and hallucination:
51
+
52
+ - Keep `SKILL.md` files focused on hard rules and activation context
53
+ - Put longer templates and examples in `references/`
54
+ - Generate `AGENTS.md` with rules for reading only relevant skills
55
+ - Install reusable workflows under `.ai-skills/workflows`
56
+ - Provide `doctor` and `validate` commands for drift checks
57
+
58
+ ## Development
59
+
60
+ Prerequisites:
61
+
62
+ - Node.js 18 or newer
63
+ - npm
64
+
65
+ Set up the project:
66
+
67
+ ```bash
68
+ npm install
69
+ npm run typecheck
70
+ npm run build
71
+ npm test
72
+ ```
73
+
74
+ Run the CLI locally while developing:
75
+
76
+ ```bash
77
+ npm run dev -- init
78
+ npm run dev -- list
79
+ npm run dev -- doctor
80
+ ```
81
+
82
+ Check what will be published:
83
+
84
+ ```bash
85
+ npm pack --dry-run
86
+ ```
87
+
88
+ The npm package only publishes the files listed in `package.json`:
89
+
90
+ - `dist`
91
+ - `bin`
92
+ - `skills`
93
+
94
+ Source files, tests, editor config, and local dependencies are not included in the published package.
95
+
96
+ ## Contributing
97
+
98
+ Contributions are welcome. Please keep changes focused and include validation steps in your pull request.
99
+
100
+ Recommended workflow:
101
+
102
+ 1. Fork the repository.
103
+ 2. Create a feature branch.
104
+ 3. Install dependencies with `npm install`.
105
+ 4. Make your changes.
106
+ 5. Run `npm run typecheck`.
107
+ 6. Run `npm test`.
108
+ 7. Run `npm pack --dry-run` if your change affects published files.
109
+ 8. Open a pull request with a short summary and test results.
110
+
111
+ ### Adding or Updating Skills
112
+
113
+ Skills live in `skills/<skill-name>/SKILL.md`. Larger examples, templates, or optional details should go in `skills/<skill-name>/references/`.
114
+
115
+ When adding a skill:
116
+
117
+ 1. Create a clear `SKILL.md` with activation context and hard rules.
118
+ 2. Move long examples into `references/`.
119
+ 3. Register the skill in the package catalog if needed.
120
+ 4. Add or update tests when behavior changes.
121
+ 5. Run `npm test`.
122
+
123
+ Keep skill files concise so agents can load only the context they need.
124
+
125
+ ### Pull Request Checklist
126
+
127
+ - The package builds with `npm run build`.
128
+ - TypeScript passes with `npm run typecheck`.
129
+ - Tests pass with `npm test`.
130
+ - New skills include focused instructions and references only where useful.
131
+ - README or docs are updated when commands, profiles, or behavior change.
132
+
133
+ ### Release Checklist
134
+
135
+ Before publishing a new version:
136
+
137
+ ```bash
138
+ npm test
139
+ npm pack --dry-run
140
+ npm publish --access public
141
+ ```
142
+
143
+ Use `npm pack --dry-run` to confirm the package contents and size before release.
144
+
145
+ ## License
146
+
147
+ MIT
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/cli/index.js').catch((err) => {
3
+ console.error(err);
4
+ process.exit(1);
5
+ });
@@ -0,0 +1,2 @@
1
+ export declare function addCommand(skillNames: string[]): Promise<void>;
2
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEpE"}
@@ -0,0 +1,66 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { resolveSkills } from '../../core/skill-resolver.js';
3
+ import { getSkillMeta, getAllSkills } from '../../core/skill-registry.js';
4
+ import { ConfigManager } from '../../core/config-manager.js';
5
+ import { agentLabels, installSkillsForAgents } from '../../generators/agent-installer.js';
6
+ import { generateAgentsMd } from '../../generators/agents-md.js';
7
+ import { generateClaudeMd } from '../../generators/claude-md.js';
8
+ import { generateWorkflows } from '../../generators/workflows.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ export async function addCommand(skillNames) {
11
+ const projectRoot = process.cwd();
12
+ const configManager = new ConfigManager(projectRoot);
13
+ const config = await configManager.read();
14
+ if (!config) {
15
+ logger.error('No ai-skills config found. Run `ai-skills init` first.');
16
+ process.exit(1);
17
+ }
18
+ let toInstall = skillNames;
19
+ if (toInstall.length === 0) {
20
+ const installed = new Set(config?.installedSkills.map((s) => s.name) ?? []);
21
+ const selected = await clack.multiselect({
22
+ message: 'Select skills to add',
23
+ options: getAllSkills()
24
+ .filter((s) => !installed.has(s.name))
25
+ .map((s) => ({ value: s.name, label: s.name, hint: s.description })),
26
+ });
27
+ if (clack.isCancel(selected)) {
28
+ clack.outro('Cancelled.');
29
+ return;
30
+ }
31
+ toInstall = selected;
32
+ }
33
+ const resolution = resolveSkills(toInstall);
34
+ if (resolution.missing.length > 0) {
35
+ logger.warn(`Unknown skills (skipped): ${resolution.missing.join(', ')}`);
36
+ }
37
+ if (resolution.ordered.length === 0) {
38
+ logger.info('No valid skills to install.');
39
+ return;
40
+ }
41
+ const spin = clack.spinner();
42
+ spin.start(`Adding ${resolution.ordered.length} skill(s) for ${agentLabels(config.agents)}...`);
43
+ try {
44
+ await installSkillsForAgents(resolution.ordered, configManager.getInstallTargets(config.agents));
45
+ await generateWorkflows(projectRoot);
46
+ for (const name of resolution.ordered) {
47
+ const meta = getSkillMeta(name);
48
+ await configManager.addSkill(name, meta?.version ?? '1.0.0');
49
+ }
50
+ spin.stop('Done.');
51
+ const updatedConfig = await configManager.read();
52
+ if (updatedConfig?.claudeMd) {
53
+ await generateClaudeMd(projectRoot, updatedConfig.installedSkills, '.ai-skills/skills');
54
+ }
55
+ if (updatedConfig?.agents.includes('codex')) {
56
+ await generateAgentsMd(projectRoot, updatedConfig.installedSkills, '.agents/skills', '.ai-skills/workflows');
57
+ }
58
+ logger.success(`Added: ${resolution.ordered.join(', ')}`);
59
+ }
60
+ catch (err) {
61
+ spin.stop('Failed.');
62
+ logger.error(err instanceof Error ? err.message : String(err));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAkBA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBnD"}
@@ -0,0 +1,33 @@
1
+ import chalk from 'chalk';
2
+ import { inspectProject } from '../../core/doctor.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ const COLORS = {
5
+ ok: chalk.green,
6
+ warning: chalk.yellow,
7
+ error: chalk.red,
8
+ info: chalk.blue,
9
+ };
10
+ const LABELS = {
11
+ ok: 'ok',
12
+ warning: 'warning',
13
+ error: 'error',
14
+ info: 'info',
15
+ };
16
+ export async function doctorCommand() {
17
+ const result = await inspectProject(process.cwd());
18
+ for (const finding of result.findings) {
19
+ const label = COLORS[finding.level](LABELS[finding.level]);
20
+ console.log(` ${label} ${finding.message}`);
21
+ }
22
+ logger.blank();
23
+ if (result.errors > 0) {
24
+ logger.error(`Doctor found ${result.errors} error(s) and ${result.warnings} warning(s).`);
25
+ process.exit(1);
26
+ }
27
+ if (result.warnings > 0) {
28
+ logger.warn(`Doctor found ${result.warnings} warning(s).`);
29
+ return;
30
+ }
31
+ logger.success('Project ai-skills setup looks healthy.');
32
+ }
33
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,KAAK,CAAC,KAAK;IACf,OAAO,EAAE,KAAK,CAAC,MAAM;IACrB,KAAK,EAAE,KAAK,CAAC,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC,IAAI;CACjB,CAAC;AAEF,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface InitCommandOptions {
2
+ agent?: string[];
3
+ stack?: string[];
4
+ skill?: string[];
5
+ profile?: string;
6
+ yes?: boolean;
7
+ agentsMd?: boolean;
8
+ }
9
+ export declare function initCommand(options?: InitCommandOptions): Promise<void>;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmJjF"}
@@ -0,0 +1,145 @@
1
+ import * as clack from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { resolveSkills } from '../../core/skill-resolver.js';
4
+ import { mapStackToSkills, getSkillMeta, getSkillProfile } from '../../core/skill-registry.js';
5
+ import { ConfigManager } from '../../core/config-manager.js';
6
+ import { agentLabels, installSkillsForAgents } from '../../generators/agent-installer.js';
7
+ import { generateAgentsMd } from '../../generators/agents-md.js';
8
+ import { generateClaudeMd } from '../../generators/claude-md.js';
9
+ import { generateWorkflows } from '../../generators/workflows.js';
10
+ import { detectStack } from '../../core/detector.js';
11
+ import { selectStacks } from '../prompts/stack-selector.js';
12
+ import { selectAgents } from '../prompts/agent-selector.js';
13
+ import { logger } from '../../utils/logger.js';
14
+ export async function initCommand(options = {}) {
15
+ clack.intro(chalk.bold.cyan(' ai-skills init '));
16
+ const projectRoot = process.cwd();
17
+ const configManager = new ConfigManager(projectRoot);
18
+ if (await configManager.exists()) {
19
+ const overwrite = await clack.confirm({
20
+ message: 'ai-skills already initialized. Reinitialize and overwrite?',
21
+ initialValue: false,
22
+ });
23
+ if (clack.isCancel(overwrite) || !overwrite) {
24
+ clack.outro('Aborted. Use `ai-skills update` to refresh installed skills.');
25
+ return;
26
+ }
27
+ }
28
+ const agents = options.agent?.length ? parseAgents(options.agent) : await selectAgents();
29
+ if (!agents) {
30
+ clack.outro('Cancelled.');
31
+ return;
32
+ }
33
+ // Auto-detect installed packages
34
+ const detected = await detectStack(projectRoot);
35
+ if (detected.packages.length > 0) {
36
+ clack.note(detected.packages.map((p) => ` • ${p}`).join('\n'), 'Auto-detected packages');
37
+ }
38
+ const directSkills = options.skill ?? [];
39
+ const explicitStacks = options.stack ?? [];
40
+ const profile = options.profile ? getSkillProfile(options.profile) : undefined;
41
+ if (options.profile && !profile) {
42
+ logger.error(`Unknown profile: ${options.profile}`);
43
+ process.exit(1);
44
+ }
45
+ let allSelected = [...explicitStacks, ...(profile?.stacks ?? [])];
46
+ if (directSkills.length === 0 && explicitStacks.length === 0 && !profile) {
47
+ // Interactive stack selection
48
+ clack.log.step('Select your project stack:');
49
+ const selection = await selectStacks();
50
+ if (!selection) {
51
+ clack.outro('Cancelled.');
52
+ return;
53
+ }
54
+ allSelected = [
55
+ ...selection.backend,
56
+ ...selection.frontend,
57
+ ...selection.database,
58
+ ...selection.validation,
59
+ ...selection.architecture,
60
+ ];
61
+ }
62
+ const requestedSkills = [
63
+ ...new Set([
64
+ ...directSkills,
65
+ ...(profile?.skills ?? []),
66
+ ...mapStackToSkills(allSelected),
67
+ ...detected.suggestedSkills,
68
+ ]),
69
+ ];
70
+ // Always ensure node-base is present
71
+ if (!requestedSkills.includes('node-base')) {
72
+ requestedSkills.unshift('node-base');
73
+ }
74
+ // Resolve with dependency graph
75
+ const resolution = resolveSkills(requestedSkills);
76
+ if (resolution.missing.length > 0) {
77
+ logger.warn(`Unknown skills (skipped): ${resolution.missing.join(', ')}`);
78
+ }
79
+ if (resolution.conflicts.length > 0) {
80
+ logger.warn(`Conflicts: ${resolution.conflicts.join('; ')}`);
81
+ }
82
+ const skillsToInstall = resolution.ordered;
83
+ clack.note(skillsToInstall
84
+ .map((s) => {
85
+ const meta = getSkillMeta(s);
86
+ return ` ${chalk.green('•')} ${chalk.bold(s)} — ${chalk.dim(meta?.description ?? '')}`;
87
+ })
88
+ .join('\n'), `Skills to install (${skillsToInstall.length})`);
89
+ if (!options.yes) {
90
+ const confirm = await clack.confirm({
91
+ message: `Install ${skillsToInstall.length} skill(s) for ${agentLabels(agents)}?`,
92
+ initialValue: true,
93
+ });
94
+ if (clack.isCancel(confirm) || !confirm) {
95
+ clack.outro('Cancelled.');
96
+ return;
97
+ }
98
+ }
99
+ const spin = clack.spinner();
100
+ spin.start('Installing skills...');
101
+ try {
102
+ await configManager.init(undefined, agents);
103
+ const targets = configManager.getInstallTargets(agents);
104
+ await installSkillsForAgents(skillsToInstall, targets);
105
+ await generateWorkflows(projectRoot);
106
+ for (const name of skillsToInstall) {
107
+ const meta = getSkillMeta(name);
108
+ await configManager.addSkill(name, meta?.version ?? '1.0.0');
109
+ }
110
+ spin.stop('Skills installed.');
111
+ const updatedConfig = await configManager.read();
112
+ if (updatedConfig?.claudeMd) {
113
+ await generateClaudeMd(projectRoot, updatedConfig.installedSkills, '.ai-skills/skills');
114
+ }
115
+ if (updatedConfig && (updatedConfig.agents.includes('codex') || options.agentsMd)) {
116
+ await generateAgentsMd(projectRoot, updatedConfig.installedSkills, '.agents/skills', '.ai-skills/workflows');
117
+ }
118
+ const locations = targets
119
+ .map((target) => ` ${chalk.dim(`${target.agent} skills:`)} ${pathRelative(projectRoot, target.skillsDir)}`)
120
+ .join('\n');
121
+ clack.outro(`${chalk.green('✓')} Done! ${skillsToInstall.length} skill(s) installed.\n` +
122
+ `${locations}` +
123
+ `${updatedConfig?.claudeMd ? `\n ${chalk.dim('Claude context:')} CLAUDE.md` : ''}`);
124
+ }
125
+ catch (err) {
126
+ spin.stop('Installation failed.');
127
+ logger.error(err instanceof Error ? err.message : String(err));
128
+ process.exit(1);
129
+ }
130
+ }
131
+ function parseAgents(values) {
132
+ const agents = [...new Set(values.map((value) => value.toLowerCase()))];
133
+ const supported = new Set(['claude', 'codex']);
134
+ const invalid = agents.filter((agent) => !supported.has(agent));
135
+ if (invalid.length > 0) {
136
+ logger.error(`Unsupported AI agent(s): ${invalid.join(', ')}. Use claude or codex.`);
137
+ process.exit(1);
138
+ }
139
+ return agents;
140
+ }
141
+ function pathRelative(from, to) {
142
+ const relative = to.startsWith(from) ? to.slice(from.length + 1) : to;
143
+ return relative.endsWith('/') ? relative : `${relative}/`;
144
+ }
145
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function listCommand(options?: {
2
+ available?: boolean;
3
+ profiles?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC1G"}
@@ -0,0 +1,55 @@
1
+ import chalk from 'chalk';
2
+ import { ConfigManager } from '../../core/config-manager.js';
3
+ import { getAllProfiles, getAllSkills, getSkillMeta } from '../../core/skill-registry.js';
4
+ import { agentLabels } from '../../generators/agent-installer.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ export async function listCommand(options = {}) {
7
+ if (options.profiles) {
8
+ listProfiles();
9
+ return;
10
+ }
11
+ if (options.available) {
12
+ listAvailable();
13
+ return;
14
+ }
15
+ const configManager = new ConfigManager(process.cwd());
16
+ const config = await configManager.read();
17
+ if (!config || config.installedSkills.length === 0) {
18
+ logger.info('No skills installed. Run `ai-skills init` to get started.');
19
+ logger.dim(' Tip: use --available to see all skills');
20
+ return;
21
+ }
22
+ console.log(chalk.bold('\n Installed Skills\n'));
23
+ for (const installed of config.installedSkills) {
24
+ const meta = getSkillMeta(installed.name);
25
+ console.log(` ${chalk.green('✓')} ${chalk.bold(installed.name.padEnd(28))} ` +
26
+ `${chalk.dim(`v${installed.version} • ${meta?.description ?? ''}`)}`);
27
+ }
28
+ console.log(chalk.dim(`\n ${config.installedSkills.length} skill(s) • ${agentLabels(config.agents)} • Updated ${new Date(config.updatedAt).toLocaleDateString()}\n`));
29
+ }
30
+ function listAvailable() {
31
+ const byCategory = {};
32
+ for (const skill of getAllSkills()) {
33
+ if (!byCategory[skill.category])
34
+ byCategory[skill.category] = [];
35
+ byCategory[skill.category].push(skill);
36
+ }
37
+ console.log(chalk.bold('\n Available Skills\n'));
38
+ for (const [category, skills] of Object.entries(byCategory)) {
39
+ console.log(` ${chalk.cyan.bold(category.toUpperCase())}`);
40
+ for (const skill of skills) {
41
+ const deps = skill.depends?.length ? chalk.dim(` (needs: ${skill.depends.join(', ')})`) : '';
42
+ console.log(` ${chalk.green(skill.name.padEnd(26))} ${chalk.dim(skill.description)}${deps}`);
43
+ }
44
+ console.log();
45
+ }
46
+ }
47
+ function listProfiles() {
48
+ console.log(chalk.bold('\n Available Profiles\n'));
49
+ for (const profile of getAllProfiles()) {
50
+ console.log(` ${chalk.green(profile.name.padEnd(18))} ${chalk.dim(profile.description)}`);
51
+ console.log(chalk.dim(` skills: ${profile.skills.join(', ')}`));
52
+ }
53
+ console.log();
54
+ }
55
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AASA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDnD"}
@@ -0,0 +1,49 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { ConfigManager } from '../../core/config-manager.js';
3
+ import { getSkillMeta } from '../../core/skill-registry.js';
4
+ import { agentLabels, installSkillsForAgents } from '../../generators/agent-installer.js';
5
+ import { generateAgentsMd } from '../../generators/agents-md.js';
6
+ import { generateClaudeMd } from '../../generators/claude-md.js';
7
+ import { generateWorkflows } from '../../generators/workflows.js';
8
+ import { logger } from '../../utils/logger.js';
9
+ export async function updateCommand() {
10
+ const projectRoot = process.cwd();
11
+ const configManager = new ConfigManager(projectRoot);
12
+ const config = await configManager.read();
13
+ if (!config || config.installedSkills.length === 0) {
14
+ logger.info('No skills installed. Run `ai-skills init` first.');
15
+ return;
16
+ }
17
+ const skillNames = config.installedSkills.map((s) => s.name);
18
+ clack.note(skillNames.map((s) => ` • ${s}`).join('\n'), `Updating ${skillNames.length} skill(s) for ${agentLabels(config.agents)}`);
19
+ const confirm = await clack.confirm({ message: 'Proceed with update?', initialValue: true });
20
+ if (clack.isCancel(confirm) || !confirm) {
21
+ clack.outro('Cancelled.');
22
+ return;
23
+ }
24
+ const spin = clack.spinner();
25
+ spin.start('Updating skills...');
26
+ try {
27
+ await installSkillsForAgents(skillNames, configManager.getInstallTargets(config.agents));
28
+ await generateWorkflows(projectRoot);
29
+ for (const name of skillNames) {
30
+ const meta = getSkillMeta(name);
31
+ await configManager.addSkill(name, meta?.version ?? '1.0.0');
32
+ }
33
+ spin.stop('Updated.');
34
+ const updated = await configManager.read();
35
+ if (updated?.claudeMd) {
36
+ await generateClaudeMd(projectRoot, updated.installedSkills, '.ai-skills/skills');
37
+ }
38
+ if (updated?.agents.includes('codex')) {
39
+ await generateAgentsMd(projectRoot, updated.installedSkills, '.agents/skills', '.ai-skills/workflows');
40
+ }
41
+ logger.success(`Updated ${skillNames.length} skill(s) for ${agentLabels(config.agents)}.`);
42
+ }
43
+ catch (err) {
44
+ spin.stop('Update failed.');
45
+ logger.error(err instanceof Error ? err.message : String(err));
46
+ process.exit(1);
47
+ }
48
+ }
49
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateCommand(): Promise<void>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBrD"}
@@ -0,0 +1,22 @@
1
+ import chalk from 'chalk';
2
+ import { validatePackageSkills } from '../../core/validator.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export async function validateCommand() {
5
+ const result = await validatePackageSkills();
6
+ if (result.issues.length === 0) {
7
+ logger.success('Skill package validation passed.');
8
+ return;
9
+ }
10
+ for (const issue of result.issues) {
11
+ const prefix = issue.level === 'error' ? chalk.red('error') : chalk.yellow('warning');
12
+ const file = issue.file ? chalk.dim(` (${issue.file})`) : '';
13
+ console.log(` ${prefix} ${issue.message}${file}`);
14
+ }
15
+ logger.blank();
16
+ if (result.errors > 0) {
17
+ logger.error(`Validation failed with ${result.errors} error(s) and ${result.warnings} warning(s).`);
18
+ process.exit(1);
19
+ }
20
+ logger.warn(`Validation passed with ${result.warnings} warning(s).`);
21
+ }
22
+ //# sourceMappingURL=validate.js.map