@jigyasudham/veto 3.0.0 → 3.1.1

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/LICENSE +21 -21
  2. package/README.md +630 -589
  3. package/dist/agents/llm-runner.js +57 -57
  4. package/dist/cli/statusline.js +2 -2
  5. package/dist/cli.js +57 -26
  6. package/dist/cli.js.map +1 -1
  7. package/dist/memory/decisions.js +1 -1
  8. package/dist/memory/local.js +144 -144
  9. package/dist/memory/schema.js +228 -228
  10. package/dist/memory/sync.js +25 -25
  11. package/dist/router/implicit-outcomes.js +4 -4
  12. package/dist/router/learning-updater.js +45 -45
  13. package/dist/server.js +1 -1
  14. package/dist/tools/compact.js +3 -3
  15. package/dist/transcripts/archive.js +5 -5
  16. package/dist/transcripts/cache.d.ts +66 -0
  17. package/dist/transcripts/cache.d.ts.map +1 -0
  18. package/dist/transcripts/cache.js +0 -0
  19. package/dist/transcripts/cache.js.map +1 -0
  20. package/dist/transcripts/chunk.d.ts +26 -0
  21. package/dist/transcripts/chunk.d.ts.map +1 -0
  22. package/dist/transcripts/chunk.js +54 -0
  23. package/dist/transcripts/chunk.js.map +1 -0
  24. package/dist/transcripts/embed.d.ts +58 -0
  25. package/dist/transcripts/embed.d.ts.map +1 -0
  26. package/dist/transcripts/embed.js +303 -0
  27. package/dist/transcripts/embed.js.map +1 -0
  28. package/dist/transcripts/ingest.d.ts.map +1 -1
  29. package/dist/transcripts/ingest.js +14 -7
  30. package/dist/transcripts/ingest.js.map +1 -1
  31. package/dist/transcripts/manage.d.ts.map +1 -1
  32. package/dist/transcripts/manage.js +6 -0
  33. package/dist/transcripts/manage.js.map +1 -1
  34. package/dist/transcripts/mapping.js +5 -5
  35. package/dist/transcripts/pyramid.js +2 -2
  36. package/dist/transcripts/recall.d.ts +7 -0
  37. package/dist/transcripts/recall.d.ts.map +1 -1
  38. package/dist/transcripts/recall.js +25 -3
  39. package/dist/transcripts/recall.js.map +1 -1
  40. package/dist/transcripts/schema.d.ts +11 -1
  41. package/dist/transcripts/schema.d.ts.map +1 -1
  42. package/dist/transcripts/schema.js +126 -94
  43. package/dist/transcripts/schema.js.map +1 -1
  44. package/dist/transcripts/search.d.ts +35 -0
  45. package/dist/transcripts/search.d.ts.map +1 -1
  46. package/dist/transcripts/search.js +232 -34
  47. package/dist/transcripts/search.js.map +1 -1
  48. package/dist/transcripts/vectors.d.ts +40 -0
  49. package/dist/transcripts/vectors.d.ts.map +1 -0
  50. package/dist/transcripts/vectors.js +203 -0
  51. package/dist/transcripts/vectors.js.map +1 -0
  52. package/package.json +70 -61
  53. package/server.json +23 -23
  54. package/dist/skills/development/skill-api-design.d.ts +0 -15
  55. package/dist/skills/development/skill-api-design.d.ts.map +0 -1
  56. package/dist/skills/development/skill-api-design.js +0 -313
  57. package/dist/skills/development/skill-api-design.js.map +0 -1
  58. package/dist/skills/development/skill-auth.d.ts +0 -15
  59. package/dist/skills/development/skill-auth.d.ts.map +0 -1
  60. package/dist/skills/development/skill-auth.js +0 -255
  61. package/dist/skills/development/skill-auth.js.map +0 -1
  62. package/dist/skills/development/skill-ci-cd.d.ts +0 -2
  63. package/dist/skills/development/skill-ci-cd.d.ts.map +0 -1
  64. package/dist/skills/development/skill-ci-cd.js +0 -2
  65. package/dist/skills/development/skill-ci-cd.js.map +0 -1
  66. package/dist/skills/development/skill-crud.d.ts +0 -15
  67. package/dist/skills/development/skill-crud.d.ts.map +0 -1
  68. package/dist/skills/development/skill-crud.js +0 -193
  69. package/dist/skills/development/skill-crud.js.map +0 -1
  70. package/dist/skills/development/skill-db-schema.d.ts +0 -2
  71. package/dist/skills/development/skill-db-schema.d.ts.map +0 -1
  72. package/dist/skills/development/skill-db-schema.js +0 -2
  73. package/dist/skills/development/skill-db-schema.js.map +0 -1
  74. package/dist/skills/development/skill-docker.d.ts +0 -2
  75. package/dist/skills/development/skill-docker.d.ts.map +0 -1
  76. package/dist/skills/development/skill-docker.js +0 -2
  77. package/dist/skills/development/skill-docker.js.map +0 -1
  78. package/dist/skills/development/skill-env-setup.d.ts +0 -2
  79. package/dist/skills/development/skill-env-setup.d.ts.map +0 -1
  80. package/dist/skills/development/skill-env-setup.js +0 -2
  81. package/dist/skills/development/skill-env-setup.js.map +0 -1
  82. package/dist/skills/development/skill-scaffold.d.ts +0 -15
  83. package/dist/skills/development/skill-scaffold.d.ts.map +0 -1
  84. package/dist/skills/development/skill-scaffold.js +0 -299
  85. package/dist/skills/development/skill-scaffold.js.map +0 -1
  86. package/dist/skills/intelligence/skill-complexity-score.d.ts +0 -15
  87. package/dist/skills/intelligence/skill-complexity-score.d.ts.map +0 -1
  88. package/dist/skills/intelligence/skill-complexity-score.js +0 -66
  89. package/dist/skills/intelligence/skill-complexity-score.js.map +0 -1
  90. package/dist/skills/intelligence/skill-cost-track.d.ts +0 -14
  91. package/dist/skills/intelligence/skill-cost-track.d.ts.map +0 -1
  92. package/dist/skills/intelligence/skill-cost-track.js +0 -36
  93. package/dist/skills/intelligence/skill-cost-track.js.map +0 -1
  94. package/dist/skills/intelligence/skill-learning-loop.d.ts +0 -15
  95. package/dist/skills/intelligence/skill-learning-loop.d.ts.map +0 -1
  96. package/dist/skills/intelligence/skill-learning-loop.js +0 -66
  97. package/dist/skills/intelligence/skill-learning-loop.js.map +0 -1
  98. package/dist/skills/intelligence/skill-pattern-detect.d.ts +0 -14
  99. package/dist/skills/intelligence/skill-pattern-detect.d.ts.map +0 -1
  100. package/dist/skills/intelligence/skill-pattern-detect.js +0 -35
  101. package/dist/skills/intelligence/skill-pattern-detect.js.map +0 -1
  102. package/dist/skills/intelligence/skill-rate-watch.d.ts +0 -15
  103. package/dist/skills/intelligence/skill-rate-watch.d.ts.map +0 -1
  104. package/dist/skills/intelligence/skill-rate-watch.js +0 -58
  105. package/dist/skills/intelligence/skill-rate-watch.js.map +0 -1
  106. package/dist/skills/memory/skill-context-compress.d.ts +0 -15
  107. package/dist/skills/memory/skill-context-compress.d.ts.map +0 -1
  108. package/dist/skills/memory/skill-context-compress.js +0 -82
  109. package/dist/skills/memory/skill-context-compress.js.map +0 -1
  110. package/dist/skills/memory/skill-cross-sync.d.ts +0 -15
  111. package/dist/skills/memory/skill-cross-sync.d.ts.map +0 -1
  112. package/dist/skills/memory/skill-cross-sync.js +0 -88
  113. package/dist/skills/memory/skill-cross-sync.js.map +0 -1
  114. package/dist/skills/memory/skill-decision-log.d.ts +0 -15
  115. package/dist/skills/memory/skill-decision-log.d.ts.map +0 -1
  116. package/dist/skills/memory/skill-decision-log.js +0 -103
  117. package/dist/skills/memory/skill-decision-log.js.map +0 -1
  118. package/dist/skills/memory/skill-session-restore.d.ts +0 -15
  119. package/dist/skills/memory/skill-session-restore.d.ts.map +0 -1
  120. package/dist/skills/memory/skill-session-restore.js +0 -39
  121. package/dist/skills/memory/skill-session-restore.js.map +0 -1
  122. package/dist/skills/memory/skill-session-save.d.ts +0 -15
  123. package/dist/skills/memory/skill-session-save.d.ts.map +0 -1
  124. package/dist/skills/memory/skill-session-save.js +0 -74
  125. package/dist/skills/memory/skill-session-save.js.map +0 -1
  126. package/dist/skills/quality/skill-accessibility.d.ts +0 -2
  127. package/dist/skills/quality/skill-accessibility.d.ts.map +0 -1
  128. package/dist/skills/quality/skill-accessibility.js +0 -2
  129. package/dist/skills/quality/skill-accessibility.js.map +0 -1
  130. package/dist/skills/quality/skill-code-review.d.ts +0 -15
  131. package/dist/skills/quality/skill-code-review.d.ts.map +0 -1
  132. package/dist/skills/quality/skill-code-review.js +0 -60
  133. package/dist/skills/quality/skill-code-review.js.map +0 -1
  134. package/dist/skills/quality/skill-docs-gen.d.ts +0 -2
  135. package/dist/skills/quality/skill-docs-gen.d.ts.map +0 -1
  136. package/dist/skills/quality/skill-docs-gen.js +0 -2
  137. package/dist/skills/quality/skill-docs-gen.js.map +0 -1
  138. package/dist/skills/quality/skill-perf-audit.d.ts +0 -2
  139. package/dist/skills/quality/skill-perf-audit.d.ts.map +0 -1
  140. package/dist/skills/quality/skill-perf-audit.js +0 -2
  141. package/dist/skills/quality/skill-perf-audit.js.map +0 -1
  142. package/dist/skills/quality/skill-security-scan.d.ts +0 -15
  143. package/dist/skills/quality/skill-security-scan.d.ts.map +0 -1
  144. package/dist/skills/quality/skill-security-scan.js +0 -67
  145. package/dist/skills/quality/skill-security-scan.js.map +0 -1
  146. package/dist/skills/quality/skill-test-suite.d.ts +0 -15
  147. package/dist/skills/quality/skill-test-suite.d.ts.map +0 -1
  148. package/dist/skills/quality/skill-test-suite.js +0 -274
  149. package/dist/skills/quality/skill-test-suite.js.map +0 -1
  150. package/dist/skills/workflow/skill-deploy.d.ts +0 -2
  151. package/dist/skills/workflow/skill-deploy.d.ts.map +0 -1
  152. package/dist/skills/workflow/skill-deploy.js +0 -2
  153. package/dist/skills/workflow/skill-deploy.js.map +0 -1
  154. package/dist/skills/workflow/skill-git-workflow.d.ts +0 -2
  155. package/dist/skills/workflow/skill-git-workflow.d.ts.map +0 -1
  156. package/dist/skills/workflow/skill-git-workflow.js +0 -2
  157. package/dist/skills/workflow/skill-git-workflow.js.map +0 -1
  158. package/dist/skills/workflow/skill-rollback.d.ts +0 -2
  159. package/dist/skills/workflow/skill-rollback.d.ts.map +0 -1
  160. package/dist/skills/workflow/skill-rollback.js +0 -2
  161. package/dist/skills/workflow/skill-rollback.js.map +0 -1
  162. package/dist/skills/workflow/skill-task-breakdown.d.ts +0 -2
  163. package/dist/skills/workflow/skill-task-breakdown.d.ts.map +0 -1
  164. package/dist/skills/workflow/skill-task-breakdown.js +0 -2
  165. package/dist/skills/workflow/skill-task-breakdown.js.map +0 -1
@@ -1,193 +0,0 @@
1
- // Skill: crud — complete CRUD implementation guide
2
- const TEMPLATE = `
3
- // ── 1. Model (src/models/item.ts) ─────────────────────────────────────────
4
- export interface Item {
5
- id: string;
6
- name: string;
7
- description?: string;
8
- userId: string; // ownership field — always include
9
- createdAt: Date;
10
- updatedAt: Date;
11
- }
12
-
13
- export interface CreateItemInput {
14
- name: string;
15
- description?: string;
16
- }
17
-
18
- export interface UpdateItemInput {
19
- name?: string;
20
- description?: string;
21
- }
22
-
23
- // ── 2. Repository (src/repositories/item.repository.ts) ──────────────────
24
- export interface ItemRepository {
25
- findById(id: string): Promise<Item | null>;
26
- findAllByUser(userId: string): Promise<Item[]>;
27
- create(userId: string, input: CreateItemInput): Promise<Item>;
28
- update(id: string, input: UpdateItemInput): Promise<Item>;
29
- delete(id: string): Promise<void>;
30
- }
31
-
32
- // PrismaItemRepository implements ItemRepository
33
- export class PrismaItemRepository implements ItemRepository {
34
- constructor(private readonly db: PrismaClient) {}
35
-
36
- async findById(id: string): Promise<Item | null> {
37
- return this.db.item.findUnique({ where: { id } });
38
- }
39
-
40
- async findAllByUser(userId: string): Promise<Item[]> {
41
- return this.db.item.findMany({ where: { userId }, orderBy: { createdAt: 'desc' } });
42
- }
43
-
44
- async create(userId: string, input: CreateItemInput): Promise<Item> {
45
- return this.db.item.create({ data: { ...input, userId } });
46
- }
47
-
48
- async update(id: string, input: UpdateItemInput): Promise<Item> {
49
- return this.db.item.update({ where: { id }, data: input });
50
- }
51
-
52
- async delete(id: string): Promise<void> {
53
- await this.db.item.delete({ where: { id } });
54
- }
55
- }
56
-
57
- // ── 3. Service (src/services/item.service.ts) ────────────────────────────
58
- export class ItemService {
59
- constructor(private readonly repo: ItemRepository) {}
60
-
61
- async getItem(id: string, requestingUserId: string): Promise<Item> {
62
- const item = await this.repo.findById(id);
63
- if (!item) throw new NotFoundError('Item not found');
64
- if (item.userId !== requestingUserId) throw new ForbiddenError('Access denied');
65
- return item;
66
- }
67
-
68
- async listItems(userId: string): Promise<Item[]> {
69
- return this.repo.findAllByUser(userId);
70
- }
71
-
72
- async createItem(userId: string, input: CreateItemInput): Promise<Item> {
73
- return this.repo.create(userId, input);
74
- }
75
-
76
- async updateItem(id: string, input: UpdateItemInput, requestingUserId: string): Promise<Item> {
77
- await this.getItem(id, requestingUserId); // throws if not found or not owned
78
- return this.repo.update(id, input);
79
- }
80
-
81
- async deleteItem(id: string, requestingUserId: string): Promise<void> {
82
- await this.getItem(id, requestingUserId); // ownership check
83
- return this.repo.delete(id);
84
- }
85
- }
86
-
87
- // ── 4. Controller (src/controllers/item.controller.ts) ───────────────────
88
- export class ItemController {
89
- constructor(private readonly service: ItemService) {}
90
-
91
- // GET /items
92
- list = async (req: Request, res: Response): Promise<void> => {
93
- const items = await this.service.listItems(req.user.id);
94
- res.json({ data: items });
95
- };
96
-
97
- // GET /items/:id
98
- get = async (req: Request, res: Response): Promise<void> => {
99
- const item = await this.service.getItem(req.params.id, req.user.id);
100
- res.json({ data: item });
101
- };
102
-
103
- // POST /items
104
- create = async (req: Request, res: Response): Promise<void> => {
105
- const item = await this.service.createItem(req.user.id, req.body);
106
- res.status(201).json({ data: item });
107
- };
108
-
109
- // PATCH /items/:id
110
- update = async (req: Request, res: Response): Promise<void> => {
111
- const item = await this.service.updateItem(req.params.id, req.body, req.user.id);
112
- res.json({ data: item });
113
- };
114
-
115
- // DELETE /items/:id
116
- delete = async (req: Request, res: Response): Promise<void> => {
117
- await this.service.deleteItem(req.params.id, req.user.id);
118
- res.status(204).send();
119
- };
120
- }
121
-
122
- // ── 5. Routes (src/routes/items.ts) ─────────────────────────────────────
123
- import { Router } from 'express';
124
- import { z } from 'zod';
125
-
126
- const CreateItemSchema = z.object({
127
- name: z.string().min(1).max(100),
128
- description: z.string().max(500).optional(),
129
- });
130
-
131
- const UpdateItemSchema = z.object({
132
- name: z.string().min(1).max(100).optional(),
133
- description: z.string().max(500).optional(),
134
- }).refine(obj => Object.keys(obj).length > 0, { message: 'At least one field required' });
135
-
136
- export function createItemRouter(controller: ItemController): Router {
137
- const router = Router();
138
- router.get('/', controller.list);
139
- router.get('/:id', controller.get);
140
- router.post('/', validate(CreateItemSchema), controller.create);
141
- router.patch('/:id', validate(UpdateItemSchema), controller.update);
142
- router.delete('/:id', controller.delete);
143
- return router;
144
- }
145
- `.trim();
146
- export function run(input) {
147
- return {
148
- skill: 'crud',
149
- template: TEMPLATE,
150
- checklist: [
151
- 'Define TypeScript model interface with id, ownership field (userId), createdAt, updatedAt',
152
- 'Define separate CreateInput and UpdateInput types (no id, no userId, all update fields optional)',
153
- 'Create repository interface — program to the interface, not the implementation',
154
- 'Implement repository with Prisma/Drizzle/raw queries; keep DB logic isolated here',
155
- 'Implement service layer: all ownership and business rule checks happen here',
156
- 'Add service method getById that always checks ownership before returning data',
157
- 'Implement controller: parse request → call service → format response; no DB access',
158
- 'Create Zod schemas for create and update request bodies',
159
- 'Add validate middleware that runs Zod schema and returns 400 on failure',
160
- 'Register routes: GET / (list), GET /:id, POST / (create), PATCH /:id, DELETE /:id',
161
- 'Mount routes behind auth middleware so req.user is always populated',
162
- 'Add 204 No Content for successful DELETE (no body)',
163
- 'Add 201 Created with Location header for successful POST',
164
- 'Write unit tests for service layer (mock the repository)',
165
- 'Write integration tests covering happy path, 404, 403 (wrong user), 400 (bad input)',
166
- 'Add pagination to the list endpoint: limit/offset or cursor-based',
167
- 'Add filtering and sorting parameters to the list endpoint',
168
- 'Document all endpoints with JSDoc or OpenAPI comments',
169
- ],
170
- patterns: [
171
- 'Controller → Service → Repository three-layer architecture',
172
- 'Repository pattern: data access is behind an interface for testability',
173
- 'Ownership check in every service read/write operation (prevents IDOR)',
174
- 'Zod schema validation at the route boundary',
175
- 'Error-first service methods: throw typed errors, not returning null for auth failures',
176
- ],
177
- gotchas: [
178
- 'Forgetting ownership check in the service — returns any user\'s data via IDOR',
179
- 'Putting DB queries directly in controllers — bypasses repository layer and breaks tests',
180
- 'Not returning 404 before 403 — leaks resource existence to unauthorised users (use 404 for both)',
181
- 'Updating with empty body — add a Zod refine check that at least one field is present for PATCH',
182
- 'Not invalidating caches after update/delete — stale data returned to other users',
183
- 'Using findMany without a userId filter on list — returns all users\' data',
184
- ],
185
- resources: [
186
- 'https://www.prisma.io/docs/concepts/components/prisma-client/crud',
187
- 'https://zod.dev/',
188
- 'https://owasp.org/www-project-api-security/ (API4:2023 Broken Object Level Authorization)',
189
- 'https://expressjs.com/en/guide/routing.html',
190
- ],
191
- };
192
- }
193
- //# sourceMappingURL=skill-crud.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-crud.js","sourceRoot":"","sources":["../../../src/skills/development/skill-crud.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAiBnD,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+IhB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,UAAU,GAAG,CAAC,KAAiB;IACnC,OAAO;QACL,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE;YACT,2FAA2F;YAC3F,kGAAkG;YAClG,gFAAgF;YAChF,mFAAmF;YACnF,6EAA6E;YAC7E,+EAA+E;YAC/E,oFAAoF;YACpF,yDAAyD;YACzD,yEAAyE;YACzE,mFAAmF;YACnF,qEAAqE;YACrE,oDAAoD;YACpD,0DAA0D;YAC1D,0DAA0D;YAC1D,qFAAqF;YACrF,mEAAmE;YACnE,2DAA2D;YAC3D,uDAAuD;SACxD;QACD,QAAQ,EAAE;YACR,4DAA4D;YAC5D,wEAAwE;YACxE,uEAAuE;YACvE,6CAA6C;YAC7C,uFAAuF;SACxF;QACD,OAAO,EAAE;YACP,+EAA+E;YAC/E,yFAAyF;YACzF,kGAAkG;YAClG,gGAAgG;YAChG,kFAAkF;YAClF,2EAA2E;SAC5E;QACD,SAAS,EAAE;YACT,mEAAmE;YACnE,kBAAkB;YAClB,2FAA2F;YAC3F,6CAA6C;SAC9C;KACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-db-schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-db-schema.d.ts","sourceRoot":"","sources":["../../../src/skills/development/skill-db-schema.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-db-schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-db-schema.js","sourceRoot":"","sources":["../../../src/skills/development/skill-db-schema.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-docker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-docker.d.ts","sourceRoot":"","sources":["../../../src/skills/development/skill-docker.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-docker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-docker.js","sourceRoot":"","sources":["../../../src/skills/development/skill-docker.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-env-setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-env-setup.d.ts","sourceRoot":"","sources":["../../../src/skills/development/skill-env-setup.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=skill-env-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-env-setup.js","sourceRoot":"","sources":["../../../src/skills/development/skill-env-setup.ts"],"names":[],"mappings":""}
@@ -1,15 +0,0 @@
1
- export interface SkillInput {
2
- task: string;
3
- context?: string;
4
- options?: Record<string, unknown>;
5
- }
6
- export interface SkillOutput {
7
- skill: string;
8
- template?: string;
9
- checklist: string[];
10
- patterns: string[];
11
- gotchas: string[];
12
- resources: string[];
13
- }
14
- export declare function run(input: SkillInput): SkillOutput;
15
- //# sourceMappingURL=skill-scaffold.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-scaffold.d.ts","sourceRoot":"","sources":["../../../src/skills/development/skill-scaffold.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAwSD,wBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAWlD"}
@@ -1,299 +0,0 @@
1
- // Skill: scaffold — generates project scaffold structure for detected project type
2
- function detectProjectType(task) {
3
- const t = task.toLowerCase();
4
- if (/\bcli\b|command[\s-]?line|commander|yargs|oclif/.test(t))
5
- return 'cli';
6
- if (/\blibrary\b|npm\s+package|sdk|module|publishable/.test(t))
7
- return 'library';
8
- if (/\bfull[\s-]?stack\b|next\.?js|nuxt|remix|frontend\s*\+\s*backend/.test(t))
9
- return 'full-stack';
10
- if (/\bapi\b|rest(?:ful)?|express|fastify|hono|koa|endpoint/.test(t))
11
- return 'rest-api';
12
- return 'generic';
13
- }
14
- const TEMPLATES = {
15
- 'rest-api': `
16
- my-api/
17
- ├── src/
18
- │ ├── index.ts # Entry point — creates and starts the server
19
- │ ├── app.ts # Express/Fastify app factory (no listen call)
20
- │ ├── config/
21
- │ │ └── env.ts # Typed env validation with zod
22
- │ ├── routes/
23
- │ │ ├── index.ts # Route aggregator
24
- │ │ └── health.ts # GET /health — liveness probe
25
- │ ├── controllers/ # HTTP layer: parse request, call service, send response
26
- │ ├── services/ # Business logic — no HTTP types
27
- │ ├── repositories/ # Data access layer — DB queries only
28
- │ ├── middleware/
29
- │ │ ├── auth.ts # JWT / session verification
30
- │ │ ├── validate.ts # Zod request schema validation
31
- │ │ └── error-handler.ts # Centralised error → HTTP response mapping
32
- │ ├── models/ # TypeScript interfaces / Prisma types
33
- │ └── utils/
34
- │ ├── logger.ts # Pino / Winston structured logger
35
- │ └── errors.ts # Typed application error classes
36
- ├── tests/
37
- │ ├── unit/ # Service and utility unit tests
38
- │ ├── integration/ # Route-level supertest tests
39
- │ └── fixtures/ # Test data factories
40
- ├── .env.example # Template with all required env keys (no real values)
41
- ├── .gitignore
42
- ├── .eslintrc.json
43
- ├── .prettierrc
44
- ├── tsconfig.json
45
- ├── jest.config.ts # Or vitest.config.ts
46
- ├── Dockerfile
47
- ├── docker-compose.yml
48
- └── package.json
49
- `.trim(),
50
- 'full-stack': `
51
- my-app/
52
- ├── apps/
53
- │ ├── web/ # Frontend (React / Next.js / Astro)
54
- │ │ ├── src/
55
- │ │ │ ├── app/ # Next.js App Router pages
56
- │ │ │ ├── components/ # Shared UI components
57
- │ │ │ ├── hooks/ # Custom React hooks
58
- │ │ │ ├── lib/ # API client, utilities
59
- │ │ │ └── styles/ # Global CSS / Tailwind config
60
- │ │ └── package.json
61
- │ └── api/ # Backend (Express / Fastify)
62
- │ ├── src/
63
- │ │ ├── routes/
64
- │ │ ├── services/
65
- │ │ └── repositories/
66
- │ └── package.json
67
- ├── packages/
68
- │ ├── ui/ # Shared component library
69
- │ ├── types/ # Shared TypeScript types between frontend and backend
70
- │ └── config/ # Shared ESLint, tsconfig base
71
- ├── infra/ # IaC (Terraform / Pulumi / CDK)
72
- ├── .env.example
73
- ├── pnpm-workspace.yaml # Or turbo.json for Turborepo
74
- ├── turbo.json
75
- └── package.json
76
- `.trim(),
77
- cli: `
78
- my-cli/
79
- ├── src/
80
- │ ├── index.ts # Entry point — calls main()
81
- │ ├── cli.ts # Commander / yargs setup, command registration
82
- │ ├── commands/
83
- │ │ ├── index.ts # Command exports
84
- │ │ └── init.ts # Example: "my-cli init" command
85
- │ ├── config/
86
- │ │ ├── loader.ts # Reads ~/.my-cli/config.json or XDG config
87
- │ │ └── schema.ts # Zod schema for config validation
88
- │ ├── utils/
89
- │ │ ├── logger.ts # Chalk-powered coloured console output
90
- │ │ ├── spinner.ts # Ora spinner wrapper
91
- │ │ └── prompt.ts # Inquirer / clack prompt helpers
92
- │ └── errors.ts # CLI-specific error classes with exit codes
93
- ├── tests/
94
- │ ├── commands/ # Command unit tests
95
- │ └── integration/ # Full CLI invocation tests via execa
96
- ├── bin/
97
- │ └── my-cli.js # Executable shim (#!/usr/bin/env node)
98
- ├── .env.example
99
- ├── .gitignore
100
- ├── tsconfig.json
101
- ├── tsconfig.build.json # Excludes test files from build output
102
- ├── package.json # "bin" field pointing to dist/index.js
103
- └── README.md
104
- `.trim(),
105
- library: `
106
- my-library/
107
- ├── src/
108
- │ ├── index.ts # Public API barrel — re-exports only the public surface
109
- │ ├── core/ # Core implementation modules
110
- │ ├── types/
111
- │ │ └── index.ts # Exported TypeScript types and interfaces
112
- │ └── utils/ # Internal utilities (not exported)
113
- ├── tests/
114
- │ ├── unit/
115
- │ └── snapshots/
116
- ├── examples/ # Runnable usage examples
117
- ├── scripts/
118
- │ └── build.ts # Build script (tsup / rollup / esbuild)
119
- ├── .env.example
120
- ├── .gitignore
121
- ├── .eslintrc.json
122
- ├── .prettierrc
123
- ├── tsconfig.json
124
- ├── tsup.config.ts # Bundles CJS + ESM + type declarations
125
- ├── vitest.config.ts
126
- ├── CHANGELOG.md
127
- └── package.json # "exports", "main", "module", "types" fields
128
- `.trim(),
129
- generic: `
130
- my-project/
131
- ├── src/
132
- │ ├── index.ts # Entry point
133
- │ └── lib/ # Core modules
134
- ├── tests/
135
- ├── .env.example
136
- ├── .gitignore
137
- ├── tsconfig.json
138
- └── package.json
139
- `.trim(),
140
- };
141
- const CHECKLISTS = {
142
- 'rest-api': [
143
- 'Run: npm init -y && git init && echo "node_modules" > .gitignore',
144
- 'Install TypeScript: npm install -D typescript ts-node @types/node && npx tsc --init',
145
- 'Configure tsconfig.json: strict:true, outDir:dist, rootDir:src, target:ES2022',
146
- 'Install framework: npm install express && npm install -D @types/express',
147
- 'Install security middleware: npm install helmet express-rate-limit cors',
148
- 'Install validation: npm install zod',
149
- 'Install logger: npm install pino && npm install -D pino-pretty',
150
- 'Set up database ORM: npm install prisma && npx prisma init',
151
- 'Configure ESLint and Prettier: npm install -D eslint @typescript-eslint/parser prettier',
152
- 'Install testing: npm install -D vitest supertest @types/supertest',
153
- 'Create .env.example with all required variables; add .env to .gitignore',
154
- 'Write src/app.ts factory and src/index.ts entry point',
155
- 'Add npm scripts: dev (ts-node-dev), build (tsc), start (node dist/index.js), test, lint',
156
- 'Write a Dockerfile with multi-stage build: builder + production runner',
157
- 'Set up GitHub Actions CI: install → lint → test → build on every PR',
158
- 'Add docker-compose.yml for local development with database service',
159
- ],
160
- 'full-stack': [
161
- 'Initialise monorepo: npm install -D turbo && pnpm init (or use create-turbo)',
162
- 'Create pnpm-workspace.yaml listing apps/* and packages/*',
163
- 'Scaffold frontend: pnpm create next-app apps/web --typescript',
164
- 'Scaffold backend: follow rest-api checklist in apps/api',
165
- 'Create packages/types with shared TypeScript interfaces',
166
- 'Create packages/config with shared tsconfig.base.json and eslint config',
167
- 'Configure Turborepo pipeline in turbo.json: build, test, lint tasks',
168
- 'Set up shared environment: turbo.env or dotenv in each app',
169
- 'Install Tailwind CSS and shadcn/ui in apps/web',
170
- 'Set up API client in apps/web/src/lib/api.ts using fetch with typed responses',
171
- 'Configure CORS in apps/api to allow the web origin in development',
172
- 'Add Prettier and ESLint configs in packages/config; extend in each app',
173
- 'Write GitHub Actions matrix workflow that tests each app independently',
174
- 'Write docker-compose.yml that starts both apps and their dependencies',
175
- ],
176
- cli: [
177
- 'npm init -y && git init',
178
- 'Install TypeScript: npm install -D typescript @types/node && npx tsc --init',
179
- 'Install CLI framework: npm install commander && npm install -D @types/commander',
180
- 'Install UX tools: npm install chalk ora inquirer && npm install -D @types/inquirer',
181
- 'Install build tool: npm install -D tsup',
182
- 'Configure package.json: add "bin" field, "files" field, and build/dev scripts',
183
- 'Create bin/my-cli.js shim with #!/usr/bin/env node pointing to dist/index.js',
184
- 'Set "prepublishOnly" script to run build and tests before npm publish',
185
- 'Create src/cli.ts with the Commander program definition',
186
- 'Add at least one example command in src/commands/',
187
- 'Write integration tests using execa to invoke the compiled CLI binary',
188
- 'Set up ESLint and Prettier',
189
- 'Add GitHub Actions workflow: test on push + publish to npm on release tag',
190
- 'Write README.md with installation and usage examples',
191
- ],
192
- library: [
193
- 'npm init -y && git init',
194
- 'Install TypeScript and tsup: npm install -D typescript tsup',
195
- 'Configure tsconfig.json with strict:true, declaration:true, declarationMap:true',
196
- 'Configure tsup.config.ts: entry src/index.ts, formats [cjs, esm], dts:true',
197
- 'Set package.json "exports", "main", "module", "types" fields for dual CJS/ESM',
198
- 'Add "files" field to package.json to only publish src + dist, not tests',
199
- 'Install vitest for testing: npm install -D vitest',
200
- 'Install Changesets for versioning: npm install -D @changesets/cli && npx changeset init',
201
- 'Write public API in src/index.ts; keep internal modules unexported',
202
- 'Write tests covering edge cases, error paths, and type narrowing',
203
- 'Add ESLint with @typescript-eslint and prettier',
204
- 'Create examples/ directory with a working usage example',
205
- 'Set up GitHub Actions: test → build → publish on changeset release',
206
- 'Add CHANGELOG.md and seed first version with npx changeset',
207
- ],
208
- generic: [
209
- 'npm init -y && git init',
210
- 'Install TypeScript: npm install -D typescript && npx tsc --init',
211
- 'Add strict TypeScript configuration',
212
- 'Set up ESLint and Prettier',
213
- 'Install testing framework (vitest or jest)',
214
- 'Create .env.example and add .env to .gitignore',
215
- 'Add CI workflow (GitHub Actions)',
216
- 'Write README with purpose, setup, and usage',
217
- ],
218
- };
219
- const PATTERNS_MAP = {
220
- 'rest-api': ['Controller → Service → Repository layered architecture', 'Middleware chain for cross-cutting concerns', 'Dependency injection via constructor parameters'],
221
- 'full-stack': ['Turborepo monorepo with shared packages', 'Type-sharing between frontend and backend via shared package', 'API contract-first development'],
222
- cli: ['Commander subcommand pattern', 'Config file with XDG base directory spec', 'Spinner + prompt UX pattern'],
223
- library: ['Barrel export pattern (src/index.ts as public API surface)', 'Dual CJS/ESM build with tsup', 'Semantic versioning with Changesets'],
224
- generic: ['Separation of concerns', 'Environment-based configuration', 'Test-driven development'],
225
- };
226
- const GOTCHAS = {
227
- 'rest-api': [
228
- 'Not separating app factory from server listen — makes supertest integration tests impossible',
229
- 'Importing from .ts paths instead of .js in ESM projects — Node requires .js extensions at runtime',
230
- 'Forgetting to handle unhandled promise rejections: process.on("unhandledRejection")',
231
- 'Not setting NODE_ENV=production in Docker — some libraries skip optimisations',
232
- ],
233
- 'full-stack': [
234
- 'pnpm hoisting rules differ from npm — some packages require explicit workspace installation',
235
- 'Turbo caches outputs — always define "outputs" in turbo.json or caching will miss files',
236
- 'Next.js Server Actions run on the server but are bundled client-side if marked incorrectly',
237
- 'CORS in development must allow the exact origin including port number',
238
- ],
239
- cli: [
240
- 'bin script must have chmod +x and #!/usr/bin/env node shebang — otherwise it won\'t run on Unix',
241
- 'Using process.exit() inside async code without await — unhandled async errors go silently',
242
- 'Global config paths differ per OS — use the "env-paths" package for cross-platform XDG dirs',
243
- 'Not handling SIGINT / SIGTERM — CLI leaves terminal in bad state on Ctrl+C',
244
- ],
245
- library: [
246
- 'Publishing src/ instead of dist/ — consumers get TypeScript source, not compiled output',
247
- 'Missing "exports" field in package.json — prevents dual CJS/ESM consumers from working',
248
- 'Exporting internal implementation details — breaks semver compatibility on refactors',
249
- 'Not testing the built package locally with "npm link" before publishing',
250
- ],
251
- generic: [
252
- 'Committing .env files — always add to .gitignore before the first commit',
253
- 'Missing tsconfig strict mode — allows silent type errors',
254
- 'No CI from the start — technical debt accumulates quickly without automated checks',
255
- ],
256
- };
257
- const RESOURCES = {
258
- 'rest-api': [
259
- 'https://expressjs.com/en/advanced/best-practice-security.html',
260
- 'https://www.prisma.io/docs/getting-started',
261
- 'https://vitest.dev/guide/',
262
- 'https://docs.npmjs.com/cli/v10/configuring-npm/package-json#main',
263
- ],
264
- 'full-stack': [
265
- 'https://turbo.build/repo/docs',
266
- 'https://nextjs.org/docs',
267
- 'https://pnpm.io/workspaces',
268
- 'https://ui.shadcn.com/docs',
269
- ],
270
- cli: [
271
- 'https://www.npmjs.com/package/commander',
272
- 'https://www.npmjs.com/package/ora',
273
- 'https://www.npmjs.com/package/inquirer',
274
- 'https://tsup.egoist.dev/',
275
- ],
276
- library: [
277
- 'https://tsup.egoist.dev/',
278
- 'https://github.com/changesets/changesets',
279
- 'https://www.typescriptlang.org/docs/handbook/declaration-files/dts-from-js.html',
280
- 'https://nodejs.org/api/packages.html#package-entry-points',
281
- ],
282
- generic: [
283
- 'https://www.typescriptlang.org/docs/handbook/tsconfig-json.html',
284
- 'https://vitest.dev/guide/',
285
- 'https://eslint.org/docs/latest/use/getting-started',
286
- ],
287
- };
288
- export function run(input) {
289
- const projectType = detectProjectType(input.task);
290
- return {
291
- skill: 'scaffold',
292
- template: TEMPLATES[projectType],
293
- checklist: CHECKLISTS[projectType],
294
- patterns: PATTERNS_MAP[projectType],
295
- gotchas: GOTCHAS[projectType],
296
- resources: RESOURCES[projectType],
297
- };
298
- }
299
- //# sourceMappingURL=skill-scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-scaffold.js","sourceRoot":"","sources":["../../../src/skills/development/skill-scaffold.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAmBnF,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IAAI,iDAAiD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,IAAI,kDAAkD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,IAAI,kEAAkE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IACpG,IAAI,wDAAwD,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACxF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,SAAS,GAAgC;IAC7C,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCb,CAAC,IAAI,EAAE;IAEN,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Bf,CAAC,IAAI,EAAE;IAEN,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BN,CAAC,IAAI,EAAE;IAEN,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBV,CAAC,IAAI,EAAE;IAEN,OAAO,EAAE;;;;;;;;;;CAUV,CAAC,IAAI,EAAE;CACP,CAAC;AAEF,MAAM,UAAU,GAAkC;IAChD,UAAU,EAAE;QACV,kEAAkE;QAClE,qFAAqF;QACrF,+EAA+E;QAC/E,yEAAyE;QACzE,yEAAyE;QACzE,qCAAqC;QACrC,gEAAgE;QAChE,4DAA4D;QAC5D,yFAAyF;QACzF,mEAAmE;QACnE,yEAAyE;QACzE,uDAAuD;QACvD,yFAAyF;QACzF,wEAAwE;QACxE,qEAAqE;QACrE,oEAAoE;KACrE;IACD,YAAY,EAAE;QACZ,8EAA8E;QAC9E,0DAA0D;QAC1D,+DAA+D;QAC/D,yDAAyD;QACzD,yDAAyD;QACzD,yEAAyE;QACzE,qEAAqE;QACrE,4DAA4D;QAC5D,gDAAgD;QAChD,+EAA+E;QAC/E,mEAAmE;QACnE,wEAAwE;QACxE,wEAAwE;QACxE,uEAAuE;KACxE;IACD,GAAG,EAAE;QACH,yBAAyB;QACzB,6EAA6E;QAC7E,iFAAiF;QACjF,oFAAoF;QACpF,yCAAyC;QACzC,+EAA+E;QAC/E,8EAA8E;QAC9E,uEAAuE;QACvE,yDAAyD;QACzD,mDAAmD;QACnD,uEAAuE;QACvE,4BAA4B;QAC5B,2EAA2E;QAC3E,sDAAsD;KACvD;IACD,OAAO,EAAE;QACP,yBAAyB;QACzB,6DAA6D;QAC7D,iFAAiF;QACjF,4EAA4E;QAC5E,+EAA+E;QAC/E,yEAAyE;QACzE,mDAAmD;QACnD,yFAAyF;QACzF,oEAAoE;QACpE,kEAAkE;QAClE,iDAAiD;QACjD,yDAAyD;QACzD,oEAAoE;QACpE,4DAA4D;KAC7D;IACD,OAAO,EAAE;QACP,yBAAyB;QACzB,iEAAiE;QACjE,qCAAqC;QACrC,4BAA4B;QAC5B,4CAA4C;QAC5C,gDAAgD;QAChD,kCAAkC;QAClC,6CAA6C;KAC9C;CACF,CAAC;AAEF,MAAM,YAAY,GAAkC;IAClD,UAAU,EAAE,CAAC,wDAAwD,EAAE,6CAA6C,EAAE,iDAAiD,CAAC;IACxK,YAAY,EAAE,CAAC,yCAAyC,EAAE,8DAA8D,EAAE,gCAAgC,CAAC;IAC3J,GAAG,EAAE,CAAC,8BAA8B,EAAE,0CAA0C,EAAE,6BAA6B,CAAC;IAChH,OAAO,EAAE,CAAC,4DAA4D,EAAE,8BAA8B,EAAE,qCAAqC,CAAC;IAC9I,OAAO,EAAE,CAAC,wBAAwB,EAAE,iCAAiC,EAAE,yBAAyB,CAAC;CAClG,CAAC;AAEF,MAAM,OAAO,GAAkC;IAC7C,UAAU,EAAE;QACV,8FAA8F;QAC9F,mGAAmG;QACnG,qFAAqF;QACrF,+EAA+E;KAChF;IACD,YAAY,EAAE;QACZ,6FAA6F;QAC7F,yFAAyF;QACzF,4FAA4F;QAC5F,uEAAuE;KACxE;IACD,GAAG,EAAE;QACH,iGAAiG;QACjG,2FAA2F;QAC3F,6FAA6F;QAC7F,4EAA4E;KAC7E;IACD,OAAO,EAAE;QACP,yFAAyF;QACzF,wFAAwF;QACxF,sFAAsF;QACtF,yEAAyE;KAC1E;IACD,OAAO,EAAE;QACP,0EAA0E;QAC1E,0DAA0D;QAC1D,oFAAoF;KACrF;CACF,CAAC;AAEF,MAAM,SAAS,GAAkC;IAC/C,UAAU,EAAE;QACV,+DAA+D;QAC/D,4CAA4C;QAC5C,2BAA2B;QAC3B,kEAAkE;KACnE;IACD,YAAY,EAAE;QACZ,+BAA+B;QAC/B,yBAAyB;QACzB,4BAA4B;QAC5B,4BAA4B;KAC7B;IACD,GAAG,EAAE;QACH,yCAAyC;QACzC,mCAAmC;QACnC,wCAAwC;QACxC,0BAA0B;KAC3B;IACD,OAAO,EAAE;QACP,0BAA0B;QAC1B,0CAA0C;QAC1C,iFAAiF;QACjF,2DAA2D;KAC5D;IACD,OAAO,EAAE;QACP,iEAAiE;QACjE,2BAA2B;QAC3B,oDAAoD;KACrD;CACF,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAiB;IACnC,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC;QAChC,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC;QAClC,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC;QAC7B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- export interface SkillInput {
2
- task: string;
3
- context?: string;
4
- options?: Record<string, unknown>;
5
- }
6
- export interface SkillOutput {
7
- skill: string;
8
- template?: string;
9
- checklist: string[];
10
- patterns: string[];
11
- gotchas: string[];
12
- resources: string[];
13
- }
14
- export declare function run(input: SkillInput): SkillOutput;
15
- //# sourceMappingURL=skill-complexity-score.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-complexity-score.d.ts","sourceRoot":"","sources":["../../../src/skills/intelligence/skill-complexity-score.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAAE;AAClG,MAAM,WAAW,WAAW;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAAE;AAEnJ,wBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CA+DlD"}