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
@@ -0,0 +1,21 @@
1
+ <?php
2
+ /**
3
+ * Frontend view for {{ElementName}}
4
+ *
5
+ * @var array $atts
6
+ */
7
+
8
+ $classes = array('{{class_prefix}}{{element_slug}}');
9
+ if (!empty($atts['class'])) $classes[] = $atts['class'];
10
+ if (!empty($atts['visibility'])) $classes[] = $atts['visibility'];
11
+
12
+ $inline_style = '';
13
+ if (!empty($atts['textColor'])) $inline_style .= 'color: ' . esc_attr($atts['textColor']) . ';';
14
+ if (!empty($atts['bgColor'])) $inline_style .= 'background-color: ' . esc_attr($atts['bgColor']) . ';';
15
+
16
+ ?>
17
+ <div id="<?php echo esc_attr($atts['_id']); ?>"
18
+ class="<?php echo esc_attr(implode(' ', $classes)); ?>"
19
+ style="<?php echo esc_attr($inline_style); ?>">
20
+ <?php echo esc_html($atts['title']); ?>
21
+ </div>
package/dist/index.js CHANGED
@@ -294,95 +294,145 @@ var init_skills_template_map = __esm({
294
294
  SKILL_TEMPLATE_MAP = {
295
295
  // Cross-cutting skills
296
296
  "ui-ux": {
297
- templateFileName: "ui-ux-skill.md",
297
+ templateFileName: "ui-ux/skill.md",
298
298
  isCrossCutting: true,
299
- resourceDirs: ["scripts", "templates", "data"]
299
+ resourceDirs: ["ui-ux/scripts", "ui-ux/templates", "ui-ux/data"]
300
300
  },
301
301
  "design-system": {
302
- templateFileName: "design-system-skill.md",
302
+ templateFileName: "design-system/skill.md",
303
303
  isCrossCutting: true,
304
- resourceDirs: ["scripts", "data", "knowledge/design-systems"]
304
+ resourceDirs: ["ui-ux/scripts", "ui-ux/data", "design-system/knowledge/design-systems"]
305
305
  },
306
306
  "documents": {
307
- templateFileName: "documents-skill.md",
307
+ templateFileName: "documents/skill.md",
308
308
  isCrossCutting: true,
309
309
  resourceDirs: ["documents/templates"]
310
310
  },
311
311
  "content-optimization": {
312
- templateFileName: "content-optimization-skill.md",
312
+ templateFileName: "content-optimization/skill.md",
313
313
  isCrossCutting: true
314
314
  },
315
315
  "unit-test": {
316
- templateFileName: "unit-test-skill.md",
316
+ templateFileName: "unit-test/skill.md",
317
317
  isCrossCutting: true
318
318
  },
319
319
  "integration-test": {
320
- templateFileName: "integration-test-skill.md",
320
+ templateFileName: "integration-test/skill.md",
321
321
  isCrossCutting: true
322
322
  },
323
323
  "e2e-test": {
324
- templateFileName: "e2e-test-skill.md",
324
+ templateFileName: "e2e-test/skill.md",
325
325
  isCrossCutting: true
326
326
  },
327
327
  "suggestion": {
328
- templateFileName: "suggestion-skill.md",
328
+ templateFileName: "suggestion/skill.md",
329
329
  isCrossCutting: true
330
330
  },
331
331
  "sourcecode-analyzer": {
332
- templateFileName: "sourcecode-analyzer-skill.md",
332
+ templateFileName: "sourcecode-analyzer/skill.md",
333
333
  isCrossCutting: true,
334
- viFileName: "sourcecode-analyzer-skill.vi.md"
334
+ viFileName: "sourcecode-analyzer/skill.vi.md"
335
335
  },
336
336
  "project-memory": {
337
- templateFileName: "project-memory-skill.md",
338
- viFileName: "project-memory-skill.vi.md",
337
+ templateFileName: "project-memory/skill.md",
338
+ viFileName: "project-memory/skill.vi.md",
339
339
  isCrossCutting: true
340
340
  },
341
341
  "smart-explore": {
342
- templateFileName: "smart-explore-skill.md",
342
+ templateFileName: "smart-explore/skill.md",
343
343
  isCrossCutting: true
344
344
  },
345
345
  "deploy-documentation": {
346
- templateFileName: "deploy-documentation-skill.md",
346
+ templateFileName: "deploy-documentation/skill.md",
347
347
  isCrossCutting: true,
348
- resourceDirs: ["templates"]
348
+ resourceDirs: ["ui-ux/templates"]
349
+ },
350
+ "code-review": {
351
+ templateFileName: "code-review/skill.md",
352
+ viFileName: "code-review/skill.vi.md",
353
+ isCrossCutting: true
354
+ },
355
+ "debug": {
356
+ templateFileName: "debug/skill.md",
357
+ viFileName: "debug/skill.vi.md",
358
+ isCrossCutting: true
359
+ },
360
+ "system-design": {
361
+ templateFileName: "system-design/skill.md",
362
+ viFileName: "system-design/skill.vi.md",
363
+ isCrossCutting: true
364
+ },
365
+ "tech-debt": {
366
+ templateFileName: "tech-debt/skill.md",
367
+ viFileName: "tech-debt/skill.vi.md",
368
+ isCrossCutting: true
369
+ },
370
+ "spec-writer": {
371
+ templateFileName: "spec-writer/skill.md",
372
+ viFileName: "spec-writer/skill.vi.md",
373
+ isCrossCutting: true
374
+ },
375
+ "seo-audit": {
376
+ templateFileName: "seo-audit/skill.md",
377
+ viFileName: "seo-audit/skill.vi.md",
378
+ isCrossCutting: true
379
+ },
380
+ "campaign-plan": {
381
+ templateFileName: "campaign-plan/skill.md",
382
+ viFileName: "campaign-plan/skill.vi.md",
383
+ isCrossCutting: true
384
+ },
385
+ "content-creation": {
386
+ templateFileName: "content-creation/skill.md",
387
+ viFileName: "content-creation/skill.vi.md",
388
+ isCrossCutting: true
389
+ },
390
+ "email-sequence": {
391
+ templateFileName: "email-sequence/skill.md",
392
+ viFileName: "email-sequence/skill.vi.md",
393
+ isCrossCutting: true
394
+ },
395
+ "sql-queries": {
396
+ templateFileName: "sql-queries/skill.md",
397
+ viFileName: "sql-queries/skill.vi.md",
398
+ isCrossCutting: true
349
399
  },
350
400
  // Perfex module skills
351
401
  "perfex-module:module-codebase": {
352
- templateFileName: "module-codebase-skill.md",
402
+ templateFileName: "perfex-module/module-codebase/skill.md",
353
403
  isCrossCutting: false,
354
404
  projectType: "perfex-module"
355
405
  },
356
406
  "wordpress:ux-element": {
357
- templateFileName: "ux-element-skill.md",
407
+ templateFileName: "wordpress/ux-element/skill.md",
358
408
  isCrossCutting: false,
359
409
  projectType: "wordpress",
360
- resourceDirs: ["ux-element/templates"]
410
+ resourceDirs: ["wordpress/ux-element/templates"]
361
411
  },
362
412
  "wordpress:plugin-standard": {
363
- templateFileName: "wordpress-plugin-standard-skill.md",
413
+ templateFileName: "wordpress/plugin-standard/skill.md",
364
414
  isCrossCutting: false,
365
415
  projectType: "wordpress",
366
- resourceDirs: ["wordpress-plugin-standard/templates"]
416
+ resourceDirs: ["wordpress/plugin-standard/templates"]
367
417
  },
368
418
  "wordpress:plugin-check": {
369
- templateFileName: "wordpress-plugin-check-skill.md",
419
+ templateFileName: "wordpress/plugin-check/skill.md",
370
420
  isCrossCutting: false,
371
421
  projectType: "wordpress"
372
422
  },
373
423
  "wordpress:plugin-directory": {
374
- templateFileName: "plugin-directory-skill.md",
424
+ templateFileName: "wordpress/plugin-directory/skill.md",
375
425
  isCrossCutting: false,
376
426
  projectType: "wordpress"
377
427
  },
378
428
  // WordPress Plugin specific (matches PROJECT_TYPES)
379
429
  "wordpress-plugin:plugin-check": {
380
- templateFileName: "wordpress-plugin-check-skill.md",
430
+ templateFileName: "wordpress/plugin-check/skill.md",
381
431
  isCrossCutting: false,
382
432
  projectType: "wordpress-plugin"
383
433
  },
384
434
  "wordpress-plugin:plugin-directory": {
385
- templateFileName: "plugin-directory-skill.md",
435
+ templateFileName: "wordpress/plugin-directory/skill.md",
386
436
  isCrossCutting: false,
387
437
  projectType: "wordpress-plugin"
388
438
  }
@@ -3156,7 +3206,7 @@ var init_skill = __esm({
3156
3206
  if (templateInfo.resourceDirs) {
3157
3207
  for (const resourceDir of templateInfo.resourceDirs) {
3158
3208
  const srcResourceDir = path7.join(coreTemplatesDir, resourceDir);
3159
- const destResourceDir = path7.join(destPath, resourceDir);
3209
+ const destResourceDir = path7.join(destPath, path7.basename(resourceDir));
3160
3210
  if (await FileSystemUtils.fileExists(srcResourceDir)) {
3161
3211
  await FileSystemUtils.copyDirectory(srcResourceDir, destResourceDir);
3162
3212
  }
@@ -3312,6 +3362,7 @@ This document defines the workflow for AI agents working with HeraSpec.
3312
3362
  - **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:
3313
3363
  - **Preferred**: Proactively install it via \`heraspec skill add <name>\` (e.g., \`heraspec skill add documents\`) if you have terminal access.
3314
3364
  - **Fallback**: If you cannot install it, **STOP** and ask the user to add it. **DO NOT** attempt manual generation without the skill.
3365
+ - **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.
3315
3366
  - **USER CONFIRMATION**: For destructive actions or public releases, always request explicit User approval first.
3316
3367
 
3317
3368
  ### Restricted Commands (REQUIRE USER CONFIRMATION)
@@ -3402,6 +3453,7 @@ The following commands are classified by risk level. You **MUST NOT** execute th
3402
3453
  - Understand purpose, steps, inputs, outputs
3403
3454
  - Follow tone, rules, and limitations
3404
3455
  - Check available templates and scripts
3456
+ - **Ignore Vietnamese Skill Files**: Only read the English \`skill.md\` instructions. Completely ignore any \`*.vi.md\` translation files.
3405
3457
 
3406
3458
  4. **Use skill resources**:
3407
3459
  - Run scripts from \`scripts/\` folder if needed
@@ -3608,6 +3660,7 @@ If \\\`heraspec/skills/smart-explore/\\\` exists, prefer token-efficient explora
3608
3660
  > heraspec skill add documents"
3609
3661
  - **DO NOT** create a task plan or attempt manual generation without the skill language.
3610
3662
  3. **Execute After Install**: Only after the skill folder is created (or installed), read the \`skill.md\` and proceed with the task.
3663
+ 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.
3611
3664
 
3612
3665
  **Example prompt for Documents skill:**
3613
3666
  If you need to generate multi-format documentation, use this prompt:
@@ -3974,20 +4027,86 @@ ${section.content.trimEnd()}`);
3974
4027
  }
3975
4028
  }
3976
4029
  /**
3977
- * Generic section replacer: replace content from marker to next ## header
4030
+ * Find the index of the next top-level H2 section in the markdown content.
4031
+ * Tracks fenced code blocks to ignore H2 headers inside code blocks.
4032
+ */
4033
+ findSectionEndIndex(content, startIndex) {
4034
+ const lines = content.substring(startIndex).split(/\r?\n/);
4035
+ let offset = startIndex;
4036
+ let inCodeBlock = false;
4037
+ for (let i = 0; i < lines.length; i++) {
4038
+ const line = lines[i];
4039
+ const lineLengthWithNewline = line.length + (content.charAt(offset + line.length) === "\r" ? 2 : 1);
4040
+ if (i === 0) {
4041
+ offset += lineLengthWithNewline;
4042
+ continue;
4043
+ }
4044
+ if (line.trim().startsWith("```")) {
4045
+ inCodeBlock = !inCodeBlock;
4046
+ }
4047
+ if (!inCodeBlock && line.startsWith("## ")) {
4048
+ return offset;
4049
+ }
4050
+ offset += lineLengthWithNewline;
4051
+ }
4052
+ return content.length;
4053
+ }
4054
+ /**
4055
+ * Finds the start index of the next standard section in the sequence.
4056
+ * This is used to replace the entire section cleanly, even if there are internal H2s or duplicates.
3978
4057
  */
3979
- replaceSection(content, sectionMarker, newSection) {
4058
+ findNextSectionIndex(content, startIndex, currentHeader) {
4059
+ const sectionsOrder = [
4060
+ ["## Universal Safety Rules"],
4061
+ ["## Core Workflow"],
4062
+ ["## Skills System", "## Skills system", "### Skills System", "### skills system"],
4063
+ ["## Proactive Memory-Aware Development", "## Memory-Aware Development"]
4064
+ ];
4065
+ let currentGroupIndex = -1;
4066
+ for (let i = 0; i < sectionsOrder.length; i++) {
4067
+ if (sectionsOrder[i].some((h) => currentHeader.toLowerCase().trim() === h.toLowerCase().trim())) {
4068
+ currentGroupIndex = i;
4069
+ break;
4070
+ }
4071
+ }
4072
+ if (currentGroupIndex === -1) {
4073
+ return this.findSectionEndIndex(content, startIndex);
4074
+ }
4075
+ let nextSectionIndex = -1;
4076
+ for (let i = currentGroupIndex + 1; i < sectionsOrder.length; i++) {
4077
+ const variations = sectionsOrder[i];
4078
+ for (const variation of variations) {
4079
+ const idx = content.indexOf(variation, startIndex + currentHeader.length);
4080
+ if (idx !== -1) {
4081
+ if (nextSectionIndex === -1 || idx < nextSectionIndex) {
4082
+ nextSectionIndex = idx;
4083
+ }
4084
+ }
4085
+ }
4086
+ }
4087
+ if (nextSectionIndex !== -1) {
4088
+ return nextSectionIndex;
4089
+ }
4090
+ return this.findSectionEndIndex(content, startIndex);
4091
+ }
4092
+ /**
4093
+ * Generic section replacer: replace content from marker to next H2 header or endMarker
4094
+ */
4095
+ replaceSection(content, sectionMarker, newSection, endMarker) {
3980
4096
  const startIndex = content.indexOf(sectionMarker);
3981
4097
  if (startIndex === -1) return content;
3982
- let endIndex = content.indexOf("\n## ", startIndex + sectionMarker.length);
4098
+ let endIndex = -1;
4099
+ if (endMarker) {
4100
+ endIndex = content.indexOf(endMarker, startIndex + sectionMarker.length);
4101
+ }
3983
4102
  if (endIndex === -1) {
3984
- endIndex = content.length;
4103
+ endIndex = this.findNextSectionIndex(content, startIndex, sectionMarker);
3985
4104
  }
3986
4105
  const before = content.substring(0, startIndex).trimEnd();
3987
4106
  const after = content.substring(endIndex);
3988
4107
  return before + "\n\n" + newSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
3989
4108
  }
3990
- replaceSkillsSection(existingContent, newSkillsSection) {
4109
+ replaceSkillsSection(existingContent, newSkillsSection, endMarker) {
3991
4110
  const startMarkers = ["## Skills System", "## Skills system", "### Skills System", "### Skills system"];
3992
4111
  let startIndex = -1;
3993
4112
  let foundMarker = "";
@@ -4001,28 +4120,19 @@ ${section.content.trimEnd()}`);
4001
4120
  if (startIndex === -1) {
4002
4121
  return this.appendSkillsSection(existingContent, newSkillsSection);
4003
4122
  }
4004
- let endIndex = existingContent.indexOf("\n## ", startIndex + foundMarker.length);
4005
- if (endIndex === -1) {
4006
- endIndex = existingContent.indexOf("\n### ", startIndex + foundMarker.length);
4123
+ let endIndex = -1;
4124
+ if (endMarker) {
4125
+ endIndex = existingContent.indexOf(endMarker, startIndex + foundMarker.length);
4007
4126
  }
4008
4127
  if (endIndex === -1) {
4009
- endIndex = existingContent.length;
4128
+ endIndex = this.findNextSectionIndex(existingContent, startIndex, foundMarker);
4010
4129
  }
4011
4130
  const before = existingContent.substring(0, startIndex).trimEnd();
4012
4131
  const after = existingContent.substring(endIndex);
4013
4132
  return before + "\n\n" + newSkillsSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
4014
4133
  }
4015
4134
  replaceSafetyRules(existingContent, newSafetySection) {
4016
- const marker = "## Universal Safety Rules";
4017
- const startIndex = existingContent.indexOf(marker);
4018
- if (startIndex === -1) return existingContent;
4019
- let endIndex = existingContent.indexOf("\n## ", startIndex + marker.length);
4020
- if (endIndex === -1) {
4021
- endIndex = existingContent.length;
4022
- }
4023
- const before = existingContent.substring(0, startIndex).trimEnd();
4024
- const after = existingContent.substring(endIndex);
4025
- return before + "\n\n" + newSafetySection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
4135
+ return this.replaceSection(existingContent, "## Universal Safety Rules", newSafetySection, "## Core Workflow");
4026
4136
  }
4027
4137
  appendSkillsSection(existingContent, skillsSection) {
4028
4138
  const rulesMarker = "\n## Rules\n";
@@ -4116,7 +4226,7 @@ ${section.content.trimEnd()}`);
4116
4226
  if (templateInfo.resourceDirs) {
4117
4227
  for (const resourceDir of templateInfo.resourceDirs) {
4118
4228
  const srcResourceDir = path8.join(coreTemplatesDir, resourceDir);
4119
- const destResourceDir = path8.join(skillPath, resourceDir);
4229
+ const destResourceDir = path8.join(skillPath, path8.basename(resourceDir));
4120
4230
  if (await FileSystemUtils.fileExists(srcResourceDir)) {
4121
4231
  if (await FileSystemUtils.fileExists(destResourceDir)) {
4122
4232
  await FileSystemUtils.removeDirectory(destResourceDir, true);
@@ -4417,15 +4527,12 @@ python3 heraspec/skills/ui-ux/scripts/search.py "pricing plans" --domain pages
4417
4527
  1. Copy skill from HeraSpec core:
4418
4528
  \`\`\`bash
4419
4529
  # Copy UI/UX skill
4420
- cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/
4421
- cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/
4422
- cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/
4423
- cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/
4530
+ cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux heraspec/skills/
4424
4531
  \`\`\`
4425
4532
 
4426
4533
  2. Or use \`heraspec skill add ui-ux\` (if available)
4427
4534
 
4428
- 3. Read \`heraspec/skills/ui-ux/ui-ux-skill.md\` for complete documentation
4535
+ 3. Read \`heraspec/skills/ui-ux/skill.md\` for complete documentation
4429
4536
 
4430
4537
  ### Flatsome UX Element Skill
4431
4538
 
@@ -4575,7 +4682,7 @@ python3 heraspec/skills/ui-ux/scripts/search.py "product-detail single-product"
4575
4682
  ## \u{1F4DA} Detailed Documentation
4576
4683
 
4577
4684
  After copying UI/UX skill to your project, see:
4578
- - \`heraspec/skills/ui-ux/ui-ux-skill.md\` - Complete skill documentation
4685
+ - \`heraspec/skills/ui-ux/skill.md\` - Complete skill documentation
4579
4686
  - \`heraspec/skills/ui-ux/templates/example-prompt-full-theme.md\` - Detailed prompt examples
4580
4687
  - \`heraspec/skills/ui-ux/templates/prompt-template-full-theme.md\` - Copy-paste templates
4581
4688
 
@@ -4591,10 +4698,7 @@ After copying UI/UX skill to your project, see:
4591
4698
 
4592
4699
  1. Copy UI/UX skill to project:
4593
4700
  \`\`\`bash
4594
- cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux-skill.md heraspec/skills/ui-ux/
4595
- cp -r /path/to/HeraSpec/src/core/templates/skills/scripts heraspec/skills/ui-ux/
4596
- cp -r /path/to/HeraSpec/src/core/templates/skills/data heraspec/skills/ui-ux/
4597
- cp -r /path/to/HeraSpec/src/core/templates/skills/templates heraspec/skills/ui-ux/
4701
+ cp -r /path/to/HeraSpec/src/core/templates/skills/ui-ux heraspec/skills/
4598
4702
  \`\`\`
4599
4703
 
4600
4704
  2. Use prompt template from above
@@ -4621,32 +4725,45 @@ After copying UI/UX skill to your project, see:
4621
4725
  async updateReadmeFile(readmePath) {
4622
4726
  const existingContent = await FileSystemUtils.readFile(readmePath);
4623
4727
  const heraspecSection = this.getHeraSpecReadmeSection();
4624
- const sectionMarkers = [
4625
- "## HeraSpec",
4626
- "## HeraSpec Development",
4627
- "### HeraSpec",
4628
- "### HeraSpec Development",
4629
- "<!-- HeraSpec Section -->"
4630
- ];
4631
- let hasHeraSpecSection = false;
4632
4728
  let sectionStartIndex = -1;
4633
4729
  let sectionEndIndex = -1;
4634
- for (const marker of sectionMarkers) {
4635
- const index = existingContent.indexOf(marker);
4636
- if (index !== -1) {
4637
- hasHeraSpecSection = true;
4638
- sectionStartIndex = index;
4639
- sectionEndIndex = existingContent.indexOf("\n## ", index + marker.length);
4640
- if (sectionEndIndex === -1) {
4641
- sectionEndIndex = existingContent.indexOf("\n### ", index + marker.length);
4642
- }
4643
- if (sectionEndIndex === -1) {
4644
- sectionEndIndex = existingContent.length;
4730
+ const commentMarker = "<!-- HeraSpec Section -->";
4731
+ const commentIndex = existingContent.indexOf(commentMarker);
4732
+ if (commentIndex !== -1) {
4733
+ sectionStartIndex = commentIndex;
4734
+ const firstHeaderIndex = existingContent.indexOf("## ", commentIndex + commentMarker.length);
4735
+ if (firstHeaderIndex !== -1) {
4736
+ let nextHeaderIndex = existingContent.indexOf("\n## ", firstHeaderIndex + 3);
4737
+ if (nextHeaderIndex === -1) {
4738
+ nextHeaderIndex = existingContent.indexOf("\n### ", firstHeaderIndex + 3);
4739
+ }
4740
+ sectionEndIndex = nextHeaderIndex !== -1 ? nextHeaderIndex : existingContent.length;
4741
+ } else {
4742
+ sectionEndIndex = existingContent.length;
4743
+ }
4744
+ } else {
4745
+ const sectionMarkers = [
4746
+ "## HeraSpec Development",
4747
+ "## HeraSpec",
4748
+ "### HeraSpec Development",
4749
+ "### HeraSpec"
4750
+ ];
4751
+ for (const marker of sectionMarkers) {
4752
+ const index = existingContent.indexOf(marker);
4753
+ if (index !== -1) {
4754
+ sectionStartIndex = index;
4755
+ sectionEndIndex = existingContent.indexOf("\n## ", index + marker.length);
4756
+ if (sectionEndIndex === -1) {
4757
+ sectionEndIndex = existingContent.indexOf("\n### ", index + marker.length);
4758
+ }
4759
+ if (sectionEndIndex === -1) {
4760
+ sectionEndIndex = existingContent.length;
4761
+ }
4762
+ break;
4645
4763
  }
4646
- break;
4647
4764
  }
4648
4765
  }
4649
- if (hasHeraSpecSection && sectionStartIndex !== -1) {
4766
+ if (sectionStartIndex !== -1) {
4650
4767
  const before = existingContent.substring(0, sectionStartIndex).trimEnd();
4651
4768
  const after = existingContent.substring(sectionEndIndex);
4652
4769
  const updatedContent = before + "\n\n" + heraspecSection + (after.trimStart().startsWith("\n") ? "" : "\n\n") + after;
@@ -5026,7 +5143,6 @@ This will archive "${changeName}" and merge delta specs into source specs.`);
5026
5143
  const archiveDir = path10.join(
5027
5144
  ".",
5028
5145
  HERASPEC_DIR_NAME,
5029
- CHANGES_DIR_NAME,
5030
5146
  ARCHIVES_DIR_NAME
5031
5147
  );
5032
5148
  await FileSystemUtils.createDirectory(archiveDir);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heraspec",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "Universal spec-first development framework + CLI for all project types and AI tools",
5
5
  "keywords": [
6
6
  "heraspec",