@phuc1403/musketeer 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/INSTALLATION.md +52 -52
  2. package/README.md +49 -49
  3. package/bin/musketeer.js +168 -168
  4. package/manifest.json +333 -301
  5. package/package.json +48 -48
  6. package/src/dotnet-scaffold-copier.js +79 -79
  7. package/src/provisioner/detect.js +93 -93
  8. package/src/self-update.js +77 -77
  9. package/template/.claude/agents/code-reviewer.md +182 -166
  10. package/template/.claude/agents/git-manager.md +18 -18
  11. package/template/.claude/agents/hallmark-auditor.md +78 -78
  12. package/template/.claude/agents/researcher.md +33 -33
  13. package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
  14. package/template/.claude/hooks/git-skill-reminder.cjs +53 -0
  15. package/template/.claude/hooks/init-adr-dir.cjs +173 -173
  16. package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
  17. package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
  18. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
  19. package/template/.claude/hooks/lib/colors.cjs +180 -122
  20. package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
  21. package/template/.claude/hooks/lib/transcript-parser.cjs +300 -277
  22. package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
  23. package/template/.claude/hooks/{usage-context-awareness.cjs → usage-quota-cache-refresh.cjs} +166 -166
  24. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
  25. package/template/.claude/hooks/validate-cml-hook.js +145 -145
  26. package/template/.claude/skills/adr-writer/SKILL.md +48 -48
  27. package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
  28. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
  29. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
  30. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
  31. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
  32. package/template/.claude/skills/code-review/SKILL.md +201 -54
  33. package/template/.claude/skills/code-review/references/checklist-workflow.md +96 -0
  34. package/template/.claude/skills/code-review/references/checklists/api.md +52 -52
  35. package/template/.claude/skills/code-review/references/checklists/base.md +100 -100
  36. package/template/.claude/skills/code-review/references/checklists/web-app.md +54 -54
  37. package/template/.claude/skills/code-review/references/code-review-reception.md +113 -0
  38. package/template/.claude/skills/code-review/references/codebase-scan-workflow.md +30 -0
  39. package/template/.claude/skills/code-review/references/edge-case-scouting.md +119 -0
  40. package/template/.claude/skills/code-review/references/input-mode-resolution.md +135 -0
  41. package/template/.claude/skills/code-review/references/parallel-review-workflow.md +76 -0
  42. package/template/.claude/skills/code-review/references/requesting-code-review.md +116 -0
  43. package/template/.claude/skills/code-review/references/spec-compliance-review.md +43 -0
  44. package/template/.claude/skills/code-review/references/task-management-reviews.md +140 -0
  45. package/template/.claude/skills/code-review/references/verification-before-completion.md +139 -0
  46. package/template/.claude/skills/context-map/SKILL.md +80 -80
  47. package/template/.claude/skills/context-map/example.cml +106 -106
  48. package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
  49. package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
  50. package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
  51. package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
  52. package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
  53. package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
  54. package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
  55. package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
  56. package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
  57. package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
  58. package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
  59. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
  60. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
  61. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
  62. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
  63. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
  64. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
  65. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
  66. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
  67. package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
  68. package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
  69. package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
  70. package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
  71. package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
  72. package/template/.claude/skills/git/SKILL.md +131 -115
  73. package/template/.claude/skills/git/references/branch-management.md +88 -88
  74. package/template/.claude/skills/git/references/commit-standards.md +46 -46
  75. package/template/.claude/skills/git/references/context-efficiency.md +54 -0
  76. package/template/.claude/skills/git/references/gh-cli-guide.md +109 -109
  77. package/template/.claude/skills/git/references/safety-protocols.md +69 -69
  78. package/template/.claude/skills/git/references/workflow-commit.md +58 -58
  79. package/template/.claude/skills/git/references/workflow-merge-pr.md +136 -0
  80. package/template/.claude/skills/git/references/workflow-merge.md +48 -48
  81. package/template/.claude/skills/git/references/workflow-pr.md +58 -58
  82. package/template/.claude/skills/git/references/workflow-push.md +52 -52
  83. package/template/.claude/skills/hallmark/SKILL.md +552 -552
  84. package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
  85. package/template/.claude/skills/hallmark/references/assets.md +406 -406
  86. package/template/.claude/skills/hallmark/references/color.md +95 -95
  87. package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
  88. package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
  89. package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
  90. package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
  91. package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
  92. package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
  93. package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
  94. package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
  95. package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
  96. package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
  97. package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
  98. package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
  99. package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
  100. package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
  101. package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
  102. package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
  103. package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
  104. package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
  105. package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
  106. package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
  107. package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
  108. package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
  109. package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
  110. package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
  111. package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
  112. package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
  113. package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
  114. package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
  115. package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
  116. package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
  117. package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
  118. package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
  119. package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
  120. package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
  121. package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
  122. package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
  123. package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
  124. package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
  125. package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
  126. package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
  127. package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
  128. package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
  129. package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
  130. package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
  131. package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
  132. package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
  133. package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
  134. package/template/.claude/skills/hallmark/references/contract.md +24 -24
  135. package/template/.claude/skills/hallmark/references/copy.md +182 -182
  136. package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
  137. package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
  138. package/template/.claude/skills/hallmark/references/design-md.md +116 -116
  139. package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
  140. package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
  141. package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
  142. package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
  143. package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
  144. package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
  145. package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
  146. package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
  147. package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
  148. package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
  149. package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
  150. package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
  151. package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
  152. package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
  153. package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
  154. package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
  155. package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
  156. package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
  157. package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
  158. package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
  159. package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
  160. package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
  161. package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
  162. package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
  163. package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
  164. package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
  165. package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
  166. package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
  167. package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
  168. package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
  169. package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
  170. package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
  171. package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
  172. package/template/.claude/skills/hallmark/references/motion.md +109 -109
  173. package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
  174. package/template/.claude/skills/hallmark/references/responsive.md +138 -138
  175. package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
  176. package/template/.claude/skills/hallmark/references/structure.md +164 -164
  177. package/template/.claude/skills/hallmark/references/study.md +511 -511
  178. package/template/.claude/skills/hallmark/references/typography.md +243 -243
  179. package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
  180. package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
  181. package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
  182. package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
  183. package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
  184. package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
  185. package/template/.claude/skills/handoff/SKILL.md +15 -15
  186. package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
  187. package/template/.claude/skills/research/SKILL.md +69 -69
  188. package/template/.claude/skills/skill-creator/LICENSE.txt +201 -201
  189. package/template/.claude/skills/skill-creator/SKILL.md +154 -149
  190. package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -274
  191. package/template/.claude/skills/skill-creator/agents/comparator.md +202 -202
  192. package/template/.claude/skills/skill-creator/agents/grader.md +223 -223
  193. package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -146
  194. package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -471
  195. package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
  196. package/template/.claude/skills/skill-creator/references/benchmark-optimization-guide.md +86 -86
  197. package/template/.claude/skills/skill-creator/references/distribution-guide.md +79 -79
  198. package/template/.claude/skills/skill-creator/references/eval-infrastructure-guide.md +129 -129
  199. package/template/.claude/skills/skill-creator/references/eval-schemas.md +121 -121
  200. package/template/.claude/skills/skill-creator/references/mcp-skills-integration.md +71 -71
  201. package/template/.claude/skills/skill-creator/references/metadata-quality-criteria.md +94 -94
  202. package/template/.claude/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -104
  203. package/template/.claude/skills/skill-creator/references/plugin-marketplace-overview.md +89 -89
  204. package/template/.claude/skills/skill-creator/references/plugin-marketplace-schema.md +93 -93
  205. package/template/.claude/skills/skill-creator/references/plugin-marketplace-sources.md +103 -103
  206. package/template/.claude/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -76
  207. package/template/.claude/skills/skill-creator/references/script-quality-criteria.md +106 -106
  208. package/template/.claude/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -77
  209. package/template/.claude/skills/skill-creator/references/skill-creation-workflow.md +152 -151
  210. package/template/.claude/skills/skill-creator/references/skill-design-patterns.md +75 -75
  211. package/template/.claude/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -102
  212. package/template/.claude/skills/skill-creator/references/structure-organization-criteria.md +114 -114
  213. package/template/.claude/skills/skill-creator/references/testing-and-iteration.md +78 -78
  214. package/template/.claude/skills/skill-creator/references/token-efficiency-criteria.md +74 -74
  215. package/template/.claude/skills/skill-creator/references/troubleshooting-guide.md +81 -81
  216. package/template/.claude/skills/skill-creator/references/validation-checklist.md +83 -83
  217. package/template/.claude/skills/skill-creator/references/writing-effective-instructions.md +88 -88
  218. package/template/.claude/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -92
  219. package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -401
  220. package/template/.claude/skills/skill-creator/scripts/encoding_utils.py +36 -36
  221. package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -326
  222. package/template/.claude/skills/skill-creator/scripts/improve_description.py +248 -248
  223. package/template/.claude/skills/skill-creator/scripts/init_skill.py +360 -360
  224. package/template/.claude/skills/skill-creator/scripts/package_skill.py +143 -143
  225. package/template/.claude/skills/skill-creator/scripts/quick_validate.py +110 -110
  226. package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -310
  227. package/template/.claude/skills/skill-creator/scripts/run_loop.py +332 -332
  228. package/template/.claude/skills/skill-creator/scripts/utils.py +47 -47
  229. package/template/.claude/skills/tdd/SKILL.md +142 -142
  230. package/template/.claude/skills/tdd/deep-modules.md +15 -15
  231. package/template/.claude/skills/tdd/interface-design.md +31 -31
  232. package/template/.claude/skills/tdd/mocking.md +59 -59
  233. package/template/.claude/skills/tdd/refactoring.md +10 -10
  234. package/template/.claude/skills/tdd/tests.md +61 -61
  235. package/template/.claude/statusline.cjs +0 -0
  236. package/template/.claude/skills/code-review/references/adversarial-review.md +0 -223
@@ -1,122 +1,180 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- /**
5
- * ANSI Terminal Colors - Cross-platform color support for statusline
6
- * Supports NO_COLOR, FORCE_COLOR, COLORTERM auto-detection
7
- * @module colors
8
- */
9
-
10
- // ANSI escape codes (8-color basic palette)
11
- const RESET = '\x1b[0m';
12
- const DIM = '\x1b[2m';
13
- const RED = '\x1b[31m';
14
- const GREEN = '\x1b[32m';
15
- const YELLOW = '\x1b[33m';
16
- const MAGENTA = '\x1b[35m';
17
- const CYAN = '\x1b[36m';
18
-
19
- // Detect color support at module load (cached)
20
- // Claude Code statusline runs via pipe but output displays in TTY - default to true
21
- const shouldUseColor = (() => {
22
- if (process.env.NO_COLOR) return false;
23
- if (process.env.FORCE_COLOR) return true;
24
- // Default true for statusline context (Claude Code handles TTY display)
25
- return true;
26
- })();
27
-
28
- // Mutable override (set by statusline.cjs from config)
29
- // null = use env detection, true/false = explicit override
30
- let _colorOverride = null;
31
-
32
- /**
33
- * Set explicit color enable/disable override (from config)
34
- * Pass null to revert to env-var detection
35
- * @param {boolean} enabled
36
- */
37
- function setColorEnabled(enabled) {
38
- _colorOverride = enabled;
39
- }
40
-
41
- /**
42
- * Determine if colors should be rendered, respecting env vars and config override
43
- * NO_COLOR env var always takes precedence over config override
44
- * @returns {boolean}
45
- */
46
- function isColorEnabled() {
47
- // NO_COLOR env var is a hard override that always wins
48
- if (process.env.NO_COLOR) return false;
49
- if (_colorOverride !== null) return _colorOverride;
50
- return shouldUseColor;
51
- }
52
-
53
- // Detect 256-color support via COLORTERM
54
- const has256Color = (() => {
55
- const ct = process.env.COLORTERM;
56
- return ct === 'truecolor' || ct === '24bit' || ct === '256color';
57
- })();
58
-
59
- /**
60
- * Wrap text with ANSI color code
61
- * @param {string} text - Text to colorize
62
- * @param {string} code - ANSI escape code
63
- * @returns {string} Colorized text or plain text if colors disabled
64
- */
65
- function colorize(text, code) {
66
- if (!isColorEnabled()) return String(text);
67
- return `${code}${text}${RESET}`;
68
- }
69
-
70
- function green(text) { return colorize(text, GREEN); }
71
- function yellow(text) { return colorize(text, YELLOW); }
72
- function red(text) { return colorize(text, RED); }
73
- function cyan(text) { return colorize(text, CYAN); }
74
- function magenta(text) { return colorize(text, MAGENTA); }
75
- function dim(text) { return colorize(text, DIM); }
76
-
77
- /**
78
- * Get color code based on context percentage threshold
79
- * @param {number} percent - Context usage percentage (0-100)
80
- * @returns {string} ANSI color code
81
- */
82
- function getContextColor(percent) {
83
- if (percent >= 85) return RED;
84
- if (percent >= 70) return YELLOW;
85
- return GREEN;
86
- }
87
-
88
- /**
89
- * Generate colored progress bar for context window
90
- * Uses ▰▱ characters (smooth horizontal rectangles) for consistent rendering
91
- * @param {number} percent - Usage percentage (0-100)
92
- * @param {number} width - Bar width in characters (default 12)
93
- * @returns {string} Unicode progress bar with threshold-based colors
94
- */
95
- function coloredBar(percent, width = 12) {
96
- const clamped = Math.max(0, Math.min(100, percent));
97
- const filled = Math.round((clamped / 100) * width);
98
- const empty = width - filled;
99
-
100
- if (!isColorEnabled()) {
101
- return '▰'.repeat(filled) + '▱'.repeat(empty);
102
- }
103
-
104
- const color = getContextColor(percent);
105
- return `${color}${'▰'.repeat(filled)}${DIM}${'▱'.repeat(empty)}${RESET}`;
106
- }
107
-
108
- module.exports = {
109
- RESET,
110
- green,
111
- yellow,
112
- red,
113
- cyan,
114
- magenta,
115
- dim,
116
- getContextColor,
117
- coloredBar,
118
- shouldUseColor,
119
- has256Color,
120
- setColorEnabled,
121
- isColorEnabled
122
- };
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * ANSI Terminal Colors - Cross-platform color support for statusline
6
+ * Supports NO_COLOR, FORCE_COLOR, COLORTERM auto-detection
7
+ * @module colors
8
+ */
9
+
10
+ // ANSI escape codes (standard + bright palette)
11
+ const RESET = '\x1b[0m';
12
+ const DIM = '\x1b[2m';
13
+ const CLEAR_INTENSITY = '\x1b[22m';
14
+ const CLEAR_FOREGROUND = '\x1b[39m';
15
+ const RED = '\x1b[31m';
16
+ const GREEN = '\x1b[32m';
17
+ const YELLOW = '\x1b[33m';
18
+ const BLUE = '\x1b[34m';
19
+ const MAGENTA = '\x1b[35m';
20
+ const CYAN = '\x1b[36m';
21
+ const BRIGHT_RED = '\x1b[91m';
22
+ const BRIGHT_GREEN = '\x1b[92m';
23
+ const BRIGHT_YELLOW = '\x1b[93m';
24
+ const BRIGHT_BLUE = '\x1b[94m';
25
+ const BRIGHT_MAGENTA = '\x1b[95m';
26
+ const BRIGHT_CYAN = '\x1b[96m';
27
+ const BRIGHT_WHITE = '\x1b[97m';
28
+ const STABLE_PREFIX = `${CLEAR_INTENSITY}${CLEAR_FOREGROUND}`;
29
+ const STABLE_SUFFIX = `${RESET}${CLEAR_INTENSITY}${CLEAR_FOREGROUND}`;
30
+ const COLOR_CODES = {
31
+ green: GREEN,
32
+ yellow: YELLOW,
33
+ red: RED,
34
+ blue: BLUE,
35
+ cyan: CYAN,
36
+ magenta: MAGENTA,
37
+ dim: DIM,
38
+ brightRed: BRIGHT_RED,
39
+ brightGreen: BRIGHT_GREEN,
40
+ brightYellow: BRIGHT_YELLOW,
41
+ brightBlue: BRIGHT_BLUE,
42
+ brightMagenta: BRIGHT_MAGENTA,
43
+ brightCyan: BRIGHT_CYAN,
44
+ brightWhite: BRIGHT_WHITE,
45
+ };
46
+
47
+ // Detect color support at module load (cached)
48
+ // Claude Code statusline runs via pipe but output displays in TTY - default to true
49
+ const shouldUseColor = (() => {
50
+ if (process.env.NO_COLOR) return false;
51
+ if (process.env.FORCE_COLOR) return true;
52
+ // Default true for statusline context (Claude Code handles TTY display)
53
+ return true;
54
+ })();
55
+
56
+ // Mutable override (set by statusline.cjs from config)
57
+ // null = use env detection, true/false = explicit override
58
+ let _colorOverride = null;
59
+
60
+ /**
61
+ * Set explicit color enable/disable override (from config)
62
+ * Pass null to revert to env-var detection
63
+ * @param {boolean} enabled
64
+ */
65
+ function setColorEnabled(enabled) {
66
+ _colorOverride = enabled;
67
+ }
68
+
69
+ /**
70
+ * Determine if colors should be rendered, respecting env vars and config override
71
+ * NO_COLOR env var always takes precedence over config override
72
+ * @returns {boolean}
73
+ */
74
+ function isColorEnabled() {
75
+ // NO_COLOR env var is a hard override that always wins
76
+ if (process.env.NO_COLOR) return false;
77
+ if (_colorOverride !== null) return _colorOverride;
78
+ return shouldUseColor;
79
+ }
80
+
81
+ // Detect 256-color support via COLORTERM
82
+ const has256Color = (() => {
83
+ const ct = process.env.COLORTERM;
84
+ return ct === 'truecolor' || ct === '24bit' || ct === '256color';
85
+ })();
86
+
87
+ /**
88
+ * Wrap text with ANSI color code
89
+ * @param {string} text - Text to colorize
90
+ * @param {string} code - ANSI escape code
91
+ * @returns {string} Colorized text or plain text if colors disabled
92
+ */
93
+ function colorize(text, code) {
94
+ if (!isColorEnabled() || !code) return String(text);
95
+ return `${STABLE_PREFIX}${code}${text}${STABLE_SUFFIX}`;
96
+ }
97
+
98
+ function green(text) { return colorize(text, GREEN); }
99
+ function yellow(text) { return colorize(text, YELLOW); }
100
+ function red(text) { return colorize(text, RED); }
101
+ function blue(text) { return colorize(text, BLUE); }
102
+ function cyan(text) { return colorize(text, CYAN); }
103
+ function magenta(text) { return colorize(text, MAGENTA); }
104
+ function dim(text) { return colorize(text, DIM); }
105
+ function brightRed(text) { return colorize(text, BRIGHT_RED); }
106
+ function brightGreen(text) { return colorize(text, BRIGHT_GREEN); }
107
+ function brightYellow(text) { return colorize(text, BRIGHT_YELLOW); }
108
+ function brightBlue(text) { return colorize(text, BRIGHT_BLUE); }
109
+ function brightMagenta(text) { return colorize(text, BRIGHT_MAGENTA); }
110
+ function brightCyan(text) { return colorize(text, BRIGHT_CYAN); }
111
+ function brightWhite(text) { return colorize(text, BRIGHT_WHITE); }
112
+
113
+ /**
114
+ * Get color code based on context percentage threshold
115
+ * @param {number} percent - Context usage percentage (0-100)
116
+ * @returns {string} ANSI color code
117
+ */
118
+ function resolveColorCode(colorName) {
119
+ if (colorName === 'white' || colorName === 'none' || colorName === 'default') return '';
120
+ return COLOR_CODES[colorName] || '';
121
+ }
122
+
123
+ function getContextColor(percent, palette = {}) {
124
+ const high = resolveColorCode(palette.high || 'red') || RED;
125
+ const mid = resolveColorCode(palette.mid || 'yellow') || YELLOW;
126
+ const low = resolveColorCode(palette.low || 'green') || GREEN;
127
+ if (percent >= 85) return high;
128
+ if (percent >= 70) return mid;
129
+ return low;
130
+ }
131
+
132
+ /**
133
+ * Generate colored progress bar for context window
134
+ * Uses ▰▱ characters (smooth horizontal rectangles) for consistent rendering
135
+ * @param {number} percent - Usage percentage (0-100)
136
+ * @param {number} width - Bar width in characters (default 12)
137
+ * @returns {string} Unicode progress bar with threshold-based colors
138
+ */
139
+ function coloredBar(percent, width = 12, palette = {}) {
140
+ const clamped = Math.max(0, Math.min(100, percent));
141
+ const filled = Math.round((clamped / 100) * width);
142
+ const empty = width - filled;
143
+
144
+ if (!isColorEnabled()) {
145
+ return '▰'.repeat(filled) + '▱'.repeat(empty);
146
+ }
147
+
148
+ const color = getContextColor(percent, palette);
149
+ return `${STABLE_PREFIX}${color}${'▰'.repeat(filled)}${STABLE_PREFIX}${DIM}${'▱'.repeat(empty)}${STABLE_SUFFIX}`;
150
+ }
151
+
152
+ /**
153
+ * Resolve a color name from theme config to its color function.
154
+ * Used by section renderers to apply theme-configurable colors.
155
+ * Falls back to identity function (no color) for unknown names.
156
+ * @param {string} colorName - Color name (e.g. "green", "yellow", "dim")
157
+ * @returns {Function} Color function (string) => string
158
+ */
159
+ function resolveColor(colorName) {
160
+ const code = resolveColorCode(colorName);
161
+ return code ? (s) => colorize(s, code) : (s) => String(s);
162
+ }
163
+
164
+ module.exports = {
165
+ RESET,
166
+ green,
167
+ yellow,
168
+ red,
169
+ cyan,
170
+ magenta,
171
+ dim,
172
+ getContextColor,
173
+ coloredBar,
174
+ shouldUseColor,
175
+ has256Color,
176
+ setColorEnabled,
177
+ isColorEnabled,
178
+ resolveColorCode,
179
+ resolveColor,
180
+ };