@soleri/core 9.14.0 → 9.14.4
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/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +9 -3
- package/dist/skills/sync-skills.js.map +1 -1
- package/package.json +2 -2
- package/src/skills/sync-skills.ts +9 -3
- package/dist/knowledge-packs/knowledge-packs/community/.gitkeep +0 -0
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/accessibility.json +0 -53
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/design-tokens.json +0 -26
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/design.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/styling.json +0 -44
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/ux-laws.json +0 -36
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/ux.json +0 -36
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/architecture.json +0 -143
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/commercial.json +0 -16
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/communication.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/component.json +0 -16
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/express.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/leadership.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/methodology.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/monorepo.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/other.json +0 -73
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/performance.json +0 -35
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/prisma.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/product-strategy.json +0 -42
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/react.json +0 -47
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/security.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/testing.json +0 -33
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/tooling.json +0 -85
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/typescript.json +0 -34
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-engineering/vault/workflow.json +0 -46
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-uipro/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/salvador/salvador-uipro/vault/design.json +0 -2589
- package/dist/knowledge-packs/knowledge-packs/starter/architecture/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/architecture/vault/patterns.json +0 -137
- package/dist/knowledge-packs/knowledge-packs/starter/design/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/design/vault/patterns.json +0 -137
- package/dist/knowledge-packs/knowledge-packs/starter/security/soleri-pack.json +0 -10
- package/dist/knowledge-packs/knowledge-packs/starter/security/vault/patterns.json +0 -137
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/api-design/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/nodejs/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/nodejs/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/react/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/react/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/testing/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/testing/vault/patterns.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/soleri-pack.json +0 -0
- /package/dist/knowledge-packs/{knowledge-packs/starter → starter}/typescript/vault/patterns.json +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-skills.d.ts","sourceRoot":"","sources":["../../src/skills/sync-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;gBAEnC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;CAarE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAgBjE;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,WAAgB,GACxB,UAAU,CA+HZ;
|
|
1
|
+
{"version":3,"file":"sync-skills.d.ts","sourceRoot":"","sources":["../../src/skills/sync-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,6EAA6E;AAC7E,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;gBAEnC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;CAarE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAgBjE;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,WAAgB,GACxB,UAAU,CA+HZ;AA6CD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,CAAC,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,YAAY,GAAG,SAAS,GAAG,SAAS,CAItC;AA+BD,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,qBAA0B,GAClC,UAAU,EAAE,CAwBd"}
|
|
@@ -198,20 +198,26 @@ export function syncSkillsToClaudeCode(skillsDirs, agentName, options = {}) {
|
|
|
198
198
|
return result;
|
|
199
199
|
}
|
|
200
200
|
/**
|
|
201
|
-
* Remove
|
|
201
|
+
* Remove ALL `{agent}-soleri-*` entries from ~/.claude/skills/
|
|
202
202
|
* to clean up duplicates left by the old global-install behavior.
|
|
203
|
+
*
|
|
204
|
+
* Cleans entries from ALL agents, not just the current one — any
|
|
205
|
+
* `*-soleri-*` entry in the global dir is a stale copy from a previous
|
|
206
|
+
* global install. Canonical skills now live in project-local .claude/skills/.
|
|
203
207
|
*/
|
|
204
208
|
function cleanStaleGlobalSkills(agentName, result) {
|
|
205
209
|
const globalSkillsDir = join(homedir(), '.claude', 'skills');
|
|
206
210
|
if (!existsSync(globalSkillsDir))
|
|
207
211
|
return;
|
|
208
|
-
|
|
212
|
+
// Match any agent-prefixed soleri skill: <anything>-soleri-<skillname>
|
|
213
|
+
// Canonical project-local names look like "soleri-*" (no agent prefix).
|
|
214
|
+
const stalePattern = /^.+-soleri-.+$/;
|
|
209
215
|
try {
|
|
210
216
|
const entries = readdirSync(globalSkillsDir, { withFileTypes: true });
|
|
211
217
|
for (const entry of entries) {
|
|
212
218
|
if (!entry.isDirectory())
|
|
213
219
|
continue;
|
|
214
|
-
if (!entry.name
|
|
220
|
+
if (!stalePattern.test(entry.name))
|
|
215
221
|
continue;
|
|
216
222
|
const staleDir = join(globalSkillsDir, entry.name);
|
|
217
223
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-skills.js","sourceRoot":"","sources":["../../src/skills/sync-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,WAAW,EACX,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA0B1D,6EAA6E;AAC7E,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,SAAS,CAAS;IAClB,KAAK,CAAY;IACjB,SAAS,CAA6B;IAE/C,YAAY,SAAiB,EAAE,SAAqC;QAClE,KAAK,CACH,UAAU,SAAS,gEAAgE;YACjF,kBAAkB,SAAS;iBACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,EAAE,CAClB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,4DAA4D;AAC5D,MAAM,UAAU,cAAc,CAAC,UAAoB;IACjD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,SAAS,iBAAiB,CAAC,OAAe,EAAE,SAAiB,EAAE,YAAqB;IAClF,uCAAuC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAEjC,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,SAAS,YAAY,CAAC;IACnD,OAAO,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAoB,EACpB,SAAkB,EAClB,UAAuB,EAAE;IAEzB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzD,MAAM,SAAS,GAAG,QAAQ;QACxB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAe;QACzB,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,uEAAuE;QACvE,MAAM,SAAS,GACb,QAAQ,IAAI,SAAS;YACnB,CAAC,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE;YACjE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,iDAAiD;gBACjD,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,SAAS;oBACvB,CAAC,CAAC,iBAAiB,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC;oBACxD,CAAC,CAAC,aAAa,CAAC;gBAElB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACnC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;oBACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;oBACjD,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;wBAC9B,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEjD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,8DAA8D;oBAC9D,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;wBAClC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;4BAC1B,2BAA2B;4BAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BAChC,SAAS;wBACX,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,qCAAqC;oBACvC,CAAC;oBACD,2DAA2D;oBAC3D,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,CAAC;gBAED,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,qDAAqD;gBACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBACpD,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAChC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzF,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACrC,CACF,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE;oBAClF,SAAS;gBACX,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,IAAI,CAAC,WAAW;oBAAE,SAAS;gBAC3B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAE1C,6CAA6C;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;oBACjE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBACpE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC3C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;wBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxE,CAAC;oBACD,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC3B,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"sync-skills.js","sourceRoot":"","sources":["../../src/skills/sync-skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soleri/core",
|
|
3
|
-
"version": "9.14.
|
|
3
|
+
"version": "9.14.4",
|
|
4
4
|
"description": "Shared engine for Soleri agents — vault, brain, planner, LLM utilities, and facade infrastructure.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
|
-
"build": "tsc && cp -r ../../knowledge-packs dist/knowledge-packs",
|
|
48
|
+
"build": "tsc && rm -rf dist/knowledge-packs && cp -r ../../knowledge-packs dist/knowledge-packs",
|
|
49
49
|
"typecheck": "tsc --noEmit",
|
|
50
50
|
"test": "vitest run",
|
|
51
51
|
"test:watch": "vitest",
|
|
@@ -257,20 +257,26 @@ export function syncSkillsToClaudeCode(
|
|
|
257
257
|
}
|
|
258
258
|
|
|
259
259
|
/**
|
|
260
|
-
* Remove
|
|
260
|
+
* Remove ALL `{agent}-soleri-*` entries from ~/.claude/skills/
|
|
261
261
|
* to clean up duplicates left by the old global-install behavior.
|
|
262
|
+
*
|
|
263
|
+
* Cleans entries from ALL agents, not just the current one — any
|
|
264
|
+
* `*-soleri-*` entry in the global dir is a stale copy from a previous
|
|
265
|
+
* global install. Canonical skills now live in project-local .claude/skills/.
|
|
262
266
|
*/
|
|
263
267
|
function cleanStaleGlobalSkills(agentName: string, result: SyncResult): void {
|
|
264
268
|
const globalSkillsDir = join(homedir(), '.claude', 'skills');
|
|
265
269
|
if (!existsSync(globalSkillsDir)) return;
|
|
266
270
|
|
|
267
|
-
|
|
271
|
+
// Match any agent-prefixed soleri skill: <anything>-soleri-<skillname>
|
|
272
|
+
// Canonical project-local names look like "soleri-*" (no agent prefix).
|
|
273
|
+
const stalePattern = /^.+-soleri-.+$/;
|
|
268
274
|
|
|
269
275
|
try {
|
|
270
276
|
const entries = readdirSync(globalSkillsDir, { withFileTypes: true });
|
|
271
277
|
for (const entry of entries) {
|
|
272
278
|
if (!entry.isDirectory()) continue;
|
|
273
|
-
if (!entry.name
|
|
279
|
+
if (!stalePattern.test(entry.name)) continue;
|
|
274
280
|
|
|
275
281
|
const staleDir = join(globalSkillsDir, entry.name);
|
|
276
282
|
try {
|
|
File without changes
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "salvador-craft",
|
|
3
|
-
"name": "Salvador Craft — Design & Accessibility",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Design system intelligence, token priority, accessibility rules, UX patterns, component patterns, and styling enforcement. Extracted from Salvador's production vault.",
|
|
6
|
-
"domains": ["design", "accessibility", "ux"],
|
|
7
|
-
"vault": {
|
|
8
|
-
"dir": "vault"
|
|
9
|
-
}
|
|
10
|
-
}
|
package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/accessibility.json
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "accessibility",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "canonical-a11y-contrast-requirements",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "accessibility",
|
|
9
|
-
"title": "Contrast Requirements",
|
|
10
|
-
"severity": "critical",
|
|
11
|
-
"description": "## Rule\n\nAll text and meaningful UI elements MUST meet WCAG 2.1 Level AA contrast ratio requirements:\n\n| Element Type | Minimum Contrast Ratio |\n|---|---|\n| Normal text (below 18px, or below 14px bold) | **4.5:1** |\n| Large text (18px+ regular, or 14px+ bold) | **3:1** |\n| UI components and graphical objects (icons, borders, focus indicators) | **3:1** |\n\n### Specifics\n\n- **Normal text**: Any text rendered below 18px (24 CSS px at default zoom) at regular weight, or below 14px (18.66 CSS px) at bold weight, requires a **4.5:1** contrast ratio against its background.\n- **Large text**: Text at 18px+ regular weight or 14px+ bold weight requires a **3:1** contrast ratio against its background.\n- **Non-text elements**: Interactive component boundaries (input borders, button outlines), focus indicators, and informational icons require a **3:1** contrast ratio against adjacent colors.\n- **Disabled elements**: Disabled controls are exempt from contrast requirements per WCAG, but should still be perceptibly different from their enabled state.\n- **Placeholder text**: Input placeholder text must meet **4.5:1** if it conveys essential information; otherwise treat as supplementary.\n\nReference: [WCAG 2.1 Success Criterion 1.4.3 (Contrast Minimum)](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html) and [SC 1.4.11 (Non-text Contrast)](https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html).\n\n## Why\n\n1. **Inclusivity** -- Approximately 1 in 12 men and 1 in 200 women have some form of color vision deficiency. Low contrast excludes these users.\n2. **Environmental factors** -- Users view interfaces on screens with varying brightness, in direct sunlight, and on aging displays. Adequate contrast ensures readability in all conditions.\n3. **Legal compliance** -- WCAG 2.1 AA is the accepted legal standard in many jurisdictions (ADA, EN 301 549, Section 508).\n4. **Cognitive load** -- High-contrast text is faster to read for all users, reducing fatigue and errors.\n\n## Assertions\n\n- Every foreground/background color pair used for text must produce a contrast ratio >= 4.5:1 (normal text) or >= 3.0:1 (large text).\n- Every interactive component border color must produce a contrast ratio >= 3.0:1 against adjacent non-interactive surfaces.\n- Focus indicator colors must produce a contrast ratio >= 3.0:1 against the element's unfocused state.\n- No color pair used for informational icons may have a contrast ratio below 3.0:1 against its background.\n- Automated checks must flag any computed contrast ratio below the applicable threshold.",
|
|
12
|
-
"tags": ["accessibility", "contrast", "wcag", "a11y", "color"],
|
|
13
|
-
"tier": "agent"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"id": "canonical-a11y-touch-targets",
|
|
17
|
-
"type": "pattern",
|
|
18
|
-
"domain": "accessibility",
|
|
19
|
-
"title": "Touch Target Sizes",
|
|
20
|
-
"severity": "critical",
|
|
21
|
-
"description": "## Rule\n\nAll interactive elements MUST meet minimum touch target sizes:\n\n| Platform | Minimum Target Size | Reference |\n|---|---|---|\n| iOS (Apple HIG) | **44 x 44 pt** | Apple Human Interface Guidelines |\n| Android / Material Design | **48 x 48 dp** | Material Design Guidelines |\n| Web (WCAG 2.5.8, AAA) | **44 x 44 CSS px** | WCAG 2.2 SC 2.5.8 Target Size (Minimum) |\n| Web (WCAG 2.5.5, AA) | **24 x 24 CSS px** minimum, 44 x 44 CSS px recommended | WCAG 2.2 SC 2.5.5 |\n\n### Spacing Between Targets\n\n- Adjacent interactive targets MUST have at least **8px** of non-interactive space between their hit areas.\n- If two targets are closer than 8px, their combined hit areas must not overlap.\n- Inline text links in body copy are exempt from size requirements but should have sufficient line height (>= 1.5) to allow accurate tapping.\n\n### Implementation Details\n\n- The touch target includes padding and any transparent hit-area extensions, not just the visible element.\n- Use CSS `min-height` and `min-width` (not just `padding`) to guarantee the minimum dimensions.\n- Icon-only buttons that render a 16px or 24px icon MUST extend their tappable area to the full minimum size via padding or an invisible hit region.\n- Dropdown menu items, list rows, and navigation links must each meet the minimum height independently.\n\n## Why\n\n1. **Motor accessibility** -- Users with motor impairments, tremors, or limited dexterity need adequately sized targets to interact reliably.\n2. **Mobile usability** -- The average adult fingertip covers roughly 10mm (~40px at standard density). Targets smaller than this cause frequent mistaps.\n3. **Speed and confidence** -- Fitts's Law shows that larger targets reduce the time and error rate for pointing tasks. Meeting minimums improves task completion speed for all users.\n4. **Platform compliance** -- Both Apple and Google reject apps from their stores that fail basic usability checks, including undersized touch targets.\n\n## Assertions\n\n- No interactive element (button, link, checkbox, radio, toggle, select, slider thumb) may have a computed tappable area smaller than 44x44 CSS px on web or 44x44 pt on iOS or 48x48 dp on Android.\n- Adjacent interactive elements must have >= 8px non-interactive separation.\n- Icon-only interactive elements with a visible icon smaller than the minimum target size must have padding or hit-area expansion to meet the minimum.\n- Elements using `onClick` or equivalent touch/click handlers must meet target size requirements.",
|
|
22
|
-
"tags": ["accessibility", "touch", "mobile", "a11y", "interaction"],
|
|
23
|
-
"tier": "agent"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "pattern-accessibility-quick-minimum-44x44px-touch-targets-enforced-via-quality",
|
|
27
|
-
"type": "pattern",
|
|
28
|
-
"domain": "accessibility",
|
|
29
|
-
"title": "Minimum 44x44px touch targets enforced via quality rules",
|
|
30
|
-
"severity": "warning",
|
|
31
|
-
"description": "# Minimum 44x44px touch targets enforced via quality rules\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nThe ux-touch-targets rule in chains/rules/quality.yaml enforces Fitts's Law: all interactive elements must have a minimum 44x44px touch target. This applies to buttons, links, checkboxes, and any clickable area. Smaller targets cause frustration on mobile and accessibility issues for motor-impaired users. The rule fires as a warning during component validation.\n\n## Example\n\n```typescript\nWarning: Button touch target is 32x32px, minimum required is 44x44px. Add p-2 or min-h-[44px] min-w-[44px].\n```\n\n## Why\n\nWCAG 2.5.8 (Target Size) requires 44x44px minimum. This is also a core UX law (Fitts's Law) that Salvador's UX-AUDITOR-flow evaluates.",
|
|
32
|
-
"tags": ["touch-targets", "fitts-law", "mobile", "motor-accessibility"]
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "pattern-accessibility-quick-tooltip-component-required-instead-of-native-title",
|
|
36
|
-
"type": "pattern",
|
|
37
|
-
"domain": "accessibility",
|
|
38
|
-
"title": "Tooltip component required instead of native title attribute",
|
|
39
|
-
"severity": "critical",
|
|
40
|
-
"description": "# Tooltip component required instead of native title attribute\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nThe no-native-title hookify rule blocks any use of title=\"...\" on HTML elements. Native title attributes have poor accessibility: not announced by all screen readers, invisible on touch devices, no styling control. Instead, use the Tooltip/TooltipTrigger/TooltipContent component pattern which provides keyboard support, screen reader announcements, and consistent styling.\n\n## Example\n\n```typescript\nBad: <button title=\"Delete item\">X</button>. Good: <Tooltip><TooltipTrigger><button>X</button></TooltipTrigger><TooltipContent>Delete item</TooltipContent></Tooltip>\n```\n\n## Why\n\nNative title is the most commonly misused accessibility pattern. Blocking it forces the accessible alternative.",
|
|
41
|
-
"tags": ["tooltip", "title-attribute", "a11y", "screen-reader", "touch"]
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"id": "pattern-accessibility-quick-wcag-contrast-validation-as-a-mandatory-gate-in-de",
|
|
45
|
-
"type": "pattern",
|
|
46
|
-
"domain": "accessibility",
|
|
47
|
-
"title": "WCAG contrast validation as a mandatory gate in design flows",
|
|
48
|
-
"severity": "critical",
|
|
49
|
-
"description": "# WCAG contrast validation as a mandatory gate in design flows\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nEvery color pairing must pass WCAG contrast validation before approval. Salvador enforces 3 levels: AA normal text (4.5:1), AA large text (3.0:1), AAA (7.0:1). The contrast chain is included in validate-colors composite and runs in design, review, and UX-audit flows. Known safe combos: bg-dark+text-inverse (19.41:1), bg-surface+text-primary (17.85:1). Known failures: bg-accent+text-inverse (2.98:1).\n\n## Example\n\n```typescript\nsalvador_check_contrast({ foreground: 'text-primary', background: 'bg-surface' }) → { pass: true, ratio: 17.85, level: 'AAA' }\n```\n\n## Why\n\nContrast failures are the most common accessibility violation. Automated gating catches them before they reach code review.",
|
|
50
|
-
"tags": ["wcag", "contrast", "color", "validation", "a11y"]
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
package/dist/knowledge-packs/knowledge-packs/salvador/salvador-craft/vault/design-tokens.json
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "design-tokens",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "canonical-design-color-token-priority",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "design-tokens",
|
|
9
|
-
"title": "Color Token Priority",
|
|
10
|
-
"severity": "critical",
|
|
11
|
-
"description": "## Rule\n\nAll color usage MUST reference design tokens, never raw color values. The priority order is:\n\n1. **Semantic tokens (highest priority)** -- Tokens that convey meaning and intent.\n - Examples: `text-primary`, `text-secondary`, `text-warning`, `text-error`, `bg-surface`, `bg-error`, `border-focus`, `icon-success`.\n - Use these whenever the color communicates a specific purpose.\n\n2. **Contextual tokens** -- Tokens scoped to a component context.\n - Examples: `button-bg-primary`, `input-border-default`, `card-bg`.\n - Use when semantic tokens are too generic for a component's specific need.\n\n3. **Primitive tokens (lowest priority)** -- Named palette references.\n - Examples: `blue-600`, `gray-100`.\n - Use only when no semantic or contextual token fits, and document the reason.\n\n### Forbidden\n\nThe following are **never** permitted in source code:\n\n- Raw hex values: `#3B82F6`, `#fff`, `#000`\n- RGB/RGBA functions: `rgb(59, 130, 246)`, `rgba(0,0,0,0.5)`\n- HSL/HSLA functions: `hsl(217, 91%, 60%)`\n- Tailwind palette classes used as color decisions: `bg-blue-500`, `text-gray-700`\n- CSS named colors: `red`, `white`, `black`\n\n## Why\n\n1. **Theming** -- Semantic tokens decouple color intent from color value, enabling dark mode, high-contrast mode, and brand theming with zero code changes.\n2. **Consistency** -- When \"error\" always maps to the same token, the error color is guaranteed to be uniform across every component.\n3. **Accessibility** -- Token-level contrast validation ensures all usages meet WCAG requirements when the palette changes.\n4. **Maintainability** -- Changing a brand color updates one token definition rather than hundreds of scattered hex values.\n\n## Assertions\n\n- No source file may contain a literal hex color (`/#[0-9a-fA-F]{3,8}/`).\n- No source file may contain `rgb(`, `rgba(`, `hsl(`, or `hsla(` as a color value.\n- No Tailwind class matching `/bg-(red|blue|green|yellow|purple|pink|indigo|gray|slate|zinc|neutral|stone|orange|amber|emerald|teal|cyan|sky|violet|fuchsia|rose|lime)-\\d+/` may appear in component code.\n- Every color property in CSS/JSX must resolve to a design token reference.\n- Primitive token usage must include a code comment explaining why no semantic token fits.",
|
|
12
|
-
"tags": ["color", "tokens", "semantic", "design-tokens", "theming"],
|
|
13
|
-
"tier": "agent"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"id": "canonical-design-spacing-scale",
|
|
17
|
-
"type": "pattern",
|
|
18
|
-
"domain": "design-tokens",
|
|
19
|
-
"title": "Spacing Scale",
|
|
20
|
-
"severity": "critical",
|
|
21
|
-
"description": "## Rule\n\nAll spacing values (margin, padding, gap) MUST use only the following scale:\n\n| Token | Value |\n|---------|-------|\n| space-1 | 4px |\n| space-2 | 8px |\n| space-3 | 12px |\n| space-4 | 16px |\n| space-6 | 24px |\n| space-8 | 32px |\n\nNo other spacing values are permitted. Allowed values: **4, 8, 12, 16, 24, 32** (in pixels).\n\n- Use `space-1` (4px) for tight inline spacing (icon-to-label gaps, error message offset).\n- Use `space-2` (8px) for related element grouping (form fields within a group).\n- Use `space-3` (12px) for medium internal padding (card content insets).\n- Use `space-4` (16px) as the base unit for standard padding and gaps.\n- Use `space-6` (24px) for section separation within a view.\n- Use `space-8` (32px) for major section breaks and page-level margins.\n\n## Why\n\nA constrained spacing scale based on a 4px grid creates consistent visual rhythm across all screens and components. When every element snaps to the same spatial grid:\n\n1. **Visual consistency** -- Users perceive the interface as polished and intentional. Arbitrary values (e.g., 5px, 13px, 22px) create subtle misalignments that accumulate into visual noise.\n2. **Faster design decisions** -- Designers and developers choose from 6 values instead of infinite possibilities, reducing bikeshedding.\n3. **Predictable responsiveness** -- A base-4 scale divides evenly across common breakpoints and container sizes.\n4. **Maintainability** -- Changing the scale in one place propagates cleanly; random values require auditing every usage.\n\n## Assertions\n\n- No CSS property `margin`, `padding`, `gap`, `top`, `right`, `bottom`, `left`, `inset`, or `row-gap`/`column-gap` may contain a value outside the set `[4, 8, 12, 16, 24, 32]` (px) or their rem equivalents `[0.25, 0.5, 0.75, 1, 1.5, 2]`.\n- Zero (`0`) is always permitted (no spacing).\n- Negative margins are allowed only if the absolute value is in the allowed set.\n- Token names matching `/space-/` must resolve to one of the allowed values.",
|
|
22
|
-
"tags": ["spacing", "layout", "rhythm", "design-tokens"],
|
|
23
|
-
"tier": "agent"
|
|
24
|
-
}
|
|
25
|
-
]
|
|
26
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "design",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "pattern-design-quick-component-variant-enum-over-boolean-prop-explosion",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "design",
|
|
9
|
-
"title": "Component variant enum over boolean prop explosion",
|
|
10
|
-
"severity": "warning",
|
|
11
|
-
"description": "# Component variant enum over boolean prop explosion\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nDesign system components must use a single variant enum prop instead of multiple boolean props. Boolean explosion: isLarge, isBold, isPrimary creates 2^3=8 combinations, most invalid. Variant enum: variant='primary'|'secondary'|'destructive'|'outline'|'ghost' makes valid states explicit and invalid states unrepresentable. This pattern is enforced via api-constraints intelligence data and component dev rules.\n\n## Example\n\n```typescript\nBad: <Button isLarge isPrimary isBold>. Good: <Button variant='primary' size='lg'>\n```\n\n## Why\n\nBoolean props create combinatorial explosion of untested states. Variant enums make the valid state space explicit and testable.",
|
|
12
|
-
"tags": ["variants", "api-design", "boolean-explosion", "type-safety", "components"]
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"id": "pattern-design-quick-atomic-design-classification-5-levels-from-atom-to",
|
|
16
|
-
"type": "rule",
|
|
17
|
-
"domain": "design",
|
|
18
|
-
"title": "Atomic design classification: 5 levels from atom to page",
|
|
19
|
-
"severity": "critical",
|
|
20
|
-
"description": "# Atomic design classification: 5 levels from atom to page\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nSalvador classifies all UI elements into 5 atomic design levels defined in chains/domains/ui-components.yaml. Atom: single-responsibility elements (Button, Input, Icon). Molecule: small groups (FormField = label+input+error). Organism: complex sections (Form, Modal, DataTable). Template: page layouts (DashboardLayout). Page: full screens (LoginPage). Classification drives UX law selection in UX-AUDITOR-flow — atoms get Fitts's Law, organisms get Hick's Law.\n\n## Example\n\n```typescript\nButton (atom) → FormField (molecule) → LoginForm (organism) → AuthLayout (template) → LoginPage (page)\n```\n\n## Why\n\nAtomic level determines which UX laws apply, which validation chains run, and how components compose. Skipping levels creates maintenance debt.",
|
|
21
|
-
"tags": ["atomic-design", "classification", "component-hierarchy", "ux-laws"]
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"id": "pattern-design-quick-semantic-color-context-mapping-with-depth-levels",
|
|
25
|
-
"type": "rule",
|
|
26
|
-
"domain": "design",
|
|
27
|
-
"title": "Semantic color context mapping with depth levels",
|
|
28
|
-
"severity": "critical",
|
|
29
|
-
"description": "# Semantic color context mapping with depth levels\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nColor intelligence uses context-aware depth levels for semantic color assignment. Page (depth 0): broadest context, lightest backgrounds. Card (depth 2): elevated surface, subtle distinction. Surface (depth 3): interactive or nested areas. Button (depth 4): highest contrast. Each depth defines text color hierarchy (primary > secondary > muted) and valid background/foreground pairs. The validate-colors composite checks both light and dark mode variants at each depth.\n\n## Example\n\n```typescript\nPage depth-0: bg-page + text-primary. Card depth-2: bg-card + text-primary. Button depth-4: bg-primary-500 + text-inverse.\n```\n\n## Why\n\nContext-aware colors prevent accessibility failures when nesting components. A text color valid on a page background may fail on a card background.",
|
|
30
|
-
"tags": ["color", "context", "depth-levels", "semantic", "dark-mode"]
|
|
31
|
-
}
|
|
32
|
-
]
|
|
33
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "styling",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "pattern-styling-quick-arbitrary-tailwind-value-blocking-to-enforce-token",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "styling",
|
|
9
|
-
"title": "Arbitrary Tailwind value blocking to enforce token-only spacing",
|
|
10
|
-
"severity": "critical",
|
|
11
|
-
"description": "# Arbitrary Tailwind value blocking to enforce token-only spacing\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nThe forbidden-primitive-tokens rule in chains/rules/enforcement.yaml blocks arbitrary Tailwind values like w-[200px], p-[15px], shadow-[...], and !important. These bypass the design token system and create inconsistent spacing/sizing. Instead, use named Tailwind classes from the design token scale (p-2, gap-4, w-full) which map to the two-layer spacing system (4pt precision + 8pt rhythm). The rule fires as a blocking action on .tsx files.\n\n## Example\n\n```typescript\nBlocked: className='w-[200px] p-[15px]'. Fix: className='w-48 p-4' (uses token scale).\n```\n\n## Why\n\nArbitrary values create visual inconsistency and break theme portability. Token-only spacing ensures all components align to the same grid.",
|
|
12
|
-
"tags": ["tailwind", "arbitrary-values", "spacing", "tokens", "enforcement"]
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"id": "pattern-styling-two-layer-spacing-system",
|
|
16
|
-
"type": "pattern",
|
|
17
|
-
"domain": "styling",
|
|
18
|
-
"title": "Two-Layer Spacing System (4pt Precision + 8pt Rhythm)",
|
|
19
|
-
"severity": "critical",
|
|
20
|
-
"description": "# Two-Layer Spacing System\n\n## Context\n\nSpacing inconsistency is one of the most common design system violations. Teams often debate \"4pt grid vs 8pt grid\" as if they're mutually exclusive. The solution is not choosing one — it's assigning responsibility to each.\n\n## Pattern\n\n**One scale, two layers.** Use a single unified scale with role-based layer assignment:\n\n**Scale:** `4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48`\n\n**4pt precision layer** — handles detail:\n- Icons and text alignment (4px gap)\n- Typography baseline adjustments (4px increments)\n- Internal component spacing (12px, 20px)\n- Fine-grained padding where 8pt is too coarse\n\n**8pt rhythm layer** — creates rhythm:\n- Layout-level spacing (16px, 24px, 32px)\n- Component padding and margins\n- Section spacing (40px, 48px)\n- Page-level divisions\n\n**Baseline grid:** Typography must snap to the 8pt baseline grid. Line-heights should be multiples of 8px (16px, 24px, 32px) so text aligns across columns and components.\n\n**Philosophy:** Parsed, not guessed. Spacing values must be enforced programmatically — never eyeballed.\n\n## Example\n\n```tsx\n// CORRECT: Values from the scale, layers respected\n<Card className=\"p-6\"> {/* 24px: rhythm layer */}\n <div className=\"flex gap-1\"> {/* 4px: precision layer (icon-text) */}\n <Icon size={16} />\n <span>Label</span>\n </div>\n <div className=\"mt-4\"> {/* 16px: rhythm layer (content gap) */}\n <p className=\"leading-6\"> {/* 24px line-height: snaps to 8pt baseline */}\n Content text here\n </p>\n </div>\n</Card>\n\n// WRONG: Random off-grid values\n<Card style={{ padding: '18px' }}> {/* 18px: OFF GRID */}\n <div style={{ gap: '5px' }}> {/* 5px: OFF GRID */}\n <Icon size={16} />\n <span>Label</span>\n </div>\n <div style={{ marginTop: '29px' }}> {/* 29px: OFF GRID */}\n <p style={{ lineHeight: '15px' }}> {/* 15px: OFF BASELINE GRID */}\n Content text here\n </p>\n </div>\n</Card>\n```\n\n## Why\n\n- **Consistent grid creates clarity** — users perceive visual harmony even if they can't articulate why\n- **Random values confuse users** — 5px, 7px, 18px, 29px create subtle visual noise that erodes trust\n- **Two layers prevent the false choice** — 4pt and 8pt serve different roles, not competing philosophies\n- **Baseline grid anchors typography** — text that snaps to the grid feels intentional and aligned\n- **Parsed, not guessed** — programmatic enforcement catches violations that the human eye misses",
|
|
21
|
-
"tags": [
|
|
22
|
-
"spacing",
|
|
23
|
-
"grid",
|
|
24
|
-
"4pt",
|
|
25
|
-
"8pt",
|
|
26
|
-
"baseline",
|
|
27
|
-
"rhythm",
|
|
28
|
-
"precision",
|
|
29
|
-
"layout",
|
|
30
|
-
"design-system"
|
|
31
|
-
],
|
|
32
|
-
"appliesTo": ["all-components", "layouts", "typography"]
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "pattern-styling-quick-token-enforcement-pyramid-blocked-forbidden-prefer",
|
|
36
|
-
"type": "pattern",
|
|
37
|
-
"domain": "styling",
|
|
38
|
-
"title": "Token enforcement pyramid: blocked → forbidden → preferred layers",
|
|
39
|
-
"severity": "critical",
|
|
40
|
-
"description": "# Token enforcement pyramid: blocked → forbidden → preferred layers\n\n## Context\n\nCaptured during development session on 2026-02-21\n\n## Pattern\n\nSalvador enforces color/token usage via a 3-layer pyramid in chains/rules/enforcement.yaml. Layer 1 (Blocked): hardcoded #hex values, rgb(), rgba(), drop-shadow-*, arbitrary Tailwind values like w-[200px]. Layer 2 (Forbidden): primitive token names text-white, text-black, bg-white, bg-black, and direct primitive imports (import { PRIMARY }). Layer 3 (Preferred): semantic tokens text-error, bg-warning, border-accent. Each layer has increasing strictness from suggestion to blocking action.\n\n## Example\n\n```typescript\nBlocked: style={{ color: '#FF0000' }}. Forbidden: className='text-white'. Preferred: className='text-inverse'.\n```\n\n## Why\n\nThe pyramid provides graduated enforcement — hardcoded values are caught immediately, primitive tokens get warnings, and semantic tokens are the only path that passes all gates.",
|
|
41
|
-
"tags": ["tokens", "enforcement", "pyramid", "blocked", "semantic-colors"]
|
|
42
|
-
}
|
|
43
|
-
]
|
|
44
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "ux-laws",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "canonical-ux-border-radius",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "ux-laws",
|
|
9
|
-
"title": "Border Radius Scale",
|
|
10
|
-
"severity": "critical",
|
|
11
|
-
"description": "## Rule\n\nAll border-radius values MUST use only the following scale:\n\n| Token | Value | Use Case |\n|-------|-------|----------|\n| radius-none | **0px** | Data tables, code blocks, sharp-edged containers |\n| radius-sm | **4px** | Subtle rounding: inputs, badges, tooltips, chips |\n| radius-md | **8px** | Prominent rounding: cards, modals, dropdowns, buttons |\n| radius-full | **9999px** | Circular elements only: avatars, status dots, icon badges |\n\n### Usage Rules\n\n- **0px** (`radius-none`): Required for data tables (`<table>`), code blocks (`<pre>`, `<code>`), and any element where sharp edges communicate precision or structure.\n- **4px** (`radius-sm`): Default for inline and small interactive elements -- text inputs, select dropdowns, badges, tags, tooltips.\n- **8px** (`radius-md`): Default for container and overlay elements -- cards, dialogs, modals, popovers, dropdown menus, buttons.\n- **9999px** (`radius-full`): Restricted to inherently circular or pill-shaped elements: user avatars, status indicator dots, and small icon badges. Never apply to rectangular content containers, cards, or buttons (use `radius-md` for pill-shaped buttons if needed).\n\n### Forbidden\n\n- Arbitrary values: `2px`, `3px`, `6px`, `10px`, `12px`, `16px`, `20px`, `24px`.\n- Using `rounded-full` on non-avatar, non-badge elements (cards, modals, containers).\n- Mixing different radii on the same element (e.g., `border-radius: 4px 8px 4px 8px`).\n\n## Why\n\n1. **Visual language** -- Consistent corner rounding creates a recognizable shape language. When everything uses the same radii, the interface feels cohesive and intentional.\n2. **Hierarchy signaling** -- The two primary values (4px and 8px) create a subtle hierarchy: smaller elements get less rounding, larger containers get more. This mapping helps users distinguish interactive controls from content containers.\n3. **Avoiding the \"pillow\" effect** -- Unrestricted border-radius leads to over-rounded interfaces where elements look inflated and boundaries between components become ambiguous.\n4. **Design-to-code fidelity** -- A constrained set of values eliminates guesswork when translating designs to code and prevents per-component radius drift.\n\n## Assertions\n\n- No `border-radius` property may resolve to a value outside `[0, 4, 8, 9999]` px.\n- Elements with `radius-full` (9999px) must be one of: avatar, status dot, or icon badge.\n- Data table elements (`<table>`, `<thead>`, `<tbody>`, `<tr>`, `<td>`, `<th>`) must have `border-radius: 0`.\n- Code block elements (`<pre>`, `<code>`) must have `border-radius: 0`.\n- No element may have mixed corner radii (all four corners must use the same value).",
|
|
12
|
-
"tags": ["border-radius", "shape", "corners", "design-tokens"],
|
|
13
|
-
"tier": "agent"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"id": "canonical-ux-loading-states",
|
|
17
|
-
"type": "pattern",
|
|
18
|
-
"domain": "ux-laws",
|
|
19
|
-
"title": "Loading States",
|
|
20
|
-
"severity": "critical",
|
|
21
|
-
"description": "## Rule\n\nLoading indicators MUST use the correct pattern based on what is loading:\n\n| Context | Pattern | Example |\n|---------|---------|---------|\n| **Content areas** (pages, lists, cards, feeds, dashboards) | **Skeleton loader** | Gray placeholder shapes matching the expected layout |\n| **User-initiated actions** (button click, form submit, toggle) | **Spinner** | Inline spinner within the triggering element |\n\n### Skeleton Loaders (Content)\n\n- Skeleton shapes MUST approximate the dimensions and position of the content they replace: a text line skeleton should be the width and height of a text line, an avatar skeleton should be a circle the size of the avatar.\n- Use a subtle shimmer animation (left-to-right gradient sweep) to indicate activity. Static gray blocks feel broken.\n- Color: `bg-skeleton` token (typically 10-15% opacity of the text color on the surface background).\n- Do not show skeleton state for longer than 10 seconds. If loading exceeds 10 seconds, transition to an explicit \"still loading\" message with a retry option.\n- Remove skeleton elements individually as content loads (progressive reveal), not all at once.\n\n### Spinners (Actions)\n\n- Use spinners **only** for discrete user actions: button submissions, toggle switches, inline saves.\n- The spinner replaces the element's label/icon while maintaining the element's dimensions (no layout shift).\n- Set `aria-busy=\"true\"` on the element or region while loading.\n- Spinner size: 16px for inline/button use, 24px for standalone section loaders.\n- Spinner color: inherit from the parent element's text color token.\n\n### Forbidden Patterns\n\n- **Full-page spinners**: Never block the entire viewport with a centered spinner. Use skeleton loaders for page-level content.\n- **Spinners for content areas**: A spinner in the middle of a card grid or feed provides no spatial context for what will load.\n- **No loading indicator**: Content that takes > 300ms to appear must have a loading indicator. Below 300ms, no indicator is needed (avoid flicker).\n- **Progress bars for indeterminate loads**: Do not show a progress bar unless you can report real completion percentage.\n\n### Timing\n\n- Delay showing any loading indicator by **300ms**. If the content arrives within 300ms, skip the indicator entirely to avoid a flash.\n- After 300ms, show the skeleton or spinner immediately (no fade-in delay).\n\n## Why\n\n1. **Perceived performance** -- Skeleton loaders make the interface feel faster because the user sees a structural preview of the page. Research (Luke Wroblewski, Google) shows skeleton screens reduce perceived wait time by up to 35% compared to spinners.\n2. **Spatial expectation** -- Skeletons set spatial expectations: the user knows where content will appear, so the page feels stable when content fills in. Spinners provide no spatial information.\n3. **Action feedback** -- Spinners within buttons and toggles give immediate feedback that the user's action was received, preventing duplicate submissions.\n4. **Layout stability** -- Skeletons that match content dimensions prevent cumulative layout shift (CLS), which improves both user experience and Core Web Vitals scores.\n\n## Assertions\n\n- Content areas (page sections, card grids, lists, feeds) must use skeleton loaders, not spinners.\n- Button and form-submit loading states must use inline spinners, not skeleton loaders.\n- No full-page spinner overlay may be used as a loading pattern.\n- Skeleton shapes must approximate the dimensions of the content they replace.\n- Loading indicators must not appear for loads completing in < 300ms.\n- Spinner elements must set `aria-busy=\"true\"` on the loading region.\n- Skeleton color must use the `bg-skeleton` design token or equivalent.\n- Loading spinner must not cause layout shift (parent element must maintain its dimensions).",
|
|
22
|
-
"tags": ["loading", "skeleton", "spinner", "perceived-performance", "ux"],
|
|
23
|
-
"tier": "agent"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "canonical-ux-typography-scale",
|
|
27
|
-
"type": "pattern",
|
|
28
|
-
"domain": "ux-laws",
|
|
29
|
-
"title": "Typography Scale",
|
|
30
|
-
"severity": "critical",
|
|
31
|
-
"description": "## Rule\n\nAll typographic sizing MUST use only the following three-tier scale:\n\n| Token | Font Size | Use Case |\n|----------|-----------|----------|\n| text-sm | **14px** (0.875rem) | Captions, helper text, metadata, labels |\n| text-md | **16px** (1rem) | Body text, form inputs, list items |\n| text-lg | **20px** (1.25rem) | Section headings, card titles, emphasis |\n\nNo other font sizes are permitted in the component library.\n\n### Line Height\n\n| Context | Line Height |\n|---------|-------------|\n| Body text (text-sm, text-md) | **1.5** (150%) |\n| Headings (text-lg) | **1.2** (120%) |\n\n### Font Weight\n\nOnly three weights are allowed:\n\n| Token | Weight | Use Case |\n|-------|--------|----------|\n| font-regular | **400** | Body text, descriptions, helper text |\n| font-semibold | **600** | Labels, subheadings, emphasis within body |\n| font-bold | **700** | Primary headings, strong callouts |\n\n### Forbidden\n\n- Font sizes outside `[14, 16, 20]` px (e.g., 10px, 12px, 13px, 18px, 24px, 32px).\n- Font weights outside `[400, 600, 700]` (e.g., 300 light, 500 medium, 800 extrabold).\n- Line heights below 1.2 or arbitrary values like 1.3, 1.4, 1.8.\n\n## Why\n\n1. **Visual hierarchy with restraint** -- Three sizes are sufficient to establish a clear hierarchy (primary, secondary, tertiary) without visual clutter. More sizes dilute the hierarchy and force users to decode subtle differences.\n2. **Readability** -- A 1.5 line height for body text ensures comfortable reading across languages and screen sizes. A 1.2 line height for headings keeps them compact and distinct from body text.\n3. **Consistency** -- Limiting weights to three prevents the \"font-weight soup\" where 300, 400, 500, 600, 700 all appear in the same view with no discernible logic.\n4. **Performance** -- Fewer font variations mean fewer font files to load, improving page load times and reducing layout shifts.\n\n## Assertions\n\n- No `font-size` property may resolve to a value outside `[14, 16, 20]` px or their rem equivalents `[0.875, 1, 1.25]`.\n- No `font-weight` property may resolve to a value outside `[400, 600, 700]`.\n- Body text elements (`<p>`, `<span>`, `<li>`, `<td>`) must have `line-height` of `1.5`.\n- Heading elements and tokens using text-lg must have `line-height` of `1.2`.\n- No `font-size` may use absolute keywords (`x-small`, `small`, `large`, `x-large`).",
|
|
32
|
-
"tags": ["typography", "scale", "font-size", "line-height", "font-weight"],
|
|
33
|
-
"tier": "agent"
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"domain": "ux",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"entries": [
|
|
5
|
-
{
|
|
6
|
-
"id": "pattern-ux-plan-summary-metadata",
|
|
7
|
-
"type": "pattern",
|
|
8
|
-
"domain": "ux",
|
|
9
|
-
"title": "Always include Plan Metadata in summaries",
|
|
10
|
-
"severity": "critical",
|
|
11
|
-
"description": "# Always include Plan Metadata in summaries\n\n## Context\n\nWhen presenting plan summaries to users after salvador_plan iterations\n\n## Pattern\n\nEvery plan summary MUST include a Plan Metadata table at the top with: Plan ID, Check ID, Grade (score/100), Status, and Expiration time\n\n## Example\n\n```typescript\n| Field | Value |\\n|-------|-------|\\n| **Plan ID** | 1770027538557_5cfbd0ba |\\n| **Check ID** | chk_plan_1770027538557_5cfbd0ba |\\n| **Grade** | A+ (95/100) |\\n| **Status** | READY_FOR_APPROVAL |\\n| **Expires** | 30 minutes from creation |\n```\n\n## Why\n\nWithout visible IDs, users cannot: (1) Resume plans after interruption, (2) Reference plans in future sessions, (3) Approve plans for task generation. The _checkId is the key to all plan operations.",
|
|
12
|
-
"tags": ["planning", "salvador", "presentation", "UX"]
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"id": "pattern-ux-preview-before-confirmation",
|
|
16
|
-
"type": "pattern",
|
|
17
|
-
"domain": "ux",
|
|
18
|
-
"title": "Show preview of changes BEFORE asking for confirmation",
|
|
19
|
-
"severity": "warning",
|
|
20
|
-
"description": "# Show preview of changes BEFORE asking for confirmation\n\n## Context\n\nInteractive prompts that ask yes/no should show what will happen first\n\n## Pattern\n\nWhen asking user to confirm a destructive action, first show the list of affected items (files to delete, hooks to remove, etc.), then ask for confirmation.\n\n## Example\n\n```typescript\nconsole.log('Files that will be removed:');\nfor (const f of filesToDelete) {\n console.log(` - ${f.path}`);\n}\nconsole.log('(These are safe to remove)');\nconst confirmed = await askQuestion('Proceed? [y/N] ');\n```\n\n## Why\n\nAsking 'Clean up duplicates? [y/N]' without showing WHICH duplicates forces user to guess or abort. Preview builds confidence in the decision.",
|
|
21
|
-
"tags": ["cli", "ux", "interactive", "confirmation"],
|
|
22
|
-
"appliesTo": ["scripts/setup-project.js"]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"id": "anti-pattern-ux-confirm-without-preview",
|
|
26
|
-
"type": "anti-pattern",
|
|
27
|
-
"domain": "ux",
|
|
28
|
-
"title": "Asking for confirmation without showing what will change",
|
|
29
|
-
"severity": "warning",
|
|
30
|
-
"description": "# Asking for confirmation without showing what will change\n\n## Context\n\nInteractive yes/no prompts that don't show the affected items\n\n## Anti-Pattern\n\nPrompting 'Clean up duplicates? [y/N]' without first listing which files will be deleted forces users to guess or abort.\n\n## Example (Bad)\n\n```typescript\n// BAD:\nconst confirmed = await askQuestion('Clean up? [y/N] ');\nif (confirmed) deleteFiles(analysis.duplicates);\n```\n\n## Why It's Wrong\n\nUsers don't know what they're agreeing to. They either abort (friction) or blindly confirm (risk). Preview eliminates both problems.\n\n## Correct Approach\n\nSee: [preview-before-confirmation](../../patterns/other/preview-before-confirmation.md)",
|
|
31
|
-
"tags": ["cli", "ux", "anti-pattern", "interactive"],
|
|
32
|
-
"appliesTo": ["scripts/setup-project.js"],
|
|
33
|
-
"context": "Related: preview-before-confirmation"
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "salvador-engineering",
|
|
3
|
-
"name": "Salvador Engineering — Architecture & Tooling",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Architecture patterns, CLI tooling, TypeScript enforcement, testing strategies, security patterns, and methodology. Extracted from Salvador's production vault.",
|
|
6
|
-
"domains": ["architecture", "tooling", "testing", "security"],
|
|
7
|
-
"vault": {
|
|
8
|
-
"dir": "vault"
|
|
9
|
-
}
|
|
10
|
-
}
|