@trieungoctam/vibekit 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 (352) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/agents/debugger.md +158 -0
  4. package/agents/docs-manager.md +220 -0
  5. package/agents/planner.md +129 -0
  6. package/agents/researcher.md +58 -0
  7. package/agents/reviewer.md +152 -0
  8. package/agents/tester.md +126 -0
  9. package/bin/vibekit.js +18 -0
  10. package/hooks/lib/ck-config-utils.cjs +831 -0
  11. package/hooks/lib/colors.cjs +95 -0
  12. package/hooks/lib/config-counter.cjs +103 -0
  13. package/hooks/lib/context-builder.cjs +616 -0
  14. package/hooks/lib/git-info-cache.cjs +143 -0
  15. package/hooks/lib/hook-logger.cjs +92 -0
  16. package/hooks/lib/privacy-checker.cjs +297 -0
  17. package/hooks/lib/project-detector.cjs +474 -0
  18. package/hooks/lib/scout-checker.cjs +263 -0
  19. package/hooks/lib/transcript-parser.cjs +181 -0
  20. package/hooks/post-edit-simplify-reminder.cjs +156 -0
  21. package/hooks/privacy-block.cjs +166 -0
  22. package/hooks/scout-block.cjs +147 -0
  23. package/hooks/session-init.cjs +360 -0
  24. package/package.json +41 -0
  25. package/rules/development-rules.md +52 -0
  26. package/rules/documentation-management.md +121 -0
  27. package/rules/orchestration-protocol.md +43 -0
  28. package/rules/primary-workflow.md +57 -0
  29. package/rules/team-coordination-rules.md +90 -0
  30. package/skills/ai/agent-browser/SKILL.md +294 -0
  31. package/skills/ai/agent-browser/references/.gitkeep +0 -0
  32. package/skills/ai/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
  33. package/skills/ai/agent-browser/references/browserbase-cloud-setup.md +161 -0
  34. package/skills/ai/ai-artist/SKILL.md +122 -0
  35. package/skills/ai/ai-artist/data/awesome-prompts.csv +3592 -0
  36. package/skills/ai/ai-artist/data/lighting.csv +19 -0
  37. package/skills/ai/ai-artist/data/nano-banana-templates.csv +17 -0
  38. package/skills/ai/ai-artist/data/platforms.csv +11 -0
  39. package/skills/ai/ai-artist/data/styles.csv +26 -0
  40. package/skills/ai/ai-artist/data/techniques.csv +19 -0
  41. package/skills/ai/ai-artist/data/use-cases.csv +16 -0
  42. package/skills/ai/ai-artist/references/advanced-techniques.md +184 -0
  43. package/skills/ai/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
  44. package/skills/ai/ai-artist/references/domain-code.md +66 -0
  45. package/skills/ai/ai-artist/references/domain-data.md +72 -0
  46. package/skills/ai/ai-artist/references/domain-marketing.md +66 -0
  47. package/skills/ai/ai-artist/references/domain-patterns.md +33 -0
  48. package/skills/ai/ai-artist/references/domain-writing.md +68 -0
  49. package/skills/ai/ai-artist/references/image-prompting.md +141 -0
  50. package/skills/ai/ai-artist/references/llm-prompting.md +165 -0
  51. package/skills/ai/ai-artist/references/nano-banana.md +136 -0
  52. package/skills/ai/ai-artist/references/reasoning-techniques.md +201 -0
  53. package/skills/ai/ai-artist/references/validation-workflow.md +117 -0
  54. package/skills/ai/ai-artist/scripts/core.py +197 -0
  55. package/skills/ai/ai-artist/scripts/extract_prompts.py +102 -0
  56. package/skills/ai/ai-artist/scripts/generate.py +370 -0
  57. package/skills/ai/ai-artist/scripts/search.py +147 -0
  58. package/skills/ai/ai-multimodal/.env.example +204 -0
  59. package/skills/ai/ai-multimodal/SKILL.md +110 -0
  60. package/skills/ai/ai-multimodal/references/audio-processing.md +387 -0
  61. package/skills/ai/ai-multimodal/references/image-generation.md +939 -0
  62. package/skills/ai/ai-multimodal/references/music-generation.md +311 -0
  63. package/skills/ai/ai-multimodal/references/video-analysis.md +515 -0
  64. package/skills/ai/ai-multimodal/references/video-generation.md +457 -0
  65. package/skills/ai/ai-multimodal/references/vision-understanding.md +492 -0
  66. package/skills/ai/ai-multimodal/scripts/.coverage +0 -0
  67. package/skills/ai/ai-multimodal/scripts/check_setup.py +315 -0
  68. package/skills/ai/ai-multimodal/scripts/document_converter.py +395 -0
  69. package/skills/ai/ai-multimodal/scripts/gemini_batch_process.py +1185 -0
  70. package/skills/ai/ai-multimodal/scripts/media_optimizer.py +506 -0
  71. package/skills/ai/ai-multimodal/scripts/requirements.txt +26 -0
  72. package/skills/ai/ai-multimodal/scripts/tests/.coverage +0 -0
  73. package/skills/ai/ai-multimodal/scripts/tests/requirements.txt +20 -0
  74. package/skills/ai/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
  75. package/skills/ai/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
  76. package/skills/ai/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
  77. package/skills/ai/mcp-management/README.md +219 -0
  78. package/skills/ai/mcp-management/SKILL.md +210 -0
  79. package/skills/ai/mcp-management/assets/tools.json +3146 -0
  80. package/skills/ai/mcp-management/references/configuration.md +114 -0
  81. package/skills/ai/mcp-management/references/gemini-cli-integration.md +221 -0
  82. package/skills/ai/mcp-management/references/mcp-protocol.md +116 -0
  83. package/skills/ai/mcp-management/scripts/.env.example +10 -0
  84. package/skills/ai/mcp-management/scripts/cli.ts +195 -0
  85. package/skills/ai/mcp-management/scripts/dist/analyze-tools.js +70 -0
  86. package/skills/ai/mcp-management/scripts/dist/cli.js +160 -0
  87. package/skills/ai/mcp-management/scripts/dist/mcp-client.js +183 -0
  88. package/skills/ai/mcp-management/scripts/mcp-client.ts +230 -0
  89. package/skills/ai/mcp-management/scripts/package.json +20 -0
  90. package/skills/ai/mcp-management/scripts/tsconfig.json +15 -0
  91. package/skills/core/brainstorm/SKILL.md +164 -0
  92. package/skills/core/brainstorm/scripts/frame-template.html +214 -0
  93. package/skills/core/brainstorm/scripts/helper.js +88 -0
  94. package/skills/core/brainstorm/scripts/server.cjs +338 -0
  95. package/skills/core/brainstorm/scripts/start-server.sh +153 -0
  96. package/skills/core/brainstorm/scripts/stop-server.sh +55 -0
  97. package/skills/core/brainstorm/spec-document-reviewer-prompt.md +49 -0
  98. package/skills/core/brainstorm/visual-companion.md +286 -0
  99. package/skills/core/code-review/SKILL.md +147 -0
  100. package/skills/core/code-review/references/code-review-reception.md +113 -0
  101. package/skills/core/code-review/references/codebase-scan-workflow.md +29 -0
  102. package/skills/core/code-review/references/edge-case-scouting.md +119 -0
  103. package/skills/core/code-review/references/parallel-review-workflow.md +69 -0
  104. package/skills/core/code-review/references/requesting-code-review.md +116 -0
  105. package/skills/core/code-review/references/task-management-reviews.md +140 -0
  106. package/skills/core/code-review/references/verification-before-completion.md +139 -0
  107. package/skills/core/cook/README.md +86 -0
  108. package/skills/core/cook/SKILL.md +113 -0
  109. package/skills/core/cook/references/intent-detection.md +101 -0
  110. package/skills/core/cook/references/review-cycle.md +75 -0
  111. package/skills/core/cook/references/subagent-patterns.md +75 -0
  112. package/skills/core/cook/references/workflow-steps.md +172 -0
  113. package/skills/core/debug/SKILL.md +121 -0
  114. package/skills/core/debug/references/defense-in-depth.md +124 -0
  115. package/skills/core/debug/references/frontend-verification.md +103 -0
  116. package/skills/core/debug/references/investigation-methodology.md +101 -0
  117. package/skills/core/debug/references/log-and-ci-analysis.md +97 -0
  118. package/skills/core/debug/references/performance-diagnostics.md +113 -0
  119. package/skills/core/debug/references/reporting-standards.md +122 -0
  120. package/skills/core/debug/references/root-cause-tracing.md +122 -0
  121. package/skills/core/debug/references/systematic-debugging.md +102 -0
  122. package/skills/core/debug/references/task-management-debugging.md +155 -0
  123. package/skills/core/debug/references/verification.md +123 -0
  124. package/skills/core/debug/scripts/find-polluter.sh +63 -0
  125. package/skills/core/debug/scripts/find-polluter.test.md +102 -0
  126. package/skills/core/execute/SKILL.md +70 -0
  127. package/skills/core/fix/SKILL.md +111 -0
  128. package/skills/core/fix/references/complexity-assessment.md +72 -0
  129. package/skills/core/fix/references/mode-selection.md +46 -0
  130. package/skills/core/fix/references/parallel-exploration.md +100 -0
  131. package/skills/core/fix/references/review-cycle.md +77 -0
  132. package/skills/core/fix/references/skill-activation-matrix.md +78 -0
  133. package/skills/core/fix/references/task-orchestration.md +103 -0
  134. package/skills/core/fix/references/workflow-ci.md +28 -0
  135. package/skills/core/fix/references/workflow-deep.md +122 -0
  136. package/skills/core/fix/references/workflow-logs.md +72 -0
  137. package/skills/core/fix/references/workflow-quick.md +59 -0
  138. package/skills/core/fix/references/workflow-standard.md +111 -0
  139. package/skills/core/fix/references/workflow-test.md +75 -0
  140. package/skills/core/fix/references/workflow-types.md +33 -0
  141. package/skills/core/fix/references/workflow-ui.md +75 -0
  142. package/skills/core/plan/SKILL.md +145 -0
  143. package/skills/core/plan/plan-document-reviewer-prompt.md +49 -0
  144. package/skills/core/subagent-dev/SKILL.md +277 -0
  145. package/skills/core/subagent-dev/code-quality-reviewer-prompt.md +26 -0
  146. package/skills/core/subagent-dev/implementer-prompt.md +113 -0
  147. package/skills/core/subagent-dev/spec-reviewer-prompt.md +61 -0
  148. package/skills/core/tdd/SKILL.md +371 -0
  149. package/skills/core/tdd/testing-anti-patterns.md +299 -0
  150. package/skills/core/test/SKILL.md +109 -0
  151. package/skills/core/test/references/report-format.md +58 -0
  152. package/skills/core/test/references/test-execution-workflow.md +103 -0
  153. package/skills/core/test/references/ui-testing-workflow.md +65 -0
  154. package/skills/core/verify/SKILL.md +139 -0
  155. package/skills/dev/backend-dev/SKILL.md +96 -0
  156. package/skills/dev/backend-dev/references/backend-api-design.md +495 -0
  157. package/skills/dev/backend-dev/references/backend-architecture.md +454 -0
  158. package/skills/dev/backend-dev/references/backend-authentication.md +338 -0
  159. package/skills/dev/backend-dev/references/backend-code-quality.md +659 -0
  160. package/skills/dev/backend-dev/references/backend-debugging.md +904 -0
  161. package/skills/dev/backend-dev/references/backend-devops.md +494 -0
  162. package/skills/dev/backend-dev/references/backend-mindset.md +387 -0
  163. package/skills/dev/backend-dev/references/backend-performance.md +397 -0
  164. package/skills/dev/backend-dev/references/backend-security.md +290 -0
  165. package/skills/dev/backend-dev/references/backend-technologies.md +256 -0
  166. package/skills/dev/backend-dev/references/backend-testing.md +429 -0
  167. package/skills/dev/context-engineering/SKILL.md +108 -0
  168. package/skills/dev/context-engineering/references/context-compression.md +84 -0
  169. package/skills/dev/context-engineering/references/context-degradation.md +93 -0
  170. package/skills/dev/context-engineering/references/context-fundamentals.md +75 -0
  171. package/skills/dev/context-engineering/references/context-optimization.md +82 -0
  172. package/skills/dev/context-engineering/references/evaluation.md +89 -0
  173. package/skills/dev/context-engineering/references/memory-systems.md +88 -0
  174. package/skills/dev/context-engineering/references/multi-agent-patterns.md +90 -0
  175. package/skills/dev/context-engineering/references/project-development.md +97 -0
  176. package/skills/dev/context-engineering/references/runtime-awareness.md +202 -0
  177. package/skills/dev/context-engineering/references/tool-design.md +86 -0
  178. package/skills/dev/context-engineering/scripts/compression_evaluator.py +349 -0
  179. package/skills/dev/context-engineering/scripts/context_analyzer.py +317 -0
  180. package/skills/dev/context-engineering/scripts/tests/test_edge_cases.py +246 -0
  181. package/skills/dev/databases/SKILL.md +84 -0
  182. package/skills/dev/databases/analytics.md +198 -0
  183. package/skills/dev/databases/db-design.md +188 -0
  184. package/skills/dev/databases/incremental-etl.md +213 -0
  185. package/skills/dev/databases/references/mongodb-aggregation.md +447 -0
  186. package/skills/dev/databases/references/mongodb-atlas.md +465 -0
  187. package/skills/dev/databases/references/mongodb-crud.md +408 -0
  188. package/skills/dev/databases/references/mongodb-indexing.md +442 -0
  189. package/skills/dev/databases/references/postgresql-administration.md +594 -0
  190. package/skills/dev/databases/references/postgresql-performance.md +527 -0
  191. package/skills/dev/databases/references/postgresql-psql-cli.md +467 -0
  192. package/skills/dev/databases/references/postgresql-queries.md +475 -0
  193. package/skills/dev/databases/scripts/.coverage +0 -0
  194. package/skills/dev/databases/scripts/db_backup.py +502 -0
  195. package/skills/dev/databases/scripts/db_migrate.py +426 -0
  196. package/skills/dev/databases/scripts/db_performance_check.py +457 -0
  197. package/skills/dev/databases/scripts/requirements.txt +20 -0
  198. package/skills/dev/databases/scripts/tests/coverage-db.json +1 -0
  199. package/skills/dev/databases/scripts/tests/requirements.txt +4 -0
  200. package/skills/dev/databases/scripts/tests/test_db_backup.py +340 -0
  201. package/skills/dev/databases/scripts/tests/test_db_migrate.py +277 -0
  202. package/skills/dev/databases/scripts/tests/test_db_performance_check.py +370 -0
  203. package/skills/dev/databases/stacks/bigquery.md +231 -0
  204. package/skills/dev/databases/stacks/d1_cloudflare.md +137 -0
  205. package/skills/dev/databases/stacks/mysql.md +216 -0
  206. package/skills/dev/databases/stacks/postgres.md +235 -0
  207. package/skills/dev/databases/stacks/sqlite.md +244 -0
  208. package/skills/dev/databases/transactional.md +176 -0
  209. package/skills/dev/devops/.env.example +76 -0
  210. package/skills/dev/devops/SKILL.md +97 -0
  211. package/skills/dev/devops/references/browser-rendering.md +305 -0
  212. package/skills/dev/devops/references/cloudflare-d1-kv.md +123 -0
  213. package/skills/dev/devops/references/cloudflare-platform.md +271 -0
  214. package/skills/dev/devops/references/cloudflare-r2-storage.md +280 -0
  215. package/skills/dev/devops/references/cloudflare-workers-advanced.md +312 -0
  216. package/skills/dev/devops/references/cloudflare-workers-apis.md +309 -0
  217. package/skills/dev/devops/references/cloudflare-workers-basics.md +418 -0
  218. package/skills/dev/devops/references/docker-basics.md +297 -0
  219. package/skills/dev/devops/references/docker-compose.md +292 -0
  220. package/skills/dev/devops/references/gcloud-platform.md +297 -0
  221. package/skills/dev/devops/references/gcloud-services.md +304 -0
  222. package/skills/dev/devops/references/kubernetes-basics.md +99 -0
  223. package/skills/dev/devops/references/kubernetes-helm-advanced.md +75 -0
  224. package/skills/dev/devops/references/kubernetes-helm.md +81 -0
  225. package/skills/dev/devops/references/kubernetes-kubectl.md +74 -0
  226. package/skills/dev/devops/references/kubernetes-security-advanced.md +98 -0
  227. package/skills/dev/devops/references/kubernetes-security.md +95 -0
  228. package/skills/dev/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
  229. package/skills/dev/devops/references/kubernetes-troubleshooting.md +49 -0
  230. package/skills/dev/devops/references/kubernetes-workflows-advanced.md +75 -0
  231. package/skills/dev/devops/references/kubernetes-workflows.md +78 -0
  232. package/skills/dev/devops/scripts/cloudflare_deploy.py +269 -0
  233. package/skills/dev/devops/scripts/docker_optimize.py +332 -0
  234. package/skills/dev/devops/scripts/requirements.txt +20 -0
  235. package/skills/dev/devops/scripts/tests/requirements.txt +3 -0
  236. package/skills/dev/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
  237. package/skills/dev/devops/scripts/tests/test_docker_optimize.py +436 -0
  238. package/skills/dev/frontend-design/SKILL.md +78 -0
  239. package/skills/dev/frontend-design/references/ai-multimodal-overview.md +165 -0
  240. package/skills/dev/frontend-design/references/analysis-best-practices.md +80 -0
  241. package/skills/dev/frontend-design/references/analysis-prompts.md +141 -0
  242. package/skills/dev/frontend-design/references/analysis-techniques.md +118 -0
  243. package/skills/dev/frontend-design/references/animejs.md +396 -0
  244. package/skills/dev/frontend-design/references/asset-generation.md +337 -0
  245. package/skills/dev/frontend-design/references/design-extraction-overview.md +71 -0
  246. package/skills/dev/frontend-design/references/extraction-best-practices.md +141 -0
  247. package/skills/dev/frontend-design/references/extraction-output-templates.md +162 -0
  248. package/skills/dev/frontend-design/references/extraction-prompts.md +127 -0
  249. package/skills/dev/frontend-design/references/technical-accessibility.md +119 -0
  250. package/skills/dev/frontend-design/references/technical-best-practices.md +97 -0
  251. package/skills/dev/frontend-design/references/technical-optimization.md +44 -0
  252. package/skills/dev/frontend-design/references/technical-overview.md +90 -0
  253. package/skills/dev/frontend-design/references/technical-workflows.md +150 -0
  254. package/skills/dev/frontend-design/references/visual-analysis-overview.md +95 -0
  255. package/skills/dev/frontend-design/references/workflow-3d.md +102 -0
  256. package/skills/dev/frontend-design/references/workflow-describe.md +87 -0
  257. package/skills/dev/frontend-design/references/workflow-immersive.md +87 -0
  258. package/skills/dev/frontend-design/references/workflow-quick.md +57 -0
  259. package/skills/dev/frontend-design/references/workflow-screenshot.md +63 -0
  260. package/skills/dev/frontend-design/references/workflow-video.md +74 -0
  261. package/skills/dev/frontend-dev/SKILL.md +400 -0
  262. package/skills/dev/frontend-dev/resources/common-patterns.md +331 -0
  263. package/skills/dev/frontend-dev/resources/complete-examples.md +872 -0
  264. package/skills/dev/frontend-dev/resources/component-patterns.md +502 -0
  265. package/skills/dev/frontend-dev/resources/data-fetching.md +767 -0
  266. package/skills/dev/frontend-dev/resources/file-organization.md +502 -0
  267. package/skills/dev/frontend-dev/resources/loading-and-error-states.md +501 -0
  268. package/skills/dev/frontend-dev/resources/performance.md +406 -0
  269. package/skills/dev/frontend-dev/resources/routing-guide.md +364 -0
  270. package/skills/dev/frontend-dev/resources/styling-guide.md +428 -0
  271. package/skills/dev/frontend-dev/resources/typescript-standards.md +418 -0
  272. package/skills/dev/git/SKILL.md +114 -0
  273. package/skills/dev/git/references/branch-management.md +88 -0
  274. package/skills/dev/git/references/commit-standards.md +46 -0
  275. package/skills/dev/git/references/gh-cli-guide.md +109 -0
  276. package/skills/dev/git/references/safety-protocols.md +69 -0
  277. package/skills/dev/git/references/workflow-commit.md +58 -0
  278. package/skills/dev/git/references/workflow-merge.md +48 -0
  279. package/skills/dev/git/references/workflow-pr.md +58 -0
  280. package/skills/dev/git/references/workflow-push.md +52 -0
  281. package/skills/dev/git-worktree/SKILL.md +218 -0
  282. package/skills/utils/ask/SKILL.md +58 -0
  283. package/skills/utils/bootstrap/SKILL.md +101 -0
  284. package/skills/utils/bootstrap/references/shared-phases.md +59 -0
  285. package/skills/utils/bootstrap/references/workflow-auto.md +52 -0
  286. package/skills/utils/bootstrap/references/workflow-fast.md +50 -0
  287. package/skills/utils/bootstrap/references/workflow-full.md +60 -0
  288. package/skills/utils/bootstrap/references/workflow-parallel.md +59 -0
  289. package/skills/utils/ck-help/SKILL.md +102 -0
  290. package/skills/utils/ck-help/scripts/ck-help.py +1321 -0
  291. package/skills/utils/ck-help/scripts/commands_data.yaml +3 -0
  292. package/skills/utils/ck-help/scripts/skills_data.yaml +593 -0
  293. package/skills/utils/copywriting/SKILL.md +94 -0
  294. package/skills/utils/copywriting/references/copy-formulas.md +150 -0
  295. package/skills/utils/copywriting/references/cta-patterns.md +168 -0
  296. package/skills/utils/copywriting/references/email-copy.md +193 -0
  297. package/skills/utils/copywriting/references/headline-templates.md +140 -0
  298. package/skills/utils/copywriting/references/landing-page-copy.md +175 -0
  299. package/skills/utils/copywriting/references/power-words.md +189 -0
  300. package/skills/utils/copywriting/references/social-media-copy.md +222 -0
  301. package/skills/utils/copywriting/references/workflow-cro.md +83 -0
  302. package/skills/utils/copywriting/references/workflow-enhance.md +32 -0
  303. package/skills/utils/copywriting/references/workflow-fast.md +29 -0
  304. package/skills/utils/copywriting/references/workflow-good.md +39 -0
  305. package/skills/utils/copywriting/references/writing-styles.md +247 -0
  306. package/skills/utils/copywriting/scripts/extract-writing-styles.py +308 -0
  307. package/skills/utils/copywriting/templates/copy-brief.md +49 -0
  308. package/skills/utils/docs/SKILL.md +55 -0
  309. package/skills/utils/docs/references/init-workflow.md +32 -0
  310. package/skills/utils/docs/references/summarize-workflow.md +18 -0
  311. package/skills/utils/docs/references/update-workflow.md +59 -0
  312. package/skills/utils/journal/SKILL.md +11 -0
  313. package/skills/utils/kanban/SKILL.md +99 -0
  314. package/skills/utils/preview/SKILL.md +75 -0
  315. package/skills/utils/preview/references/generation-modes.md +95 -0
  316. package/skills/utils/preview/references/view-mode.md +42 -0
  317. package/skills/utils/repomix/SKILL.md +248 -0
  318. package/skills/utils/repomix/references/configuration.md +211 -0
  319. package/skills/utils/repomix/references/usage-patterns.md +232 -0
  320. package/skills/utils/repomix/scripts/.coverage +0 -0
  321. package/skills/utils/repomix/scripts/README.md +179 -0
  322. package/skills/utils/repomix/scripts/repomix_batch.py +455 -0
  323. package/skills/utils/repomix/scripts/repos.example.json +15 -0
  324. package/skills/utils/repomix/scripts/requirements.txt +15 -0
  325. package/skills/utils/repomix/scripts/tests/test_repomix_batch.py +531 -0
  326. package/skills/utils/research/SKILL.md +171 -0
  327. package/skills/utils/scout/SKILL.md +89 -0
  328. package/skills/utils/scout/references/external-scouting.md +140 -0
  329. package/skills/utils/scout/references/internal-scouting.md +119 -0
  330. package/skills/utils/scout/references/task-management-scouting.md +125 -0
  331. package/skills/utils/sequential-thinking/.env.example +8 -0
  332. package/skills/utils/sequential-thinking/README.md +183 -0
  333. package/skills/utils/sequential-thinking/SKILL.md +95 -0
  334. package/skills/utils/sequential-thinking/package.json +31 -0
  335. package/skills/utils/sequential-thinking/references/advanced-strategies.md +79 -0
  336. package/skills/utils/sequential-thinking/references/advanced-techniques.md +76 -0
  337. package/skills/utils/sequential-thinking/references/core-patterns.md +95 -0
  338. package/skills/utils/sequential-thinking/references/examples-api.md +88 -0
  339. package/skills/utils/sequential-thinking/references/examples-architecture.md +94 -0
  340. package/skills/utils/sequential-thinking/references/examples-debug.md +90 -0
  341. package/skills/utils/sequential-thinking/scripts/format-thought.js +159 -0
  342. package/skills/utils/sequential-thinking/scripts/process-thought.js +236 -0
  343. package/skills/utils/sequential-thinking/tests/format-thought.test.js +133 -0
  344. package/skills/utils/sequential-thinking/tests/process-thought.test.js +215 -0
  345. package/skills/utils/write-skill/SKILL.md +655 -0
  346. package/skills/utils/write-skill/anthropic-best-practices.md +1150 -0
  347. package/skills/utils/write-skill/examples/CLAUDE_MD_TESTING.md +189 -0
  348. package/skills/utils/write-skill/graphviz-conventions.dot +172 -0
  349. package/skills/utils/write-skill/persuasion-principles.md +187 -0
  350. package/skills/utils/write-skill/render-graphs.js +168 -0
  351. package/skills/utils/write-skill/testing-skills-with-subagents.md +384 -0
  352. package/src/commands/init.js +238 -0
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Compression Evaluator - Evaluate compression quality with probe-based testing.
4
+
5
+ Usage:
6
+ python compression_evaluator.py evaluate <original_file> <compressed_file>
7
+ python compression_evaluator.py generate-probes <context_file>
8
+ """
9
+
10
+ import argparse
11
+ import json
12
+ import os
13
+ import re
14
+ import sys
15
+ from dataclasses import dataclass, field
16
+ from enum import Enum
17
+ from typing import Optional
18
+
19
+ MAX_FILE_SIZE_MB = 100
20
+
21
+
22
+ def load_file(path: str, as_json: bool = True):
23
+ """Load file with proper error handling and size validation."""
24
+ try:
25
+ size_mb = os.path.getsize(path) / (1024 * 1024)
26
+ if size_mb > MAX_FILE_SIZE_MB:
27
+ print(f"Error: File too large ({size_mb:.1f}MB). Max {MAX_FILE_SIZE_MB}MB", file=sys.stderr)
28
+ sys.exit(1)
29
+ with open(path, encoding='utf-8') as f:
30
+ return json.load(f) if as_json else f.read()
31
+ except FileNotFoundError:
32
+ print(f"Error: File not found: {path}", file=sys.stderr)
33
+ sys.exit(1)
34
+ except PermissionError:
35
+ print(f"Error: Permission denied: {path}", file=sys.stderr)
36
+ sys.exit(1)
37
+ except json.JSONDecodeError as e:
38
+ print(f"Error: Invalid JSON in {path}: {e}", file=sys.stderr)
39
+ sys.exit(1)
40
+
41
+
42
+ class ProbeType(Enum):
43
+ RECALL = "recall" # Factual retention
44
+ ARTIFACT = "artifact" # File tracking
45
+ CONTINUATION = "continuation" # Task planning
46
+ DECISION = "decision" # Reasoning chains
47
+
48
+
49
+ @dataclass
50
+ class Probe:
51
+ type: ProbeType
52
+ question: str
53
+ ground_truth: str
54
+ context_reference: Optional[str] = None
55
+
56
+
57
+ @dataclass
58
+ class ProbeResult:
59
+ probe: Probe
60
+ response: str
61
+ scores: dict
62
+ overall_score: float
63
+
64
+
65
+ @dataclass
66
+ class EvaluationReport:
67
+ compression_ratio: float
68
+ quality_score: float
69
+ dimension_scores: dict
70
+ probe_results: list
71
+ recommendations: list = field(default_factory=list)
72
+
73
+
74
+ # Six evaluation dimensions with weights
75
+ DIMENSIONS = {
76
+ "accuracy": {"weight": 0.20, "description": "Technical correctness"},
77
+ "context_awareness": {"weight": 0.15, "description": "Conversation state"},
78
+ "artifact_trail": {"weight": 0.20, "description": "File tracking"},
79
+ "completeness": {"weight": 0.20, "description": "Coverage and depth"},
80
+ "continuity": {"weight": 0.15, "description": "Work continuation"},
81
+ "instruction_following": {"weight": 0.10, "description": "Constraint adherence"}
82
+ }
83
+
84
+
85
+ def estimate_tokens(text: str) -> int:
86
+ """Estimate token count."""
87
+ return len(text) // 4
88
+
89
+
90
+ def extract_facts(messages: list) -> list:
91
+ """Extract factual statements that can be probed."""
92
+ facts = []
93
+ patterns = [
94
+ (r"error[:\s]+([^.]+)", "error"),
95
+ (r"next step[s]?[:\s]+([^.]+)", "next_step"),
96
+ (r"decided to\s+([^.]+)", "decision"),
97
+ (r"implemented\s+([^.]+)", "implementation"),
98
+ (r"found that\s+([^.]+)", "finding")
99
+ ]
100
+
101
+ for msg in messages:
102
+ content = str(msg.get("content", "") if isinstance(msg, dict) else msg)
103
+ for pattern, fact_type in patterns:
104
+ matches = re.findall(pattern, content, re.IGNORECASE)
105
+ for match in matches:
106
+ facts.append({"type": fact_type, "content": match.strip()})
107
+ return facts
108
+
109
+
110
+ def extract_files(messages: list) -> list:
111
+ """Extract file references."""
112
+ files = []
113
+ patterns = [
114
+ r"(?:created|modified|updated|edited|read)\s+[`'\"]?([a-zA-Z0-9_/.-]+\.[a-zA-Z]+)[`'\"]?",
115
+ r"file[:\s]+[`'\"]?([a-zA-Z0-9_/.-]+\.[a-zA-Z]+)[`'\"]?"
116
+ ]
117
+
118
+ for msg in messages:
119
+ content = str(msg.get("content", "") if isinstance(msg, dict) else msg)
120
+ for pattern in patterns:
121
+ matches = re.findall(pattern, content)
122
+ files.extend(matches)
123
+ return list(set(files))
124
+
125
+
126
+ def extract_decisions(messages: list) -> list:
127
+ """Extract decision points."""
128
+ decisions = []
129
+ patterns = [
130
+ r"chose\s+([^.]+)\s+(?:because|since|over)",
131
+ r"decided\s+(?:to\s+)?([^.]+)",
132
+ r"went with\s+([^.]+)"
133
+ ]
134
+
135
+ for msg in messages:
136
+ content = str(msg.get("content", "") if isinstance(msg, dict) else msg)
137
+ for pattern in patterns:
138
+ matches = re.findall(pattern, content, re.IGNORECASE)
139
+ decisions.extend(matches)
140
+ return decisions
141
+
142
+
143
+ def generate_probes(messages: list) -> list:
144
+ """Generate probe set for evaluation."""
145
+ probes = []
146
+
147
+ # Recall probes from facts
148
+ facts = extract_facts(messages)
149
+ for fact in facts[:3]: # Limit to 3 recall probes
150
+ probes.append(Probe(
151
+ type=ProbeType.RECALL,
152
+ question=f"What was the {fact['type'].replace('_', ' ')}?",
153
+ ground_truth=fact["content"]
154
+ ))
155
+
156
+ # Artifact probes from files
157
+ files = extract_files(messages)
158
+ if files:
159
+ probes.append(Probe(
160
+ type=ProbeType.ARTIFACT,
161
+ question="Which files have been modified or created?",
162
+ ground_truth=", ".join(files)
163
+ ))
164
+
165
+ # Continuation probe
166
+ probes.append(Probe(
167
+ type=ProbeType.CONTINUATION,
168
+ question="What should be done next?",
169
+ ground_truth="[Extracted from context]" # Would need LLM to generate
170
+ ))
171
+
172
+ # Decision probes
173
+ decisions = extract_decisions(messages)
174
+ for decision in decisions[:2]: # Limit to 2 decision probes
175
+ probes.append(Probe(
176
+ type=ProbeType.DECISION,
177
+ question=f"Why was the decision made to {decision[:50]}...?",
178
+ ground_truth=decision
179
+ ))
180
+
181
+ return probes
182
+
183
+
184
+ def evaluate_response(probe: Probe, response: str) -> dict:
185
+ """
186
+ Evaluate response against probe.
187
+ Note: Production should use LLM-as-Judge.
188
+ """
189
+ scores = {}
190
+ response_lower = response.lower()
191
+ ground_truth_lower = probe.ground_truth.lower()
192
+
193
+ # Heuristic scoring (replace with LLM evaluation in production)
194
+ # Check for ground truth presence
195
+ if ground_truth_lower in response_lower:
196
+ base_score = 1.0
197
+ elif any(word in response_lower for word in ground_truth_lower.split()[:3]):
198
+ base_score = 0.6
199
+ else:
200
+ base_score = 0.3
201
+
202
+ # Adjust based on probe type
203
+ if probe.type == ProbeType.ARTIFACT:
204
+ # Check file mentions
205
+ files_mentioned = len(re.findall(r'\.[a-z]+', response_lower))
206
+ scores["artifact_trail"] = min(1.0, base_score + files_mentioned * 0.1)
207
+ scores["accuracy"] = base_score
208
+ elif probe.type == ProbeType.RECALL:
209
+ scores["accuracy"] = base_score
210
+ scores["completeness"] = base_score
211
+ elif probe.type == ProbeType.CONTINUATION:
212
+ scores["continuity"] = base_score
213
+ scores["context_awareness"] = base_score
214
+ elif probe.type == ProbeType.DECISION:
215
+ scores["accuracy"] = base_score
216
+ scores["context_awareness"] = base_score
217
+
218
+ return scores
219
+
220
+
221
+ def calculate_compression_ratio(original: str, compressed: str) -> float:
222
+ """Calculate compression ratio."""
223
+ original_tokens = estimate_tokens(original)
224
+ compressed_tokens = estimate_tokens(compressed)
225
+ if original_tokens == 0:
226
+ return 0.0
227
+ return 1.0 - (compressed_tokens / original_tokens)
228
+
229
+
230
+ def evaluate_compression(original_messages: list, compressed_text: str,
231
+ probes: Optional[list] = None) -> EvaluationReport:
232
+ """
233
+ Evaluate compression quality.
234
+
235
+ Args:
236
+ original_messages: Original context messages
237
+ compressed_text: Compressed summary
238
+ probes: Optional pre-generated probes
239
+
240
+ Returns:
241
+ EvaluationReport with scores and recommendations
242
+ """
243
+ # Generate probes if not provided
244
+ if probes is None:
245
+ probes = generate_probes(original_messages)
246
+
247
+ # Calculate compression ratio
248
+ original_text = json.dumps(original_messages)
249
+ compression_ratio = calculate_compression_ratio(original_text, compressed_text)
250
+
251
+ # Evaluate each probe (simulated - production uses LLM)
252
+ probe_results = []
253
+ dimension_scores = {dim: [] for dim in DIMENSIONS}
254
+
255
+ for probe in probes:
256
+ # In production, send compressed_text + probe.question to LLM
257
+ # Here we simulate with heuristic check
258
+ scores = evaluate_response(probe, compressed_text)
259
+
260
+ overall = sum(scores.values()) / len(scores) if scores else 0
261
+ probe_results.append(ProbeResult(
262
+ probe=probe,
263
+ response="[Would be LLM response]",
264
+ scores=scores,
265
+ overall_score=overall
266
+ ))
267
+
268
+ # Aggregate by dimension
269
+ for dim, score in scores.items():
270
+ if dim in dimension_scores:
271
+ dimension_scores[dim].append(score)
272
+
273
+ # Calculate dimension averages
274
+ avg_dimensions = {}
275
+ for dim, scores in dimension_scores.items():
276
+ avg_dimensions[dim] = sum(scores) / len(scores) if scores else 0.5
277
+
278
+ # Calculate weighted quality score
279
+ quality_score = sum(
280
+ avg_dimensions.get(dim, 0.5) * info["weight"]
281
+ for dim, info in DIMENSIONS.items()
282
+ )
283
+
284
+ # Generate recommendations
285
+ recommendations = []
286
+ if compression_ratio > 0.99:
287
+ recommendations.append("Very high compression. Risk of information loss.")
288
+ if avg_dimensions.get("artifact_trail", 1) < 0.5:
289
+ recommendations.append("Artifact tracking weak. Add explicit file section to summary.")
290
+ if avg_dimensions.get("continuity", 1) < 0.5:
291
+ recommendations.append("Continuity low. Add 'Next Steps' section to summary.")
292
+ if quality_score < 0.6:
293
+ recommendations.append("Quality below threshold. Consider less aggressive compression.")
294
+
295
+ return EvaluationReport(
296
+ compression_ratio=compression_ratio,
297
+ quality_score=quality_score,
298
+ dimension_scores=avg_dimensions,
299
+ probe_results=probe_results,
300
+ recommendations=recommendations
301
+ )
302
+
303
+
304
+ def main():
305
+ parser = argparse.ArgumentParser(description="Compression quality evaluator")
306
+ subparsers = parser.add_subparsers(dest="command", required=True)
307
+
308
+ # Evaluate command
309
+ eval_parser = subparsers.add_parser("evaluate", help="Evaluate compression quality")
310
+ eval_parser.add_argument("original_file", help="JSON file with original messages")
311
+ eval_parser.add_argument("compressed_file", help="Text file with compressed summary")
312
+
313
+ # Generate probes command
314
+ probe_parser = subparsers.add_parser("generate-probes", help="Generate evaluation probes")
315
+ probe_parser.add_argument("context_file", help="JSON file with context messages")
316
+
317
+ args = parser.parse_args()
318
+
319
+ if args.command == "evaluate":
320
+ original = load_file(args.original_file, as_json=True)
321
+ messages = original if isinstance(original, list) else original.get("messages", [])
322
+ compressed = load_file(args.compressed_file, as_json=False)
323
+
324
+ report = evaluate_compression(messages, compressed)
325
+ print(json.dumps({
326
+ "compression_ratio": f"{report.compression_ratio:.1%}",
327
+ "quality_score": f"{report.quality_score:.2f}",
328
+ "dimension_scores": {k: f"{v:.2f}" for k, v in report.dimension_scores.items()},
329
+ "probe_count": len(report.probe_results),
330
+ "recommendations": report.recommendations
331
+ }, indent=2))
332
+
333
+ elif args.command == "generate-probes":
334
+ data = load_file(args.context_file, as_json=True)
335
+ messages = data if isinstance(data, list) else data.get("messages", [])
336
+
337
+ probes = generate_probes(messages)
338
+ output = []
339
+ for probe in probes:
340
+ output.append({
341
+ "type": probe.type.value,
342
+ "question": probe.question,
343
+ "ground_truth": probe.ground_truth
344
+ })
345
+ print(json.dumps(output, indent=2))
346
+
347
+
348
+ if __name__ == "__main__":
349
+ main()
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Context Analyzer - Health analysis and degradation detection for agent contexts.
4
+
5
+ Usage:
6
+ python context_analyzer.py analyze <context_file>
7
+ python context_analyzer.py budget --system 2000 --tools 1500 --docs 3000 --history 5000
8
+ """
9
+
10
+ import argparse
11
+ import json
12
+ import math
13
+ import os
14
+ import re
15
+ import sys
16
+ from dataclasses import dataclass, field
17
+ from enum import Enum
18
+ from typing import Optional
19
+
20
+ MAX_FILE_SIZE_MB = 100
21
+
22
+
23
+ def load_json_file(path: str):
24
+ """Load JSON file with proper error handling and size validation."""
25
+ try:
26
+ size_mb = os.path.getsize(path) / (1024 * 1024)
27
+ if size_mb > MAX_FILE_SIZE_MB:
28
+ print(f"Error: File too large ({size_mb:.1f}MB). Max {MAX_FILE_SIZE_MB}MB", file=sys.stderr)
29
+ sys.exit(1)
30
+ with open(path, encoding='utf-8') as f:
31
+ return json.load(f)
32
+ except FileNotFoundError:
33
+ print(f"Error: File not found: {path}", file=sys.stderr)
34
+ sys.exit(1)
35
+ except PermissionError:
36
+ print(f"Error: Permission denied: {path}", file=sys.stderr)
37
+ sys.exit(1)
38
+ except json.JSONDecodeError as e:
39
+ print(f"Error: Invalid JSON in {path}: {e}", file=sys.stderr)
40
+ sys.exit(1)
41
+
42
+
43
+ class HealthStatus(Enum):
44
+ HEALTHY = "healthy"
45
+ WARNING = "warning"
46
+ DEGRADED = "degraded"
47
+ CRITICAL = "critical"
48
+
49
+
50
+ @dataclass
51
+ class ContextAnalysis:
52
+ total_tokens: int
53
+ token_limit: int
54
+ utilization: float
55
+ health_status: HealthStatus
56
+ health_score: float
57
+ degradation_risk: float
58
+ poisoning_risk: float
59
+ recommendations: list = field(default_factory=list)
60
+
61
+
62
+ def estimate_tokens(text: str) -> int:
63
+ """Estimate token count (~4 chars per token for English)."""
64
+ return len(text) // 4
65
+
66
+
67
+ def estimate_message_tokens(messages: list) -> int:
68
+ """Estimate tokens in message list."""
69
+ total = 0
70
+ for msg in messages:
71
+ if isinstance(msg, dict):
72
+ content = msg.get("content", "")
73
+ total += estimate_tokens(str(content))
74
+ # Add overhead for role, metadata
75
+ total += 10
76
+ else:
77
+ total += estimate_tokens(str(msg))
78
+ return total
79
+
80
+
81
+ def measure_attention_distribution(context_length: int, sample_size: int = 100) -> list:
82
+ """
83
+ Simulate U-shaped attention distribution.
84
+ Real implementation would extract from model attention weights.
85
+ """
86
+ attention = []
87
+ for i in range(sample_size):
88
+ position = i / sample_size
89
+ # U-shaped curve: high at start/end, low in middle
90
+ if position < 0.1:
91
+ score = 0.9 - position * 2
92
+ elif position > 0.9:
93
+ score = 0.7 + (position - 0.9) * 2
94
+ else:
95
+ score = 0.3 + 0.1 * math.sin(position * math.pi)
96
+ attention.append(score)
97
+ return attention
98
+
99
+
100
+ def detect_lost_in_middle(messages: list, critical_keywords: list) -> list:
101
+ """Identify critical items in attention-degraded regions."""
102
+ if not messages:
103
+ return []
104
+
105
+ total = len(messages)
106
+ warnings = []
107
+
108
+ for i, msg in enumerate(messages):
109
+ position = i / total
110
+ content = str(msg.get("content", "") if isinstance(msg, dict) else msg)
111
+
112
+ # Middle region (10%-90%)
113
+ if 0.1 < position < 0.9:
114
+ for keyword in critical_keywords:
115
+ if keyword.lower() in content.lower():
116
+ warnings.append({
117
+ "position": i,
118
+ "position_pct": f"{position:.1%}",
119
+ "keyword": keyword,
120
+ "risk": "high" if 0.3 < position < 0.7 else "medium"
121
+ })
122
+ return warnings
123
+
124
+
125
+ def detect_poisoning_patterns(messages: list) -> dict:
126
+ """Detect potential context poisoning indicators."""
127
+ error_patterns = [
128
+ r"error", r"failed", r"exception", r"cannot", r"unable",
129
+ r"invalid", r"not found", r"undefined", r"null"
130
+ ]
131
+ # Simple contradiction check - look for both positive and negative statements
132
+ contradiction_keywords = [
133
+ ("is correct", "is not correct"),
134
+ ("should work", "should not work"),
135
+ ("will succeed", "will fail"),
136
+ ("is valid", "is invalid"),
137
+ ]
138
+
139
+ errors_found = []
140
+ contradictions = []
141
+
142
+ for i, msg in enumerate(messages):
143
+ content = str(msg.get("content", "") if isinstance(msg, dict) else msg).lower()
144
+
145
+ # Check error patterns
146
+ for pattern in error_patterns:
147
+ if re.search(pattern, content):
148
+ errors_found.append({"position": i, "pattern": pattern})
149
+
150
+ # Check for contradiction keywords (simplified)
151
+ for pos_phrase, neg_phrase in contradiction_keywords:
152
+ if pos_phrase in content and neg_phrase in content:
153
+ contradictions.append({"position": i, "type": "self-contradiction"})
154
+
155
+ total = max(len(messages), 1)
156
+ return {
157
+ "error_density": len(errors_found) / total,
158
+ "contradiction_count": len(contradictions),
159
+ "poisoning_risk": min(1.0, (len(errors_found) * 0.1 + len(contradictions) * 0.3))
160
+ }
161
+
162
+
163
+ def calculate_health_score(utilization: float, degradation_risk: float, poisoning_risk: float) -> float:
164
+ """
165
+ Calculate composite health score.
166
+ 1.0 = healthy, 0.0 = critical
167
+ """
168
+ score = 1.0
169
+ # Utilization penalty (kicks in after 70%)
170
+ if utilization > 0.7:
171
+ score -= (utilization - 0.7) * 1.5
172
+ # Degradation penalty
173
+ score -= degradation_risk * 0.3
174
+ # Poisoning penalty
175
+ score -= poisoning_risk * 0.2
176
+ return max(0.0, min(1.0, score))
177
+
178
+
179
+ def get_health_status(score: float) -> HealthStatus:
180
+ """Map health score to status."""
181
+ if score > 0.8:
182
+ return HealthStatus.HEALTHY
183
+ elif score > 0.6:
184
+ return HealthStatus.WARNING
185
+ elif score > 0.4:
186
+ return HealthStatus.DEGRADED
187
+ return HealthStatus.CRITICAL
188
+
189
+
190
+ def analyze_context(messages: list, token_limit: int = 128000,
191
+ critical_keywords: Optional[list] = None) -> ContextAnalysis:
192
+ """
193
+ Comprehensive context health analysis.
194
+
195
+ Args:
196
+ messages: List of context messages
197
+ token_limit: Model's context window size
198
+ critical_keywords: Keywords that should be at attention-favored positions
199
+
200
+ Returns:
201
+ ContextAnalysis with health metrics and recommendations
202
+ """
203
+ critical_keywords = critical_keywords or ["goal", "task", "important", "critical", "must"]
204
+
205
+ # Calculate token utilization
206
+ total_tokens = estimate_message_tokens(messages)
207
+ utilization = total_tokens / token_limit
208
+
209
+ # Check for lost-in-middle issues
210
+ middle_warnings = detect_lost_in_middle(messages, critical_keywords)
211
+ degradation_risk = min(1.0, len(middle_warnings) * 0.2)
212
+
213
+ # Check for poisoning
214
+ poisoning = detect_poisoning_patterns(messages)
215
+ poisoning_risk = poisoning["poisoning_risk"]
216
+
217
+ # Calculate health
218
+ health_score = calculate_health_score(utilization, degradation_risk, poisoning_risk)
219
+ health_status = get_health_status(health_score)
220
+
221
+ # Generate recommendations
222
+ recommendations = []
223
+ if utilization > 0.8:
224
+ recommendations.append("URGENT: Context utilization >80%. Trigger compaction immediately.")
225
+ elif utilization > 0.7:
226
+ recommendations.append("WARNING: Context utilization >70%. Plan for compaction.")
227
+
228
+ if middle_warnings:
229
+ recommendations.append(f"Found {len(middle_warnings)} critical items in middle region. "
230
+ "Consider moving to beginning/end.")
231
+
232
+ if poisoning_risk > 0.3:
233
+ recommendations.append("High poisoning risk detected. Review recent tool outputs for errors.")
234
+
235
+ if health_status == HealthStatus.CRITICAL:
236
+ recommendations.append("CRITICAL: Consider context reset with clean state.")
237
+
238
+ return ContextAnalysis(
239
+ total_tokens=total_tokens,
240
+ token_limit=token_limit,
241
+ utilization=utilization,
242
+ health_status=health_status,
243
+ health_score=health_score,
244
+ degradation_risk=degradation_risk,
245
+ poisoning_risk=poisoning_risk,
246
+ recommendations=recommendations
247
+ )
248
+
249
+
250
+ def calculate_budget(system: int, tools: int, docs: int, history: int,
251
+ buffer_pct: float = 0.15) -> dict:
252
+ """Calculate context budget allocation."""
253
+ subtotal = system + tools + docs + history
254
+ buffer = int(subtotal * buffer_pct)
255
+ total = subtotal + buffer
256
+
257
+ return {
258
+ "allocation": {
259
+ "system_prompt": system,
260
+ "tool_definitions": tools,
261
+ "retrieved_docs": docs,
262
+ "message_history": history,
263
+ "reserved_buffer": buffer
264
+ },
265
+ "total_budget": total,
266
+ "warning_threshold": int(total * 0.7),
267
+ "critical_threshold": int(total * 0.8),
268
+ "recommendations": [
269
+ f"Trigger compaction at {int(total * 0.7):,} tokens",
270
+ f"Aggressive optimization at {int(total * 0.8):,} tokens",
271
+ f"Reserved {buffer:,} tokens ({buffer_pct:.0%}) for responses"
272
+ ]
273
+ }
274
+
275
+
276
+ def main():
277
+ parser = argparse.ArgumentParser(description="Context health analyzer")
278
+ subparsers = parser.add_subparsers(dest="command", required=True)
279
+
280
+ # Analyze command
281
+ analyze_parser = subparsers.add_parser("analyze", help="Analyze context health")
282
+ analyze_parser.add_argument("context_file", help="JSON file with messages array")
283
+ analyze_parser.add_argument("--limit", type=int, default=128000, help="Token limit")
284
+ analyze_parser.add_argument("--keywords", nargs="+", help="Critical keywords to track")
285
+
286
+ # Budget command
287
+ budget_parser = subparsers.add_parser("budget", help="Calculate context budget")
288
+ budget_parser.add_argument("--system", type=int, default=2000, help="System prompt tokens")
289
+ budget_parser.add_argument("--tools", type=int, default=1500, help="Tool definitions tokens")
290
+ budget_parser.add_argument("--docs", type=int, default=3000, help="Retrieved docs tokens")
291
+ budget_parser.add_argument("--history", type=int, default=5000, help="Message history tokens")
292
+ budget_parser.add_argument("--buffer", type=float, default=0.15, help="Buffer percentage")
293
+
294
+ args = parser.parse_args()
295
+
296
+ if args.command == "analyze":
297
+ data = load_json_file(args.context_file)
298
+ messages = data if isinstance(data, list) else data.get("messages", [])
299
+ result = analyze_context(messages, args.limit, args.keywords)
300
+ print(json.dumps({
301
+ "total_tokens": result.total_tokens,
302
+ "token_limit": result.token_limit,
303
+ "utilization": f"{result.utilization:.1%}",
304
+ "health_status": result.health_status.value,
305
+ "health_score": f"{result.health_score:.2f}",
306
+ "degradation_risk": f"{result.degradation_risk:.2f}",
307
+ "poisoning_risk": f"{result.poisoning_risk:.2f}",
308
+ "recommendations": result.recommendations
309
+ }, indent=2))
310
+
311
+ elif args.command == "budget":
312
+ result = calculate_budget(args.system, args.tools, args.docs, args.history, args.buffer)
313
+ print(json.dumps(result, indent=2))
314
+
315
+
316
+ if __name__ == "__main__":
317
+ main()