pulse-line 1.0.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 (211) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +27 -0
  3. package/LICENSE +21 -0
  4. package/README.md +316 -0
  5. package/bin/pulse-line.js +12 -0
  6. package/commands/clear-cache.md +23 -0
  7. package/commands/config.md +25 -0
  8. package/commands/debug.md +25 -0
  9. package/commands/disable.md +27 -0
  10. package/commands/enable.md +27 -0
  11. package/commands/install.md +25 -0
  12. package/commands/language.md +27 -0
  13. package/commands/reload.md +23 -0
  14. package/commands/theme.md +27 -0
  15. package/commands/themes.md +23 -0
  16. package/commands/uninstall.md +23 -0
  17. package/dist/src/cli.d.ts +2 -0
  18. package/dist/src/cli.js +242 -0
  19. package/dist/src/cli.js.map +1 -0
  20. package/dist/src/config/defaults.d.ts +2 -0
  21. package/dist/src/config/defaults.js +7 -0
  22. package/dist/src/config/defaults.js.map +1 -0
  23. package/dist/src/config/loader.d.ts +6 -0
  24. package/dist/src/config/loader.js +146 -0
  25. package/dist/src/config/loader.js.map +1 -0
  26. package/dist/src/config/migrate-config.d.ts +2 -0
  27. package/dist/src/config/migrate-config.js +22 -0
  28. package/dist/src/config/migrate-config.js.map +1 -0
  29. package/dist/src/config/validator.d.ts +2 -0
  30. package/dist/src/config/validator.js +7 -0
  31. package/dist/src/config/validator.js.map +1 -0
  32. package/dist/src/extractors/account-usage.d.ts +20 -0
  33. package/dist/src/extractors/account-usage.js +293 -0
  34. package/dist/src/extractors/account-usage.js.map +1 -0
  35. package/dist/src/extractors/context.d.ts +7 -0
  36. package/dist/src/extractors/context.js +20 -0
  37. package/dist/src/extractors/context.js.map +1 -0
  38. package/dist/src/extractors/cost.d.ts +5 -0
  39. package/dist/src/extractors/cost.js +13 -0
  40. package/dist/src/extractors/cost.js.map +1 -0
  41. package/dist/src/extractors/git.d.ts +6 -0
  42. package/dist/src/extractors/git.js +35 -0
  43. package/dist/src/extractors/git.js.map +1 -0
  44. package/dist/src/extractors/index.d.ts +25 -0
  45. package/dist/src/extractors/index.js +33 -0
  46. package/dist/src/extractors/index.js.map +1 -0
  47. package/dist/src/extractors/mcp.d.ts +5 -0
  48. package/dist/src/extractors/mcp.js +72 -0
  49. package/dist/src/extractors/mcp.js.map +1 -0
  50. package/dist/src/extractors/model.d.ts +9 -0
  51. package/dist/src/extractors/model.js +20 -0
  52. package/dist/src/extractors/model.js.map +1 -0
  53. package/dist/src/extractors/output-style.d.ts +9 -0
  54. package/dist/src/extractors/output-style.js +13 -0
  55. package/dist/src/extractors/output-style.js.map +1 -0
  56. package/dist/src/extractors/rate-limits.d.ts +8 -0
  57. package/dist/src/extractors/rate-limits.js +39 -0
  58. package/dist/src/extractors/rate-limits.js.map +1 -0
  59. package/dist/src/extractors/session.d.ts +5 -0
  60. package/dist/src/extractors/session.js +67 -0
  61. package/dist/src/extractors/session.js.map +1 -0
  62. package/dist/src/extractors/thinking.d.ts +10 -0
  63. package/dist/src/extractors/thinking.js +16 -0
  64. package/dist/src/extractors/thinking.js.map +1 -0
  65. package/dist/src/extractors/third-party-api.d.ts +13 -0
  66. package/dist/src/extractors/third-party-api.js +193 -0
  67. package/dist/src/extractors/third-party-api.js.map +1 -0
  68. package/dist/src/extractors/transcript.d.ts +5 -0
  69. package/dist/src/extractors/transcript.js +67 -0
  70. package/dist/src/extractors/transcript.js.map +1 -0
  71. package/dist/src/extractors/workspace.d.ts +9 -0
  72. package/dist/src/extractors/workspace.js +43 -0
  73. package/dist/src/extractors/workspace.js.map +1 -0
  74. package/dist/src/formatters/duration.d.ts +1 -0
  75. package/dist/src/formatters/duration.js +19 -0
  76. package/dist/src/formatters/duration.js.map +1 -0
  77. package/dist/src/formatters/index.d.ts +7 -0
  78. package/dist/src/formatters/index.js +16 -0
  79. package/dist/src/formatters/index.js.map +1 -0
  80. package/dist/src/formatters/layout.d.ts +10 -0
  81. package/dist/src/formatters/layout.js +38 -0
  82. package/dist/src/formatters/layout.js.map +1 -0
  83. package/dist/src/formatters/progress-bar.d.ts +2 -0
  84. package/dist/src/formatters/progress-bar.js +23 -0
  85. package/dist/src/formatters/progress-bar.js.map +1 -0
  86. package/dist/src/formatters/segment.d.ts +9 -0
  87. package/dist/src/formatters/segment.js +18 -0
  88. package/dist/src/formatters/segment.js.map +1 -0
  89. package/dist/src/formatters/separator.d.ts +1 -0
  90. package/dist/src/formatters/separator.js +11 -0
  91. package/dist/src/formatters/separator.js.map +1 -0
  92. package/dist/src/i18n/index.d.ts +8 -0
  93. package/dist/src/i18n/index.js +31 -0
  94. package/dist/src/i18n/index.js.map +1 -0
  95. package/dist/src/i18n/locales/en.d.ts +1 -0
  96. package/dist/src/i18n/locales/en.js +26 -0
  97. package/dist/src/i18n/locales/en.js.map +1 -0
  98. package/dist/src/i18n/locales/zh.d.ts +1 -0
  99. package/dist/src/i18n/locales/zh.js +26 -0
  100. package/dist/src/i18n/locales/zh.js.map +1 -0
  101. package/dist/src/index.d.ts +1 -0
  102. package/dist/src/index.js +176 -0
  103. package/dist/src/index.js.map +1 -0
  104. package/dist/src/parser/stdin-parser.d.ts +3 -0
  105. package/dist/src/parser/stdin-parser.js +58 -0
  106. package/dist/src/parser/stdin-parser.js.map +1 -0
  107. package/dist/src/themes/builtin/cyberpunk.d.ts +2 -0
  108. package/dist/src/themes/builtin/cyberpunk.js +47 -0
  109. package/dist/src/themes/builtin/cyberpunk.js.map +1 -0
  110. package/dist/src/themes/builtin/dark.d.ts +2 -0
  111. package/dist/src/themes/builtin/dark.js +47 -0
  112. package/dist/src/themes/builtin/dark.js.map +1 -0
  113. package/dist/src/themes/builtin/forest.d.ts +2 -0
  114. package/dist/src/themes/builtin/forest.js +47 -0
  115. package/dist/src/themes/builtin/forest.js.map +1 -0
  116. package/dist/src/themes/builtin/light.d.ts +2 -0
  117. package/dist/src/themes/builtin/light.js +47 -0
  118. package/dist/src/themes/builtin/light.js.map +1 -0
  119. package/dist/src/themes/builtin/ocean.d.ts +2 -0
  120. package/dist/src/themes/builtin/ocean.js +47 -0
  121. package/dist/src/themes/builtin/ocean.js.map +1 -0
  122. package/dist/src/themes/icon-provider.d.ts +2 -0
  123. package/dist/src/themes/icon-provider.js +10 -0
  124. package/dist/src/themes/icon-provider.js.map +1 -0
  125. package/dist/src/themes/icon-sets/nerd.d.ts +17 -0
  126. package/dist/src/themes/icon-sets/nerd.js +20 -0
  127. package/dist/src/themes/icon-sets/nerd.js.map +1 -0
  128. package/dist/src/themes/icon-sets/text.d.ts +17 -0
  129. package/dist/src/themes/icon-sets/text.js +21 -0
  130. package/dist/src/themes/icon-sets/text.js.map +1 -0
  131. package/dist/src/themes/index.d.ts +4 -0
  132. package/dist/src/themes/index.js +56 -0
  133. package/dist/src/themes/index.js.map +1 -0
  134. package/dist/src/types/pulse-config.d.ts +58 -0
  135. package/dist/src/types/pulse-config.js +50 -0
  136. package/dist/src/types/pulse-config.js.map +1 -0
  137. package/dist/src/types/pulse-input.d.ts +83 -0
  138. package/dist/src/types/pulse-input.js +4 -0
  139. package/dist/src/types/pulse-input.js.map +1 -0
  140. package/dist/src/types/theme.d.ts +50 -0
  141. package/dist/src/types/theme.js +4 -0
  142. package/dist/src/types/theme.js.map +1 -0
  143. package/dist/src/utils/ansi.d.ts +6 -0
  144. package/dist/src/utils/ansi.js +31 -0
  145. package/dist/src/utils/ansi.js.map +1 -0
  146. package/dist/src/utils/cache.d.ts +11 -0
  147. package/dist/src/utils/cache.js +128 -0
  148. package/dist/src/utils/cache.js.map +1 -0
  149. package/dist/src/utils/claude-settings-env.d.ts +11 -0
  150. package/dist/src/utils/claude-settings-env.js +108 -0
  151. package/dist/src/utils/claude-settings-env.js.map +1 -0
  152. package/dist/src/utils/constants.d.ts +3 -0
  153. package/dist/src/utils/constants.js +43 -0
  154. package/dist/src/utils/constants.js.map +1 -0
  155. package/dist/src/utils/display-sanitize.d.ts +7 -0
  156. package/dist/src/utils/display-sanitize.js +69 -0
  157. package/dist/src/utils/display-sanitize.js.map +1 -0
  158. package/dist/src/utils/fs.d.ts +5 -0
  159. package/dist/src/utils/fs.js +79 -0
  160. package/dist/src/utils/fs.js.map +1 -0
  161. package/dist/src/utils/git.d.ts +7 -0
  162. package/dist/src/utils/git.js +56 -0
  163. package/dist/src/utils/git.js.map +1 -0
  164. package/dist/src/utils/logger.d.ts +9 -0
  165. package/dist/src/utils/logger.js +53 -0
  166. package/dist/src/utils/logger.js.map +1 -0
  167. package/dist/src/utils/model-display-env.d.ts +12 -0
  168. package/dist/src/utils/model-display-env.js +53 -0
  169. package/dist/src/utils/model-display-env.js.map +1 -0
  170. package/dist/src/utils/provider-credentials.d.ts +12 -0
  171. package/dist/src/utils/provider-credentials.js +145 -0
  172. package/dist/src/utils/provider-credentials.js.map +1 -0
  173. package/dist/test/advanced-extractors.test.d.ts +1 -0
  174. package/dist/test/advanced-extractors.test.js +96 -0
  175. package/dist/test/advanced-extractors.test.js.map +1 -0
  176. package/dist/test/benchmark.d.ts +1 -0
  177. package/dist/test/benchmark.js +67 -0
  178. package/dist/test/benchmark.js.map +1 -0
  179. package/dist/test/display-sanitize.test.d.ts +1 -0
  180. package/dist/test/display-sanitize.test.js +28 -0
  181. package/dist/test/display-sanitize.test.js.map +1 -0
  182. package/dist/test/extractors.test.d.ts +1 -0
  183. package/dist/test/extractors.test.js +261 -0
  184. package/dist/test/extractors.test.js.map +1 -0
  185. package/dist/test/formatters.test.d.ts +1 -0
  186. package/dist/test/formatters.test.js +62 -0
  187. package/dist/test/formatters.test.js.map +1 -0
  188. package/dist/test/git.test.d.ts +1 -0
  189. package/dist/test/git.test.js +85 -0
  190. package/dist/test/git.test.js.map +1 -0
  191. package/dist/test/migrate-config.test.d.ts +1 -0
  192. package/dist/test/migrate-config.test.js +23 -0
  193. package/dist/test/migrate-config.test.js.map +1 -0
  194. package/dist/test/model-display-env.test.d.ts +1 -0
  195. package/dist/test/model-display-env.test.js +125 -0
  196. package/dist/test/model-display-env.test.js.map +1 -0
  197. package/dist/test/parser.test.d.ts +1 -0
  198. package/dist/test/parser.test.js +108 -0
  199. package/dist/test/parser.test.js.map +1 -0
  200. package/dist/test/provider-credentials.test.d.ts +1 -0
  201. package/dist/test/provider-credentials.test.js +62 -0
  202. package/dist/test/provider-credentials.test.js.map +1 -0
  203. package/dist/test/themes.test.d.ts +1 -0
  204. package/dist/test/themes.test.js +83 -0
  205. package/dist/test/themes.test.js.map +1 -0
  206. package/dist/test/third-party-api.test.d.ts +1 -0
  207. package/dist/test/third-party-api.test.js +99 -0
  208. package/dist/test/third-party-api.test.js.map +1 -0
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/package.json +43 -0
  211. package/skills/pulse-configuration/SKILL.md +267 -0
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ // test/parser.test.ts
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_test_1 = require("node:test");
8
+ const node_assert_1 = __importDefault(require("node:assert"));
9
+ const fs_1 = require("fs");
10
+ const path_1 = require("path");
11
+ const os_1 = require("os");
12
+ (0, node_test_1.test)('parseStdinSync should parse valid JSON from stdin', () => {
13
+ const testFile = (0, path_1.join)((0, os_1.tmpdir)(), 'pulse-test-input.json');
14
+ const mockInput = {
15
+ cwd: '/Users/test/project',
16
+ session_id: 'session-123',
17
+ transcript_path: '/Users/test/.claude/sessions/session-123.jsonl',
18
+ model: { id: 'claude-opus-4', display_name: 'Opus 4' },
19
+ workspace: {
20
+ current_dir: '/Users/test/project',
21
+ project_dir: '/Users/test/project',
22
+ project_name: 'project',
23
+ read_only: false
24
+ },
25
+ version: '1.0.0',
26
+ output_style: { name: 'default' },
27
+ cost: {
28
+ total_cost_usd: 0.042,
29
+ input_cost_usd: 0.008,
30
+ output_cost_usd: 0.034
31
+ },
32
+ context_window: {
33
+ total_input_tokens: 1200,
34
+ total_output_tokens: 420,
35
+ context_window_size: 200000,
36
+ used_percentage: 65.0,
37
+ remaining_percentage: 99.4
38
+ },
39
+ exceeds_200k_tokens: false
40
+ };
41
+ try {
42
+ (0, fs_1.writeFileSync)(testFile, JSON.stringify(mockInput));
43
+ const raw = JSON.stringify(mockInput);
44
+ const result = JSON.parse(raw);
45
+ // Verify structure
46
+ node_assert_1.default.strictEqual(result.model.display_name, 'Opus 4');
47
+ node_assert_1.default.strictEqual(result.cost.total_cost_usd, 0.042);
48
+ node_assert_1.default.strictEqual(result.cwd, '/Users/test/project');
49
+ }
50
+ finally {
51
+ try {
52
+ (0, fs_1.unlinkSync)(testFile);
53
+ }
54
+ catch { }
55
+ }
56
+ });
57
+ (0, node_test_1.test)('parseStdinSync should throw on invalid JSON', () => {
58
+ const invalidJson = 'not valid json{{{';
59
+ node_assert_1.default.throws(() => {
60
+ JSON.parse(invalidJson);
61
+ });
62
+ });
63
+ (0, node_test_1.test)('parseStdinSync should handle optional fields', () => {
64
+ const minimal = {
65
+ cwd: '/tmp',
66
+ session_id: 's1',
67
+ transcript_path: '/tmp/s1.jsonl',
68
+ model: { id: 'claude-sonnet-4', display_name: 'Sonnet 4' },
69
+ workspace: { current_dir: '/tmp', read_only: false },
70
+ version: '1.0',
71
+ output_style: { name: 'default' },
72
+ cost: { total_cost_usd: 0.01 },
73
+ context_window: {
74
+ total_input_tokens: 0,
75
+ total_output_tokens: 0,
76
+ context_window_size: 200000,
77
+ used_percentage: 0,
78
+ remaining_percentage: 100
79
+ },
80
+ exceeds_200k_tokens: false
81
+ };
82
+ const result = minimal;
83
+ node_assert_1.default.strictEqual(result.model.display_name, 'Sonnet 4');
84
+ node_assert_1.default.strictEqual(result.rate_limits, undefined);
85
+ });
86
+ (0, node_test_1.test)('parseStdinSync should handle large context window', () => {
87
+ const largeCtx = {
88
+ cwd: '/tmp',
89
+ session_id: 's1',
90
+ transcript_path: '/tmp/s1.jsonl',
91
+ model: { id: 'claude-opus-4', display_name: 'Opus 4' },
92
+ workspace: { current_dir: '/tmp', read_only: false },
93
+ version: '1.0',
94
+ output_style: { name: 'default' },
95
+ cost: { total_cost_usd: 0.01 },
96
+ context_window: {
97
+ total_input_tokens: 190000,
98
+ total_output_tokens: 5000,
99
+ context_window_size: 200000,
100
+ used_percentage: 97.5,
101
+ remaining_percentage: 2.5
102
+ },
103
+ exceeds_200k_tokens: false
104
+ };
105
+ node_assert_1.default.strictEqual(largeCtx.context_window.used_percentage, 97.5);
106
+ node_assert_1.default.strictEqual(largeCtx.exceeds_200k_tokens, false);
107
+ });
108
+ //# sourceMappingURL=parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../test/parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ // test/provider-credentials.test.ts
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_test_1 = require("node:test");
8
+ const node_assert_1 = __importDefault(require("node:assert"));
9
+ const provider_credentials_1 = require("../src/utils/provider-credentials");
10
+ (0, node_test_1.test)('zhipu resolves from ANTHROPIC_* when BASE_URL targets bigmodel.cn', () => {
11
+ const save = {};
12
+ for (const k of ['ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ZHIPU_API_KEY', 'ZHIPUAI_API_KEY',
13
+ 'BIGMODEL_API_KEY', 'PULSE_ZHIPU_API_KEY', 'ANTHROPIC_API_KEY']) {
14
+ save[k] = process.env[k];
15
+ delete process.env[k];
16
+ }
17
+ try {
18
+ const merged = {
19
+ ANTHROPIC_BASE_URL: 'https://open.bigmodel.cn/api/anthropic',
20
+ ANTHROPIC_AUTH_TOKEN: 'test-bigmodel-token'
21
+ };
22
+ const c = (0, provider_credentials_1.resolveProviderCredentials)('zhipu', merged);
23
+ node_assert_1.default.ok(c);
24
+ node_assert_1.default.strictEqual(c.apiKey, 'test-bigmodel-token');
25
+ node_assert_1.default.strictEqual(c.baseUrl, 'https://open.bigmodel.cn');
26
+ }
27
+ finally {
28
+ for (const k of Object.keys(save)) {
29
+ const v = save[k];
30
+ if (v === undefined)
31
+ delete process.env[k];
32
+ else
33
+ process.env[k] = v;
34
+ }
35
+ }
36
+ });
37
+ (0, node_test_1.test)('classic ZHIPU_API_KEY beats Anthropic-compat when both set', () => {
38
+ const save = {};
39
+ for (const k of ['ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ZHIPU_API_KEY']) {
40
+ save[k] = process.env[k];
41
+ delete process.env[k];
42
+ }
43
+ try {
44
+ const merged = {
45
+ ANTHROPIC_BASE_URL: 'https://open.bigmodel.cn/api/anthropic',
46
+ ANTHROPIC_AUTH_TOKEN: 'anthropic-route',
47
+ ZHIPU_API_KEY: 'dedicated-key'
48
+ };
49
+ const c = (0, provider_credentials_1.resolveProviderCredentials)('zhipu', merged);
50
+ node_assert_1.default.strictEqual(c.apiKey, 'dedicated-key');
51
+ }
52
+ finally {
53
+ for (const k of Object.keys(save)) {
54
+ const v = save[k];
55
+ if (v === undefined)
56
+ delete process.env[k];
57
+ else
58
+ process.env[k] = v;
59
+ }
60
+ }
61
+ });
62
+ //# sourceMappingURL=provider-credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-credentials.test.js","sourceRoot":"","sources":["../../test/provider-credentials.test.ts"],"names":[],"mappings":";AAAA,oCAAoC;;;;;AAEpC,yCAAiC;AACjC,8DAAiC;AACjC,4EAA+E;AAE/E,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,eAAe,EAAE,iBAAiB;QAC/F,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAA2B;YACrC,kBAAkB,EAAE,wCAAwC;YAC5D,oBAAoB,EAAE,qBAAqB;SAC5C,CAAC;QACF,MAAM,CAAC,GAAG,IAAA,iDAA0B,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtD,qBAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,qBAAM,CAAC,WAAW,CAAC,CAAE,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACrD,qBAAM,CAAC,WAAW,CAAC,CAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;gBACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,4DAA4D,EAAE,GAAG,EAAE;IACtE,MAAM,IAAI,GAAuC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,sBAAsB,EAAE,eAAe,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAA2B;YACrC,kBAAkB,EAAE,wCAAwC;YAC5D,oBAAoB,EAAE,iBAAiB;YACvC,aAAa,EAAE,eAAe;SAC/B,CAAC;QACF,MAAM,CAAC,GAAG,IAAA,iDAA0B,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtD,qBAAM,CAAC,WAAW,CAAC,CAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;gBACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ // test/themes.test.ts
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_test_1 = require("node:test");
8
+ const node_assert_1 = __importDefault(require("node:assert"));
9
+ const themes_1 = require("../src/themes");
10
+ (0, node_test_1.test)('loadTheme should load dark theme', () => {
11
+ const theme = (0, themes_1.loadTheme)('dark', 'text');
12
+ node_assert_1.default.ok(theme);
13
+ node_assert_1.default.strictEqual(theme.meta.name, 'Deep Dark');
14
+ node_assert_1.default.ok(theme.colors.primary);
15
+ node_assert_1.default.ok(theme.components.model.fg);
16
+ });
17
+ (0, node_test_1.test)('loadTheme should load light theme', () => {
18
+ const theme = (0, themes_1.loadTheme)('light', 'text');
19
+ node_assert_1.default.ok(theme);
20
+ node_assert_1.default.strictEqual(theme.meta.name, 'Minimal Light');
21
+ });
22
+ (0, node_test_1.test)('loadTheme should load cyberpunk theme', () => {
23
+ const theme = (0, themes_1.loadTheme)('cyberpunk', 'text');
24
+ node_assert_1.default.ok(theme);
25
+ node_assert_1.default.strictEqual(theme.meta.name, 'Cyberpunk');
26
+ });
27
+ (0, node_test_1.test)('loadTheme should load forest theme', () => {
28
+ const theme = (0, themes_1.loadTheme)('forest', 'text');
29
+ node_assert_1.default.ok(theme);
30
+ node_assert_1.default.strictEqual(theme.meta.name, 'Forest');
31
+ });
32
+ (0, node_test_1.test)('loadTheme should load ocean theme', () => {
33
+ const theme = (0, themes_1.loadTheme)('ocean', 'text');
34
+ node_assert_1.default.ok(theme);
35
+ node_assert_1.default.strictEqual(theme.meta.name, 'Ocean');
36
+ });
37
+ (0, node_test_1.test)('loadTheme should fallback to dark for unknown theme', () => {
38
+ const theme = (0, themes_1.loadTheme)('nonexistent', 'text');
39
+ node_assert_1.default.ok(theme);
40
+ node_assert_1.default.strictEqual(theme.meta.name, 'Deep Dark');
41
+ });
42
+ (0, node_test_1.test)('loadTheme nerd overlays PUA icons and powerline sep', () => {
43
+ const t = (0, themes_1.loadTheme)('dark', 'nerd');
44
+ node_assert_1.default.notStrictEqual(t.components.model.icon, '[M]');
45
+ node_assert_1.default.strictEqual(t.separator.left, '\u{e0b0}');
46
+ });
47
+ (0, node_test_1.test)('getBuiltinThemeNames should return 5 themes', () => {
48
+ const names = (0, themes_1.getBuiltinThemeNames)();
49
+ node_assert_1.default.strictEqual(names.length, 5);
50
+ node_assert_1.default.ok(names.includes('dark'));
51
+ node_assert_1.default.ok(names.includes('light'));
52
+ node_assert_1.default.ok(names.includes('cyberpunk'));
53
+ node_assert_1.default.ok(names.includes('forest'));
54
+ node_assert_1.default.ok(names.includes('ocean'));
55
+ });
56
+ (0, node_test_1.test)('getAllThemes should return 5 themes', () => {
57
+ const themes = (0, themes_1.getAllThemes)();
58
+ node_assert_1.default.strictEqual(themes.length, 5);
59
+ });
60
+ (0, node_test_1.test)('all themes should have required color properties', () => {
61
+ const themes = (0, themes_1.getAllThemes)();
62
+ const requiredColors = ['primary', 'accent', 'success', 'warning', 'error', 'info', 'muted', 'dim'];
63
+ for (const theme of themes) {
64
+ for (const color of requiredColors) {
65
+ node_assert_1.default.ok(theme.colors[color], `Theme ${theme.meta.name} missing color: ${color}`);
66
+ node_assert_1.default.ok(theme.colors[color].startsWith('#'), `Theme ${theme.meta.name} color ${color} should be hex`);
67
+ }
68
+ }
69
+ });
70
+ (0, node_test_1.test)('all themes should have all component styles', () => {
71
+ const themes = (0, themes_1.getAllThemes)();
72
+ const requiredComponents = [
73
+ 'model', 'context', 'contextBar', 'git', 'cost', 'duration',
74
+ 'workspace', 'turns', 'cacheRatio', 'rateLimit', 'weeklyQuota',
75
+ 'accountUsage', 'mcpStatus', 'thinking', 'outputStyle', 'separator'
76
+ ];
77
+ for (const theme of themes) {
78
+ for (const comp of requiredComponents) {
79
+ node_assert_1.default.ok(theme.components[comp], `Theme ${theme.meta.name} missing component: ${comp}`);
80
+ }
81
+ }
82
+ });
83
+ //# sourceMappingURL=themes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.test.js","sourceRoot":"","sources":["../../test/themes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ // test/third-party-api.test.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const node_test_1 = require("node:test");
41
+ const node_assert_1 = __importDefault(require("node:assert"));
42
+ const os = __importStar(require("os"));
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const third_party_api_1 = require("../src/extractors/third-party-api");
46
+ const dark_1 = require("../src/themes/builtin/dark");
47
+ const claude_settings_env_1 = require("../src/utils/claude-settings-env");
48
+ const TMP_CWD = os.tmpdir();
49
+ (0, node_test_1.test)('extractThirdPartyApi should return empty array when no providers configured', async () => {
50
+ const results = await (0, third_party_api_1.extractThirdPartyApi)([], dark_1.darkTheme, 500, TMP_CWD);
51
+ node_assert_1.default.ok(Array.isArray(results));
52
+ node_assert_1.default.strictEqual(results.length, 0);
53
+ });
54
+ (0, node_test_1.test)('extractThirdPartyApi skips providers without keys in env/settings', async () => {
55
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'pulse-no-keys-'));
56
+ const keys = [
57
+ 'ZHIPU_API_KEY', 'ZHIPU_BASE_URL', 'ZHIPUAI_API_KEY', 'BIGMODEL_API_KEY', 'BIGMODEL_BASE_URL',
58
+ 'DEEPSEEK_API_KEY', 'DEEPSEEK_BASE_URL',
59
+ 'MINIMAX_API_KEY', 'MINIMAX_GROUP_ID', 'MINIMAX_BASE_URL',
60
+ 'ANTHROPIC_BASE_URL', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_API_KEY',
61
+ 'PULSE_PROVIDER',
62
+ 'PULSE_ZHIPU_API_KEY', 'PULSE_ZHIPU_BASE_URL',
63
+ 'PULSE_DEEPSEEK_API_KEY', 'PULSE_DEEPSEEK_BASE_URL'
64
+ ];
65
+ const saved = {};
66
+ for (const k of keys) {
67
+ saved[k] = process.env[k];
68
+ delete process.env[k];
69
+ }
70
+ (0, claude_settings_env_1.__setTestEnvOverride)({});
71
+ try {
72
+ const results = await (0, third_party_api_1.extractThirdPartyApi)(['zhipu', 'deepseek'], dark_1.darkTheme, 500, cwd);
73
+ node_assert_1.default.ok(Array.isArray(results));
74
+ node_assert_1.default.strictEqual(results.length, 0);
75
+ }
76
+ finally {
77
+ (0, claude_settings_env_1.__setTestEnvOverride)(null);
78
+ for (const k of keys) {
79
+ const v = saved[k];
80
+ if (v === undefined)
81
+ delete process.env[k];
82
+ else
83
+ process.env[k] = v;
84
+ }
85
+ fs.rmSync(cwd, { recursive: true, force: true });
86
+ }
87
+ });
88
+ (0, node_test_1.test)('extractThirdPartyApi should gracefully handle unknown provider ids', async () => {
89
+ const cwd = fs.mkdtempSync(path.join(os.tmpdir(), 'pulse-unknown-prov-'));
90
+ try {
91
+ const results = await (0, third_party_api_1.extractThirdPartyApi)(['nonexistent_provider'], dark_1.darkTheme, 500, cwd);
92
+ node_assert_1.default.ok(Array.isArray(results));
93
+ node_assert_1.default.strictEqual(results.length, 0);
94
+ }
95
+ finally {
96
+ fs.rmSync(cwd, { recursive: true, force: true });
97
+ }
98
+ });
99
+ //# sourceMappingURL=third-party-api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"third-party-api.test.js","sourceRoot":"","sources":["../../test/third-party-api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../src/cli.ts","../src/index.ts","../src/config/defaults.ts","../src/config/loader.ts","../src/config/validator.ts","../src/extractors/account-usage.ts","../src/extractors/context.ts","../src/extractors/cost.ts","../src/extractors/git.ts","../src/extractors/index.ts","../src/extractors/mcp.ts","../src/extractors/model.ts","../src/extractors/output-style.ts","../src/extractors/rate-limits.ts","../src/extractors/session.ts","../src/extractors/thinking.ts","../src/extractors/third-party-api.ts","../src/extractors/transcript.ts","../src/extractors/workspace.ts","../src/formatters/duration.ts","../src/formatters/index.ts","../src/formatters/layout.ts","../src/formatters/progress-bar.ts","../src/formatters/segment.ts","../src/formatters/separator.ts","../src/parser/stdin-parser.ts","../src/themes/icon-provider.ts","../src/themes/index.ts","../src/themes/builtin/cyberpunk.ts","../src/themes/builtin/dark.ts","../src/themes/builtin/forest.ts","../src/themes/builtin/light.ts","../src/themes/builtin/ocean.ts","../src/themes/icon-sets/nerd.ts","../src/themes/icon-sets/text.ts","../src/types/pulse-config.ts","../src/types/pulse-input.ts","../src/types/theme.ts","../src/utils/ansi.ts","../src/utils/cache.ts","../src/utils/constants.ts","../src/utils/fs.ts","../src/utils/git.ts","../src/utils/logger.ts","../test/advanced-extractors.test.ts","../test/benchmark.ts","../test/extractors.test.ts","../test/formatters.test.ts","../test/git.test.ts","../test/parser.test.ts","../test/themes.test.ts","../test/third-party-api.test.ts"],"version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "pulse-line",
3
+ "version": "1.0.0",
4
+ "description": "Customizable status bar for Claude Code",
5
+ "main": "dist/src/index.js",
6
+ "bin": {
7
+ "pulse-line": "./bin/pulse-line.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "watch": "tsc -w",
12
+ "start": "node dist/src/index.js",
13
+ "dev": "ts-node src/index.ts",
14
+ "test": "node scripts/test.js",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "bin/",
20
+ "commands/",
21
+ ".claude-plugin/",
22
+ "skills/"
23
+ ],
24
+ "keywords": [
25
+ "claude-code",
26
+ "statusline",
27
+ "status-bar",
28
+ "monitoring",
29
+ "pulse-line"
30
+ ],
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=18.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.0.0",
37
+ "ts-node": "^10.9.0",
38
+ "typescript": "^5.0.0"
39
+ },
40
+ "dependencies": {
41
+ "commander": "^14.0.3"
42
+ }
43
+ }