@colin4k1024/tsp 2.5.2 → 2.5.3

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 (36) hide show
  1. package/bin/lib/install-surface.js +5 -0
  2. package/hooks/harness-statusline.js +34 -11
  3. package/manifests/install-modules.json +98 -31
  4. package/package.json +2 -1
  5. package/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  6. package/scripts/__pycache__/build_platform_artifacts.cpython-311.pyc +0 -0
  7. package/scripts/__pycache__/install_platform.cpython-311.pyc +0 -0
  8. package/scripts/__pycache__/langfuse_trace.cpython-311.pyc +0 -0
  9. package/scripts/__pycache__/query_audit_logs.cpython-311.pyc +0 -0
  10. package/scripts/__pycache__/scan_leaked_keys.cpython-311.pyc +0 -0
  11. package/scripts/__pycache__/team_skills_platform.cpython-311.pyc +0 -0
  12. package/scripts/__pycache__/team_skills_platform.cpython-313.pyc +0 -0
  13. package/scripts/__pycache__/validate_library.cpython-311.pyc +0 -0
  14. package/scripts/__pycache__/validate_workflow_state.cpython-311.pyc +0 -0
  15. package/scripts/evolution/__pycache__/__init__.cpython-311.pyc +0 -0
  16. package/scripts/evolution/__pycache__/store.cpython-311.pyc +0 -0
  17. package/scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  18. package/scripts/hooks/__pycache__/mcp_health_check.cpython-311.pyc +0 -0
  19. package/scripts/hooks/__pycache__/observe.cpython-311.pyc +0 -0
  20. package/scripts/hooks/__pycache__/session_end.cpython-311.pyc +0 -0
  21. package/scripts/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  22. package/scripts/hooks/suggest-compact.js +41 -0
  23. package/scripts/lib/__pycache__/audit_logger.cpython-311.pyc +0 -0
  24. package/scripts/lib/__pycache__/audit_query.cpython-311.pyc +0 -0
  25. package/scripts/lib/__pycache__/hook_contract.cpython-311.pyc +0 -0
  26. package/scripts/lib/__pycache__/memory_store.cpython-311.pyc +0 -0
  27. package/scripts/lib/__pycache__/utils.cpython-311.pyc +0 -0
  28. package/scripts/lib/install/request.js +1 -1
  29. package/scripts/lib/install-manifests.js +9 -1
  30. package/scripts/lib/install-targets/cangming-home.js +143 -0
  31. package/scripts/lib/install-targets/codewhale-home.js +187 -0
  32. package/scripts/lib/install-targets/registry.js +5 -1
  33. package/scripts/lib/transcript-usage.js +183 -0
  34. package/scripts/test-cangming-install.js +105 -0
  35. package/skills/goframe-v2/examples/practices/quick-demo/manifest/config/config.yaml +14 -14
  36. package/skills/repo-scan/SKILL.md +63 -63
@@ -37,6 +37,11 @@ const TARGET_METADATA = Object.freeze({
37
37
  installPath: '~/.config/opencode/',
38
38
  scope: 'home-level',
39
39
  },
40
+ cangming: {
41
+ label: 'Cangming',
42
+ installPath: '~/.config/cangming/',
43
+ scope: 'home-level',
44
+ },
40
45
  codebuddy: {
41
46
  label: 'CodeBuddy',
42
47
  installPath: './.codebuddy/',
@@ -52,22 +52,45 @@ process.stdin.on('end', () => {
52
52
  if (remaining != null) {
53
53
  const usableRemaining = Math.max(0, ((remaining - AUTO_COMPACT_BUFFER_PCT) / (100 - AUTO_COMPACT_BUFFER_PCT)) * 100);
54
54
  usedPct = Math.max(0, Math.min(100, Math.round(100 - usableRemaining)));
55
+ } else if (data.transcript_path) {
56
+ // Parse actual token usage from transcript JSONL (CCometixLine approach)
57
+ try {
58
+ const { resolveTranscriptMetrics } = require('../scripts/lib/transcript-usage');
59
+ const modelId = (data.model && data.model.id) || process.env.CLAUDE_MODEL || null;
60
+ const metrics = resolveTranscriptMetrics(data.transcript_path, modelId);
61
+ if (metrics) {
62
+ usedPct = Math.max(0, Math.min(100, Math.round(metrics.usagePct)));
63
+ }
64
+ } catch (_) { /* ignore */ }
55
65
 
56
- // Write bridge file for harness-context-monitor.js
57
- if (session) {
66
+ // Final fallback: file size estimate
67
+ if (usedPct == null) {
58
68
  try {
59
- const bridgePath = path.join(os.tmpdir(), `harness-ctx-${session}.json`);
60
- fs.writeFileSync(bridgePath, JSON.stringify({
61
- session_id: session,
62
- remaining_percentage: remaining,
63
- used_pct: usedPct,
64
- active_role: activeRole,
65
- timestamp: Math.floor(Date.now() / 1000),
66
- }));
69
+ const stat = fs.statSync(data.transcript_path);
70
+ const estimatedTokens = Math.round(stat.size * 0.25);
71
+ if (estimatedTokens > 0) {
72
+ usedPct = Math.max(0, Math.min(100, Math.round((estimatedTokens / 200000) * 100)));
73
+ }
67
74
  } catch (_) { /* ignore */ }
68
75
  }
76
+ }
77
+
78
+ // Write bridge file for downstream hooks (suggest-compact, context-monitor)
79
+ if (usedPct != null && session) {
80
+ try {
81
+ const bridgePath = path.join(os.tmpdir(), `harness-ctx-${session}.json`);
82
+ fs.writeFileSync(bridgePath, JSON.stringify({
83
+ session_id: session,
84
+ remaining_percentage: remaining != null ? remaining : null,
85
+ used_pct: usedPct,
86
+ active_role: activeRole,
87
+ timestamp: Math.floor(Date.now() / 1000),
88
+ }));
89
+ } catch (_) { /* ignore */ }
90
+ }
69
91
 
70
- // Build progress bar (10 segments)
92
+ // Build progress bar (10 segments)
93
+ if (usedPct != null) {
71
94
  const filled = Math.floor(usedPct / 10);
72
95
  const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
73
96
  if (usedPct < 50) {
@@ -14,10 +14,12 @@
14
14
  "antigravity",
15
15
  "codex",
16
16
  "opencode",
17
+ "cangming",
17
18
  "codebuddy",
18
19
  "copilot",
19
20
  "windsurf",
20
- "augment"
21
+ "augment",
22
+ "codewhale"
21
23
  ],
22
24
  "dependencies": [],
23
25
  "defaultInstall": true,
@@ -39,7 +41,9 @@
39
41
  "antigravity",
40
42
  "codex",
41
43
  "opencode",
42
- "codebuddy"
44
+ "cangming",
45
+ "codebuddy",
46
+ "codewhale"
43
47
  ],
44
48
  "dependencies": [],
45
49
  "defaultInstall": true,
@@ -59,7 +63,9 @@
59
63
  "antigravity",
60
64
  "codex",
61
65
  "opencode",
62
- "codebuddy"
66
+ "cangming",
67
+ "codebuddy",
68
+ "codewhale"
63
69
  ],
64
70
  "dependencies": [],
65
71
  "defaultInstall": true,
@@ -79,7 +85,9 @@
79
85
  "claude",
80
86
  "cursor",
81
87
  "opencode",
82
- "codebuddy"
88
+ "cangming",
89
+ "codebuddy",
90
+ "codewhale"
83
91
  ],
84
92
  "dependencies": [],
85
93
  "defaultInstall": true,
@@ -104,10 +112,12 @@
104
112
  "codex",
105
113
  "gemini",
106
114
  "opencode",
115
+ "cangming",
107
116
  "codebuddy",
108
117
  "copilot",
109
118
  "windsurf",
110
- "augment"
119
+ "augment",
120
+ "codewhale"
111
121
  ],
112
122
  "dependencies": [],
113
123
  "defaultInstall": true,
@@ -162,7 +172,9 @@
162
172
  "antigravity",
163
173
  "codex",
164
174
  "opencode",
165
- "codebuddy"
175
+ "cangming",
176
+ "codebuddy",
177
+ "codewhale"
166
178
  ],
167
179
  "dependencies": [
168
180
  "rules-core",
@@ -190,7 +202,9 @@
190
202
  "antigravity",
191
203
  "codex",
192
204
  "opencode",
193
- "codebuddy"
205
+ "cangming",
206
+ "codebuddy",
207
+ "codewhale"
194
208
  ],
195
209
  "dependencies": [
196
210
  "platform-configs"
@@ -233,7 +247,9 @@
233
247
  "antigravity",
234
248
  "codex",
235
249
  "opencode",
236
- "codebuddy"
250
+ "cangming",
251
+ "codebuddy",
252
+ "codewhale"
237
253
  ],
238
254
  "dependencies": [
239
255
  "platform-configs"
@@ -260,7 +276,9 @@
260
276
  "antigravity",
261
277
  "codex",
262
278
  "opencode",
263
- "codebuddy"
279
+ "cangming",
280
+ "codebuddy",
281
+ "codewhale"
264
282
  ],
265
283
  "dependencies": [
266
284
  "workflow-quality"
@@ -284,7 +302,9 @@
284
302
  "antigravity",
285
303
  "codex",
286
304
  "opencode",
287
- "codebuddy"
305
+ "cangming",
306
+ "codebuddy",
307
+ "codewhale"
288
308
  ],
289
309
  "dependencies": [
290
310
  "platform-configs"
@@ -321,7 +341,9 @@
321
341
  "antigravity",
322
342
  "codex",
323
343
  "opencode",
324
- "codebuddy"
344
+ "cangming",
345
+ "codebuddy",
346
+ "codewhale"
325
347
  ],
326
348
  "dependencies": [
327
349
  "platform-configs"
@@ -357,7 +379,9 @@
357
379
  "antigravity",
358
380
  "codex",
359
381
  "opencode",
360
- "codebuddy"
382
+ "cangming",
383
+ "codebuddy",
384
+ "codewhale"
361
385
  ],
362
386
  "dependencies": [
363
387
  "platform-configs"
@@ -385,7 +409,9 @@
385
409
  "antigravity",
386
410
  "codex",
387
411
  "opencode",
388
- "codebuddy"
412
+ "cangming",
413
+ "codebuddy",
414
+ "codewhale"
389
415
  ],
390
416
  "dependencies": [
391
417
  "platform-configs"
@@ -411,7 +437,9 @@
411
437
  "antigravity",
412
438
  "codex",
413
439
  "opencode",
414
- "codebuddy"
440
+ "cangming",
441
+ "codebuddy",
442
+ "codewhale"
415
443
  ],
416
444
  "dependencies": [
417
445
  "platform-configs"
@@ -434,7 +462,9 @@
434
462
  "antigravity",
435
463
  "codex",
436
464
  "opencode",
437
- "codebuddy"
465
+ "cangming",
466
+ "codebuddy",
467
+ "codewhale"
438
468
  ],
439
469
  "dependencies": [
440
470
  "business-content"
@@ -460,7 +490,9 @@
460
490
  "cursor",
461
491
  "codex",
462
492
  "opencode",
463
- "codebuddy"
493
+ "cangming",
494
+ "codebuddy",
495
+ "codewhale"
464
496
  ],
465
497
  "dependencies": [
466
498
  "platform-configs"
@@ -484,7 +516,9 @@
484
516
  "targets": [
485
517
  "claude",
486
518
  "codex",
487
- "opencode"
519
+ "opencode",
520
+ "cangming",
521
+ "codewhale"
488
522
  ],
489
523
  "dependencies": [
490
524
  "commands-core",
@@ -511,7 +545,9 @@
511
545
  "cursor",
512
546
  "codex",
513
547
  "opencode",
514
- "codebuddy"
548
+ "cangming",
549
+ "codebuddy",
550
+ "codewhale"
515
551
  ],
516
552
  "dependencies": [
517
553
  "platform-configs"
@@ -532,7 +568,9 @@
532
568
  "cursor",
533
569
  "codex",
534
570
  "opencode",
535
- "codebuddy"
571
+ "cangming",
572
+ "codebuddy",
573
+ "codewhale"
536
574
  ],
537
575
  "dependencies": [
538
576
  "workflow-engine"
@@ -559,7 +597,9 @@
559
597
  "antigravity",
560
598
  "codex",
561
599
  "opencode",
562
- "codebuddy"
600
+ "cangming",
601
+ "codebuddy",
602
+ "codewhale"
563
603
  ],
564
604
  "dependencies": [
565
605
  "platform-configs"
@@ -598,7 +638,9 @@
598
638
  "antigravity",
599
639
  "codex",
600
640
  "opencode",
601
- "codebuddy"
641
+ "cangming",
642
+ "codebuddy",
643
+ "codewhale"
602
644
  ],
603
645
  "dependencies": [
604
646
  "platform-configs"
@@ -621,7 +663,9 @@
621
663
  "antigravity",
622
664
  "codex",
623
665
  "opencode",
624
- "codebuddy"
666
+ "cangming",
667
+ "codebuddy",
668
+ "codewhale"
625
669
  ],
626
670
  "dependencies": [
627
671
  "platform-configs"
@@ -650,7 +694,9 @@
650
694
  "antigravity",
651
695
  "codex",
652
696
  "opencode",
653
- "codebuddy"
697
+ "cangming",
698
+ "codebuddy",
699
+ "codewhale"
654
700
  ],
655
701
  "dependencies": [
656
702
  "platform-configs"
@@ -673,7 +719,9 @@
673
719
  "antigravity",
674
720
  "codex",
675
721
  "opencode",
676
- "codebuddy"
722
+ "cangming",
723
+ "codebuddy",
724
+ "codewhale"
677
725
  ],
678
726
  "dependencies": [
679
727
  "platform-configs"
@@ -695,7 +743,9 @@
695
743
  "claude",
696
744
  "cursor",
697
745
  "codex",
698
- "opencode"
746
+ "opencode",
747
+ "cangming",
748
+ "codewhale"
699
749
  ],
700
750
  "dependencies": [
701
751
  "agents-core",
@@ -720,7 +770,9 @@
720
770
  "claude",
721
771
  "cursor",
722
772
  "codex",
723
- "opencode"
773
+ "opencode",
774
+ "cangming",
775
+ "codewhale"
724
776
  ],
725
777
  "dependencies": [
726
778
  "team-workflow"
@@ -760,8 +812,17 @@
760
812
  "skills/workflow-forensics",
761
813
  "templates/context-docs"
762
814
  ],
763
- "targets": ["claude", "cursor", "codex", "opencode"],
764
- "dependencies": ["team-workflow"],
815
+ "targets": [
816
+ "claude",
817
+ "cursor",
818
+ "codex",
819
+ "opencode",
820
+ "cangming",
821
+ "codewhale"
822
+ ],
823
+ "dependencies": [
824
+ "team-workflow"
825
+ ],
765
826
  "defaultInstall": false,
766
827
  "cost": "heavy",
767
828
  "stability": "stable"
@@ -781,7 +842,9 @@
781
842
  "antigravity",
782
843
  "codex",
783
844
  "opencode",
784
- "codebuddy"
845
+ "cangming",
846
+ "codebuddy",
847
+ "codewhale"
785
848
  ],
786
849
  "dependencies": [
787
850
  "platform-configs",
@@ -808,7 +871,9 @@
808
871
  "antigravity",
809
872
  "codex",
810
873
  "opencode",
811
- "codebuddy"
874
+ "cangming",
875
+ "codebuddy",
876
+ "codewhale"
812
877
  ],
813
878
  "dependencies": [
814
879
  "hooks-runtime",
@@ -843,7 +908,9 @@
843
908
  "antigravity",
844
909
  "codex",
845
910
  "opencode",
846
- "codebuddy"
911
+ "cangming",
912
+ "codebuddy",
913
+ "codewhale"
847
914
  ],
848
915
  "dependencies": [
849
916
  "commands-core",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colin4k1024/tsp",
3
- "version": "2.5.2",
3
+ "version": "2.5.3",
4
4
  "description": "Open-source Team Skills Platform for role-based AI delivery workflows, shared skills, hooks, commands, and multi-platform installs.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -62,6 +62,7 @@
62
62
  "install:codex": "node scripts/install-apply.js --profile full --target codex",
63
63
  "install:cursor": "node scripts/install-apply.js --profile full --target cursor",
64
64
  "install:opencode": "node scripts/install-apply.js --profile full --target opencode",
65
+ "install:cangming": "node scripts/install-apply.js --profile full --target cangming",
65
66
  "prepack": "node scripts/validate-prebuilt.js",
66
67
  "prepublishOnly": "node scripts/validate-prebuilt.js",
67
68
  "test": "node tests/run-all.js",
@@ -160,6 +160,27 @@ function resolveContextMetrics(data) {
160
160
  };
161
161
  }
162
162
 
163
+ // Transcript JSONL usage parsing (CCometixLine approach)
164
+ const transcriptPath = data.transcript_path;
165
+ const modelId = (data.model && data.model.id) || process.env.CLAUDE_MODEL || null;
166
+ if (transcriptPath && typeof transcriptPath === 'string') {
167
+ try {
168
+ const { resolveTranscriptMetrics } = require('../lib/transcript-usage');
169
+ const transcriptMetrics = resolveTranscriptMetrics(transcriptPath, modelId);
170
+ if (transcriptMetrics) {
171
+ return {
172
+ usagePct: clampPct(transcriptMetrics.usagePct),
173
+ remainingPct: null,
174
+ contextLimit: transcriptMetrics.contextLimit,
175
+ contextSize: transcriptMetrics.contextTokens,
176
+ source: 'transcript_usage',
177
+ };
178
+ }
179
+ } catch (_) {
180
+ // transcript parsing failed — fall through
181
+ }
182
+ }
183
+
163
184
  const bridge = readBridgeMetrics(sessionKey(data));
164
185
  if (bridge) {
165
186
  return {
@@ -169,6 +190,26 @@ function resolveContextMetrics(data) {
169
190
  };
170
191
  }
171
192
 
193
+ // Final fallback: estimate from transcript file size
194
+ if (transcriptPath && typeof transcriptPath === 'string') {
195
+ try {
196
+ const stat = fs.statSync(transcriptPath);
197
+ const estimatedTokens = Math.round(stat.size * 0.25);
198
+ if (estimatedTokens > 0) {
199
+ const usagePct = clampPct((estimatedTokens / contextLimit) * 100);
200
+ return {
201
+ usagePct,
202
+ remainingPct: null,
203
+ contextLimit,
204
+ contextSize: estimatedTokens,
205
+ source: 'transcript_size',
206
+ };
207
+ }
208
+ } catch (_) {
209
+ // transcript not accessible — fall through
210
+ }
211
+ }
212
+
172
213
  return null;
173
214
  }
174
215
 
@@ -3,7 +3,7 @@
3
3
  const { validateInstallModuleIds } = require('../install-manifests');
4
4
  const { normalizeInstallTarget } = require('../install-targets/registry');
5
5
 
6
- const LEGACY_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'opencode'];
6
+ const LEGACY_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'opencode', 'cangming'];
7
7
 
8
8
  function dedupeStrings(values) {
9
9
  return [...new Set((Array.isArray(values) ? values : []).map(value => String(value).trim()).filter(Boolean))];
@@ -8,7 +8,7 @@ const {
8
8
  } = require('./install-targets/registry');
9
9
 
10
10
  const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
11
- const SUPPORTED_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'gemini', 'opencode', 'codebuddy', 'copilot', 'windsurf', 'augment'];
11
+ const SUPPORTED_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'codex', 'gemini', 'opencode', 'cangming', 'codewhale', 'codebuddy', 'copilot', 'windsurf', 'augment'];
12
12
  const COMPONENT_FAMILY_PREFIXES = {
13
13
  baseline: 'baseline:',
14
14
  language: 'lang:',
@@ -54,6 +54,14 @@ const LEGACY_COMPAT_BASE_MODULE_IDS_BY_TARGET = Object.freeze({
54
54
  'platform-configs',
55
55
  'workflow-quality',
56
56
  ],
57
+ codewhale: [
58
+ 'rules-core',
59
+ 'agents-core',
60
+ 'commands-core',
61
+ 'hooks-runtime',
62
+ 'platform-configs',
63
+ 'workflow-quality',
64
+ ],
57
65
  });
58
66
  const LEGACY_LANGUAGE_ALIAS_TO_CANONICAL = Object.freeze({
59
67
  cpp: 'cpp',