@mcp-graph-workflow/mcp-graph 5.3.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/router.js +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/context.d.ts.map +1 -1
- package/dist/api/routes/context.js +75 -0
- package/dist/api/routes/context.js.map +1 -1
- package/dist/api/routes/skills.d.ts +2 -1
- package/dist/api/routes/skills.d.ts.map +1 -1
- package/dist/api/routes/skills.js +139 -3
- package/dist/api/routes/skills.js.map +1 -1
- package/dist/core/events/event-types.d.ts +18 -1
- package/dist/core/events/event-types.d.ts.map +1 -1
- package/dist/core/graph/graph-types.d.ts +1 -0
- package/dist/core/graph/graph-types.d.ts.map +1 -1
- package/dist/core/skills/built-in-skills.d.ts +1 -1
- package/dist/core/skills/built-in-skills.d.ts.map +1 -1
- package/dist/core/skills/built-in-skills.js +265 -1
- package/dist/core/skills/built-in-skills.js.map +1 -1
- package/dist/core/skills/self-healing-listener.d.ts +22 -0
- package/dist/core/skills/self-healing-listener.d.ts.map +1 -0
- package/dist/core/skills/self-healing-listener.js +102 -0
- package/dist/core/skills/self-healing-listener.js.map +1 -0
- package/dist/core/skills/skill-store.d.ts +14 -0
- package/dist/core/skills/skill-store.d.ts.map +1 -0
- package/dist/core/skills/skill-store.js +109 -0
- package/dist/core/skills/skill-store.js.map +1 -0
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +39 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/core/store/path-resolver.d.ts +38 -0
- package/dist/core/store/path-resolver.d.ts.map +1 -0
- package/dist/core/store/path-resolver.js +92 -0
- package/dist/core/store/path-resolver.js.map +1 -0
- package/dist/core/store/sqlite-store.d.ts +21 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -1
- package/dist/core/store/sqlite-store.js +81 -30
- package/dist/core/store/sqlite-store.js.map +1 -1
- package/dist/core/utils/constants.d.ts +10 -0
- package/dist/core/utils/constants.d.ts.map +1 -1
- package/dist/core/utils/constants.js +12 -0
- package/dist/core/utils/constants.js.map +1 -1
- package/dist/mcp/lifecycle-wrapper.d.ts +2 -1
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
- package/dist/mcp/lifecycle-wrapper.js +20 -1
- package/dist/mcp/lifecycle-wrapper.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +2 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/manage-skill.d.ts +8 -0
- package/dist/mcp/tools/manage-skill.d.ts.map +1 -0
- package/dist/mcp/tools/manage-skill.js +149 -0
- package/dist/mcp/tools/manage-skill.js.map +1 -0
- package/dist/schemas/graph.schema.d.ts +2 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -1
- package/dist/schemas/graph.schema.js +1 -0
- package/dist/schemas/graph.schema.js.map +1 -1
- package/dist/schemas/skill.schema.d.ts +57 -0
- package/dist/schemas/skill.schema.d.ts.map +1 -0
- package/dist/schemas/skill.schema.js +24 -0
- package/dist/schemas/skill.schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/{benchmark-tab-B5Sr8Cah.js → benchmark-tab-BW4QxI49.js} +1 -1
- package/dist/web/dashboard/dist/assets/context-tab-C5RAlXNW.js +1 -0
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-DqmbSdzV.js → gitnexus-tab-BnxxYl2F.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-BKns5HdW.js → graph-tab-Cv_wQ6Az.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-BxUWNvsI.js → graph-utils-Ds1zJyD1.js} +1 -1
- package/dist/web/dashboard/dist/assets/{index-CZOiKbTP.js → index-BAeZDWWy.js} +11 -11
- package/dist/web/dashboard/dist/assets/{index-Dd4vKyDX.js → index-Bic_URMs.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-DQqYFXms.css +1 -0
- package/dist/web/dashboard/dist/assets/{insights-tab-B1kPckBM.js → insights-tab-U_ATOqPu.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-BWfsrRlB.js → logs-tab-B8psCXuB.js} +1 -1
- package/dist/web/dashboard/dist/assets/{memories-tab-D3zm-1Sq.js → memories-tab-DcWok2by.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DXP4dFP-.js → prd-backlog-tab-CjftveTc.js} +1 -1
- package/dist/web/dashboard/dist/assets/skills-tab-Ddp1w4vS.js +1 -0
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/dashboard/dist/assets/index-xyMN-_UV.css +0 -1
- package/dist/web/dashboard/dist/assets/skills-tab-CAlVL80S.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Built-in Skills Registry —
|
|
2
|
+
* Built-in Skills Registry — 40 skills mapped to lifecycle phases.
|
|
3
3
|
* Each skill is a structured instruction set for agentic workflows.
|
|
4
4
|
*/
|
|
5
5
|
export const BUILT_IN_SKILLS = [
|
|
@@ -181,6 +181,270 @@ export const BUILT_IN_SKILLS = [
|
|
|
181
181
|
"Defina SLIs/SLOs para endpoints críticos. Configure alertas para anomalias. " +
|
|
182
182
|
"Garanta que logs são queryable (structured, not free-text). Output: observability setup.",
|
|
183
183
|
},
|
|
184
|
+
// ── SOFTWARE DESIGN PRINCIPLES ────────────────────
|
|
185
|
+
{
|
|
186
|
+
name: "kiss",
|
|
187
|
+
description: "Keep It Simple, Stupid — simplicidade como princípio de design",
|
|
188
|
+
category: "software-design",
|
|
189
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
190
|
+
instructions: "Aplique o princípio KISS em todas as decisões de design e implementação. " +
|
|
191
|
+
"Prefira soluções simples e diretas. Evite abstrações prematuras, generalizações desnecessárias " +
|
|
192
|
+
"e complexidade acidental. Pergunte: 'Qual é a forma mais simples de resolver isso?' " +
|
|
193
|
+
"Se a solução precisa de um diagrama para ser entendida, simplifique.",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: "yagni",
|
|
197
|
+
description: "You Aren't Gonna Need It — não implemente o que não é necessário agora",
|
|
198
|
+
category: "software-design",
|
|
199
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
200
|
+
instructions: "Aplique YAGNI rigorosamente. Não adicione features, configurações ou abstrações 'para o futuro'. " +
|
|
201
|
+
"Implemente apenas o que é explicitamente necessário para o requisito atual. " +
|
|
202
|
+
"Se não há user story ou AC pedindo, não implemente. Código não escrito é código sem bugs.",
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: "dry",
|
|
206
|
+
description: "Don't Repeat Yourself — elimine duplicação de conhecimento",
|
|
207
|
+
category: "software-design",
|
|
208
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
209
|
+
instructions: "Identifique e elimine duplicação de conhecimento (não apenas código). " +
|
|
210
|
+
"Cada conceito deve ter uma única representação autoritativa no sistema. " +
|
|
211
|
+
"Atenção: DRY é sobre conhecimento, não sintaxe — duas funções com código similar " +
|
|
212
|
+
"mas razões de mudança diferentes NÃO são duplicação.",
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: "solid-srp",
|
|
216
|
+
description: "Single Responsibility Principle — uma razão para mudar",
|
|
217
|
+
category: "software-design",
|
|
218
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
219
|
+
instructions: "Cada módulo/classe/função deve ter uma única razão para mudar. " +
|
|
220
|
+
"Identifique os atores (stakeholders) que podem solicitar mudanças e separe responsabilidades " +
|
|
221
|
+
"por ator. Se uma classe muda por mais de uma razão, extraia responsabilidades em módulos separados.",
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: "solid-ocp",
|
|
225
|
+
description: "Open/Closed Principle — aberto para extensão, fechado para modificação",
|
|
226
|
+
category: "software-design",
|
|
227
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
228
|
+
instructions: "Projete módulos que possam ser estendidos sem modificação do código existente. " +
|
|
229
|
+
"Use abstrações (interfaces, strategy pattern, plugins) para pontos de extensão previsíveis. " +
|
|
230
|
+
"Quando um novo requisito chega, prefira adicionar código novo a alterar código estável.",
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
name: "solid-lsp",
|
|
234
|
+
description: "Liskov Substitution Principle — subtipos devem ser substituíveis",
|
|
235
|
+
category: "software-design",
|
|
236
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
237
|
+
instructions: "Garanta que subtipos podem substituir seus tipos base sem quebrar o comportamento esperado. " +
|
|
238
|
+
"Verifique: pré-condições não são fortalecidas, pós-condições não são enfraquecidas, " +
|
|
239
|
+
"invariantes são preservados. Se uma subclasse precisa de um 'if instanceof', há violação de LSP.",
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: "solid-isp",
|
|
243
|
+
description: "Interface Segregation Principle — interfaces coesas e específicas",
|
|
244
|
+
category: "software-design",
|
|
245
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
246
|
+
instructions: "Prefira interfaces pequenas e específicas a interfaces grandes e genéricas. " +
|
|
247
|
+
"Nenhum cliente deve ser forçado a depender de métodos que não usa. " +
|
|
248
|
+
"Quando uma interface tem muitos métodos, divida por coesão funcional.",
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: "solid-dip",
|
|
252
|
+
description: "Dependency Inversion Principle — dependa de abstrações",
|
|
253
|
+
category: "software-design",
|
|
254
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
255
|
+
instructions: "Módulos de alto nível não devem depender de módulos de baixo nível — ambos devem depender de abstrações. " +
|
|
256
|
+
"Abstrações não devem depender de detalhes. Use injeção de dependência e interfaces " +
|
|
257
|
+
"para desacoplar camadas. A direção de dependência deve apontar para políticas, não para detalhes.",
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: "tell-dont-ask",
|
|
261
|
+
description: "Tell, Don't Ask — peça ao objeto que faça, não pergunte seu estado",
|
|
262
|
+
category: "software-design",
|
|
263
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
264
|
+
instructions: "Em vez de perguntar o estado de um objeto para decidir o que fazer, diga ao objeto o que fazer. " +
|
|
265
|
+
"Evite getters seguidos de lógica condicional externa. Encapsule comportamento junto com dados. " +
|
|
266
|
+
"Se você faz obj.getX() para decidir algo, considere mover a decisão para dentro do obj.",
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: "law-of-demeter",
|
|
270
|
+
description: "Lei de Demeter — fale apenas com seus amigos próximos",
|
|
271
|
+
category: "software-design",
|
|
272
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
273
|
+
instructions: "Cada módulo deve ter conhecimento limitado sobre outros módulos. " +
|
|
274
|
+
"Evite cadeias de chamadas como a.getB().getC().doSomething(). " +
|
|
275
|
+
"Um método deve chamar apenas: seus próprios métodos, métodos de seus parâmetros, " +
|
|
276
|
+
"métodos de objetos que ele cria, e métodos de suas dependências diretas.",
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
name: "composition-over-inheritance",
|
|
280
|
+
description: "Composição sobre Herança — favoreça composição de comportamento",
|
|
281
|
+
category: "software-design",
|
|
282
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
283
|
+
instructions: "Prefira composição (has-a) sobre herança (is-a) para reutilização de código. " +
|
|
284
|
+
"Herança cria acoplamento forte e hierarquias rígidas. Use composição com interfaces " +
|
|
285
|
+
"para combinar comportamentos flexivelmente. Reserve herança para relações genuínas de subtipo.",
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
name: "fail-fast",
|
|
289
|
+
description: "Fail Fast — detecte e reporte erros imediatamente",
|
|
290
|
+
category: "software-design",
|
|
291
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
292
|
+
instructions: "Valide inputs e pré-condições no ponto de entrada, não no meio do processamento. " +
|
|
293
|
+
"Use assertions, guards e validação Zod nas fronteiras. Falhe com mensagens claras " +
|
|
294
|
+
"e stack traces preservados. Nunca engula erros silenciosamente — log + rethrow ou handle explicitamente.",
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
name: "clean-architecture",
|
|
298
|
+
description: "Clean Architecture — camadas com direção de dependência controlada",
|
|
299
|
+
category: "software-design",
|
|
300
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
301
|
+
instructions: "Organize o código em camadas concêntricas: Entities → Use Cases → Adapters → Frameworks. " +
|
|
302
|
+
"Dependências apontam para dentro (regra de dependência). O core de negócio não conhece " +
|
|
303
|
+
"frameworks, DB ou UI. Use interfaces para inverter dependências nas fronteiras.",
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
name: "separation-of-concerns",
|
|
307
|
+
description: "Separação de Responsabilidades — cada módulo faz uma coisa",
|
|
308
|
+
category: "software-design",
|
|
309
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
310
|
+
instructions: "Separe o sistema em módulos distintos com responsabilidades claras e sobreposição mínima. " +
|
|
311
|
+
"Cada camada (CLI, API, Core, Store) tem um papel definido. Não misture lógica de apresentação " +
|
|
312
|
+
"com lógica de negócio. Não misture acesso a dados com regras de domínio.",
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
name: "boy-scout-rule",
|
|
316
|
+
description: "Regra do Escoteiro — deixe o código melhor do que encontrou",
|
|
317
|
+
category: "software-design",
|
|
318
|
+
phases: ["DESIGN", "IMPLEMENT", "REVIEW"],
|
|
319
|
+
instructions: "Ao tocar em código existente, faça pequenas melhorias incrementais: renomeie variáveis " +
|
|
320
|
+
"mal nomeadas, extraia funções longas, remova dead code, adicione tipagem faltante. " +
|
|
321
|
+
"Não refatore tudo de uma vez — melhorias pequenas e consistentes acumulam qualidade.",
|
|
322
|
+
},
|
|
323
|
+
// ── DDD ──────────────────────────────────────────
|
|
324
|
+
{
|
|
325
|
+
name: "domain-driven-design",
|
|
326
|
+
description: "Domain-Driven Design — modelagem orientada ao domínio de negócio",
|
|
327
|
+
category: "ddd",
|
|
328
|
+
phases: ["DESIGN", "PLAN"],
|
|
329
|
+
instructions: "Modele o software em torno do domínio de negócio. Identifique bounded contexts, " +
|
|
330
|
+
"entidades, value objects, aggregates e domain events. Use linguagem ubíqua — " +
|
|
331
|
+
"termos do domínio no código. Separe subdomínios (core, supporting, generic). " +
|
|
332
|
+
"Context maps para definir relacionamentos entre bounded contexts.",
|
|
333
|
+
},
|
|
334
|
+
// ── SECURITY ─────────────────────────────────────
|
|
335
|
+
{
|
|
336
|
+
name: "owasp-web-security",
|
|
337
|
+
description: "OWASP Top 10 — segurança web essencial",
|
|
338
|
+
category: "security",
|
|
339
|
+
phases: ["DESIGN", "REVIEW", "VALIDATE"],
|
|
340
|
+
instructions: "Verifique contra OWASP Top 10: Injection (SQL, NoSQL, OS), Broken Auth, " +
|
|
341
|
+
"Sensitive Data Exposure, XXE, Broken Access Control, Security Misconfiguration, " +
|
|
342
|
+
"XSS, Insecure Deserialization, Using Components with Known Vulns, Insufficient Logging. " +
|
|
343
|
+
"Para cada item: identifique superfície de ataque, aplique mitigação, documente.",
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
name: "auth-and-secrets",
|
|
347
|
+
description: "Autenticação, autorização e gestão de segredos",
|
|
348
|
+
category: "security",
|
|
349
|
+
phases: ["DESIGN", "REVIEW", "VALIDATE"],
|
|
350
|
+
instructions: "Nunca hardcode secrets — use variáveis de ambiente ou vault. Tokens JWT com expiração curta. " +
|
|
351
|
+
"Hash de senhas com bcrypt/argon2 (nunca MD5/SHA). RBAC ou ABAC para autorização. " +
|
|
352
|
+
"Valide tokens em cada request. Revogue sessões ativas em caso de compromisso. " +
|
|
353
|
+
"Audite acessos a recursos sensíveis. .env nunca no git.",
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: "database-and-deps-security",
|
|
357
|
+
description: "Segurança de banco de dados e dependências",
|
|
358
|
+
category: "security",
|
|
359
|
+
phases: ["DESIGN", "REVIEW", "VALIDATE"],
|
|
360
|
+
instructions: "Use prepared statements / parameterized queries para prevenir SQL injection. " +
|
|
361
|
+
"Princípio do menor privilégio para acessos ao DB. Audite dependências com npm audit. " +
|
|
362
|
+
"Lock files commitados. Mantenha deps atualizadas. Nunca exponha stack traces em produção. " +
|
|
363
|
+
"Encrypt dados sensíveis at rest. Backup strategy com testes de restore.",
|
|
364
|
+
},
|
|
365
|
+
// ── FRONTEND DESIGN ──────────────────────────────
|
|
366
|
+
{
|
|
367
|
+
name: "ui-ux-patterns",
|
|
368
|
+
description: "Padrões de UI/UX para interfaces eficazes",
|
|
369
|
+
category: "frontend-design",
|
|
370
|
+
phases: ["DESIGN", "IMPLEMENT"],
|
|
371
|
+
instructions: "Aplique padrões de UX comprovados: loading states para toda operação assíncrona, " +
|
|
372
|
+
"error states com ações de recovery, empty states informativos, feedback visual imediato. " +
|
|
373
|
+
"Acessibilidade: ARIA labels, keyboard navigation, contraste mínimo WCAG AA. " +
|
|
374
|
+
"Responsividade: mobile-first, breakpoints consistentes. Performance: lazy loading, " +
|
|
375
|
+
"virtualização para listas longas, debounce em inputs.",
|
|
376
|
+
},
|
|
377
|
+
// ── TESTING ──────────────────────────────────────
|
|
378
|
+
{
|
|
379
|
+
name: "comprehensive-testing-reference",
|
|
380
|
+
description: "Referência completa de estratégia de testes",
|
|
381
|
+
category: "testing",
|
|
382
|
+
phases: ["IMPLEMENT", "VALIDATE"],
|
|
383
|
+
instructions: "Siga a pirâmide de testes: muitos unit tests, integration tests moderados, poucos E2E. " +
|
|
384
|
+
"Unit: isolados, rápidos, uma assertion por conceito, factory functions para fixtures. " +
|
|
385
|
+
"Integration: real DB (in-memory), real file I/O (tmp), mock apenas fronteiras externas. " +
|
|
386
|
+
"E2E: fluxos reais do usuário, Playwright para browser. Cobertura: 80%+ para core, " +
|
|
387
|
+
"100% para paths críticos (auth, payments, data integrity). TDD: Red → Green → Refactor.",
|
|
388
|
+
},
|
|
389
|
+
// ── RESEARCH ─────────────────────────────────────
|
|
390
|
+
{
|
|
391
|
+
name: "research-methodology",
|
|
392
|
+
description: "Metodologia de pesquisa estruturada para decisões técnicas",
|
|
393
|
+
category: "research",
|
|
394
|
+
phases: ["ANALYZE"],
|
|
395
|
+
instructions: "Para pesquisa técnica: 1) Defina a pergunta central claramente. " +
|
|
396
|
+
"2) Liste opções candidatas (mín. 3). 3) Defina critérios de avaliação objetivos " +
|
|
397
|
+
"(performance, manutenibilidade, comunidade, licença, custo). " +
|
|
398
|
+
"4) Avalie cada opção contra cada critério com evidência. " +
|
|
399
|
+
"5) Documente trade-offs e decisão final em ADR. " +
|
|
400
|
+
"6) Prototipe a opção vencedora antes de comprometer. Use Context7 para docs atualizados.",
|
|
401
|
+
},
|
|
402
|
+
// ── COST REDUCER ─────────────────────────────────
|
|
403
|
+
{
|
|
404
|
+
name: "cloud-infra-cost",
|
|
405
|
+
description: "Otimização de custos de infraestrutura cloud",
|
|
406
|
+
category: "cost-reducer",
|
|
407
|
+
phases: ["DESIGN", "REVIEW"],
|
|
408
|
+
instructions: "Audite custos de infra: right-sizing de instâncias (CPU/memory utilization), " +
|
|
409
|
+
"reserved/spot instances, auto-scaling policies, storage tiering (hot/warm/cold). " +
|
|
410
|
+
"Identifique recursos ociosos (unused EIPs, unattached volumes, idle load balancers). " +
|
|
411
|
+
"CDN para assets estáticos. Serverless para workloads intermitentes. " +
|
|
412
|
+
"Budget alerts e cost anomaly detection. FinOps: tag resources por team/project.",
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
name: "code-level-savings",
|
|
416
|
+
description: "Economias a nível de código — performance e eficiência",
|
|
417
|
+
category: "cost-reducer",
|
|
418
|
+
phases: ["DESIGN", "REVIEW"],
|
|
419
|
+
instructions: "Otimize código para reduzir custo computacional: queries N+1 → batch/join, " +
|
|
420
|
+
"caching estratégico (Redis/in-memory) para dados lidos frequentemente, " +
|
|
421
|
+
"connection pooling, lazy loading de recursos pesados, pagination para datasets grandes. " +
|
|
422
|
+
"Compressão de responses (gzip/brotli). Índices de DB otimizados para queries frequentes. " +
|
|
423
|
+
"Elimine computações redundantes. Profile antes de otimizar.",
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
name: "finops-services",
|
|
427
|
+
description: "FinOps para serviços gerenciados e APIs externas",
|
|
428
|
+
category: "cost-reducer",
|
|
429
|
+
phases: ["DESIGN", "REVIEW"],
|
|
430
|
+
instructions: "Gerencie custos de serviços gerenciados e APIs externas: rate limiting para proteger budget, " +
|
|
431
|
+
"caching de responses de APIs pagas, batch requests quando possível. " +
|
|
432
|
+
"LLM costs: prompt compression, response caching, model tiering (use modelos menores " +
|
|
433
|
+
"para tasks simples). Monitore spend por serviço. Defina budgets por team/feature. " +
|
|
434
|
+
"Alertas quando spend excede threshold.",
|
|
435
|
+
},
|
|
436
|
+
// ── SELF-HEALING ─────────────────────────────────
|
|
437
|
+
{
|
|
438
|
+
name: "self-healing-awareness",
|
|
439
|
+
description: "Consulta memórias de auto-correção antes de executar tarefas",
|
|
440
|
+
category: "implement",
|
|
441
|
+
phases: ["IMPLEMENT", "VALIDATE"],
|
|
442
|
+
instructions: "Antes de executar uma tarefa, consulte rag_context para verificar memórias de self-healing " +
|
|
443
|
+
"relacionadas ao contexto atual. Padrões de erro conhecidos e suas prevenções estão " +
|
|
444
|
+
"armazenados em workflow-graph/memories/healing-*.md. Se encontrar uma memória relevante, " +
|
|
445
|
+
"aplique a regra de prevenção ANTES de implementar. Isso evita repetição de erros " +
|
|
446
|
+
"já cometidos e corrigidos anteriormente.",
|
|
447
|
+
},
|
|
184
448
|
];
|
|
185
449
|
/**
|
|
186
450
|
* Get all built-in skills.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in-skills.js","sourceRoot":"","sources":["../../../src/core/skills/built-in-skills.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"built-in-skills.js","sourceRoot":"","sources":["../../../src/core/skills/built-in-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-Healing Listener — creates auto-memories when errors are detected.
|
|
3
|
+
* Subscribes to "error:detected" events on the GraphEventBus.
|
|
4
|
+
* Deduplicates via error hash to prevent flood.
|
|
5
|
+
*/
|
|
6
|
+
import type { GraphEventBus } from "../events/event-bus.js";
|
|
7
|
+
export interface SelfHealingOptions {
|
|
8
|
+
memoriesDir: string;
|
|
9
|
+
eventBus: GraphEventBus;
|
|
10
|
+
}
|
|
11
|
+
/** Categorize an error message into a healing category. */
|
|
12
|
+
export declare function categorizeError(message: string): string;
|
|
13
|
+
/** Generate a short hash for deduplication of error patterns. */
|
|
14
|
+
export declare function generateErrorHash(category: string, message: string): string;
|
|
15
|
+
/** Build the healing memory content. */
|
|
16
|
+
export declare function buildHealingMemory(category: string, errorMessage: string, toolName: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Register the self-healing listener on the event bus.
|
|
19
|
+
* Returns an unsubscribe function.
|
|
20
|
+
*/
|
|
21
|
+
export declare function registerSelfHealingListener(options: SelfHealingOptions): () => void;
|
|
22
|
+
//# sourceMappingURL=self-healing-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-healing-listener.d.ts","sourceRoot":"","sources":["../../../src/core/skills/self-healing-listener.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAa3E;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAiDnF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-Healing Listener — creates auto-memories when errors are detected.
|
|
3
|
+
* Subscribes to "error:detected" events on the GraphEventBus.
|
|
4
|
+
* Deduplicates via error hash to prevent flood.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
/** Categorize an error message into a healing category. */
|
|
11
|
+
export function categorizeError(message) {
|
|
12
|
+
const lower = message.toLowerCase();
|
|
13
|
+
if (lower.includes("type") && (lower.includes("error") || lower.includes("mismatch")))
|
|
14
|
+
return "type-error";
|
|
15
|
+
if (lower.includes("validation") || lower.includes("invalid") || lower.includes("zod"))
|
|
16
|
+
return "validation-error";
|
|
17
|
+
if (lower.includes("build") || lower.includes("compile") || lower.includes("tsc"))
|
|
18
|
+
return "build-error";
|
|
19
|
+
if (lower.includes("test") && (lower.includes("fail") || lower.includes("assert")))
|
|
20
|
+
return "test-failure";
|
|
21
|
+
if (lower.includes("sqlite") || lower.includes("database") || lower.includes("migration"))
|
|
22
|
+
return "database-error";
|
|
23
|
+
if (lower.includes("import") || lower.includes("module") || lower.includes("require"))
|
|
24
|
+
return "module-error";
|
|
25
|
+
return "general-error";
|
|
26
|
+
}
|
|
27
|
+
/** Generate a short hash for deduplication of error patterns. */
|
|
28
|
+
export function generateErrorHash(category, message) {
|
|
29
|
+
// Normalize: strip dynamic parts like timestamps, line numbers, ids
|
|
30
|
+
const normalized = message
|
|
31
|
+
.replace(/\d{4}-\d{2}-\d{2}T[\d:.Z]+/g, "")
|
|
32
|
+
.replace(/\b[a-f0-9]{12,}\b/g, "")
|
|
33
|
+
.replace(/line \d+/gi, "line N")
|
|
34
|
+
.replace(/:\d+:\d+/g, ":N:N")
|
|
35
|
+
.trim();
|
|
36
|
+
return createHash("sha256")
|
|
37
|
+
.update(`${category}:${normalized}`)
|
|
38
|
+
.digest("hex")
|
|
39
|
+
.slice(0, 12);
|
|
40
|
+
}
|
|
41
|
+
/** Build the healing memory content. */
|
|
42
|
+
export function buildHealingMemory(category, errorMessage, toolName) {
|
|
43
|
+
const timestamp = new Date().toISOString();
|
|
44
|
+
return [
|
|
45
|
+
`# Self-Healing: ${category}`,
|
|
46
|
+
"",
|
|
47
|
+
"## Error Pattern",
|
|
48
|
+
errorMessage,
|
|
49
|
+
"",
|
|
50
|
+
"## Prevention Rule",
|
|
51
|
+
`When encountering similar ${category} issues, check the tool '${toolName}' inputs and outputs carefully.`,
|
|
52
|
+
"Apply validation at boundaries and verify types match expected schemas before proceeding.",
|
|
53
|
+
"",
|
|
54
|
+
"## Context",
|
|
55
|
+
`- Tool: ${toolName}`,
|
|
56
|
+
`- Category: ${category}`,
|
|
57
|
+
`- Date: ${timestamp}`,
|
|
58
|
+
].join("\n");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register the self-healing listener on the event bus.
|
|
62
|
+
* Returns an unsubscribe function.
|
|
63
|
+
*/
|
|
64
|
+
export function registerSelfHealingListener(options) {
|
|
65
|
+
const { memoriesDir, eventBus } = options;
|
|
66
|
+
// Ensure memories directory exists
|
|
67
|
+
if (!existsSync(memoriesDir)) {
|
|
68
|
+
mkdirSync(memoriesDir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
const handler = (event) => {
|
|
71
|
+
if (event.type !== "error:detected")
|
|
72
|
+
return;
|
|
73
|
+
const { toolName, errorMessage, errorCategory, errorHash } = event.payload;
|
|
74
|
+
const memoryName = `healing-${errorCategory}-${errorHash}`;
|
|
75
|
+
const memoryPath = path.join(memoriesDir, `${memoryName}.md`);
|
|
76
|
+
// Deduplication: skip if memory already exists
|
|
77
|
+
if (existsSync(memoryPath)) {
|
|
78
|
+
logger.debug("self-healing:skip-duplicate", { memoryName });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Create healing memory
|
|
82
|
+
const content = buildHealingMemory(errorCategory, errorMessage, toolName);
|
|
83
|
+
try {
|
|
84
|
+
writeFileSync(memoryPath, content, "utf-8");
|
|
85
|
+
logger.info("self-healing:memory-created", { memoryName, category: errorCategory });
|
|
86
|
+
// Emit healing event
|
|
87
|
+
eventBus.emitTyped("healing:memory_created", {
|
|
88
|
+
memoryName,
|
|
89
|
+
errorCategory,
|
|
90
|
+
errorHash,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
logger.error("self-healing:write-failed", { memoryName, error: String(err) });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
eventBus.on("error:detected", handler);
|
|
98
|
+
return () => {
|
|
99
|
+
eventBus.off("error:detected", handler);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=self-healing-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-healing-listener.js","sourceRoot":"","sources":["../../../src/core/skills/self-healing-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Store — persistence layer for skill preferences and custom skills.
|
|
3
|
+
* Uses SQLite tables created by migration v9.
|
|
4
|
+
*/
|
|
5
|
+
import type Database from "better-sqlite3";
|
|
6
|
+
import type { CustomSkill, CustomSkillInput } from "../../schemas/skill.schema.js";
|
|
7
|
+
export declare function setSkillEnabled(db: Database.Database, projectId: string, skillName: string, enabled: boolean): void;
|
|
8
|
+
export declare function getSkillPreferences(db: Database.Database, projectId: string): Map<string, boolean>;
|
|
9
|
+
export declare function createCustomSkill(db: Database.Database, projectId: string, data: CustomSkillInput): CustomSkill;
|
|
10
|
+
export declare function updateCustomSkill(db: Database.Database, projectId: string, id: string, data: Partial<CustomSkillInput>): CustomSkill;
|
|
11
|
+
export declare function deleteCustomSkill(db: Database.Database, projectId: string, id: string): void;
|
|
12
|
+
export declare function getCustomSkills(db: Database.Database, projectId: string): CustomSkill[];
|
|
13
|
+
export declare function getCustomSkillByName(db: Database.Database, projectId: string, name: string): CustomSkill | undefined;
|
|
14
|
+
//# sourceMappingURL=skill-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../../src/core/skills/skill-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAyCnF,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAOnH;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAUlG;AAID,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,WAAW,CAgC/G;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC9B,WAAW,CAkCb;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAS5F;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAMvF;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMpH"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Store — persistence layer for skill preferences and custom skills.
|
|
3
|
+
* Uses SQLite tables created by migration v9.
|
|
4
|
+
*/
|
|
5
|
+
import { generateId } from "../utils/id.js";
|
|
6
|
+
import { now } from "../utils/time.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
import { ValidationError } from "../utils/errors.js";
|
|
9
|
+
// ── Mapping helpers ──────────────────────────────────
|
|
10
|
+
function rowToCustomSkill(row) {
|
|
11
|
+
return {
|
|
12
|
+
id: row.id,
|
|
13
|
+
projectId: row.project_id,
|
|
14
|
+
name: row.name,
|
|
15
|
+
description: row.description,
|
|
16
|
+
category: row.category,
|
|
17
|
+
phases: JSON.parse(row.phases),
|
|
18
|
+
instructions: row.instructions,
|
|
19
|
+
createdAt: row.created_at,
|
|
20
|
+
updatedAt: row.updated_at,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// ── Preferences ──────────────────────────────────────
|
|
24
|
+
export function setSkillEnabled(db, projectId, skillName, enabled) {
|
|
25
|
+
logger.debug("skill-store:setEnabled", { projectId, skillName, enabled });
|
|
26
|
+
db.prepare(`
|
|
27
|
+
INSERT INTO skill_preferences (project_id, skill_name, enabled, updated_at)
|
|
28
|
+
VALUES (?, ?, ?, ?)
|
|
29
|
+
ON CONFLICT(project_id, skill_name) DO UPDATE SET enabled = excluded.enabled, updated_at = excluded.updated_at
|
|
30
|
+
`).run(projectId, skillName, enabled ? 1 : 0, now());
|
|
31
|
+
}
|
|
32
|
+
export function getSkillPreferences(db, projectId) {
|
|
33
|
+
const rows = db.prepare("SELECT skill_name, enabled FROM skill_preferences WHERE project_id = ?").all(projectId);
|
|
34
|
+
const map = new Map();
|
|
35
|
+
for (const row of rows) {
|
|
36
|
+
map.set(row.skill_name, row.enabled === 1);
|
|
37
|
+
}
|
|
38
|
+
return map;
|
|
39
|
+
}
|
|
40
|
+
// ── Custom Skills CRUD ───────────────────────────────
|
|
41
|
+
export function createCustomSkill(db, projectId, data) {
|
|
42
|
+
const id = generateId("skill");
|
|
43
|
+
const timestamp = now();
|
|
44
|
+
logger.info("skill-store:create", { projectId, name: data.name });
|
|
45
|
+
try {
|
|
46
|
+
db.prepare(`
|
|
47
|
+
INSERT INTO custom_skills (id, project_id, name, description, category, phases, instructions, created_at, updated_at)
|
|
48
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
49
|
+
`).run(id, projectId, data.name, data.description, data.category ?? "know-me", JSON.stringify(data.phases), data.instructions, timestamp, timestamp);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err instanceof Error && err.message.includes("UNIQUE constraint")) {
|
|
53
|
+
throw new ValidationError(`Custom skill '${data.name}' already exists in this project`, []);
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
id,
|
|
59
|
+
projectId,
|
|
60
|
+
name: data.name,
|
|
61
|
+
description: data.description,
|
|
62
|
+
category: data.category ?? "know-me",
|
|
63
|
+
phases: data.phases,
|
|
64
|
+
instructions: data.instructions,
|
|
65
|
+
createdAt: timestamp,
|
|
66
|
+
updatedAt: timestamp,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function updateCustomSkill(db, projectId, id, data) {
|
|
70
|
+
const existing = db.prepare("SELECT * FROM custom_skills WHERE id = ? AND project_id = ?").get(id, projectId);
|
|
71
|
+
if (!existing) {
|
|
72
|
+
throw new ValidationError(`Custom skill not found: ${id}`, []);
|
|
73
|
+
}
|
|
74
|
+
const timestamp = now();
|
|
75
|
+
const updated = {
|
|
76
|
+
name: data.name ?? existing.name,
|
|
77
|
+
description: data.description ?? existing.description,
|
|
78
|
+
category: data.category ?? existing.category,
|
|
79
|
+
phases: data.phases ? JSON.stringify(data.phases) : existing.phases,
|
|
80
|
+
instructions: data.instructions ?? existing.instructions,
|
|
81
|
+
};
|
|
82
|
+
logger.info("skill-store:update", { projectId, id });
|
|
83
|
+
db.prepare(`
|
|
84
|
+
UPDATE custom_skills
|
|
85
|
+
SET name = ?, description = ?, category = ?, phases = ?, instructions = ?, updated_at = ?
|
|
86
|
+
WHERE id = ? AND project_id = ?
|
|
87
|
+
`).run(updated.name, updated.description, updated.category, updated.phases, updated.instructions, timestamp, id, projectId);
|
|
88
|
+
return rowToCustomSkill({
|
|
89
|
+
...existing,
|
|
90
|
+
...updated,
|
|
91
|
+
updated_at: timestamp,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function deleteCustomSkill(db, projectId, id) {
|
|
95
|
+
logger.info("skill-store:delete", { projectId, id });
|
|
96
|
+
const result = db.prepare("DELETE FROM custom_skills WHERE id = ? AND project_id = ?").run(id, projectId);
|
|
97
|
+
if (result.changes === 0) {
|
|
98
|
+
throw new ValidationError(`Custom skill not found: ${id}`, []);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function getCustomSkills(db, projectId) {
|
|
102
|
+
const rows = db.prepare("SELECT * FROM custom_skills WHERE project_id = ? ORDER BY created_at").all(projectId);
|
|
103
|
+
return rows.map(rowToCustomSkill);
|
|
104
|
+
}
|
|
105
|
+
export function getCustomSkillByName(db, projectId, name) {
|
|
106
|
+
const row = db.prepare("SELECT * FROM custom_skills WHERE project_id = ? AND name = ?").get(projectId, name);
|
|
107
|
+
return row ? rowToCustomSkill(row) : undefined;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=skill-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-store.js","sourceRoot":"","sources":["../../../src/core/skills/skill-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAwV3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA6BzD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAGvD"}
|
|
@@ -293,6 +293,45 @@ const migrations = [
|
|
|
293
293
|
CREATE INDEX IF NOT EXISTS idx_ttu_called ON tool_token_usage(called_at);
|
|
294
294
|
`,
|
|
295
295
|
},
|
|
296
|
+
{
|
|
297
|
+
version: 8,
|
|
298
|
+
description: "Global mode — fs_path on projects, project_id on knowledge_documents",
|
|
299
|
+
sql: `
|
|
300
|
+
ALTER TABLE projects ADD COLUMN fs_path TEXT;
|
|
301
|
+
CREATE INDEX IF NOT EXISTS idx_projects_fs_path ON projects(fs_path);
|
|
302
|
+
|
|
303
|
+
ALTER TABLE knowledge_documents ADD COLUMN project_id TEXT;
|
|
304
|
+
CREATE INDEX IF NOT EXISTS idx_knowledge_project ON knowledge_documents(project_id);
|
|
305
|
+
`,
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
version: 9,
|
|
309
|
+
description: "Skill preferences and custom skills tables",
|
|
310
|
+
sql: `
|
|
311
|
+
CREATE TABLE IF NOT EXISTS skill_preferences (
|
|
312
|
+
project_id TEXT NOT NULL,
|
|
313
|
+
skill_name TEXT NOT NULL,
|
|
314
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
315
|
+
updated_at TEXT NOT NULL,
|
|
316
|
+
PRIMARY KEY (project_id, skill_name)
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
CREATE TABLE IF NOT EXISTS custom_skills (
|
|
320
|
+
id TEXT PRIMARY KEY,
|
|
321
|
+
project_id TEXT NOT NULL,
|
|
322
|
+
name TEXT NOT NULL,
|
|
323
|
+
description TEXT NOT NULL,
|
|
324
|
+
category TEXT NOT NULL DEFAULT 'know-me',
|
|
325
|
+
phases TEXT NOT NULL,
|
|
326
|
+
instructions TEXT NOT NULL,
|
|
327
|
+
created_at TEXT NOT NULL,
|
|
328
|
+
updated_at TEXT NOT NULL,
|
|
329
|
+
UNIQUE(project_id, name)
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
CREATE INDEX IF NOT EXISTS idx_custom_skills_project ON custom_skills(project_id);
|
|
333
|
+
`,
|
|
334
|
+
},
|
|
296
335
|
];
|
|
297
336
|
export function runMigrations(db) {
|
|
298
337
|
// Create migrations tracking table
|