heraspec 0.1.14 → 0.1.15

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 (174) hide show
  1. package/LICENSE +187 -0
  2. package/README.md +94 -95
  3. package/bin/heraspec.js +195 -80
  4. package/bin/heraspec.js.map +2 -2
  5. package/dist/core/templates/skills/README.md +41 -38
  6. package/dist/core/templates/skills/campaign-plan/skill.md +76 -0
  7. package/dist/core/templates/skills/campaign-plan/skill.vi.md +76 -0
  8. package/dist/core/templates/skills/campaign-plan-skill.md +76 -0
  9. package/dist/core/templates/skills/campaign-plan-skill.vi.md +76 -0
  10. package/dist/core/templates/skills/code-review/skill.md +70 -0
  11. package/dist/core/templates/skills/code-review/skill.vi.md +70 -0
  12. package/dist/core/templates/skills/code-review-skill.md +70 -0
  13. package/dist/core/templates/skills/code-review-skill.vi.md +70 -0
  14. package/dist/core/templates/skills/content-creation/skill.md +69 -0
  15. package/dist/core/templates/skills/content-creation/skill.vi.md +69 -0
  16. package/dist/core/templates/skills/content-creation-skill.md +69 -0
  17. package/dist/core/templates/skills/content-creation-skill.vi.md +69 -0
  18. package/dist/core/templates/skills/content-optimization/skill.md +104 -0
  19. package/dist/core/templates/skills/debug/skill.md +69 -0
  20. package/dist/core/templates/skills/debug/skill.vi.md +69 -0
  21. package/dist/core/templates/skills/debug-skill.md +69 -0
  22. package/dist/core/templates/skills/debug-skill.vi.md +69 -0
  23. package/dist/core/templates/skills/deploy-documentation/skill.md +408 -0
  24. package/dist/core/templates/skills/design-system/knowledge/design-systems/airbnb/DESIGN.md +246 -0
  25. package/dist/core/templates/skills/design-system/knowledge/design-systems/airtable/DESIGN.md +89 -0
  26. package/dist/core/templates/skills/design-system/knowledge/design-systems/apple/DESIGN.md +313 -0
  27. package/dist/core/templates/skills/design-system/knowledge/design-systems/bmw/DESIGN.md +180 -0
  28. package/dist/core/templates/skills/design-system/knowledge/design-systems/cal/DESIGN.md +259 -0
  29. package/dist/core/templates/skills/design-system/knowledge/design-systems/claude/DESIGN.md +312 -0
  30. package/dist/core/templates/skills/design-system/knowledge/design-systems/clay/DESIGN.md +304 -0
  31. package/dist/core/templates/skills/design-system/knowledge/design-systems/clickhouse/DESIGN.md +281 -0
  32. package/dist/core/templates/skills/design-system/knowledge/design-systems/cohere/DESIGN.md +266 -0
  33. package/dist/core/templates/skills/design-system/knowledge/design-systems/coinbase/DESIGN.md +129 -0
  34. package/dist/core/templates/skills/design-system/knowledge/design-systems/composio/DESIGN.md +307 -0
  35. package/dist/core/templates/skills/design-system/knowledge/design-systems/cursor/DESIGN.md +309 -0
  36. package/dist/core/templates/skills/design-system/knowledge/design-systems/elevenlabs/DESIGN.md +265 -0
  37. package/dist/core/templates/skills/design-system/knowledge/design-systems/expo/DESIGN.md +281 -0
  38. package/dist/core/templates/skills/design-system/knowledge/design-systems/figma/DESIGN.md +220 -0
  39. package/dist/core/templates/skills/design-system/knowledge/design-systems/framer/DESIGN.md +246 -0
  40. package/dist/core/templates/skills/design-system/knowledge/design-systems/hashicorp/DESIGN.md +278 -0
  41. package/dist/core/templates/skills/design-system/knowledge/design-systems/ibm/DESIGN.md +332 -0
  42. package/dist/core/templates/skills/design-system/knowledge/design-systems/index.json +72 -0
  43. package/dist/core/templates/skills/design-system/knowledge/design-systems/intercom/DESIGN.md +146 -0
  44. package/dist/core/templates/skills/design-system/knowledge/design-systems/kraken/DESIGN.md +125 -0
  45. package/dist/core/templates/skills/design-system/knowledge/design-systems/linear.app/DESIGN.md +367 -0
  46. package/dist/core/templates/skills/design-system/knowledge/design-systems/lovable/DESIGN.md +298 -0
  47. package/dist/core/templates/skills/design-system/knowledge/design-systems/minimax/DESIGN.md +257 -0
  48. package/dist/core/templates/skills/design-system/knowledge/design-systems/mintlify/DESIGN.md +326 -0
  49. package/dist/core/templates/skills/design-system/knowledge/design-systems/miro/DESIGN.md +108 -0
  50. package/dist/core/templates/skills/design-system/knowledge/design-systems/mistral.ai/DESIGN.md +261 -0
  51. package/dist/core/templates/skills/design-system/knowledge/design-systems/mongodb/DESIGN.md +266 -0
  52. package/dist/core/templates/skills/design-system/knowledge/design-systems/notion/DESIGN.md +309 -0
  53. package/dist/core/templates/skills/design-system/knowledge/design-systems/nvidia/DESIGN.md +293 -0
  54. package/dist/core/templates/skills/design-system/knowledge/design-systems/ollama/DESIGN.md +267 -0
  55. package/dist/core/templates/skills/design-system/knowledge/design-systems/opencode.ai/DESIGN.md +281 -0
  56. package/dist/core/templates/skills/design-system/knowledge/design-systems/pinterest/DESIGN.md +230 -0
  57. package/dist/core/templates/skills/design-system/knowledge/design-systems/posthog/DESIGN.md +256 -0
  58. package/dist/core/templates/skills/design-system/knowledge/design-systems/raycast/DESIGN.md +268 -0
  59. package/dist/core/templates/skills/design-system/knowledge/design-systems/replicate/DESIGN.md +261 -0
  60. package/dist/core/templates/skills/design-system/knowledge/design-systems/resend/DESIGN.md +303 -0
  61. package/dist/core/templates/skills/design-system/knowledge/design-systems/revolut/DESIGN.md +185 -0
  62. package/dist/core/templates/skills/design-system/knowledge/design-systems/runwayml/DESIGN.md +244 -0
  63. package/dist/core/templates/skills/design-system/knowledge/design-systems/sanity/DESIGN.md +357 -0
  64. package/dist/core/templates/skills/design-system/knowledge/design-systems/sentry/DESIGN.md +262 -0
  65. package/dist/core/templates/skills/design-system/knowledge/design-systems/spacex/DESIGN.md +194 -0
  66. package/dist/core/templates/skills/design-system/knowledge/design-systems/spotify/DESIGN.md +246 -0
  67. package/dist/core/templates/skills/design-system/knowledge/design-systems/stripe/DESIGN.md +322 -0
  68. package/dist/core/templates/skills/design-system/knowledge/design-systems/supabase/DESIGN.md +255 -0
  69. package/dist/core/templates/skills/design-system/knowledge/design-systems/superhuman/DESIGN.md +252 -0
  70. package/dist/core/templates/skills/design-system/knowledge/design-systems/together.ai/DESIGN.md +263 -0
  71. package/dist/core/templates/skills/design-system/knowledge/design-systems/uber/DESIGN.md +295 -0
  72. package/dist/core/templates/skills/design-system/knowledge/design-systems/vercel/DESIGN.md +310 -0
  73. package/dist/core/templates/skills/design-system/knowledge/design-systems/voltagent/DESIGN.md +323 -0
  74. package/dist/core/templates/skills/design-system/knowledge/design-systems/warp/DESIGN.md +253 -0
  75. package/dist/core/templates/skills/design-system/knowledge/design-systems/webflow/DESIGN.md +92 -0
  76. package/dist/core/templates/skills/design-system/knowledge/design-systems/wise/DESIGN.md +173 -0
  77. package/dist/core/templates/skills/design-system/knowledge/design-systems/x.ai/DESIGN.md +257 -0
  78. package/dist/core/templates/skills/design-system/knowledge/design-systems/zapier/DESIGN.md +328 -0
  79. package/dist/core/templates/skills/design-system/skill.md +176 -0
  80. package/dist/core/templates/skills/documents/skill.md +104 -0
  81. package/dist/core/templates/skills/e2e-test/skill.md +119 -0
  82. package/dist/core/templates/skills/email-sequence/skill.md +68 -0
  83. package/dist/core/templates/skills/email-sequence/skill.vi.md +68 -0
  84. package/dist/core/templates/skills/email-sequence-skill.md +68 -0
  85. package/dist/core/templates/skills/email-sequence-skill.vi.md +68 -0
  86. package/dist/core/templates/skills/git-embed/skill.md +57 -0
  87. package/dist/core/templates/skills/integration-test/skill.md +118 -0
  88. package/dist/core/templates/skills/knowledge/README.md +63 -63
  89. package/dist/core/templates/skills/knowledge/design-systems/index.json +72 -72
  90. package/dist/core/templates/skills/knowledge/frameworks/php/codeigniter/rise-cms/profile.json +27 -27
  91. package/dist/core/templates/skills/knowledge/frameworks/php/codeigniter/rise-cms/structure.md +137 -137
  92. package/dist/core/templates/skills/knowledge/frameworks/php/laravel/botble/profile.json +39 -39
  93. package/dist/core/templates/skills/knowledge/frameworks/php/laravel/botble/structure.md +207 -207
  94. package/dist/core/templates/skills/knowledge/frameworks/php/wordpress/core/profile.json +51 -51
  95. package/dist/core/templates/skills/knowledge/frameworks/php/wordpress/core/structure.md +369 -369
  96. package/dist/core/templates/skills/knowledge/index.json +65 -65
  97. package/dist/core/templates/skills/perfex-module/module-codebase/skill.md +110 -0
  98. package/dist/core/templates/skills/project-memory/skill.md +222 -0
  99. package/dist/core/templates/skills/project-memory/skill.vi.md +223 -0
  100. package/dist/core/templates/skills/seo-audit/skill.md +75 -0
  101. package/dist/core/templates/skills/seo-audit/skill.vi.md +75 -0
  102. package/dist/core/templates/skills/seo-audit-skill.md +75 -0
  103. package/dist/core/templates/skills/seo-audit-skill.vi.md +75 -0
  104. package/dist/core/templates/skills/smart-explore/skill.md +141 -0
  105. package/dist/core/templates/skills/sourcecode-analyzer/skill.md +210 -0
  106. package/dist/core/templates/skills/sourcecode-analyzer/skill.vi.md +210 -0
  107. package/dist/core/templates/skills/spec-writer/skill.md +61 -0
  108. package/dist/core/templates/skills/spec-writer/skill.vi.md +61 -0
  109. package/dist/core/templates/skills/spec-writer-skill.md +61 -0
  110. package/dist/core/templates/skills/spec-writer-skill.vi.md +61 -0
  111. package/dist/core/templates/skills/sql-queries/skill.md +67 -0
  112. package/dist/core/templates/skills/sql-queries/skill.vi.md +67 -0
  113. package/dist/core/templates/skills/sql-queries-skill.md +67 -0
  114. package/dist/core/templates/skills/sql-queries-skill.vi.md +67 -0
  115. package/dist/core/templates/skills/suggestion/skill.md +118 -0
  116. package/dist/core/templates/skills/system-design/skill.md +70 -0
  117. package/dist/core/templates/skills/system-design/skill.vi.md +70 -0
  118. package/dist/core/templates/skills/system-design-skill.md +70 -0
  119. package/dist/core/templates/skills/system-design-skill.vi.md +70 -0
  120. package/dist/core/templates/skills/tech-debt/skill.md +70 -0
  121. package/dist/core/templates/skills/tech-debt/skill.vi.md +70 -0
  122. package/dist/core/templates/skills/tech-debt-skill.md +70 -0
  123. package/dist/core/templates/skills/tech-debt-skill.vi.md +70 -0
  124. package/dist/core/templates/skills/ui-ux/data/charts.csv +26 -0
  125. package/dist/core/templates/skills/ui-ux/data/colors.csv +97 -0
  126. package/dist/core/templates/skills/ui-ux/data/design-systems.csv +54 -0
  127. package/dist/core/templates/skills/ui-ux/data/landing.csv +31 -0
  128. package/dist/core/templates/skills/ui-ux/data/pages-proposed.csv +22 -0
  129. package/dist/core/templates/skills/ui-ux/data/pages.csv +10 -0
  130. package/dist/core/templates/skills/ui-ux/data/products.csv +97 -0
  131. package/dist/core/templates/skills/ui-ux/data/prompts.csv +24 -0
  132. package/dist/core/templates/skills/ui-ux/data/stacks/flutter.csv +53 -0
  133. package/dist/core/templates/skills/ui-ux/data/stacks/html-tailwind.csv +56 -0
  134. package/dist/core/templates/skills/ui-ux/data/stacks/nextjs.csv +53 -0
  135. package/dist/core/templates/skills/ui-ux/data/stacks/react-native.csv +52 -0
  136. package/dist/core/templates/skills/ui-ux/data/stacks/react.csv +54 -0
  137. package/dist/core/templates/skills/ui-ux/data/stacks/svelte.csv +54 -0
  138. package/dist/core/templates/skills/ui-ux/data/stacks/swiftui.csv +51 -0
  139. package/dist/core/templates/skills/ui-ux/data/stacks/vue.csv +50 -0
  140. package/dist/core/templates/skills/ui-ux/data/styles.csv +59 -0
  141. package/dist/core/templates/skills/ui-ux/data/typography.csv +58 -0
  142. package/dist/core/templates/skills/ui-ux/data/ux-guidelines.csv +100 -0
  143. package/dist/core/templates/skills/ui-ux/scripts/CODE_EXPLANATION.md +394 -0
  144. package/dist/core/templates/skills/ui-ux/scripts/SEARCH_ALGORITHMS_COMPARISON.md +421 -0
  145. package/dist/core/templates/skills/ui-ux/scripts/SEARCH_MODES_GUIDE.md +238 -0
  146. package/dist/core/templates/skills/ui-ux/scripts/core.py +391 -0
  147. package/dist/core/templates/skills/ui-ux/scripts/search.py +73 -0
  148. package/dist/core/templates/skills/ui-ux/skill.md +595 -0
  149. package/dist/core/templates/skills/ui-ux/templates/accessibility-checklist.md +40 -0
  150. package/dist/core/templates/skills/ui-ux/templates/example-prompt-full-theme.md +333 -0
  151. package/dist/core/templates/skills/ui-ux/templates/page-types-guide.md +338 -0
  152. package/dist/core/templates/skills/ui-ux/templates/pages-proposed-summary.md +273 -0
  153. package/dist/core/templates/skills/ui-ux/templates/pre-delivery-checklist.md +42 -0
  154. package/dist/core/templates/skills/ui-ux/templates/prompt-template-full-theme.md +313 -0
  155. package/dist/core/templates/skills/ui-ux/templates/responsive-design.md +40 -0
  156. package/dist/core/templates/skills/unit-test/skill.md +111 -0
  157. package/dist/core/templates/skills/wordpress/plugin-check/skill.md +151 -0
  158. package/dist/core/templates/skills/wordpress/plugin-directory/skill.md +396 -0
  159. package/dist/core/templates/skills/wordpress/plugin-standard/skill.md +100 -0
  160. package/dist/core/templates/skills/wordpress/plugin-standard/templates/admin-dashboard.php +47 -0
  161. package/dist/core/templates/skills/wordpress/plugin-standard/templates/admin-settings.php +60 -0
  162. package/dist/core/templates/skills/wordpress/plugin-standard/templates/assets/admin-css.css +22 -0
  163. package/dist/core/templates/skills/wordpress/plugin-standard/templates/assets/admin-js.js +15 -0
  164. package/dist/core/templates/skills/wordpress/plugin-standard/templates/plugin-main.php +169 -0
  165. package/dist/core/templates/skills/wordpress/plugin-standard/templates/readme.txt +41 -0
  166. package/dist/core/templates/skills/wordpress/plugin-standard/templates/uninstall.php +21 -0
  167. package/dist/core/templates/skills/wordpress/ux-element/skill.md +83 -0
  168. package/dist/core/templates/skills/wordpress/ux-element/templates/Controller.php +50 -0
  169. package/dist/core/templates/skills/wordpress/ux-element/templates/Shortcode.php +23 -0
  170. package/dist/core/templates/skills/wordpress/ux-element/templates/Template.html +20 -0
  171. package/dist/core/templates/skills/wordpress/ux-element/templates/Thumbnail.svg +8 -0
  172. package/dist/core/templates/skills/wordpress/ux-element/templates/View.php +21 -0
  173. package/dist/index.js +195 -79
  174. package/package.json +1 -1
package/bin/heraspec.js CHANGED
@@ -214,95 +214,145 @@ var init_skills_template_map = __esm({
214
214
  SKILL_TEMPLATE_MAP = {
215
215
  // Cross-cutting skills
216
216
  "ui-ux": {
217
- templateFileName: "ui-ux-skill.md",
217
+ templateFileName: "ui-ux/skill.md",
218
218
  isCrossCutting: true,
219
- resourceDirs: ["scripts", "templates", "data"]
219
+ resourceDirs: ["ui-ux/scripts", "ui-ux/templates", "ui-ux/data"]
220
220
  },
221
221
  "design-system": {
222
- templateFileName: "design-system-skill.md",
222
+ templateFileName: "design-system/skill.md",
223
223
  isCrossCutting: true,
224
- resourceDirs: ["scripts", "data", "knowledge/design-systems"]
224
+ resourceDirs: ["ui-ux/scripts", "ui-ux/data", "design-system/knowledge/design-systems"]
225
225
  },
226
226
  "documents": {
227
- templateFileName: "documents-skill.md",
227
+ templateFileName: "documents/skill.md",
228
228
  isCrossCutting: true,
229
229
  resourceDirs: ["documents/templates"]
230
230
  },
231
231
  "content-optimization": {
232
- templateFileName: "content-optimization-skill.md",
232
+ templateFileName: "content-optimization/skill.md",
233
233
  isCrossCutting: true
234
234
  },
235
235
  "unit-test": {
236
- templateFileName: "unit-test-skill.md",
236
+ templateFileName: "unit-test/skill.md",
237
237
  isCrossCutting: true
238
238
  },
239
239
  "integration-test": {
240
- templateFileName: "integration-test-skill.md",
240
+ templateFileName: "integration-test/skill.md",
241
241
  isCrossCutting: true
242
242
  },
243
243
  "e2e-test": {
244
- templateFileName: "e2e-test-skill.md",
244
+ templateFileName: "e2e-test/skill.md",
245
245
  isCrossCutting: true
246
246
  },
247
247
  "suggestion": {
248
- templateFileName: "suggestion-skill.md",
248
+ templateFileName: "suggestion/skill.md",
249
249
  isCrossCutting: true
250
250
  },
251
251
  "sourcecode-analyzer": {
252
- templateFileName: "sourcecode-analyzer-skill.md",
252
+ templateFileName: "sourcecode-analyzer/skill.md",
253
253
  isCrossCutting: true,
254
- viFileName: "sourcecode-analyzer-skill.vi.md"
254
+ viFileName: "sourcecode-analyzer/skill.vi.md"
255
255
  },
256
256
  "project-memory": {
257
- templateFileName: "project-memory-skill.md",
258
- viFileName: "project-memory-skill.vi.md",
257
+ templateFileName: "project-memory/skill.md",
258
+ viFileName: "project-memory/skill.vi.md",
259
259
  isCrossCutting: true
260
260
  },
261
261
  "smart-explore": {
262
- templateFileName: "smart-explore-skill.md",
262
+ templateFileName: "smart-explore/skill.md",
263
263
  isCrossCutting: true
264
264
  },
265
265
  "deploy-documentation": {
266
- templateFileName: "deploy-documentation-skill.md",
266
+ templateFileName: "deploy-documentation/skill.md",
267
267
  isCrossCutting: true,
268
- resourceDirs: ["templates"]
268
+ resourceDirs: ["ui-ux/templates"]
269
+ },
270
+ "code-review": {
271
+ templateFileName: "code-review/skill.md",
272
+ viFileName: "code-review/skill.vi.md",
273
+ isCrossCutting: true
274
+ },
275
+ "debug": {
276
+ templateFileName: "debug/skill.md",
277
+ viFileName: "debug/skill.vi.md",
278
+ isCrossCutting: true
279
+ },
280
+ "system-design": {
281
+ templateFileName: "system-design/skill.md",
282
+ viFileName: "system-design/skill.vi.md",
283
+ isCrossCutting: true
284
+ },
285
+ "tech-debt": {
286
+ templateFileName: "tech-debt/skill.md",
287
+ viFileName: "tech-debt/skill.vi.md",
288
+ isCrossCutting: true
289
+ },
290
+ "spec-writer": {
291
+ templateFileName: "spec-writer/skill.md",
292
+ viFileName: "spec-writer/skill.vi.md",
293
+ isCrossCutting: true
294
+ },
295
+ "seo-audit": {
296
+ templateFileName: "seo-audit/skill.md",
297
+ viFileName: "seo-audit/skill.vi.md",
298
+ isCrossCutting: true
299
+ },
300
+ "campaign-plan": {
301
+ templateFileName: "campaign-plan/skill.md",
302
+ viFileName: "campaign-plan/skill.vi.md",
303
+ isCrossCutting: true
304
+ },
305
+ "content-creation": {
306
+ templateFileName: "content-creation/skill.md",
307
+ viFileName: "content-creation/skill.vi.md",
308
+ isCrossCutting: true
309
+ },
310
+ "email-sequence": {
311
+ templateFileName: "email-sequence/skill.md",
312
+ viFileName: "email-sequence/skill.vi.md",
313
+ isCrossCutting: true
314
+ },
315
+ "sql-queries": {
316
+ templateFileName: "sql-queries/skill.md",
317
+ viFileName: "sql-queries/skill.vi.md",
318
+ isCrossCutting: true
269
319
  },
270
320
  // Perfex module skills
271
321
  "perfex-module:module-codebase": {
272
- templateFileName: "module-codebase-skill.md",
322
+ templateFileName: "perfex-module/module-codebase/skill.md",
273
323
  isCrossCutting: false,
274
324
  projectType: "perfex-module"
275
325
  },
276
326
  "wordpress:ux-element": {
277
- templateFileName: "ux-element-skill.md",
327
+ templateFileName: "wordpress/ux-element/skill.md",
278
328
  isCrossCutting: false,
279
329
  projectType: "wordpress",
280
- resourceDirs: ["ux-element/templates"]
330
+ resourceDirs: ["wordpress/ux-element/templates"]
281
331
  },
282
332
  "wordpress:plugin-standard": {
283
- templateFileName: "wordpress-plugin-standard-skill.md",
333
+ templateFileName: "wordpress/plugin-standard/skill.md",
284
334
  isCrossCutting: false,
285
335
  projectType: "wordpress",
286
- resourceDirs: ["wordpress-plugin-standard/templates"]
336
+ resourceDirs: ["wordpress/plugin-standard/templates"]
287
337
  },
288
338
  "wordpress:plugin-check": {
289
- templateFileName: "wordpress-plugin-check-skill.md",
339
+ templateFileName: "wordpress/plugin-check/skill.md",
290
340
  isCrossCutting: false,
291
341
  projectType: "wordpress"
292
342
  },
293
343
  "wordpress:plugin-directory": {
294
- templateFileName: "plugin-directory-skill.md",
344
+ templateFileName: "wordpress/plugin-directory/skill.md",
295
345
  isCrossCutting: false,
296
346
  projectType: "wordpress"
297
347
  },
298
348
  // WordPress Plugin specific (matches PROJECT_TYPES)
299
349
  "wordpress-plugin:plugin-check": {
300
- templateFileName: "wordpress-plugin-check-skill.md",
350
+ templateFileName: "wordpress/plugin-check/skill.md",
301
351
  isCrossCutting: false,
302
352
  projectType: "wordpress-plugin"
303
353
  },
304
354
  "wordpress-plugin:plugin-directory": {
305
- templateFileName: "plugin-directory-skill.md",
355
+ templateFileName: "wordpress/plugin-directory/skill.md",
306
356
  isCrossCutting: false,
307
357
  projectType: "wordpress-plugin"
308
358
  }
@@ -3076,7 +3126,7 @@ var init_skill = __esm({
3076
3126
  if (templateInfo.resourceDirs) {
3077
3127
  for (const resourceDir of templateInfo.resourceDirs) {
3078
3128
  const srcResourceDir = path7.join(coreTemplatesDir, resourceDir);
3079
- const destResourceDir = path7.join(destPath, resourceDir);
3129
+ const destResourceDir = path7.join(destPath, path7.basename(resourceDir));
3080
3130
  if (await FileSystemUtils.fileExists(srcResourceDir)) {
3081
3131
  await FileSystemUtils.copyDirectory(srcResourceDir, destResourceDir);
3082
3132
  }
@@ -3162,6 +3212,7 @@ This document defines the workflow for AI agents working with HeraSpec.
3162
3212
  - **SKILL PREREQUISITE**: If a task maps to a skill (e.g., "Generate documentation"), you **MUST** verify the skill folder exists in \`heraspec/skills/\`. If missing:
3163
3213
  - **Preferred**: Proactively install it via \`heraspec skill add <name>\` (e.g., \`heraspec skill add documents\`) if you have terminal access.
3164
3214
  - **Fallback**: If you cannot install it, **STOP** and ask the user to add it. **DO NOT** attempt manual generation without the skill.
3215
+ - **IGNORE VIETNAMESE SKILL FILES**: When reading and executing skill workflows, you **MUST ONLY** look at the English version of the skill instructions (e.g., \`skill.md\`). You **MUST completely ignore** all Vietnamese versions (e.g., \`skill.vi.md\` or files ending with \`*.vi.md\`). These Vietnamese files are for reference/development purposes by the user only.
3165
3216
  - **USER CONFIRMATION**: For destructive actions or public releases, always request explicit User approval first.
3166
3217
 
3167
3218
  ### Restricted Commands (REQUIRE USER CONFIRMATION)
@@ -3252,6 +3303,7 @@ The following commands are classified by risk level. You **MUST NOT** execute th
3252
3303
  - Understand purpose, steps, inputs, outputs
3253
3304
  - Follow tone, rules, and limitations
3254
3305
  - Check available templates and scripts
3306
+ - **Ignore Vietnamese Skill Files**: Only read the English \`skill.md\` instructions. Completely ignore any \`*.vi.md\` translation files.
3255
3307
 
3256
3308
  4. **Use skill resources**:
3257
3309
  - Run scripts from \`scripts/\` folder if needed
@@ -3458,6 +3510,7 @@ If \\\`heraspec/skills/smart-explore/\\\` exists, prefer token-efficient explora
3458
3510
  > heraspec skill add documents"
3459
3511
  - **DO NOT** create a task plan or attempt manual generation without the skill language.
3460
3512
  3. **Execute After Install**: Only after the skill folder is created (or installed), read the \`skill.md\` and proceed with the task.
3513
+ 4. **Ignore Vietnamese Skill Files**: You MUST only read the English \`skill.md\` file inside the skill folder. Completely ignore all \`*.vi.md\` files (e.g., \`skill.vi.md\`), as they are strictly for reference purposes by human developers.
3461
3514
 
3462
3515
  **Example prompt for Documents skill:**
3463
3516
  If you need to generate multi-format documentation, use this prompt:
@@ -3824,20 +3877,86 @@ ${section.content.trimEnd()}`);
3824
3877
  }
3825
3878
  }
3826
3879
  /**
3827
- * Generic section replacer: replace content from marker to next ## header
3880
+ * Find the index of the next top-level H2 section in the markdown content.
3881
+ * Tracks fenced code blocks to ignore H2 headers inside code blocks.
3828
3882
  */
3829
- replaceSection(content, sectionMarker, newSection) {
3883
+ findSectionEndIndex(content, startIndex) {
3884
+ const lines = content.substring(startIndex).split(/\r?\n/);
3885
+ let offset = startIndex;
3886
+ let inCodeBlock = false;
3887
+ for (let i = 0; i < lines.length; i++) {
3888
+ const line = lines[i];
3889
+ const lineLengthWithNewline = line.length + (content.charAt(offset + line.length) === "\r" ? 2 : 1);
3890
+ if (i === 0) {
3891
+ offset += lineLengthWithNewline;
3892
+ continue;
3893
+ }
3894
+ if (line.trim().startsWith("```")) {
3895
+ inCodeBlock = !inCodeBlock;
3896
+ }
3897
+ if (!inCodeBlock && line.startsWith("## ")) {
3898
+ return offset;
3899
+ }
3900
+ offset += lineLengthWithNewline;
3901
+ }
3902
+ return content.length;
3903
+ }
3904
+ /**
3905
+ * Finds the start index of the next standard section in the sequence.
3906
+ * This is used to replace the entire section cleanly, even if there are internal H2s or duplicates.
3907
+ */
3908
+ findNextSectionIndex(content, startIndex, currentHeader) {
3909
+ const sectionsOrder = [
3910
+ ["## Universal Safety Rules"],
3911
+ ["## Core Workflow"],
3912
+ ["## Skills System", "## Skills system", "### Skills System", "### skills system"],
3913
+ ["## Proactive Memory-Aware Development", "## Memory-Aware Development"]
3914
+ ];
3915
+ let currentGroupIndex = -1;
3916
+ for (let i = 0; i < sectionsOrder.length; i++) {
3917
+ if (sectionsOrder[i].some((h) => currentHeader.toLowerCase().trim() === h.toLowerCase().trim())) {
3918
+ currentGroupIndex = i;
3919
+ break;
3920
+ }
3921
+ }
3922
+ if (currentGroupIndex === -1) {
3923
+ return this.findSectionEndIndex(content, startIndex);
3924
+ }
3925
+ let nextSectionIndex = -1;
3926
+ for (let i = currentGroupIndex + 1; i < sectionsOrder.length; i++) {
3927
+ const variations = sectionsOrder[i];
3928
+ for (const variation of variations) {
3929
+ const idx = content.indexOf(variation, startIndex + currentHeader.length);
3930
+ if (idx !== -1) {
3931
+ if (nextSectionIndex === -1 || idx < nextSectionIndex) {
3932
+ nextSectionIndex = idx;
3933
+ }
3934
+ }
3935
+ }
3936
+ }
3937
+ if (nextSectionIndex !== -1) {
3938
+ return nextSectionIndex;
3939
+ }
3940
+ return this.findSectionEndIndex(content, startIndex);
3941
+ }
3942
+ /**
3943
+ * Generic section replacer: replace content from marker to next H2 header or endMarker
3944
+ */
3945
+ replaceSection(content, sectionMarker, newSection, endMarker) {
3830
3946
  const startIndex = content.indexOf(sectionMarker);
3831
3947
  if (startIndex === -1) return content;
3832
- let endIndex = content.indexOf("\n## ", startIndex + sectionMarker.length);
3948
+ let endIndex = -1;
3949
+ if (endMarker) {
3950
+ endIndex = content.indexOf(endMarker, startIndex + sectionMarker.length);
3951
+ }
3833
3952
  if (endIndex === -1) {
3834
- endIndex = content.length;
3953
+ endIndex = this.findNextSectionIndex(content, startIndex, sectionMarker);
3835
3954
  }
3836
3955
  const before = content.substring(0, startIndex).trimEnd();
3837
3956
  const after = content.substring(endIndex);
3838
3957
  return before + "\n\n" + newSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
3839
3958
  }
3840
- replaceSkillsSection(existingContent, newSkillsSection) {
3959
+ replaceSkillsSection(existingContent, newSkillsSection, endMarker) {
3841
3960
  const startMarkers = ["## Skills System", "## Skills system", "### Skills System", "### Skills system"];
3842
3961
  let startIndex = -1;
3843
3962
  let foundMarker = "";
@@ -3851,28 +3970,19 @@ ${section.content.trimEnd()}`);
3851
3970
  if (startIndex === -1) {
3852
3971
  return this.appendSkillsSection(existingContent, newSkillsSection);
3853
3972
  }
3854
- let endIndex = existingContent.indexOf("\n## ", startIndex + foundMarker.length);
3855
- if (endIndex === -1) {
3856
- endIndex = existingContent.indexOf("\n### ", startIndex + foundMarker.length);
3973
+ let endIndex = -1;
3974
+ if (endMarker) {
3975
+ endIndex = existingContent.indexOf(endMarker, startIndex + foundMarker.length);
3857
3976
  }
3858
3977
  if (endIndex === -1) {
3859
- endIndex = existingContent.length;
3978
+ endIndex = this.findNextSectionIndex(existingContent, startIndex, foundMarker);
3860
3979
  }
3861
3980
  const before = existingContent.substring(0, startIndex).trimEnd();
3862
3981
  const after = existingContent.substring(endIndex);
3863
3982
  return before + "\n\n" + newSkillsSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
3864
3983
  }
3865
3984
  replaceSafetyRules(existingContent, newSafetySection) {
3866
- const marker = "## Universal Safety Rules";
3867
- const startIndex = existingContent.indexOf(marker);
3868
- if (startIndex === -1) return existingContent;
3869
- let endIndex = existingContent.indexOf("\n## ", startIndex + marker.length);
3870
- if (endIndex === -1) {
3871
- endIndex = existingContent.length;
3872
- }
3873
- const before = existingContent.substring(0, startIndex).trimEnd();
3874
- const after = existingContent.substring(endIndex);
3875
- return before + "\n\n" + newSafetySection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
3985
+ return this.replaceSection(existingContent, "## Universal Safety Rules", newSafetySection, "## Core Workflow");
3876
3986
  }
3877
3987
  appendSkillsSection(existingContent, skillsSection) {
3878
3988
  const rulesMarker = "\n## Rules\n";
@@ -3966,7 +4076,7 @@ ${section.content.trimEnd()}`);
3966
4076
  if (templateInfo.resourceDirs) {
3967
4077
  for (const resourceDir of templateInfo.resourceDirs) {
3968
4078
  const srcResourceDir = path8.join(coreTemplatesDir, resourceDir);
3969
- const destResourceDir = path8.join(skillPath, resourceDir);
4079
+ const destResourceDir = path8.join(skillPath, path8.basename(resourceDir));
3970
4080
  if (await FileSystemUtils.fileExists(srcResourceDir)) {
3971
4081
  if (await FileSystemUtils.fileExists(destResourceDir)) {
3972
4082
  await FileSystemUtils.removeDirectory(destResourceDir, true);
@@ -4267,15 +4377,12 @@ python3 heraspec/skills/ui-ux/scripts/search.py "pricing plans" --domain pages
4267
4377
  1. Copy skill from HeraSpec core:
4268
4378
  \`\`\`bash
4269
4379
  # Copy UI/UX skill
4270
- cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/
4271
- cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/
4272
- cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/
4273
- cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/
4380
+ cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux heraspec/skills/
4274
4381
  \`\`\`
4275
4382
 
4276
4383
  2. Or use \`heraspec skill add ui-ux\` (if available)
4277
4384
 
4278
- 3. Read \`heraspec/skills/ui-ux/ui-ux-skill.md\` for complete documentation
4385
+ 3. Read \`heraspec/skills/ui-ux/skill.md\` for complete documentation
4279
4386
 
4280
4387
  ### Flatsome UX Element Skill
4281
4388
 
@@ -4425,7 +4532,7 @@ python3 heraspec/skills/ui-ux/scripts/search.py "product-detail single-product"
4425
4532
  ## \u{1F4DA} Detailed Documentation
4426
4533
 
4427
4534
  After copying UI/UX skill to your project, see:
4428
- - \`heraspec/skills/ui-ux/ui-ux-skill.md\` - Complete skill documentation
4535
+ - \`heraspec/skills/ui-ux/skill.md\` - Complete skill documentation
4429
4536
  - \`heraspec/skills/ui-ux/templates/example-prompt-full-theme.md\` - Detailed prompt examples
4430
4537
  - \`heraspec/skills/ui-ux/templates/prompt-template-full-theme.md\` - Copy-paste templates
4431
4538
 
@@ -4441,10 +4548,7 @@ After copying UI/UX skill to your project, see:
4441
4548
 
4442
4549
  1. Copy UI/UX skill to project:
4443
4550
  \`\`\`bash
4444
- cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/
4445
- cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/
4446
- cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/
4447
- cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/
4551
+ cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux heraspec/skills/
4448
4552
  \`\`\`
4449
4553
 
4450
4554
  2. Use prompt template from above
@@ -4471,32 +4575,45 @@ After copying UI/UX skill to your project, see:
4471
4575
  async updateReadmeFile(readmePath) {
4472
4576
  const existingContent = await FileSystemUtils.readFile(readmePath);
4473
4577
  const heraspecSection = this.getHeraSpecReadmeSection();
4474
- const sectionMarkers = [
4475
- "## HeraSpec",
4476
- "## HeraSpec Development",
4477
- "### HeraSpec",
4478
- "### HeraSpec Development",
4479
- "<!-- HeraSpec Section -->"
4480
- ];
4481
- let hasHeraSpecSection = false;
4482
4578
  let sectionStartIndex = -1;
4483
4579
  let sectionEndIndex = -1;
4484
- for (const marker of sectionMarkers) {
4485
- const index = existingContent.indexOf(marker);
4486
- if (index !== -1) {
4487
- hasHeraSpecSection = true;
4488
- sectionStartIndex = index;
4489
- sectionEndIndex = existingContent.indexOf("\n## ", index + marker.length);
4490
- if (sectionEndIndex === -1) {
4491
- sectionEndIndex = existingContent.indexOf("\n### ", index + marker.length);
4492
- }
4493
- if (sectionEndIndex === -1) {
4494
- sectionEndIndex = existingContent.length;
4580
+ const commentMarker = "<!-- HeraSpec Section -->";
4581
+ const commentIndex = existingContent.indexOf(commentMarker);
4582
+ if (commentIndex !== -1) {
4583
+ sectionStartIndex = commentIndex;
4584
+ const firstHeaderIndex = existingContent.indexOf("## ", commentIndex + commentMarker.length);
4585
+ if (firstHeaderIndex !== -1) {
4586
+ let nextHeaderIndex = existingContent.indexOf("\n## ", firstHeaderIndex + 3);
4587
+ if (nextHeaderIndex === -1) {
4588
+ nextHeaderIndex = existingContent.indexOf("\n### ", firstHeaderIndex + 3);
4589
+ }
4590
+ sectionEndIndex = nextHeaderIndex !== -1 ? nextHeaderIndex : existingContent.length;
4591
+ } else {
4592
+ sectionEndIndex = existingContent.length;
4593
+ }
4594
+ } else {
4595
+ const sectionMarkers = [
4596
+ "## HeraSpec Development",
4597
+ "## HeraSpec",
4598
+ "### HeraSpec Development",
4599
+ "### HeraSpec"
4600
+ ];
4601
+ for (const marker of sectionMarkers) {
4602
+ const index = existingContent.indexOf(marker);
4603
+ if (index !== -1) {
4604
+ sectionStartIndex = index;
4605
+ sectionEndIndex = existingContent.indexOf("\n## ", index + marker.length);
4606
+ if (sectionEndIndex === -1) {
4607
+ sectionEndIndex = existingContent.indexOf("\n### ", index + marker.length);
4608
+ }
4609
+ if (sectionEndIndex === -1) {
4610
+ sectionEndIndex = existingContent.length;
4611
+ }
4612
+ break;
4495
4613
  }
4496
- break;
4497
4614
  }
4498
4615
  }
4499
- if (hasHeraSpecSection && sectionStartIndex !== -1) {
4616
+ if (sectionStartIndex !== -1) {
4500
4617
  const before = existingContent.substring(0, sectionStartIndex).trimEnd();
4501
4618
  const after = existingContent.substring(sectionEndIndex);
4502
4619
  const updatedContent = before + "\n\n" + heraspecSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
@@ -4876,7 +4993,6 @@ This will archive "${changeName}" and merge delta specs into source specs.`);
4876
4993
  const archiveDir = path10.join(
4877
4994
  ".",
4878
4995
  HERASPEC_DIR_NAME,
4879
- CHANGES_DIR_NAME,
4880
4996
  ARCHIVES_DIR_NAME
4881
4997
  );
4882
4998
  await FileSystemUtils.createDirectory(archiveDir);
@@ -5200,7 +5316,6 @@ var RestoreCommand = class {
5200
5316
  const archivesDir = path12.join(
5201
5317
  ".",
5202
5318
  HERASPEC_DIR_NAME,
5203
- CHANGES_DIR_NAME,
5204
5319
  ARCHIVES_DIR_NAME
5205
5320
  );
5206
5321
  if (!await FileSystemUtils.fileExists(archivesDir)) {