@planu/cli 0.62.1 → 0.63.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 (155) hide show
  1. package/dist/config/ecosystem-sources.json +34 -0
  2. package/dist/config/license-plans.json +5 -2
  3. package/dist/config/skill-registries.json +26 -0
  4. package/dist/engine/dynamic-knowledge/context-resolver.d.ts +15 -0
  5. package/dist/engine/dynamic-knowledge/context-resolver.d.ts.map +1 -0
  6. package/dist/engine/dynamic-knowledge/context-resolver.js +80 -0
  7. package/dist/engine/dynamic-knowledge/context-resolver.js.map +1 -0
  8. package/dist/engine/dynamic-knowledge/index.d.ts +7 -0
  9. package/dist/engine/dynamic-knowledge/index.d.ts.map +1 -0
  10. package/dist/engine/dynamic-knowledge/index.js +7 -0
  11. package/dist/engine/dynamic-knowledge/index.js.map +1 -0
  12. package/dist/engine/dynamic-knowledge/knowledge-cache.d.ts +8 -0
  13. package/dist/engine/dynamic-knowledge/knowledge-cache.d.ts.map +1 -0
  14. package/dist/engine/dynamic-knowledge/knowledge-cache.js +90 -0
  15. package/dist/engine/dynamic-knowledge/knowledge-cache.js.map +1 -0
  16. package/dist/engine/dynamic-knowledge/knowledge-merger.d.ts +13 -0
  17. package/dist/engine/dynamic-knowledge/knowledge-merger.d.ts.map +1 -0
  18. package/dist/engine/dynamic-knowledge/knowledge-merger.js +135 -0
  19. package/dist/engine/dynamic-knowledge/knowledge-merger.js.map +1 -0
  20. package/dist/engine/dynamic-knowledge/query-knowledge.d.ts +17 -0
  21. package/dist/engine/dynamic-knowledge/query-knowledge.d.ts.map +1 -0
  22. package/dist/engine/dynamic-knowledge/query-knowledge.js +73 -0
  23. package/dist/engine/dynamic-knowledge/query-knowledge.js.map +1 -0
  24. package/dist/engine/dynamic-knowledge/stack-filter.d.ts +7 -0
  25. package/dist/engine/dynamic-knowledge/stack-filter.d.ts.map +1 -0
  26. package/dist/engine/dynamic-knowledge/stack-filter.js +45 -0
  27. package/dist/engine/dynamic-knowledge/stack-filter.js.map +1 -0
  28. package/dist/engine/dynamic-knowledge/web-researcher.d.ts +12 -0
  29. package/dist/engine/dynamic-knowledge/web-researcher.d.ts.map +1 -0
  30. package/dist/engine/dynamic-knowledge/web-researcher.js +189 -0
  31. package/dist/engine/dynamic-knowledge/web-researcher.js.map +1 -0
  32. package/dist/engine/ecosystem-absorber/capability-detector.d.ts +11 -0
  33. package/dist/engine/ecosystem-absorber/capability-detector.d.ts.map +1 -0
  34. package/dist/engine/ecosystem-absorber/capability-detector.js +65 -0
  35. package/dist/engine/ecosystem-absorber/capability-detector.js.map +1 -0
  36. package/dist/engine/ecosystem-absorber/ecosystem-watcher.d.ts +11 -0
  37. package/dist/engine/ecosystem-absorber/ecosystem-watcher.d.ts.map +1 -0
  38. package/dist/engine/ecosystem-absorber/ecosystem-watcher.js +57 -0
  39. package/dist/engine/ecosystem-absorber/ecosystem-watcher.js.map +1 -0
  40. package/dist/engine/ecosystem-absorber/index.d.ts +5 -0
  41. package/dist/engine/ecosystem-absorber/index.d.ts.map +1 -0
  42. package/dist/engine/ecosystem-absorber/index.js +6 -0
  43. package/dist/engine/ecosystem-absorber/index.js.map +1 -0
  44. package/dist/engine/ecosystem-absorber/knowledge-cache.d.ts +23 -0
  45. package/dist/engine/ecosystem-absorber/knowledge-cache.d.ts.map +1 -0
  46. package/dist/engine/ecosystem-absorber/knowledge-cache.js +83 -0
  47. package/dist/engine/ecosystem-absorber/knowledge-cache.js.map +1 -0
  48. package/dist/engine/ecosystem-absorber/platform-crawler.d.ts +12 -0
  49. package/dist/engine/ecosystem-absorber/platform-crawler.d.ts.map +1 -0
  50. package/dist/engine/ecosystem-absorber/platform-crawler.js +129 -0
  51. package/dist/engine/ecosystem-absorber/platform-crawler.js.map +1 -0
  52. package/dist/engine/resilience-fetcher/index.d.ts +2 -0
  53. package/dist/engine/resilience-fetcher/index.d.ts.map +1 -0
  54. package/dist/engine/resilience-fetcher/index.js +2 -0
  55. package/dist/engine/resilience-fetcher/index.js.map +1 -0
  56. package/dist/engine/resilience-fetcher/resilience-injector.d.ts +11 -0
  57. package/dist/engine/resilience-fetcher/resilience-injector.d.ts.map +1 -0
  58. package/dist/engine/resilience-fetcher/resilience-injector.js +72 -0
  59. package/dist/engine/resilience-fetcher/resilience-injector.js.map +1 -0
  60. package/dist/engine/skill-registry/agentskill-adapter.d.ts +9 -0
  61. package/dist/engine/skill-registry/agentskill-adapter.d.ts.map +1 -0
  62. package/dist/engine/skill-registry/agentskill-adapter.js +64 -0
  63. package/dist/engine/skill-registry/agentskill-adapter.js.map +1 -0
  64. package/dist/engine/skill-registry/anthropic-adapter.d.ts +11 -0
  65. package/dist/engine/skill-registry/anthropic-adapter.d.ts.map +1 -0
  66. package/dist/engine/skill-registry/anthropic-adapter.js +133 -0
  67. package/dist/engine/skill-registry/anthropic-adapter.js.map +1 -0
  68. package/dist/engine/skill-registry/discovery.d.ts +7 -0
  69. package/dist/engine/skill-registry/discovery.d.ts.map +1 -0
  70. package/dist/engine/skill-registry/discovery.js +15 -0
  71. package/dist/engine/skill-registry/discovery.js.map +1 -0
  72. package/dist/engine/skill-registry/index.d.ts +7 -0
  73. package/dist/engine/skill-registry/index.d.ts.map +1 -0
  74. package/dist/engine/skill-registry/index.js +8 -0
  75. package/dist/engine/skill-registry/index.js.map +1 -0
  76. package/dist/engine/skill-registry/installer.d.ts +22 -0
  77. package/dist/engine/skill-registry/installer.d.ts.map +1 -0
  78. package/dist/engine/skill-registry/installer.js +122 -0
  79. package/dist/engine/skill-registry/installer.js.map +1 -0
  80. package/dist/engine/skill-registry/skillssh-adapter.d.ts +7 -0
  81. package/dist/engine/skill-registry/skillssh-adapter.d.ts.map +1 -0
  82. package/dist/engine/skill-registry/skillssh-adapter.js +78 -0
  83. package/dist/engine/skill-registry/skillssh-adapter.js.map +1 -0
  84. package/dist/engine/skill-registry/unified-search.d.ts +12 -0
  85. package/dist/engine/skill-registry/unified-search.d.ts.map +1 -0
  86. package/dist/engine/skill-registry/unified-search.js +116 -0
  87. package/dist/engine/skill-registry/unified-search.js.map +1 -0
  88. package/dist/index.js +4 -0
  89. package/dist/index.js.map +1 -1
  90. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -1
  91. package/dist/tools/create-spec/constitution-validator.js +7 -13
  92. package/dist/tools/create-spec/constitution-validator.js.map +1 -1
  93. package/dist/tools/create-spec/resilience-adapter.d.ts +6 -0
  94. package/dist/tools/create-spec/resilience-adapter.d.ts.map +1 -0
  95. package/dist/tools/create-spec/resilience-adapter.js +21 -0
  96. package/dist/tools/create-spec/resilience-adapter.js.map +1 -0
  97. package/dist/tools/create-spec.d.ts.map +1 -1
  98. package/dist/tools/create-spec.js +46 -4
  99. package/dist/tools/create-spec.js.map +1 -1
  100. package/dist/tools/ecosystem-status.d.ts +7 -0
  101. package/dist/tools/ecosystem-status.d.ts.map +1 -0
  102. package/dist/tools/ecosystem-status.js +69 -0
  103. package/dist/tools/ecosystem-status.js.map +1 -0
  104. package/dist/tools/register-ecosystem-tools.d.ts +7 -0
  105. package/dist/tools/register-ecosystem-tools.d.ts.map +1 -0
  106. package/dist/tools/register-ecosystem-tools.js +20 -0
  107. package/dist/tools/register-ecosystem-tools.js.map +1 -0
  108. package/dist/tools/register-skill-registry-tools.d.ts +3 -0
  109. package/dist/tools/register-skill-registry-tools.d.ts.map +1 -0
  110. package/dist/tools/register-skill-registry-tools.js +40 -0
  111. package/dist/tools/register-skill-registry-tools.js.map +1 -0
  112. package/dist/tools/schemas/ecosystem-schemas.d.ts +6 -0
  113. package/dist/tools/schemas/ecosystem-schemas.d.ts.map +1 -0
  114. package/dist/tools/schemas/ecosystem-schemas.js +10 -0
  115. package/dist/tools/schemas/ecosystem-schemas.js.map +1 -0
  116. package/dist/tools/schemas/index.d.ts +2 -0
  117. package/dist/tools/schemas/index.d.ts.map +1 -1
  118. package/dist/tools/schemas/index.js +2 -0
  119. package/dist/tools/schemas/index.js.map +1 -1
  120. package/dist/tools/schemas/skill-registry-schemas.d.ts +15 -0
  121. package/dist/tools/schemas/skill-registry-schemas.d.ts.map +1 -0
  122. package/dist/tools/schemas/skill-registry-schemas.js +45 -0
  123. package/dist/tools/schemas/skill-registry-schemas.js.map +1 -0
  124. package/dist/tools/skill-registry/index.d.ts +3 -0
  125. package/dist/tools/skill-registry/index.d.ts.map +1 -0
  126. package/dist/tools/skill-registry/index.js +4 -0
  127. package/dist/tools/skill-registry/index.js.map +1 -0
  128. package/dist/tools/skill-registry/install.d.ts +7 -0
  129. package/dist/tools/skill-registry/install.d.ts.map +1 -0
  130. package/dist/tools/skill-registry/install.js +42 -0
  131. package/dist/tools/skill-registry/install.js.map +1 -0
  132. package/dist/tools/skill-registry/search.d.ts +8 -0
  133. package/dist/tools/skill-registry/search.d.ts.map +1 -0
  134. package/dist/tools/skill-registry/search.js +45 -0
  135. package/dist/tools/skill-registry/search.js.map +1 -0
  136. package/dist/types/dynamic-knowledge.d.ts +47 -0
  137. package/dist/types/dynamic-knowledge.d.ts.map +1 -0
  138. package/dist/types/dynamic-knowledge.js +11 -0
  139. package/dist/types/dynamic-knowledge.js.map +1 -0
  140. package/dist/types/ecosystem.d.ts +45 -0
  141. package/dist/types/ecosystem.d.ts.map +1 -0
  142. package/dist/types/ecosystem.js +3 -0
  143. package/dist/types/ecosystem.js.map +1 -0
  144. package/dist/types/index.d.ts +3 -0
  145. package/dist/types/index.d.ts.map +1 -1
  146. package/dist/types/index.js +3 -0
  147. package/dist/types/index.js.map +1 -1
  148. package/dist/types/skill-registry.d.ts +162 -0
  149. package/dist/types/skill-registry.d.ts.map +1 -0
  150. package/dist/types/skill-registry.js +3 -0
  151. package/dist/types/skill-registry.js.map +1 -0
  152. package/package.json +1 -1
  153. package/src/config/ecosystem-sources.json +34 -0
  154. package/src/config/license-plans.json +5 -2
  155. package/src/config/skill-registries.json +26 -0
@@ -0,0 +1,122 @@
1
+ // engine/skill-registry/installer.ts — SPEC-150: Skill installer
2
+ // Installs skills from a registry into a project's .claude/skills/ directory.
3
+ // Manages the local manifest (manifest.json) tracking all installed skills.
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import { fetchAnthropicSkillContent } from './anthropic-adapter.js';
7
+ const SKILLS_DIR = '.claude/skills';
8
+ const MANIFEST_FILE = 'manifest.json';
9
+ /** Return the absolute path to the project's skills directory. */
10
+ function skillsRoot(projectPath) {
11
+ return path.join(projectPath, SKILLS_DIR);
12
+ }
13
+ /** Return the absolute path to the manifest file. */
14
+ function manifestPath(projectPath) {
15
+ return path.join(skillsRoot(projectPath), MANIFEST_FILE);
16
+ }
17
+ /**
18
+ * Read the skill manifest from disk.
19
+ * Returns an empty manifest if the file does not exist or cannot be parsed.
20
+ */
21
+ export async function readSkillManifest(projectPath) {
22
+ try {
23
+ const raw = await fs.readFile(manifestPath(projectPath), 'utf-8');
24
+ return JSON.parse(raw);
25
+ }
26
+ catch {
27
+ return { installedAt: new Date().toISOString(), skills: [] };
28
+ }
29
+ }
30
+ /** Write the manifest to disk (creates the directory if needed). */
31
+ async function writeSkillManifest(projectPath, manifest) {
32
+ await fs.mkdir(skillsRoot(projectPath), { recursive: true });
33
+ await fs.writeFile(manifestPath(projectPath), JSON.stringify(manifest, null, 2), 'utf-8');
34
+ }
35
+ /**
36
+ * Check whether a skill is already installed in the project.
37
+ */
38
+ export async function isSkillInstalled(projectPath, skillName) {
39
+ const manifest = await readSkillManifest(projectPath);
40
+ return manifest.skills.some((s) => s.name === skillName);
41
+ }
42
+ /** Update or add a skill entry in the manifest. */
43
+ function upsertManifestEntry(manifest, entry) {
44
+ const existing = manifest.skills.findIndex((s) => s.name === entry.name);
45
+ const skills = existing >= 0
46
+ ? manifest.skills.map((s, i) => i === existing ? { ...s, ...entry, updatedAt: new Date().toISOString() } : s)
47
+ : [...manifest.skills, entry];
48
+ return { ...manifest, skills };
49
+ }
50
+ /** Install a skill from the Anthropic (GitHub) source. */
51
+ async function installFromAnthropic(skillName, installDir) {
52
+ const content = await fetchAnthropicSkillContent(skillName);
53
+ if (!content) {
54
+ throw new Error(`Skill "${skillName}" not found in the Anthropic skills repository. ` +
55
+ 'Check the skill name and try again.');
56
+ }
57
+ await fs.mkdir(installDir, { recursive: true });
58
+ const skillMdPath = path.join(installDir, 'SKILL.md');
59
+ await fs.writeFile(skillMdPath, content.skillMd, 'utf-8');
60
+ const hasScripts = content.files.some((f) => f.startsWith('scripts/') || f === 'scripts');
61
+ return { filesWritten: [skillMdPath], hasScripts };
62
+ }
63
+ /** Install a skill placeholder for skillssh/agentskill sources (no direct file API yet). */
64
+ async function installFromExternal(skillName, source, installDir) {
65
+ await fs.mkdir(installDir, { recursive: true });
66
+ const placeholder = [
67
+ `# ${skillName}`,
68
+ '',
69
+ `> Installed from: ${source}`,
70
+ `> Installation date: ${new Date().toISOString()}`,
71
+ '',
72
+ 'Run `planu registry install` again to refresh this skill.',
73
+ ].join('\n');
74
+ const skillMdPath = path.join(installDir, 'SKILL.md');
75
+ await fs.writeFile(skillMdPath, placeholder, 'utf-8');
76
+ return { filesWritten: [skillMdPath], hasScripts: false };
77
+ }
78
+ /**
79
+ * Install a skill from the specified source into the project's .claude/skills/ directory.
80
+ *
81
+ * Steps:
82
+ * 1. Resolve the target installation directory.
83
+ * 2. Fetch skill content from the appropriate adapter.
84
+ * 3. Write files to disk.
85
+ * 4. Update the local manifest.
86
+ * 5. Return the install result with security flags.
87
+ */
88
+ export async function installSkill(skillName, source, projectPath) {
89
+ const installDir = path.join(skillsRoot(projectPath), skillName);
90
+ let filesWritten;
91
+ let hasScripts;
92
+ let version;
93
+ if (source === 'anthropic') {
94
+ const result = await installFromAnthropic(skillName, installDir);
95
+ filesWritten = result.filesWritten;
96
+ hasScripts = result.hasScripts;
97
+ version = result.version;
98
+ }
99
+ else {
100
+ const result = await installFromExternal(skillName, source, installDir);
101
+ filesWritten = result.filesWritten;
102
+ hasScripts = result.hasScripts;
103
+ }
104
+ const manifest = await readSkillManifest(projectPath);
105
+ const entry = {
106
+ name: skillName,
107
+ source,
108
+ version,
109
+ installedAt: new Date().toISOString(),
110
+ path: installDir,
111
+ };
112
+ await writeSkillManifest(projectPath, upsertManifestEntry(manifest, entry));
113
+ return {
114
+ name: skillName,
115
+ source,
116
+ installedPath: installDir,
117
+ filesWritten,
118
+ hasScripts,
119
+ version,
120
+ };
121
+ }
122
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../../src/engine/skill-registry/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SkillSearchResult } from '../../types/index.js';
2
+ /**
3
+ * Search skills.sh catalog for skills matching the given query and optional stack.
4
+ * Returns an empty array on network errors or unexpected response shapes.
5
+ */
6
+ export declare function searchSkillsSh(query: string, stack?: string, limit?: number): Promise<SkillSearchResult[]>;
7
+ //# sourceMappingURL=skillssh-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillssh-adapter.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-registry/skillssh-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAmC,MAAM,sBAAsB,CAAC;AA8D/F;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwB9B"}
@@ -0,0 +1,78 @@
1
+ // engine/skill-registry/skillssh-adapter.ts — SPEC-150: skills.sh registry adapter
2
+ // Searches the skills.sh catalog API for installable agent skills.
3
+ // Uses native fetch() (Node 18+). No external dependencies.
4
+ const SKILLS_SH_BASE = 'https://skills.sh';
5
+ const CATALOG_PATH = '/api/catalog';
6
+ const SEARCH_PATH = '/api/search';
7
+ const USER_AGENT = 'Planu/1.0';
8
+ const DEFAULT_LIMIT = 10;
9
+ /** Build the search URL with query and stack params. */
10
+ function buildUrl(query, stack) {
11
+ const hasQuery = query.trim().length > 0;
12
+ const endpoint = hasQuery ? SEARCH_PATH : CATALOG_PATH;
13
+ const url = new URL(`${SKILLS_SH_BASE}${endpoint}`);
14
+ if (hasQuery) {
15
+ url.searchParams.set('q', query);
16
+ }
17
+ if (stack) {
18
+ url.searchParams.set('stack', stack);
19
+ }
20
+ return url.toString();
21
+ }
22
+ /** Perform a single fetch against skills.sh, returning parsed JSON or null. */
23
+ async function fetchSkillsSh(url) {
24
+ try {
25
+ const response = await globalThis.fetch(url, {
26
+ headers: {
27
+ 'User-Agent': USER_AGENT,
28
+ Accept: 'application/json',
29
+ },
30
+ signal: AbortSignal.timeout(10_000),
31
+ });
32
+ if (!response.ok) {
33
+ return null;
34
+ }
35
+ return (await response.json());
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /** Map a raw skills.sh entry to a unified SkillSearchResult. */
42
+ function mapEntry(entry) {
43
+ const slug = entry.owner ? `${entry.owner}/${entry.name ?? ''}` : (entry.name ?? '');
44
+ return {
45
+ name: entry.name ?? slug,
46
+ description: entry.description ?? `Skill: ${entry.name ?? slug}`,
47
+ source: 'skillssh',
48
+ installCommand: entry.installCommand ?? `planu registry install ${slug}`,
49
+ url: entry.url ?? `${SKILLS_SH_BASE}/skills/${slug}`,
50
+ author: entry.author ?? entry.owner,
51
+ installs: entry.installs,
52
+ license: entry.license,
53
+ tags: entry.tags,
54
+ relevanceScore: 0,
55
+ };
56
+ }
57
+ /**
58
+ * Search skills.sh catalog for skills matching the given query and optional stack.
59
+ * Returns an empty array on network errors or unexpected response shapes.
60
+ */
61
+ export async function searchSkillsSh(query, stack, limit) {
62
+ const url = buildUrl(query, stack);
63
+ const data = await fetchSkillsSh(url);
64
+ if (!data) {
65
+ return [];
66
+ }
67
+ const raw = data.skills ?? data.results ?? [];
68
+ const q = query.toLowerCase();
69
+ // Client-side filter when using catalog endpoint (no query param)
70
+ const filtered = query.trim().length > 0
71
+ ? raw
72
+ : raw.filter((entry) => (entry.name ?? '').toLowerCase().includes(q) ||
73
+ (entry.description ?? '').toLowerCase().includes(q) ||
74
+ entry.tags?.some((t) => t.toLowerCase().includes(q)));
75
+ const cap = limit ?? DEFAULT_LIMIT;
76
+ return filtered.slice(0, cap).map(mapEntry);
77
+ }
78
+ //# sourceMappingURL=skillssh-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillssh-adapter.js","sourceRoot":"","sources":["../../../src/engine/skill-registry/skillssh-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SkillSearchResult, SkillSearchParams, SkillRegistrySource } from '../../types/index.js';
2
+ /**
3
+ * Search across all enabled registries in parallel.
4
+ *
5
+ * Steps:
6
+ * 1. Filter enabled registries (and by params.registry if specified).
7
+ * 2. Query each adapter in parallel with Promise.allSettled (failures silenced).
8
+ * 3. Assign relevance scores, merge, deduplicate by name.
9
+ * 4. Sort by relevance desc, cap at params.limit.
10
+ */
11
+ export declare function searchAllRegistries(params: SkillSearchParams, registries: SkillRegistrySource[]): Promise<SkillSearchResult[]>;
12
+ //# sourceMappingURL=unified-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-search.d.ts","sourceRoot":"","sources":["../../../src/engine/skill-registry/unified-search.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AA0F9B;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwC9B"}
@@ -0,0 +1,116 @@
1
+ // engine/skill-registry/unified-search.ts — SPEC-150: Unified skill search across registries
2
+ // Queries all enabled registries in parallel, merges and ranks results by relevance.
3
+ import { searchAnthropicSkills } from './anthropic-adapter.js';
4
+ import { searchSkillsSh } from './skillssh-adapter.js';
5
+ import { searchAgentSkills } from './agentskill-adapter.js';
6
+ const DEFAULT_LIMIT = 10;
7
+ /** Dispatch a search to the correct adapter based on registry ID. */
8
+ async function queryRegistry(registry, query, stack) {
9
+ try {
10
+ switch (registry.id) {
11
+ case 'anthropic':
12
+ return await searchAnthropicSkills(query);
13
+ case 'skillssh':
14
+ return await searchSkillsSh(query, stack);
15
+ case 'agentskill':
16
+ return await searchAgentSkills(query, stack);
17
+ default:
18
+ return [];
19
+ }
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ }
25
+ /**
26
+ * Compute a relevance score 0-1 for a skill result.
27
+ *
28
+ * Factors (weighted):
29
+ * - Exact name match: +0.40
30
+ * - Name contains query: +0.25
31
+ * - Description contains query: +0.15
32
+ * - Tag match: +0.10
33
+ * - Registry priority (inverted, capped at 10 registries): up to 0.05
34
+ * - Install popularity (log scale): up to 0.05
35
+ */
36
+ function computeRelevanceScore(result, query, registryPriority) {
37
+ const q = query.toLowerCase();
38
+ const nameLower = result.name.toLowerCase();
39
+ const descLower = result.description.toLowerCase();
40
+ let score = 0;
41
+ if (nameLower === q) {
42
+ score += 0.4;
43
+ }
44
+ else if (nameLower.includes(q)) {
45
+ score += 0.25;
46
+ }
47
+ if (descLower.includes(q)) {
48
+ score += 0.15;
49
+ }
50
+ if (result.tags?.some((t) => t.toLowerCase().includes(q))) {
51
+ score += 0.1;
52
+ }
53
+ // Priority: priority=1 (highest) yields 0.05, priority=10+ yields 0
54
+ const priorityBonus = Math.max(0, (11 - registryPriority) / 10) * 0.05;
55
+ score += priorityBonus;
56
+ // Popularity: log10(installs+1) capped at 6 (1M installs) → 0-0.05
57
+ if (result.installs && result.installs > 0) {
58
+ const popularityBonus = Math.min(Math.log10(result.installs + 1) / 6, 1) * 0.05;
59
+ score += popularityBonus;
60
+ }
61
+ return Math.min(score, 1);
62
+ }
63
+ /** Deduplicate results by name, keeping the one with the highest relevance score. */
64
+ function deduplicate(results) {
65
+ const best = new Map();
66
+ for (const r of results) {
67
+ const existing = best.get(r.name);
68
+ if (!existing || r.relevanceScore > existing.relevanceScore) {
69
+ best.set(r.name, r);
70
+ }
71
+ }
72
+ return Array.from(best.values());
73
+ }
74
+ /**
75
+ * Search across all enabled registries in parallel.
76
+ *
77
+ * Steps:
78
+ * 1. Filter enabled registries (and by params.registry if specified).
79
+ * 2. Query each adapter in parallel with Promise.allSettled (failures silenced).
80
+ * 3. Assign relevance scores, merge, deduplicate by name.
81
+ * 4. Sort by relevance desc, cap at params.limit.
82
+ */
83
+ export async function searchAllRegistries(params, registries) {
84
+ const enabled = registries.filter((r) => {
85
+ if (!r.enabled) {
86
+ return false;
87
+ }
88
+ if (params.registry && params.registry !== 'all' && r.id !== params.registry) {
89
+ return false;
90
+ }
91
+ return true;
92
+ });
93
+ if (enabled.length === 0) {
94
+ return [];
95
+ }
96
+ const settled = await Promise.allSettled(enabled.map((reg) => queryRegistry(reg, params.query, params.stack)));
97
+ const priorityMap = new Map(enabled.map((r) => [r.id, r.priority]));
98
+ const allResults = [];
99
+ for (const outcome of settled) {
100
+ if (outcome.status !== 'fulfilled') {
101
+ continue;
102
+ }
103
+ for (const result of outcome.value) {
104
+ const priority = priorityMap.get(result.source) ?? 99;
105
+ allResults.push({
106
+ ...result,
107
+ relevanceScore: computeRelevanceScore(result, params.query, priority),
108
+ });
109
+ }
110
+ }
111
+ const deduped = deduplicate(allResults);
112
+ deduped.sort((a, b) => b.relevanceScore - a.relevanceScore);
113
+ const cap = params.limit ?? DEFAULT_LIMIT;
114
+ return deduped.slice(0, cap);
115
+ }
116
+ //# sourceMappingURL=unified-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified-search.js","sourceRoot":"","sources":["../../../src/engine/skill-registry/unified-search.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -76,10 +76,12 @@ import { registerExportTools } from './tools/register-export-tools.js';
76
76
  import { registerLivingSpecTools } from './tools/register-living-spec-tools.js';
77
77
  import { registerLivingSpecAdvancedTools } from './tools/register-living-spec-advanced-tools.js';
78
78
  import { registerSpecRegistryTools } from './tools/register-spec-registry-tools.js';
79
+ import { registerSkillRegistryTools } from './tools/register-skill-registry-tools.js';
79
80
  import { registerScanTools } from './tools/register-scan-tools.js';
80
81
  import { registerGenerateDashboardTools } from './tools/generate-dashboard.js';
81
82
  import { registerGenerateProposalTool } from './tools/generate-proposal.js';
82
83
  import { registerExportPdfTool } from './tools/export-pdf.js';
84
+ import { registerEcosystemTools } from './tools/register-ecosystem-tools.js';
83
85
  import { PLANU_VERSION } from './config/version.js';
84
86
  import { handleActivateLicense } from './tools/activate-license.js';
85
87
  import { GroupManager } from './engine/tool-groups/group-manager.js';
@@ -212,10 +214,12 @@ function createMcpServer() {
212
214
  registerLivingSpecTools(s);
213
215
  registerLivingSpecAdvancedTools(s);
214
216
  registerSpecRegistryTools(s);
217
+ registerSkillRegistryTools(s);
215
218
  registerScanTools(s);
216
219
  registerGenerateDashboardTools(s);
217
220
  registerGenerateProposalTool(s);
218
221
  registerExportPdfTool(s);
222
+ registerEcosystemTools(s);
219
223
  registerPrompts(s);
220
224
  return s;
221
225
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"constitution-validator.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAIpE,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
1
+ {"version":3,"file":"constitution-validator.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAKpE,wFAAwF;AACxF,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,uBAAuB,CAAC,CA0BlC"}
@@ -2,6 +2,7 @@
2
2
  // Extracted from create-spec.ts to keep file sizes within limits.
3
3
  import { knowledgeStore } from '../../storage/index.js';
4
4
  import { checkConstitutionCompliance } from '../create-spec-tech.js';
5
+ import { toolResult } from '../response-helpers.js';
5
6
  /** Validates spec against Constitution principles. Returns block result or warnings. */
6
7
  export async function validateConstitution(projectId, title, tags) {
7
8
  const constitution = await knowledgeStore.getConstitution(projectId);
@@ -11,21 +12,14 @@ export async function validateConstitution(projectId, title, tags) {
11
12
  const violations = checkConstitutionCompliance(title, tags, constitution.principles);
12
13
  const strictViolations = violations.filter((v) => v.severity === 'error');
13
14
  if (strictViolations.length > 0) {
15
+ const structured = {
16
+ error: 'Constitution violation',
17
+ strictViolations,
18
+ message: `Spec violates ${strictViolations.length} strict Constitution principle(s). Revise the spec or update the Constitution.`,
19
+ };
14
20
  return {
15
21
  blocked: true,
16
- errorResult: {
17
- content: [
18
- {
19
- type: 'text',
20
- text: JSON.stringify({
21
- error: 'Constitution violation',
22
- strictViolations,
23
- message: `Spec violates ${strictViolations.length} strict Constitution principle(s). Revise the spec or update the Constitution.`,
24
- }, null, 2),
25
- },
26
- ],
27
- isError: true,
28
- },
22
+ errorResult: toolResult(`Constitution violation: ${structured.message}`, structured, true),
29
23
  warnings: [],
30
24
  };
31
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"constitution-validator.js","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,kEAAkE;AAGlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,KAAa,EACb,IAAc;IAEd,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAE1E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE;gBACX,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,KAAK,EAAE,wBAAwB;4BAC/B,gBAAgB;4BAChB,OAAO,EAAE,iBAAiB,gBAAgB,CAAC,MAAM,gFAAgF;yBAClI,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;KAC7D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"constitution-validator.js","sourceRoot":"","sources":["../../../src/tools/create-spec/constitution-validator.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,kEAAkE;AAGlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,KAAa,EACb,IAAc;IAEd,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAE1E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,wBAAwB;YAC/B,gBAAgB;YAChB,OAAO,EAAE,iBAAiB,gBAAgB,CAAC,MAAM,gFAAgF;SAClI,CAAC;QACF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,UAAU,CAAC,2BAA2B,UAAU,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC;YAC1F,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Build resilience section for a spec.
3
+ * Non-blocking: returns empty string on any failure.
4
+ */
5
+ export declare function buildResilienceSection(specTarget: string, specScope: string, stack: string[], appType?: string): Promise<string>;
6
+ //# sourceMappingURL=resilience-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilience-adapter.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec/resilience-adapter.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -0,0 +1,21 @@
1
+ import { fetchResilienceCriteria, formatResilienceSection, } from '../../engine/resilience-fetcher/index.js';
2
+ /**
3
+ * Build resilience section for a spec.
4
+ * Non-blocking: returns empty string on any failure.
5
+ */
6
+ export async function buildResilienceSection(specTarget, specScope, stack, appType) {
7
+ try {
8
+ const context = {
9
+ stack,
10
+ target: specTarget,
11
+ scope: specScope,
12
+ appType,
13
+ };
14
+ const criteria = await fetchResilienceCriteria(context);
15
+ return formatResilienceSection(criteria);
16
+ }
17
+ catch {
18
+ return ''; // never block spec creation
19
+ }
20
+ }
21
+ //# sourceMappingURL=resilience-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilience-adapter.js","sourceRoot":"","sources":["../../../src/tools/create-spec/resilience-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,0CAA0C,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAkB,EAClB,SAAiB,EACjB,KAAe,EACf,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAmB;YAC9B,KAAK;YACL,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,SAAS;YAChB,OAAO;SACR,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,4BAA4B;IACzC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA8BrE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAwNnF"}
1
+ {"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAgCrE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAsRnF"}
@@ -1,6 +1,7 @@
1
1
  import { ti } from '../i18n/index.js';
2
2
  import { knowledgeStore, specStore } from '../storage/index.js';
3
3
  import { describeFilters, isExtendedChallenge } from '../engine/scope-filter.js';
4
+ import { formatSuccess, addNextSteps, toolResult } from './response-helpers.js';
4
5
  import { generateHUContent } from './create-spec-hu.js';
5
6
  import { buildAgentHuSection } from './create-spec/agent-spec-adapter.js';
6
7
  import { isMcpSpec, buildMcpHuSection } from './create-spec/mcp-spec-adapter.js';
@@ -15,6 +16,7 @@ import { generateProgressContent } from '../engine/progress-writer.js';
15
16
  import { generatePerSpecExecutiveReport, generatePerSpecTechnicalReport, } from '../engine/doc-generator/per-spec-report/index.js';
16
17
  import { buildSpecContext, buildSplitResult } from './create-spec/spec-builder.js';
17
18
  import { validateConstitution } from './create-spec/constitution-validator.js';
19
+ import { buildResilienceSection } from './create-spec/resilience-adapter.js';
18
20
  import { setupGitBranch, checkContradictions, fireSpecCreatedHook, generatePostCreationSuggestions, } from './create-spec/post-creation.js';
19
21
  import { regenerateSpecSummaryHtml } from '../engine/spec-summary-html.js';
20
22
  import { notifyStoreChange } from '../engine/doc-generator/portal/regen-hook.js';
@@ -51,9 +53,11 @@ export async function handleCreateSpec(params) {
51
53
  const depWarnings = knowledge?.projectPath && knowledge.projectPath.length > 0
52
54
  ? await runPreSpecDepCheck(knowledge.projectPath, knowledge)
53
55
  : undefined;
56
+ const resilienceSection = await buildResilienceSection(spec.target, spec.scope, knowledge?.stack ?? []);
54
57
  const huContent = generateHUContent(spec, description, knowledge, undefined, teamScale, depWarnings) +
55
58
  agentSection +
56
- mcpSection;
59
+ mcpSection +
60
+ resilienceSection;
57
61
  const fichaTecnicaContent = generateFichaTecnicaContent(spec, description, estimation, knowledge, diagrams, teamScale);
58
62
  await writeFile(specPath, huContent, 'utf-8');
59
63
  await writeFile(technicalPath, fichaTecnicaContent, 'utf-8');
@@ -175,9 +179,47 @@ export async function handleCreateSpec(params) {
175
179
  void regenerateSpecSummaryHtml(params.projectPath, allSpecs, [String(result.specId)]);
176
180
  notifyStoreChange(params.projectPath, 'specs');
177
181
  }
178
- return {
179
- content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
180
- };
182
+ // Build markdown response
183
+ const lines = [
184
+ `**SPEC-${spec.id}** — ${spec.title}`,
185
+ '',
186
+ `| Field | Value |`,
187
+ `|-------|-------|`,
188
+ `| Type | ${spec.type} |`,
189
+ `| Scope | ${spec.scope} |`,
190
+ `| Difficulty | ${String(spec.difficulty)}/5 |`,
191
+ `| Risk | ${spec.risk} |`,
192
+ `| Target | ${spec.target} |`,
193
+ `| Status | ${spec.status} |`,
194
+ `| Tags | ${spec.tags.join(', ')} |`,
195
+ `| Dev hours | ${String(estimation.devHours)}h |`,
196
+ `| Review hours | ${String(estimation.reviewHours)}h |`,
197
+ `| Cost | $${String(estimation.totalCostUsd)} |`,
198
+ ];
199
+ if (spec.gitBranch) {
200
+ lines.push(`| Branch | \`${spec.gitBranch}\` |`);
201
+ }
202
+ if (duplicate) {
203
+ lines.push('', `⚠️ ${ti('spec.duplicateTitle', { title: spec.title, slug: spec.slug })}`);
204
+ }
205
+ if (constitutionCheck.warnings.length > 0) {
206
+ lines.push('', '⚠️ **Constitution Warnings**');
207
+ constitutionCheck.warnings.forEach((w) => lines.push(`- ${w.description}`));
208
+ }
209
+ if (contradictionHint) {
210
+ lines.push('', `⚠️ ${contradictionHint}`);
211
+ }
212
+ if (result.riskWarning) {
213
+ lines.push('', `⚠️ ${result.riskWarning}`);
214
+ }
215
+ if (splitResult) {
216
+ lines.push('', `💡 ${splitResult.formatted ?? 'Consider splitting this spec.'}`);
217
+ }
218
+ const allNextSteps = result.nextSteps ?? [];
219
+ const markdownText = allNextSteps.length > 0
220
+ ? addNextSteps(formatSuccess(ti('tools.create_spec.success', { id: spec.id, title: spec.title }), lines.join('\n')), allNextSteps)
221
+ : formatSuccess(ti('tools.create_spec.success', { id: spec.id, title: spec.title }), lines.join('\n'));
222
+ return toolResult(markdownText, result);
181
223
  }
182
224
  catch (error) {
183
225
  const message = error instanceof Error ? error.message : String(error);