@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { Command } from 'commander';
2
+ import { initCommand } from './commands/init.js';
3
+ import { addCommand } from './commands/add.js';
4
+ import { listCommand } from './commands/list.js';
5
+ import { updateCommand } from './commands/update.js';
6
+ import { validateCommand } from './commands/validate.js';
7
+ import { doctorCommand } from './commands/doctor.js';
8
+ const program = new Command();
9
+ program
10
+ .name('ai-skills')
11
+ .description('Install and manage AI agent development skills for your Node.js project')
12
+ .version('0.1.0');
13
+ program
14
+ .command('init')
15
+ .description('Initialize ai-skills and install skills for your stack')
16
+ .option('-a, --agent <agent>', 'AI agent target: claude or codex', collectOption, [])
17
+ .option('-s, --stack <stack>', 'Stack item to map to skills, such as express or react', collectOption, [])
18
+ .option('--skill <skill>', 'Skill name to install directly', collectOption, [])
19
+ .option('-p, --profile <profile>', 'Skill profile to install')
20
+ .option('-y, --yes', 'Skip confirmation prompts')
21
+ .option('--agents-md', 'Generate AGENTS.md even when Codex is not selected')
22
+ .action((opts) => initCommand(opts));
23
+ program
24
+ .command('add [skills...]')
25
+ .description('Add one or more skills by name, or select interactively')
26
+ .action((skills) => addCommand(skills));
27
+ program
28
+ .command('list')
29
+ .description('List installed skills')
30
+ .option('-a, --available', 'Show all available skills in the registry')
31
+ .option('-p, --profiles', 'Show available skill profiles')
32
+ .action((opts) => listCommand(opts));
33
+ program
34
+ .command('update')
35
+ .description('Refresh installed skills from the current package version')
36
+ .action(() => updateCommand());
37
+ program
38
+ .command('validate')
39
+ .description('Validate the bundled skill catalog and skill files')
40
+ .action(() => validateCommand());
41
+ program
42
+ .command('doctor')
43
+ .description('Inspect the current project ai-skills installation')
44
+ .action(() => doctorCommand());
45
+ program.parse();
46
+ function collectOption(value, previous) {
47
+ return [...previous, ...value.split(',').map((item) => item.trim()).filter(Boolean)];
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,yEAAyE,CAAC;KACtF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,kCAAkC,EAAE,aAAa,EAAE,EAAE,CAAC;KACpF,MAAM,CAAC,qBAAqB,EAAE,uDAAuD,EAAE,aAAa,EAAE,EAAE,CAAC;KACzG,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,EAAE,aAAa,EAAE,EAAE,CAAC;KAC9E,MAAM,CAAC,yBAAyB,EAAE,0BAA0B,CAAC;KAC7D,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;KAC3E,MAAM,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvD,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,CAAC,MAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;KACtE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;KACzD,MAAM,CAAC,CAAC,IAAiD,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAEpF,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;AAEjC,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;AAEnC,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oDAAoD,CAAC;KACjE,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC;AAWhB,SAAS,aAAa,CAAC,KAAa,EAAE,QAAkB;IACtD,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AiAgent } from '../../types/index.js';
2
+ export declare function selectAgents(): Promise<AiAgent[] | null>;
3
+ //# sourceMappingURL=agent-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-selector.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/agent-selector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAoB9D"}
@@ -0,0 +1,23 @@
1
+ import * as clack from '@clack/prompts';
2
+ export async function selectAgents() {
3
+ const selected = await clack.multiselect({
4
+ message: 'Which AI agent should these skills be installed for?',
5
+ options: [
6
+ {
7
+ value: 'claude',
8
+ label: 'Claude Code',
9
+ hint: 'Installs to .ai-skills/skills and updates CLAUDE.md',
10
+ },
11
+ {
12
+ value: 'codex',
13
+ label: 'Codex',
14
+ hint: 'Installs to .agents/skills for repo-local skill discovery',
15
+ },
16
+ ],
17
+ required: true,
18
+ });
19
+ if (clack.isCancel(selected))
20
+ return null;
21
+ return selected;
22
+ }
23
+ //# sourceMappingURL=agent-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-selector.js","sourceRoot":"","sources":["../../../src/cli/prompts/agent-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAGxC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACvC,OAAO,EAAE,sDAAsD;QAC/D,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,qDAAqD;aAC5D;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,2DAA2D;aAClE;SACF;QACD,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,QAAqB,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StackSelection } from '../../types/index.js';
2
+ export declare function selectStacks(): Promise<StackSelection | null>;
3
+ //# sourceMappingURL=stack-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-selector.d.ts","sourceRoot":"","sources":["../../../src/cli/prompts/stack-selector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,wBAAsB,YAAY,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAyDnE"}
@@ -0,0 +1,60 @@
1
+ import * as clack from '@clack/prompts';
2
+ export async function selectStacks() {
3
+ const backend = await clack.multiselect({
4
+ message: 'Backend framework',
5
+ options: [
6
+ { value: 'express', label: 'Express.js', hint: 'MVC + REST API (recommended)' },
7
+ { value: 'fastify', label: 'Fastify', hint: 'High-performance REST API' },
8
+ { value: 'node', label: 'Node.js only', hint: 'No framework, raw Node' },
9
+ ],
10
+ required: false,
11
+ });
12
+ if (clack.isCancel(backend))
13
+ return null;
14
+ const frontend = await clack.multiselect({
15
+ message: 'Frontend framework',
16
+ options: [
17
+ { value: 'react', label: 'React', hint: 'Feature-based SPA architecture' },
18
+ { value: 'nextjs', label: 'Next.js 14+', hint: 'App Router + Server Components' },
19
+ ],
20
+ required: false,
21
+ });
22
+ if (clack.isCancel(frontend))
23
+ return null;
24
+ const database = await clack.multiselect({
25
+ message: 'Database / ORM',
26
+ options: [
27
+ { value: 'prisma', label: 'Prisma', hint: 'PostgreSQL / MySQL / SQLite ORM' },
28
+ { value: 'mongoose', label: 'Mongoose', hint: 'MongoDB ODM' },
29
+ ],
30
+ required: false,
31
+ });
32
+ if (clack.isCancel(database))
33
+ return null;
34
+ const architecture = await clack.multiselect({
35
+ message: 'Architecture patterns',
36
+ options: [
37
+ { value: 'clean', label: 'Clean Architecture', hint: 'Use cases, entities, adapters' },
38
+ ],
39
+ required: false,
40
+ });
41
+ if (clack.isCancel(architecture))
42
+ return null;
43
+ const validation = await clack.multiselect({
44
+ message: 'Validation library',
45
+ options: [
46
+ { value: 'zod', label: 'Zod', hint: 'TypeScript-first schema validation' },
47
+ ],
48
+ required: false,
49
+ });
50
+ if (clack.isCancel(validation))
51
+ return null;
52
+ return {
53
+ backend: backend,
54
+ frontend: frontend,
55
+ database: database,
56
+ architecture: architecture,
57
+ validation: validation,
58
+ };
59
+ }
60
+ //# sourceMappingURL=stack-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-selector.js","sourceRoot":"","sources":["../../../src/cli/prompts/stack-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AAGxC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACtC,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,8BAA8B,EAAE;YAC/E,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACzE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,wBAAwB,EAAE;SACzE;QACD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACvC,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,gCAAgC,EAAE;YAC1E,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,gCAAgC,EAAE;SAClF;QACD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACvC,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iCAAiC,EAAE;YAC7E,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE;SAC9D;QACD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QAC3C,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,+BAA+B,EAAE;SACvF;QACD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;QACzC,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,oCAAoC,EAAE;SAC3E;QACD,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO;QACL,OAAO,EAAE,OAAmB;QAC5B,QAAQ,EAAE,QAAoB;QAC9B,QAAQ,EAAE,QAAoB;QAC9B,YAAY,EAAE,YAAwB;QACtC,UAAU,EAAE,UAAsB;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { AiAgent, AgentInstallTarget, ProjectConfig } from '../types/index.js';
2
+ export declare class ConfigManager {
3
+ private projectRoot;
4
+ private configDir;
5
+ private configPath;
6
+ constructor(projectRoot?: string);
7
+ exists(): Promise<boolean>;
8
+ read(): Promise<ProjectConfig | null>;
9
+ write(config: ProjectConfig): Promise<void>;
10
+ init(outputDir?: string, agents?: AiAgent[]): Promise<ProjectConfig>;
11
+ addSkill(name: string, version: string): Promise<void>;
12
+ removeSkill(name: string): Promise<void>;
13
+ get skillsOutputDir(): string;
14
+ get agentTargets(): AgentInstallTarget[];
15
+ getInstallTargets(agents: AiAgent[]): AgentInstallTarget[];
16
+ agentTarget(agent: AiAgent): AgentInstallTarget;
17
+ get configDirectory(): string;
18
+ private normalize;
19
+ }
20
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,mBAAmB,CAAC;AAQpG,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,WAAW,GAAE,MAAsB;IAMzC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,IAAI,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMrC,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,IAAI,CAAC,SAAS,GAAE,MAAmB,EAAE,MAAM,GAAE,OAAO,EAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAchG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,YAAY,IAAI,kBAAkB,EAAE,CAYvC;IAED,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,kBAAkB,EAAE;IAK1D,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB;IAM/C,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,OAAO,CAAC,SAAS;CAalB"}
@@ -0,0 +1,107 @@
1
+ import path from 'path';
2
+ import { readJson, writeJson, pathExists, ensureDir } from '../utils/file-utils.js';
3
+ const CONFIG_DIR = '.ai-skills';
4
+ const CONFIG_FILE = 'config.json';
5
+ const PACKAGE_VERSION = '0.1.0';
6
+ const DEFAULT_AGENTS = ['claude'];
7
+ export class ConfigManager {
8
+ projectRoot;
9
+ configDir;
10
+ configPath;
11
+ constructor(projectRoot = process.cwd()) {
12
+ this.projectRoot = projectRoot;
13
+ this.configDir = path.join(projectRoot, CONFIG_DIR);
14
+ this.configPath = path.join(this.configDir, CONFIG_FILE);
15
+ }
16
+ async exists() {
17
+ return pathExists(this.configPath);
18
+ }
19
+ async read() {
20
+ if (!(await this.exists()))
21
+ return null;
22
+ const config = await readJson(this.configPath);
23
+ return this.normalize(config);
24
+ }
25
+ async write(config) {
26
+ await ensureDir(this.configDir);
27
+ await writeJson(this.configPath, config);
28
+ }
29
+ async init(outputDir = CONFIG_DIR, agents = DEFAULT_AGENTS) {
30
+ const config = {
31
+ version: PACKAGE_VERSION,
32
+ installedSkills: [],
33
+ outputDir,
34
+ claudeMd: agents.includes('claude'),
35
+ agents: [...new Set(agents)],
36
+ createdAt: new Date().toISOString(),
37
+ updatedAt: new Date().toISOString(),
38
+ };
39
+ await this.write(config);
40
+ return config;
41
+ }
42
+ async addSkill(name, version) {
43
+ const config = await this.read();
44
+ if (!config)
45
+ throw new Error('No ai-skills config found. Run `ai-skills init` first.');
46
+ const existing = config.installedSkills.findIndex((s) => s.name === name);
47
+ const entry = { name, version, installedAt: new Date().toISOString() };
48
+ if (existing >= 0) {
49
+ config.installedSkills[existing] = entry;
50
+ }
51
+ else {
52
+ config.installedSkills.push(entry);
53
+ }
54
+ config.updatedAt = new Date().toISOString();
55
+ await this.write(config);
56
+ }
57
+ async removeSkill(name) {
58
+ const config = await this.read();
59
+ if (!config)
60
+ return;
61
+ config.installedSkills = config.installedSkills.filter((s) => s.name !== name);
62
+ config.updatedAt = new Date().toISOString();
63
+ await this.write(config);
64
+ }
65
+ get skillsOutputDir() {
66
+ return this.agentTarget('claude').skillsDir;
67
+ }
68
+ get agentTargets() {
69
+ return [
70
+ {
71
+ agent: 'claude',
72
+ skillsDir: path.join(this.projectRoot, CONFIG_DIR, 'skills'),
73
+ contextFile: path.join(this.projectRoot, 'CLAUDE.md'),
74
+ },
75
+ {
76
+ agent: 'codex',
77
+ skillsDir: path.join(this.projectRoot, '.agents', 'skills'),
78
+ },
79
+ ];
80
+ }
81
+ getInstallTargets(agents) {
82
+ const selected = new Set(agents);
83
+ return this.agentTargets.filter((target) => selected.has(target.agent));
84
+ }
85
+ agentTarget(agent) {
86
+ const target = this.agentTargets.find((item) => item.agent === agent);
87
+ if (!target)
88
+ throw new Error(`Unsupported AI agent: ${agent}`);
89
+ return target;
90
+ }
91
+ get configDirectory() {
92
+ return this.configDir;
93
+ }
94
+ normalize(config) {
95
+ const agents = config.agents?.length
96
+ ? [...new Set(config.agents)]
97
+ : config.claudeMd === false
98
+ ? []
99
+ : DEFAULT_AGENTS;
100
+ return {
101
+ ...config,
102
+ agents,
103
+ claudeMd: agents.includes('claude'),
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DetectedStack } from '../types/index.js';
2
+ export declare function detectStack(projectRoot?: string): Promise<DetectedStack>;
3
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAmBvD,wBAAsB,WAAW,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiC7F"}
@@ -0,0 +1,50 @@
1
+ import path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { mapStackToSkills } from './skill-registry.js';
4
+ const PACKAGE_STACK_MAP = {
5
+ express: ['express'],
6
+ fastify: ['fastify'],
7
+ '@prisma/client': ['prisma'],
8
+ mongoose: ['mongoose'],
9
+ zod: ['zod'],
10
+ react: ['react'],
11
+ 'react-dom': ['react'],
12
+ next: ['nextjs'],
13
+ 'next-auth': ['nextjs'],
14
+ '@tanstack/react-query': ['react'],
15
+ '@trpc/server': ['node'],
16
+ '@trpc/client': ['react'],
17
+ hono: ['node'],
18
+ };
19
+ export async function detectStack(projectRoot = process.cwd()) {
20
+ const pkgPath = path.join(projectRoot, 'package.json');
21
+ const detectedStacks = [];
22
+ const confidence = {};
23
+ try {
24
+ const pkg = await fs.readJson(pkgPath);
25
+ const deps = {
26
+ ...(pkg['dependencies'] ?? {}),
27
+ ...(pkg['devDependencies'] ?? {}),
28
+ ...(pkg['peerDependencies'] ?? {}),
29
+ };
30
+ for (const [pkgName, stacks] of Object.entries(PACKAGE_STACK_MAP)) {
31
+ if (deps[pkgName]) {
32
+ stacks.forEach((stack) => {
33
+ detectedStacks.push(stack);
34
+ confidence[stack] = (confidence[stack] ?? 0) + 1;
35
+ });
36
+ }
37
+ }
38
+ }
39
+ catch {
40
+ // No package.json or unreadable — silently skip
41
+ }
42
+ const unique = [...new Set(detectedStacks)];
43
+ const suggestedSkills = mapStackToSkills(unique);
44
+ return {
45
+ packages: unique,
46
+ suggestedSkills,
47
+ confidence,
48
+ };
49
+ }
50
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/core/detector.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,iBAAiB,GAA6B;IAClD,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,gBAAgB,EAAE,CAAC,QAAQ,CAAC;IAC5B,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,WAAW,EAAE,CAAC,OAAO,CAAC;IACtB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,WAAW,EAAE,CAAC,QAAQ,CAAC;IACvB,uBAAuB,EAAE,CAAC,OAAO,CAAC;IAClC,cAAc,EAAE,CAAC,MAAM,CAAC;IACxB,cAAc,EAAE,CAAC,OAAO,CAAC;IACzB,IAAI,EAAE,CAAC,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAA4B,CAAC;QAClE,MAAM,IAAI,GAA2B;YACnC,GAAG,CAAC,GAAG,CAAC,cAAc,CAA2B,IAAI,EAAE,CAAC;YACxD,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAA2B,IAAI,EAAE,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAA2B,IAAI,EAAE,CAAC;SAC7D,CAAC;QAEF,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAClE,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACvB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC3B,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEjD,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,eAAe;QACf,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type DoctorLevel = 'ok' | 'warning' | 'error' | 'info';
2
+ export interface DoctorFinding {
3
+ level: DoctorLevel;
4
+ message: string;
5
+ }
6
+ export interface DoctorResult {
7
+ findings: DoctorFinding[];
8
+ errors: number;
9
+ warnings: number;
10
+ }
11
+ export declare function inspectProject(projectRoot?: string): Promise<DoctorResult>;
12
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6E/F"}
@@ -0,0 +1,102 @@
1
+ import path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { ConfigManager } from './config-manager.js';
4
+ import { detectStack } from './detector.js';
5
+ import { getSkillMeta } from './skill-registry.js';
6
+ import { workflowNames } from '../generators/workflows.js';
7
+ export async function inspectProject(projectRoot = process.cwd()) {
8
+ const findings = [];
9
+ const configManager = new ConfigManager(projectRoot);
10
+ const config = await configManager.read();
11
+ if (!config) {
12
+ findings.push({ level: 'error', message: 'No ai-skills config found. Run `ai-skills init`.' });
13
+ return summarize(findings);
14
+ }
15
+ findings.push({
16
+ level: 'ok',
17
+ message: `Configured agents: ${config.agents.length ? config.agents.join(', ') : 'none'}`,
18
+ });
19
+ for (const target of configManager.getInstallTargets(config.agents)) {
20
+ if (await fs.pathExists(target.skillsDir)) {
21
+ findings.push({ level: 'ok', message: `${target.agent} skills directory exists: ${relative(projectRoot, target.skillsDir)}` });
22
+ }
23
+ else {
24
+ findings.push({ level: 'error', message: `${target.agent} skills directory missing: ${relative(projectRoot, target.skillsDir)}` });
25
+ }
26
+ for (const skill of config.installedSkills) {
27
+ const skillPath = path.join(target.skillsDir, skill.name, 'SKILL.md');
28
+ if (!(await fs.pathExists(skillPath))) {
29
+ findings.push({
30
+ level: 'error',
31
+ message: `${target.agent} is missing installed skill "${skill.name}" at ${relative(projectRoot, skillPath)}`,
32
+ });
33
+ }
34
+ }
35
+ }
36
+ if (config.claudeMd && !(await fs.pathExists(path.join(projectRoot, 'CLAUDE.md')))) {
37
+ findings.push({ level: 'warning', message: 'Claude is configured, but CLAUDE.md is missing.' });
38
+ }
39
+ if (config.agents.includes('codex') && !(await fs.pathExists(path.join(projectRoot, 'AGENTS.md')))) {
40
+ findings.push({ level: 'warning', message: 'Codex is configured, but AGENTS.md is missing.' });
41
+ }
42
+ for (const workflow of workflowNames()) {
43
+ const workflowPath = path.join(projectRoot, '.ai-skills', 'workflows', workflow);
44
+ if (!(await fs.pathExists(workflowPath))) {
45
+ findings.push({ level: 'warning', message: `Workflow is missing: ${relative(projectRoot, workflowPath)}` });
46
+ }
47
+ }
48
+ const detected = await detectStack(projectRoot);
49
+ if (detected.packages.length > 0) {
50
+ findings.push({ level: 'info', message: `Detected stack: ${detected.packages.join(', ')}` });
51
+ }
52
+ const installed = new Set(config.installedSkills.map((skill) => skill.name));
53
+ const missingSuggested = detected.suggestedSkills.filter((skill) => !installed.has(skill));
54
+ if (missingSuggested.length > 0) {
55
+ findings.push({
56
+ level: 'warning',
57
+ message: `Recommended skills not installed: ${missingSuggested.join(', ')}`,
58
+ });
59
+ }
60
+ for (const skill of config.installedSkills) {
61
+ const meta = getSkillMeta(skill.name);
62
+ if (!meta) {
63
+ findings.push({ level: 'warning', message: `Installed skill is no longer in the package catalog: ${skill.name}` });
64
+ }
65
+ else if (meta.version !== skill.version) {
66
+ findings.push({
67
+ level: 'warning',
68
+ message: `Installed skill "${skill.name}" is v${skill.version}; package has v${meta.version}. Run ai-skills update.`,
69
+ });
70
+ }
71
+ }
72
+ await inspectPackageScripts(projectRoot, findings);
73
+ return summarize(findings);
74
+ }
75
+ async function inspectPackageScripts(projectRoot, findings) {
76
+ const pkgPath = path.join(projectRoot, 'package.json');
77
+ if (!(await fs.pathExists(pkgPath)))
78
+ return;
79
+ const pkg = await fs.readJson(pkgPath);
80
+ const scripts = pkg.scripts ?? {};
81
+ const useful = ['typecheck', 'test', 'lint'].filter((script) => scripts[script]);
82
+ if (useful.length === 0) {
83
+ findings.push({
84
+ level: 'warning',
85
+ message: 'No typecheck/test/lint scripts found. Agents work better with cheap verification commands.',
86
+ });
87
+ }
88
+ else {
89
+ findings.push({ level: 'ok', message: `Verification scripts available: ${useful.join(', ')}` });
90
+ }
91
+ }
92
+ function summarize(findings) {
93
+ return {
94
+ findings,
95
+ errors: findings.filter((finding) => finding.level === 'error').length,
96
+ warnings: findings.filter((finding) => finding.level === 'warning').length,
97
+ };
98
+ }
99
+ function relative(from, to) {
100
+ return path.relative(from, to) || '.';
101
+ }
102
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SkillMeta, SkillCategory, SkillProfile } from '../types/index.js';
2
+ export declare const SKILL_CATALOG: Record<string, SkillMeta>;
3
+ export declare const STACK_SKILL_MAP: Record<string, string[]>;
4
+ export declare const SKILL_PROFILES: Record<string, SkillProfile>;
5
+ export declare function getSkillMeta(name: string): SkillMeta | undefined;
6
+ export declare function getAllSkills(): SkillMeta[];
7
+ export declare function getSkillsByCategory(category: SkillCategory): SkillMeta[];
8
+ export declare function getSkillProfile(name: string): SkillProfile | undefined;
9
+ export declare function getAllProfiles(): SkillProfile[];
10
+ export declare function mapStackToSkills(stackItems: string[]): string[];
11
+ //# sourceMappingURL=skill-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/core/skill-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2FnD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAkBpD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAqCvD,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEhE;AAED,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAE1C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS,EAAE,CAExE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO/D"}