@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.
- package/LICENSE +21 -0
- package/README.md +147 -0
- package/bin/ai-skills.js +5 -0
- package/dist/cli/commands/add.d.ts +2 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +66 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +33 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +145 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +5 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +55 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +49 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +22 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +49 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts/agent-selector.d.ts +3 -0
- package/dist/cli/prompts/agent-selector.d.ts.map +1 -0
- package/dist/cli/prompts/agent-selector.js +23 -0
- package/dist/cli/prompts/agent-selector.js.map +1 -0
- package/dist/cli/prompts/stack-selector.d.ts +3 -0
- package/dist/cli/prompts/stack-selector.d.ts.map +1 -0
- package/dist/cli/prompts/stack-selector.js +60 -0
- package/dist/cli/prompts/stack-selector.js.map +1 -0
- package/dist/core/config-manager.d.ts +20 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +107 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +50 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/doctor.d.ts +12 -0
- package/dist/core/doctor.d.ts.map +1 -0
- package/dist/core/doctor.js +102 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/skill-registry.d.ts +11 -0
- package/dist/core/skill-registry.d.ts.map +1 -0
- package/dist/core/skill-registry.js +174 -0
- package/dist/core/skill-registry.js.map +1 -0
- package/dist/core/skill-resolver.d.ts +3 -0
- package/dist/core/skill-resolver.d.ts.map +1 -0
- package/dist/core/skill-resolver.js +36 -0
- package/dist/core/skill-resolver.js.map +1 -0
- package/dist/core/validator.d.ts +13 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +99 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/generators/agent-installer.d.ts +5 -0
- package/dist/generators/agent-installer.d.ts.map +1 -0
- package/dist/generators/agent-installer.js +20 -0
- package/dist/generators/agent-installer.js.map +1 -0
- package/dist/generators/agents-md.d.ts +3 -0
- package/dist/generators/agents-md.d.ts.map +1 -0
- package/dist/generators/agents-md.js +70 -0
- package/dist/generators/agents-md.js.map +1 -0
- package/dist/generators/claude-md.d.ts +3 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +47 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/skill-generator.d.ts +5 -0
- package/dist/generators/skill-generator.d.ts.map +1 -0
- package/dist/generators/skill-generator.js +34 -0
- package/dist/generators/skill-generator.js.map +1 -0
- package/dist/generators/workflows.d.ts +3 -0
- package/dist/generators/workflows.d.ts.map +1 -0
- package/dist/generators/workflows.js +57 -0
- package/dist/generators/workflows.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/file-utils.d.ts +12 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +39 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +73 -0
- package/skills/clean-architecture/SKILL.md +324 -0
- package/skills/express-mvc-prisma/SKILL.md +168 -0
- package/skills/express-mvc-prisma/references/auth.md +190 -0
- package/skills/express-mvc-prisma/references/boilerplate.md +196 -0
- package/skills/express-mvc-prisma/references/error-handling.md +121 -0
- package/skills/express-mvc-prisma/references/module-scaffold.md +253 -0
- package/skills/express-mvc-prisma/references/prisma-setup.md +97 -0
- package/skills/express-mvc-prisma/references/response-helpers.md +157 -0
- package/skills/express-mvc-prisma/references/zod-validation.md +157 -0
- package/skills/fastify-rest/SKILL.md +287 -0
- package/skills/mongoose-odm/SKILL.md +281 -0
- package/skills/nextjs-fullstack/SKILL.md +328 -0
- package/skills/nextjs-fullstack/references/auth.md +270 -0
- package/skills/nextjs-fullstack/references/caching.md +157 -0
- package/skills/nextjs-fullstack/references/route-handlers.md +194 -0
- package/skills/nextjs-fullstack/references/server-actions.md +214 -0
- package/skills/nextjs-fullstack/references/server-components.md +190 -0
- package/skills/node-base/SKILL.md +139 -0
- package/skills/prisma-orm/SKILL.md +334 -0
- package/skills/react-feature-arch/SKILL.md +208 -0
- package/skills/react-feature-arch/references/api-layer.md +110 -0
- package/skills/react-feature-arch/references/components.md +192 -0
- package/skills/react-feature-arch/references/data-fetching.md +198 -0
- package/skills/react-feature-arch/references/forms.md +194 -0
- package/skills/react-feature-arch/references/routing.md +148 -0
- package/skills/react-feature-arch/references/state-management.md +107 -0
- package/skills/tailwind-css/SKILL.md +236 -0
- package/skills/tailwind-css/references/components.md +340 -0
- package/skills/tailwind-css/references/design-tokens.md +230 -0
- package/skills/tailwind-css/references/patterns.md +375 -0
- package/skills/tailwind-css/references/setup.md +165 -0
- 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
|
package/bin/ai-skills.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|