@planu/cli 0.62.0 → 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 (165) 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/engine/spec-summary-html.d.ts +1 -1
  89. package/dist/engine/spec-summary-html.d.ts.map +1 -1
  90. package/dist/engine/spec-summary-html.js +6 -2
  91. package/dist/engine/spec-summary-html.js.map +1 -1
  92. package/dist/index.js +4 -0
  93. package/dist/index.js.map +1 -1
  94. package/dist/tools/create-spec/constitution-validator.d.ts.map +1 -1
  95. package/dist/tools/create-spec/constitution-validator.js +7 -13
  96. package/dist/tools/create-spec/constitution-validator.js.map +1 -1
  97. package/dist/tools/create-spec/resilience-adapter.d.ts +6 -0
  98. package/dist/tools/create-spec/resilience-adapter.d.ts.map +1 -0
  99. package/dist/tools/create-spec/resilience-adapter.js +21 -0
  100. package/dist/tools/create-spec/resilience-adapter.js.map +1 -0
  101. package/dist/tools/create-spec.d.ts.map +1 -1
  102. package/dist/tools/create-spec.js +47 -5
  103. package/dist/tools/create-spec.js.map +1 -1
  104. package/dist/tools/delete-spec.js +1 -1
  105. package/dist/tools/delete-spec.js.map +1 -1
  106. package/dist/tools/ecosystem-status.d.ts +7 -0
  107. package/dist/tools/ecosystem-status.d.ts.map +1 -0
  108. package/dist/tools/ecosystem-status.js +69 -0
  109. package/dist/tools/ecosystem-status.js.map +1 -0
  110. package/dist/tools/list-specs.js +1 -1
  111. package/dist/tools/list-specs.js.map +1 -1
  112. package/dist/tools/register-ecosystem-tools.d.ts +7 -0
  113. package/dist/tools/register-ecosystem-tools.d.ts.map +1 -0
  114. package/dist/tools/register-ecosystem-tools.js +20 -0
  115. package/dist/tools/register-ecosystem-tools.js.map +1 -0
  116. package/dist/tools/register-skill-registry-tools.d.ts +3 -0
  117. package/dist/tools/register-skill-registry-tools.d.ts.map +1 -0
  118. package/dist/tools/register-skill-registry-tools.js +40 -0
  119. package/dist/tools/register-skill-registry-tools.js.map +1 -0
  120. package/dist/tools/schemas/ecosystem-schemas.d.ts +6 -0
  121. package/dist/tools/schemas/ecosystem-schemas.d.ts.map +1 -0
  122. package/dist/tools/schemas/ecosystem-schemas.js +10 -0
  123. package/dist/tools/schemas/ecosystem-schemas.js.map +1 -0
  124. package/dist/tools/schemas/index.d.ts +2 -0
  125. package/dist/tools/schemas/index.d.ts.map +1 -1
  126. package/dist/tools/schemas/index.js +2 -0
  127. package/dist/tools/schemas/index.js.map +1 -1
  128. package/dist/tools/schemas/skill-registry-schemas.d.ts +15 -0
  129. package/dist/tools/schemas/skill-registry-schemas.d.ts.map +1 -0
  130. package/dist/tools/schemas/skill-registry-schemas.js +45 -0
  131. package/dist/tools/schemas/skill-registry-schemas.js.map +1 -0
  132. package/dist/tools/skill-registry/index.d.ts +3 -0
  133. package/dist/tools/skill-registry/index.d.ts.map +1 -0
  134. package/dist/tools/skill-registry/index.js +4 -0
  135. package/dist/tools/skill-registry/index.js.map +1 -0
  136. package/dist/tools/skill-registry/install.d.ts +7 -0
  137. package/dist/tools/skill-registry/install.d.ts.map +1 -0
  138. package/dist/tools/skill-registry/install.js +42 -0
  139. package/dist/tools/skill-registry/install.js.map +1 -0
  140. package/dist/tools/skill-registry/search.d.ts +8 -0
  141. package/dist/tools/skill-registry/search.d.ts.map +1 -0
  142. package/dist/tools/skill-registry/search.js +45 -0
  143. package/dist/tools/skill-registry/search.js.map +1 -0
  144. package/dist/tools/update-status.js +1 -1
  145. package/dist/tools/update-status.js.map +1 -1
  146. package/dist/types/dynamic-knowledge.d.ts +47 -0
  147. package/dist/types/dynamic-knowledge.d.ts.map +1 -0
  148. package/dist/types/dynamic-knowledge.js +11 -0
  149. package/dist/types/dynamic-knowledge.js.map +1 -0
  150. package/dist/types/ecosystem.d.ts +45 -0
  151. package/dist/types/ecosystem.d.ts.map +1 -0
  152. package/dist/types/ecosystem.js +3 -0
  153. package/dist/types/ecosystem.js.map +1 -0
  154. package/dist/types/index.d.ts +3 -0
  155. package/dist/types/index.d.ts.map +1 -1
  156. package/dist/types/index.js +3 -0
  157. package/dist/types/index.js.map +1 -1
  158. package/dist/types/skill-registry.d.ts +162 -0
  159. package/dist/types/skill-registry.d.ts.map +1 -0
  160. package/dist/types/skill-registry.js +3 -0
  161. package/dist/types/skill-registry.js.map +1 -0
  162. package/package.json +1 -1
  163. package/src/config/ecosystem-sources.json +34 -0
  164. package/src/config/license-plans.json +5 -2
  165. package/src/config/skill-registries.json +26 -0
@@ -0,0 +1,34 @@
1
+ [
2
+ {
3
+ "id": "claude-platform",
4
+ "name": "Claude Platform Docs",
5
+ "url": "https://platform.claude.com/docs",
6
+ "type": "docs",
7
+ "crawlIntervalHours": 24,
8
+ "enabled": true
9
+ },
10
+ {
11
+ "id": "agentskills-spec",
12
+ "name": "Agent Skills Specification",
13
+ "url": "https://agentskills.io/specification",
14
+ "type": "docs",
15
+ "crawlIntervalHours": 168,
16
+ "enabled": true
17
+ },
18
+ {
19
+ "id": "anthropic-skills",
20
+ "name": "Anthropic Skills Repo",
21
+ "url": "https://github.com/anthropics/skills",
22
+ "type": "github",
23
+ "crawlIntervalHours": 48,
24
+ "enabled": true
25
+ },
26
+ {
27
+ "id": "mcp-trending",
28
+ "name": "GitHub MCP Trending",
29
+ "url": "https://github.com/topics/model-context-protocol",
30
+ "type": "github",
31
+ "crawlIntervalHours": 168,
32
+ "enabled": true
33
+ }
34
+ ]
@@ -50,7 +50,9 @@
50
50
  "pr_status",
51
51
  "registry_search",
52
52
  "registry_install",
53
- "generate_spec_dashboard"
53
+ "generate_spec_dashboard",
54
+ "skill_search",
55
+ "skill_install"
54
56
  ],
55
57
  "proTools": [
56
58
  "audit",
@@ -152,7 +154,8 @@
152
154
  "registry_login",
153
155
  "registry_logout",
154
156
  "registry_whoami",
155
- "scan_project"
157
+ "scan_project",
158
+ "ecosystem_status"
156
159
  ],
157
160
  "alwaysAllowed": [
158
161
  "activate_license",
@@ -0,0 +1,26 @@
1
+ [
2
+ {
3
+ "id": "anthropic",
4
+ "name": "Anthropic Official Skills",
5
+ "url": "https://github.com/anthropics/skills",
6
+ "type": "github",
7
+ "priority": 1,
8
+ "enabled": true
9
+ },
10
+ {
11
+ "id": "agentskill",
12
+ "name": "AgentSkill.sh",
13
+ "url": "https://agentskill.sh",
14
+ "type": "api",
15
+ "priority": 2,
16
+ "enabled": true
17
+ },
18
+ {
19
+ "id": "skillssh",
20
+ "name": "Skills.sh",
21
+ "url": "https://skills.sh",
22
+ "type": "npm",
23
+ "priority": 3,
24
+ "enabled": true
25
+ }
26
+ ]
@@ -0,0 +1,15 @@
1
+ import type { ProjectContext, KnowledgeCategory } from '../../types/index.js';
2
+ /**
3
+ * Build search queries based on project context and category.
4
+ * Returns an array of search terms optimized for web search.
5
+ */
6
+ export declare function buildSearchQueries(category: KnowledgeCategory, context: ProjectContext): string[];
7
+ /**
8
+ * Determine which categories are relevant for a given project context.
9
+ */
10
+ export declare function resolveRelevantCategories(context: ProjectContext): KnowledgeCategory[];
11
+ /**
12
+ * Build a normalized context key for caching.
13
+ */
14
+ export declare function normalizeContext(context: ProjectContext): Record<string, unknown>;
15
+ //# sourceMappingURL=context-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-resolver.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/context-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9E;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CA+CjG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAetF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQjF"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Build search queries based on project context and category.
3
+ * Returns an array of search terms optimized for web search.
4
+ */
5
+ export function buildSearchQueries(category, context) {
6
+ const year = new Date().getFullYear();
7
+ const stackStr = context.stack.join(' ');
8
+ const queryBuilders = {
9
+ frameworks: () => [
10
+ `best ${context.target} frameworks ${stackStr} ${year}`,
11
+ `${stackStr} recommended libraries tools ${year}`,
12
+ ...(context.appType ? [`best frameworks for ${context.appType} ${year}`] : []),
13
+ ],
14
+ security: () => [
15
+ `OWASP top 10 ${year} ${context.target} security`,
16
+ `${stackStr} security best practices ${year}`,
17
+ `${stackStr} common vulnerabilities prevention ${year}`,
18
+ ...(context.target === 'frontend' ? [`XSS CSRF prevention ${stackStr} ${year}`] : []),
19
+ ...(context.target === 'backend' ? [`SQL injection API security ${stackStr} ${year}`] : []),
20
+ ],
21
+ pricing: () => [
22
+ `LLM API pricing comparison ${year}`,
23
+ `Claude OpenAI Gemini pricing per token ${year}`,
24
+ `AI model costs ${year} latest`,
25
+ ],
26
+ tooling: () => [
27
+ `${stackStr} recommended dev tools ${year}`,
28
+ `${context.target} tooling ecosystem ${stackStr} ${year}`,
29
+ ...(context.appType ? [`${context.appType} tooling stack ${year}`] : []),
30
+ ],
31
+ patterns: () => [
32
+ `${context.target} architecture patterns ${year}`,
33
+ `${stackStr} anti-patterns common bugs ${year}`,
34
+ `resilience patterns ${context.target} ${year}`,
35
+ `${stackStr} scalability best practices ${year}`,
36
+ ...(context.scope === 'architectural' ? [`distributed systems patterns ${year}`] : []),
37
+ ],
38
+ compliance: () => [
39
+ `data privacy regulations ${year}`,
40
+ `GDPR CCPA compliance requirements ${year}`,
41
+ `${context.target} data protection checklist ${year}`,
42
+ ],
43
+ platforms: () => [
44
+ `${context.target} deployment platforms comparison ${year}`,
45
+ `best hosting ${stackStr} ${year}`,
46
+ `serverless edge deployment ${stackStr} ${year}`,
47
+ ],
48
+ };
49
+ return queryBuilders[category]();
50
+ }
51
+ /**
52
+ * Determine which categories are relevant for a given project context.
53
+ */
54
+ export function resolveRelevantCategories(context) {
55
+ const categories = ['patterns', 'security']; // always relevant
56
+ if (context.target === 'frontend' || context.target === 'fullstack') {
57
+ categories.push('frameworks');
58
+ }
59
+ if (context.target === 'backend' || context.target === 'fullstack') {
60
+ categories.push('tooling', 'platforms');
61
+ }
62
+ if (context.scope === 'architectural' || context.scope === 'cross-module') {
63
+ categories.push('compliance');
64
+ }
65
+ // Deduplicate
66
+ return [...new Set(categories)];
67
+ }
68
+ /**
69
+ * Build a normalized context key for caching.
70
+ */
71
+ export function normalizeContext(context) {
72
+ return {
73
+ stack: [...context.stack].sort(),
74
+ target: context.target,
75
+ scope: context.scope,
76
+ ...(context.appType ? { appType: context.appType } : {}),
77
+ ...(context.language ? { language: context.language } : {}),
78
+ };
79
+ }
80
+ //# sourceMappingURL=context-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-resolver.js","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/context-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { readCache, writeCache, findCachedEntry, setCacheEntry, pruneCache, getCacheKey, } from './knowledge-cache.js';
2
+ export { buildSearchQueries, resolveRelevantCategories, normalizeContext, } from './context-resolver.js';
3
+ export { searchWeb, fetchKnowledge } from './web-researcher.js';
4
+ export { loadStaticFallback, mergeKnowledge } from './knowledge-merger.js';
5
+ export { filterByContext } from './stack-filter.js';
6
+ export { queryKnowledge, queryMultipleCategories } from './query-knowledge.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { readCache, writeCache, findCachedEntry, setCacheEntry, pruneCache, getCacheKey, } from './knowledge-cache.js';
2
+ export { buildSearchQueries, resolveRelevantCategories, normalizeContext, } from './context-resolver.js';
3
+ export { searchWeb, fetchKnowledge } from './web-researcher.js';
4
+ export { loadStaticFallback, mergeKnowledge } from './knowledge-merger.js';
5
+ export { filterByContext } from './stack-filter.js';
6
+ export { queryKnowledge, queryMultipleCategories } from './query-knowledge.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type KnowledgeCacheStore, type KnowledgeCacheEntry, type KnowledgeCategory, type KnowledgeItem } from '../../types/index.js';
2
+ export declare function readCache(): Promise<KnowledgeCacheStore>;
3
+ export declare function writeCache(store: KnowledgeCacheStore): Promise<void>;
4
+ export declare function getCacheKey(category: KnowledgeCategory, context: Record<string, unknown>): string;
5
+ export declare function findCachedEntry(store: KnowledgeCacheStore, category: KnowledgeCategory, context: Record<string, unknown>): KnowledgeCacheEntry | null;
6
+ export declare function setCacheEntry(category: KnowledgeCategory, context: Record<string, unknown>, items: KnowledgeItem[]): Promise<void>;
7
+ export declare function pruneCache(store: KnowledgeCacheStore): KnowledgeCacheStore;
8
+ //# sourceMappingURL=knowledge-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-cache.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/knowledge-cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AA6B9B,wBAAsB,SAAS,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAO9D;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEjG;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,mBAAmB,GAAG,IAAI,CAW5B;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAgB1E"}
@@ -0,0 +1,90 @@
1
+ // Cache layer for Dynamic Knowledge Engine
2
+ // Reads/writes data/knowledge/cache.json with per-category TTL
3
+ import { CATEGORY_TTL, } from '../../types/index.js';
4
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
5
+ import { join, dirname } from 'node:path';
6
+ const CACHE_DIR = 'data/knowledge';
7
+ const CACHE_FILE = 'cache.json';
8
+ const MAX_ENTRIES = 200;
9
+ const PRUNE_THRESHOLD_DAYS = 30;
10
+ function getCachePath() {
11
+ return join(process.cwd(), CACHE_DIR, CACHE_FILE);
12
+ }
13
+ function createEmptyStore() {
14
+ return { version: 1, entries: [], lastPruned: new Date().toISOString() };
15
+ }
16
+ function hashContext(context) {
17
+ // Simple hash: sorted JSON string -> basic hash
18
+ const str = JSON.stringify(context, Object.keys(context).sort());
19
+ let hash = 0;
20
+ for (let i = 0; i < str.length; i++) {
21
+ const char = str.charCodeAt(i);
22
+ hash = (hash << 5) - hash + char;
23
+ hash |= 0;
24
+ }
25
+ return Math.abs(hash).toString(36);
26
+ }
27
+ export async function readCache() {
28
+ try {
29
+ const raw = await readFile(getCachePath(), 'utf-8');
30
+ return JSON.parse(raw);
31
+ }
32
+ catch {
33
+ return createEmptyStore();
34
+ }
35
+ }
36
+ export async function writeCache(store) {
37
+ const path = getCachePath();
38
+ await mkdir(dirname(path), { recursive: true });
39
+ await writeFile(path, JSON.stringify(store, null, 2), 'utf-8');
40
+ }
41
+ export function getCacheKey(category, context) {
42
+ return `${category}:${hashContext(context)}`;
43
+ }
44
+ export function findCachedEntry(store, category, context) {
45
+ const contextHash = hashContext(context);
46
+ const entry = store.entries.find((e) => e.category === category && e.context === contextHash);
47
+ if (!entry) {
48
+ return null;
49
+ }
50
+ // Check TTL
51
+ if (new Date(entry.expiresAt) < new Date()) {
52
+ return null;
53
+ }
54
+ return entry;
55
+ }
56
+ export async function setCacheEntry(category, context, items) {
57
+ const store = await readCache();
58
+ const contextHash = hashContext(context);
59
+ const ttlHours = CATEGORY_TTL[category];
60
+ const now = new Date();
61
+ const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1000);
62
+ // Remove existing entry for same category+context
63
+ store.entries = store.entries.filter((e) => !(e.category === category && e.context === contextHash));
64
+ store.entries.push({
65
+ category,
66
+ context: contextHash,
67
+ items,
68
+ fetchedAt: now.toISOString(),
69
+ expiresAt: expiresAt.toISOString(),
70
+ ttl: ttlHours,
71
+ });
72
+ // Prune old entries
73
+ const pruned = pruneCache(store);
74
+ await writeCache(pruned);
75
+ }
76
+ export function pruneCache(store) {
77
+ const now = new Date();
78
+ const threshold = new Date(now.getTime() - PRUNE_THRESHOLD_DAYS * 24 * 60 * 60 * 1000);
79
+ // Remove expired entries older than threshold
80
+ let entries = store.entries.filter((e) => new Date(e.fetchedAt) > threshold);
81
+ // Cap at MAX_ENTRIES (keep newest)
82
+ if (entries.length > MAX_ENTRIES) {
83
+ entries = entries
84
+ .slice()
85
+ .sort((a, b) => new Date(b.fetchedAt).getTime() - new Date(a.fetchedAt).getTime())
86
+ .slice(0, MAX_ENTRIES);
87
+ }
88
+ return { ...store, entries, lastPruned: now.toISOString() };
89
+ }
90
+ //# sourceMappingURL=knowledge-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-cache.js","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/knowledge-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { KnowledgeItem, KnowledgeCategory } from '../../types/index.js';
2
+ /**
3
+ * Load static fallback items from JSON config files.
4
+ * Converts JSON entries into KnowledgeItem format.
5
+ */
6
+ export declare function loadStaticFallback(category: KnowledgeCategory): Promise<KnowledgeItem[]>;
7
+ /**
8
+ * Merge web-fetched items with static fallback items.
9
+ * Web items take priority. Static items fill gaps.
10
+ * Deduplicates by title similarity.
11
+ */
12
+ export declare function mergeKnowledge(webItems: KnowledgeItem[], staticItems: KnowledgeItem[]): KnowledgeItem[];
13
+ //# sourceMappingURL=knowledge-merger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-merger.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/knowledge-merger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA0B7E;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAiB9F;AA+ED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,aAAa,EAAE,GAC3B,aAAa,EAAE,CAwBjB"}
@@ -0,0 +1,135 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ /** Safely convert an unknown value to string, falling back to a default. */
4
+ function toStr(val, fallback) {
5
+ if (typeof val === 'string') {
6
+ return val;
7
+ }
8
+ if (typeof val === 'number') {
9
+ return String(val);
10
+ }
11
+ return fallback;
12
+ }
13
+ /** Map categories to their static fallback JSON files in src/config/ */
14
+ const STATIC_FALLBACK_MAP = {
15
+ frameworks: ['framework-registry/index.json', 'build-tools-catalog.json'],
16
+ security: ['known-cves.json', 'security-patterns.json'],
17
+ pricing: ['ai-model-pricing.json', 'llm-providers.json'],
18
+ tooling: ['saas-registry.json', 'mcp-catalog.json'],
19
+ patterns: ['architecture-patterns.json', 'quality-principles.json'],
20
+ compliance: ['security-patterns.json'], // reuse security for compliance fallback
21
+ platforms: ['deploy-platforms.json'],
22
+ };
23
+ /**
24
+ * Load static fallback items from JSON config files.
25
+ * Converts JSON entries into KnowledgeItem format.
26
+ */
27
+ export async function loadStaticFallback(category) {
28
+ const files = STATIC_FALLBACK_MAP[category];
29
+ const items = [];
30
+ for (const file of files) {
31
+ try {
32
+ const configDir = join(import.meta.dirname, '../../config');
33
+ const raw = await readFile(join(configDir, file), 'utf-8');
34
+ const data = JSON.parse(raw);
35
+ const converted = convertStaticToItems(data, category, file);
36
+ items.push(...converted);
37
+ }
38
+ catch {
39
+ // File doesn't exist or can't parse — skip silently
40
+ }
41
+ }
42
+ return items;
43
+ }
44
+ /**
45
+ * Convert a static JSON config into KnowledgeItem format.
46
+ * Handles various JSON structures found in src/config/.
47
+ */
48
+ function convertStaticToItems(data, category, sourceFile) {
49
+ const items = [];
50
+ const now = new Date().toISOString();
51
+ // Handle arrays at top level
52
+ if (Array.isArray(data)) {
53
+ for (const entry of data) {
54
+ const rawId = entry.id ?? entry.name ?? items.length;
55
+ const id = typeof rawId === 'string' || typeof rawId === 'number'
56
+ ? String(rawId)
57
+ : String(items.length);
58
+ items.push({
59
+ id: `static-${category}-${id}`,
60
+ category,
61
+ title: toStr(entry.name ?? entry.title ?? entry.id, 'Unknown'),
62
+ description: toStr(entry.description ?? entry.summary, ''),
63
+ sourceUrl: undefined,
64
+ applicableTargets: inferTargetsFromStatic(entry),
65
+ severity: 'recommended',
66
+ tags: extractTagsFromStatic(entry),
67
+ fetchedAt: now,
68
+ });
69
+ }
70
+ return items;
71
+ }
72
+ // Handle object with named entries (like framework-registry)
73
+ for (const [key, value] of Object.entries(data)) {
74
+ if (typeof value === 'object' && value !== null) {
75
+ const entry = value;
76
+ items.push({
77
+ id: `static-${category}-${key}`,
78
+ category,
79
+ title: toStr(entry.name, key),
80
+ description: toStr(entry.description ?? entry.summary, `${key} from ${sourceFile}`),
81
+ sourceUrl: undefined,
82
+ applicableTargets: inferTargetsFromStatic(entry),
83
+ severity: 'recommended',
84
+ tags: extractTagsFromStatic(entry),
85
+ fetchedAt: now,
86
+ });
87
+ }
88
+ }
89
+ return items;
90
+ }
91
+ function inferTargetsFromStatic(entry) {
92
+ const type = toStr(entry.type ?? entry.target, '').toLowerCase();
93
+ if (type.includes('frontend')) {
94
+ return ['frontend'];
95
+ }
96
+ if (type.includes('backend')) {
97
+ return ['backend'];
98
+ }
99
+ return ['fullstack'];
100
+ }
101
+ function extractTagsFromStatic(entry) {
102
+ if (Array.isArray(entry.tags)) {
103
+ return entry.tags.filter((t) => typeof t === 'string').slice(0, 10);
104
+ }
105
+ if (typeof entry.category === 'string') {
106
+ return [entry.category];
107
+ }
108
+ return [];
109
+ }
110
+ /**
111
+ * Merge web-fetched items with static fallback items.
112
+ * Web items take priority. Static items fill gaps.
113
+ * Deduplicates by title similarity.
114
+ */
115
+ export function mergeKnowledge(webItems, staticItems) {
116
+ if (webItems.length === 0) {
117
+ return staticItems;
118
+ }
119
+ if (staticItems.length === 0) {
120
+ return webItems;
121
+ }
122
+ const merged = [...webItems];
123
+ const webTitlesLower = new Set(webItems.map((i) => i.title.toLowerCase()));
124
+ // Add static items that don't overlap with web results
125
+ for (const staticItem of staticItems) {
126
+ const titleLower = staticItem.title.toLowerCase();
127
+ const isDuplicate = webTitlesLower.has(titleLower) ||
128
+ [...webTitlesLower].some((t) => t.includes(titleLower) || titleLower.includes(t));
129
+ if (!isDuplicate) {
130
+ merged.push(staticItem);
131
+ }
132
+ }
133
+ return merged;
134
+ }
135
+ //# sourceMappingURL=knowledge-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-merger.js","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/knowledge-merger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type KnowledgeCategory, type KnowledgeResult, type ProjectContext } from '../../types/index.js';
2
+ /**
3
+ * Query the Dynamic Knowledge Engine.
4
+ * Pipeline: cache check → web fetch → merge with static → filter → cache result
5
+ *
6
+ * Graceful degradation:
7
+ * 1. Try cache (fastest)
8
+ * 2. Try web search (freshest)
9
+ * 3. Fall back to static JSON (always available)
10
+ */
11
+ export declare function queryKnowledge(category: KnowledgeCategory, context: ProjectContext): Promise<KnowledgeResult>;
12
+ /**
13
+ * Query multiple categories at once.
14
+ * Runs queries in parallel for performance.
15
+ */
16
+ export declare function queryMultipleCategories(categories: KnowledgeCategory[], context: ProjectContext): Promise<KnowledgeResult[]>;
17
+ //# sourceMappingURL=query-knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-knowledge.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/query-knowledge.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAO9B;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAsD1B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,iBAAiB,EAAE,EAC/B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,EAAE,CAAC,CAE5B"}
@@ -0,0 +1,73 @@
1
+ // Main entry point — orchestrates fetch → cache → merge → filter
2
+ import { CATEGORY_TTL, } from '../../types/index.js';
3
+ import { findCachedEntry, readCache, setCacheEntry } from './knowledge-cache.js';
4
+ import { buildSearchQueries, normalizeContext } from './context-resolver.js';
5
+ import { fetchKnowledge } from './web-researcher.js';
6
+ import { loadStaticFallback, mergeKnowledge } from './knowledge-merger.js';
7
+ import { filterByContext } from './stack-filter.js';
8
+ /**
9
+ * Query the Dynamic Knowledge Engine.
10
+ * Pipeline: cache check → web fetch → merge with static → filter → cache result
11
+ *
12
+ * Graceful degradation:
13
+ * 1. Try cache (fastest)
14
+ * 2. Try web search (freshest)
15
+ * 3. Fall back to static JSON (always available)
16
+ */
17
+ export async function queryKnowledge(category, context) {
18
+ const normalizedCtx = normalizeContext(context);
19
+ const ttl = CATEGORY_TTL[category];
20
+ // Step 1: Check cache
21
+ try {
22
+ const store = await readCache();
23
+ const cached = findCachedEntry(store, category, normalizedCtx);
24
+ if (cached) {
25
+ return {
26
+ items: filterByContext(cached.items, context),
27
+ source: 'cache',
28
+ fetchedAt: cached.fetchedAt,
29
+ ttl,
30
+ category,
31
+ };
32
+ }
33
+ }
34
+ catch {
35
+ // Cache read failed — continue to web
36
+ }
37
+ // Step 2: Try web search
38
+ let webItems = [];
39
+ try {
40
+ const queries = buildSearchQueries(category, context);
41
+ webItems = await fetchKnowledge(queries, category);
42
+ }
43
+ catch {
44
+ // Web search failed — will use static
45
+ }
46
+ // Step 3: Load static fallback
47
+ const staticItems = await loadStaticFallback(category);
48
+ // Step 4: Merge web + static
49
+ const merged = mergeKnowledge(webItems, staticItems);
50
+ // Step 5: Filter by context
51
+ const filtered = filterByContext(merged, context);
52
+ // Step 6: Cache the merged result (fire-and-forget)
53
+ if (merged.length > 0) {
54
+ void setCacheEntry(category, normalizedCtx, merged);
55
+ }
56
+ // Determine source
57
+ const source = webItems.length > 0 ? 'web' : 'static';
58
+ return {
59
+ items: filtered,
60
+ source,
61
+ fetchedAt: new Date().toISOString(),
62
+ ttl,
63
+ category,
64
+ };
65
+ }
66
+ /**
67
+ * Query multiple categories at once.
68
+ * Runs queries in parallel for performance.
69
+ */
70
+ export async function queryMultipleCategories(categories, context) {
71
+ return Promise.all(categories.map((cat) => queryKnowledge(cat, context)));
72
+ }
73
+ //# sourceMappingURL=query-knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-knowledge.js","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/query-knowledge.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EACL,YAAY,GAIb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAA2B,EAC3B,OAAuB;IAEvB,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEnC,sBAAsB;IACtB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC/D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC7C,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG;gBACH,QAAQ;aACT,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,yBAAyB;IACzB,IAAI,QAAQ,GAA+C,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAErD,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,oDAAoD;IACpD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEtD,OAAO;QACL,KAAK,EAAE,QAAQ;QACf,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG;QACH,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAA+B,EAC/B,OAAuB;IAEvB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { KnowledgeItem, ProjectContext } from '../../types/index.js';
2
+ /**
3
+ * Filter knowledge items by relevance to the project context.
4
+ * Returns items sorted by relevance score (highest first).
5
+ */
6
+ export declare function filterByContext(items: KnowledgeItem[], context: ProjectContext): KnowledgeItem[];
7
+ //# sourceMappingURL=stack-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-filter.d.ts","sourceRoot":"","sources":["../../../src/engine/dynamic-knowledge/stack-filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAUhG"}