@wazir-dev/cli 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 (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. package/workflows/verify.md +37 -0
@@ -0,0 +1,270 @@
1
+ import fs from 'node:fs';
2
+
3
+ export function estimateTokens(bytes) {
4
+ if (bytes < 0) {
5
+ process.stderr.write(`warning: estimateTokens called with negative bytes (${bytes}), returning 0\n`);
6
+ return 0;
7
+ }
8
+ if (bytes === 0) return 0;
9
+ return Math.ceil(bytes / 4);
10
+ }
11
+
12
+ function createDefaultUsage(runId) {
13
+ const now = new Date().toISOString();
14
+ return {
15
+ schema_version: 1,
16
+ run_id: runId,
17
+ created_at: now,
18
+ updated_at: now,
19
+ phases: {},
20
+ roles: {},
21
+ savings: {
22
+ capture_routing: {
23
+ raw_bytes: 0,
24
+ summary_bytes: 0,
25
+ estimated_tokens_avoided: 0,
26
+ strategy: 'byte_heuristic',
27
+ },
28
+ context_mode: {
29
+ available: false,
30
+ raw_kb: 0,
31
+ context_kb: 0,
32
+ savings_ratio: '0%',
33
+ per_tool: {},
34
+ },
35
+ compaction: {
36
+ compaction_count: 0,
37
+ pre_compaction_tokens_est: 0,
38
+ post_compaction_tokens_est: 0,
39
+ },
40
+ },
41
+ totals: {
42
+ total_events: 0,
43
+ total_capture_bytes_raw: 0,
44
+ total_capture_bytes_summary: 0,
45
+ total_estimated_tokens_if_raw: 0,
46
+ total_estimated_tokens_avoided: 0,
47
+ savings_percentage: '0%',
48
+ },
49
+ };
50
+ }
51
+
52
+ function writeUsageAtomic(runPaths, usage) {
53
+ usage.updated_at = new Date().toISOString();
54
+ const tmpPath = `${runPaths.usagePath}.tmp`;
55
+ fs.writeFileSync(tmpPath, `${JSON.stringify(usage, null, 2)}\n`);
56
+ fs.renameSync(tmpPath, runPaths.usagePath);
57
+ }
58
+
59
+ function recalcTotals(usage) {
60
+ let totalEvents = 0;
61
+ let totalRaw = 0;
62
+ let totalSummary = 0;
63
+
64
+ for (const phase of Object.values(usage.phases)) {
65
+ totalEvents += phase.events_count ?? 0;
66
+ totalRaw += phase.capture_bytes_raw ?? 0;
67
+ totalSummary += phase.capture_bytes_summary ?? 0;
68
+ }
69
+
70
+ usage.totals.total_events = totalEvents;
71
+ usage.totals.total_capture_bytes_raw = totalRaw;
72
+ usage.totals.total_capture_bytes_summary = totalSummary;
73
+ usage.totals.total_estimated_tokens_if_raw = estimateTokens(totalRaw);
74
+ usage.totals.total_estimated_tokens_avoided = estimateTokens(totalRaw - totalSummary);
75
+
76
+ const ifRaw = usage.totals.total_estimated_tokens_if_raw;
77
+ const avoided = usage.totals.total_estimated_tokens_avoided;
78
+ usage.totals.savings_percentage = ifRaw > 0
79
+ ? `${((avoided / ifRaw) * 100).toFixed(1)}%`
80
+ : '0%';
81
+ }
82
+
83
+ export function readUsage(runPaths) {
84
+ if (!fs.existsSync(runPaths.usagePath)) {
85
+ return createDefaultUsage('unknown');
86
+ }
87
+
88
+ try {
89
+ const raw = fs.readFileSync(runPaths.usagePath, 'utf8');
90
+ return JSON.parse(raw);
91
+ } catch {
92
+ process.stderr.write(`warning: malformed usage.json at ${runPaths.usagePath}, using defaults\n`);
93
+ return createDefaultUsage('unknown');
94
+ }
95
+ }
96
+
97
+ export function initUsage(runPaths, runId) {
98
+ if (fs.existsSync(runPaths.usagePath)) {
99
+ return readUsage(runPaths);
100
+ }
101
+
102
+ const usage = createDefaultUsage(runId);
103
+ writeUsageAtomic(runPaths, usage);
104
+ return usage;
105
+ }
106
+
107
+ export function recordCaptureSavings(runPaths, rawBytes, summaryBytes) {
108
+ const usage = readUsage(runPaths);
109
+ usage.savings.capture_routing.raw_bytes += rawBytes;
110
+ usage.savings.capture_routing.summary_bytes += summaryBytes;
111
+ usage.savings.capture_routing.estimated_tokens_avoided = estimateTokens(
112
+ usage.savings.capture_routing.raw_bytes - usage.savings.capture_routing.summary_bytes,
113
+ );
114
+ writeUsageAtomic(runPaths, usage);
115
+ }
116
+
117
+ export function recordPhaseUsage(runPaths, phase, data) {
118
+ const usage = readUsage(runPaths);
119
+ const existing = usage.phases[phase] ?? {
120
+ started_at: new Date().toISOString(),
121
+ completed_at: null,
122
+ events_count: 0,
123
+ capture_bytes_raw: 0,
124
+ capture_bytes_summary: 0,
125
+ estimated_tokens_if_raw: 0,
126
+ estimated_tokens_avoided: 0,
127
+ };
128
+
129
+ existing.events_count += data.events_count ?? 0;
130
+ existing.capture_bytes_raw = data.capture_bytes_raw ?? existing.capture_bytes_raw;
131
+ existing.capture_bytes_summary = data.capture_bytes_summary ?? existing.capture_bytes_summary;
132
+ existing.estimated_tokens_if_raw = estimateTokens(existing.capture_bytes_raw);
133
+ existing.estimated_tokens_avoided = estimateTokens(existing.capture_bytes_raw - existing.capture_bytes_summary);
134
+
135
+ if (data.completed_at) {
136
+ existing.completed_at = data.completed_at;
137
+ }
138
+
139
+ usage.phases[phase] = existing;
140
+ recalcTotals(usage);
141
+ writeUsageAtomic(runPaths, usage);
142
+ }
143
+
144
+ // Totals are derived from phase data, not role data — intentionally no recalcTotals here
145
+ export function recordRoleUsage(runPaths, role, data) {
146
+ const usage = readUsage(runPaths);
147
+ const existing = usage.roles[role] ?? {
148
+ events_count: 0,
149
+ capture_bytes_raw: 0,
150
+ estimated_tokens_if_raw: 0,
151
+ };
152
+
153
+ existing.events_count = data.events_count ?? existing.events_count;
154
+ existing.capture_bytes_raw = data.capture_bytes_raw ?? existing.capture_bytes_raw;
155
+ existing.estimated_tokens_if_raw = estimateTokens(existing.capture_bytes_raw);
156
+
157
+ usage.roles[role] = existing;
158
+ writeUsageAtomic(runPaths, usage);
159
+ }
160
+
161
+ export function recordContextModeSavings(runPaths, statsData) {
162
+ const usage = readUsage(runPaths);
163
+
164
+ if (statsData.raw_kb === 0 && usage.savings.context_mode.raw_kb > 0) {
165
+ return;
166
+ }
167
+
168
+ usage.savings.context_mode = {
169
+ available: statsData.available ?? false,
170
+ raw_kb: statsData.raw_kb ?? 0,
171
+ context_kb: statsData.context_kb ?? 0,
172
+ savings_ratio: statsData.savings_ratio ?? '0%',
173
+ per_tool: statsData.per_tool ?? {},
174
+ };
175
+
176
+ writeUsageAtomic(runPaths, usage);
177
+ }
178
+
179
+ export function recordCompaction(runPaths, preTokens, postTokens) {
180
+ const usage = readUsage(runPaths);
181
+ usage.savings.compaction.compaction_count += 1;
182
+ usage.savings.compaction.pre_compaction_tokens_est += preTokens;
183
+ usage.savings.compaction.post_compaction_tokens_est += postTokens;
184
+ writeUsageAtomic(runPaths, usage);
185
+ }
186
+
187
+ function formatNumber(n) {
188
+ return n.toLocaleString('en-US');
189
+ }
190
+
191
+ export function generateReport(runPaths, format, options = {}) {
192
+ const usage = readUsage(runPaths);
193
+
194
+ // Filter to a single phase if requested
195
+ if (options.phase && usage.phases[options.phase]) {
196
+ const filtered = {
197
+ ...usage,
198
+ phases: { [options.phase]: usage.phases[options.phase] },
199
+ };
200
+ if (format === 'json') {
201
+ return JSON.stringify(filtered, null, 2);
202
+ }
203
+ // Fall through to render with filtered usage
204
+ Object.assign(usage, filtered);
205
+ } else if (format === 'json') {
206
+ return JSON.stringify(usage, null, 2);
207
+ }
208
+
209
+ const cr = usage.savings.capture_routing;
210
+ const cm = usage.savings.context_mode;
211
+ const co = usage.savings.compaction;
212
+
213
+ const crRaw = cr.estimated_tokens_avoided + estimateTokens(cr.summary_bytes);
214
+ const crAfter = estimateTokens(cr.summary_bytes);
215
+ const cmRaw = estimateTokens(Math.round(cm.raw_kb * 1024));
216
+ const cmAfter = estimateTokens(Math.round(cm.context_kb * 1024));
217
+ const coSaved = co.pre_compaction_tokens_est - co.post_compaction_tokens_est;
218
+
219
+ const withoutSavings = crRaw + cmRaw + co.pre_compaction_tokens_est;
220
+ const saOnly = cmRaw + co.post_compaction_tokens_est + crAfter;
221
+ const withAll = crAfter + cmAfter + co.post_compaction_tokens_est;
222
+ const overallPct = withoutSavings > 0
223
+ ? ((1 - withAll / withoutSavings) * 100).toFixed(1)
224
+ : '0.0';
225
+
226
+ let report = `# Usage Report: ${usage.run_id}\n\n`;
227
+
228
+ report += '## Token Savings by Strategy\n';
229
+ report += '| Strategy | Raw (est. tokens) | After (est. tokens) | Avoided |\n';
230
+ report += '|------------------|--------------------|---------------------|--------------------|\n';
231
+ report += `| Capture routing | ${formatNumber(crRaw).padStart(18)} | ${formatNumber(crAfter).padStart(19)} | ${formatNumber(cr.estimated_tokens_avoided).padStart(18)} |\n`;
232
+ report += `| Context-mode | ${formatNumber(cmRaw).padStart(18)} | ${formatNumber(cmAfter).padStart(19)} | ${formatNumber(cmRaw - cmAfter).padStart(18)} |\n`;
233
+ report += `| Compaction | ${formatNumber(co.pre_compaction_tokens_est).padStart(18)} | ${formatNumber(co.post_compaction_tokens_est).padStart(19)} | ${formatNumber(coSaved).padStart(18)} |\n`;
234
+ report += '\n';
235
+
236
+ report += '## "What If" Comparison\n';
237
+ report += '| Scenario | Est. tokens consumed |\n';
238
+ report += '|-----------------------------------|----------------------|\n';
239
+ report += `| Without any savings strategies | ${formatNumber(withoutSavings).padStart(20)} |\n`;
240
+ report += `| With Wazir savings only | ${formatNumber(saOnly).padStart(20)} |\n`;
241
+ report += `| With Wazir + context-mode | ${formatNumber(withAll).padStart(20)} |\n`;
242
+ report += `| **Actual savings** | **${overallPct}%**${' '.repeat(Math.max(0, 14 - overallPct.length))} |\n`;
243
+ report += '\n';
244
+
245
+ const phases = Object.entries(usage.phases);
246
+ if (phases.length > 0) {
247
+ report += '## Phase Breakdown\n';
248
+ report += '| Phase | Events | Raw bytes | Summary bytes | Est. tokens avoided |\n';
249
+ report += '|----------|--------|-------------|---------------|---------------------|\n';
250
+ for (const [name, p] of phases) {
251
+ report += `| ${name.padEnd(8)} | ${String(p.events_count).padStart(6)} | ${formatNumber(p.capture_bytes_raw).padStart(11)} | ${formatNumber(p.capture_bytes_summary).padStart(13)} | ${formatNumber(p.estimated_tokens_avoided).padStart(19)} |\n`;
252
+ }
253
+ report += '\n';
254
+ }
255
+
256
+ const roles = Object.entries(usage.roles);
257
+ if (roles.length > 0) {
258
+ report += '## Role Breakdown\n';
259
+ report += '| Role | Events | Raw bytes | Est. tokens if raw |\n';
260
+ report += '|------------|--------|-------------|--------------------|\n';
261
+ for (const [name, r] of roles) {
262
+ report += `| ${name.padEnd(10)} | ${String(r.events_count).padStart(6)} | ${formatNumber(r.capture_bytes_raw).padStart(11)} | ${formatNumber(r.estimated_tokens_if_raw).padStart(18)} |\n`;
263
+ }
264
+ report += '\n';
265
+ }
266
+
267
+ report += 'Estimation method: byte heuristic (ceil(bytes/4))\n';
268
+
269
+ return report;
270
+ }
@@ -0,0 +1,50 @@
1
+ import { execFileSync } from 'node:child_process';
2
+
3
+ const ALLOWED_PATTERNS = [
4
+ /^main$/,
5
+ /^develop$/,
6
+ /^feat\/.+$/,
7
+ /^feature\/.+$/,
8
+ /^fix\/.+$/,
9
+ /^chore\/.+$/,
10
+ /^codex\/.+$/,
11
+ /^release\/.+$/,
12
+ /^hotfix\/.+$/,
13
+ /^worktree-.+$/,
14
+ ];
15
+
16
+ function getCurrentBranch(cwd) {
17
+ try {
18
+ return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
19
+ encoding: 'utf8',
20
+ cwd,
21
+ }).trim();
22
+ } catch {
23
+ return null;
24
+ }
25
+ }
26
+
27
+ export function validateBranchName(branchName, options = {}) {
28
+ const branch = branchName || getCurrentBranch(options.cwd);
29
+
30
+ if (!branch) {
31
+ return {
32
+ exitCode: 1,
33
+ stderr: 'Branch name validation failed:\n- Could not determine current branch name\n',
34
+ };
35
+ }
36
+
37
+ const isAllowed = ALLOWED_PATTERNS.some((pattern) => pattern.test(branch));
38
+
39
+ if (!isAllowed) {
40
+ return {
41
+ exitCode: 1,
42
+ stderr: `Branch name validation failed:\n- "${branch}" does not match any allowed pattern: main, develop, feat/*, feature/*, fix/*, chore/*, codex/*, release/*, hotfix/*, worktree-*\n`,
43
+ };
44
+ }
45
+
46
+ return {
47
+ exitCode: 0,
48
+ stdout: `Branch name validation passed: "${branch}"\n`,
49
+ };
50
+ }
@@ -0,0 +1,110 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ const EXCLUDED_DOC_DIRS = new Set(['plans']);
5
+ const EXCLUDED_DOC_FILES = new Set([
6
+ 'terminology-policy.md',
7
+ ]);
8
+
9
+ const BRAND_PATTERNS = [
10
+ { label: 'Agent OS', regex: /\bAgent OS\b/g },
11
+ { label: 'agent-os', regex: /\bagent-os\b/g },
12
+ { label: 'Symphony', regex: /\bSymphony\b/g },
13
+ { label: 'Wazir OS', regex: /\bWazir OS\b/g },
14
+ ];
15
+
16
+ function normalizeAllowedLegacyReferences(content) {
17
+ return content
18
+ .replace(/archive\/legacy-agent-os\/[^\s)`]*/g, 'archive/<legacy>')
19
+ .replace(/archive\/v5\.1-agent-os-daemon\/[^\s)`]*/g, 'archive/<legacy>')
20
+ .replace(/migration\/v5\.1-agent-os-to-wazir\.md/g, 'migration/<legacy>');
21
+ }
22
+
23
+ function walkMarkdownFiles(dirPath, files = []) {
24
+ if (!fs.existsSync(dirPath)) {
25
+ return files;
26
+ }
27
+
28
+ for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {
29
+ if (entry.isDirectory()) {
30
+ if (!EXCLUDED_DOC_DIRS.has(entry.name)) {
31
+ walkMarkdownFiles(path.join(dirPath, entry.name), files);
32
+ }
33
+ continue;
34
+ }
35
+
36
+ if (entry.name.endsWith('.md') && !EXCLUDED_DOC_FILES.has(entry.name)) {
37
+ files.push(path.join(dirPath, entry.name));
38
+ }
39
+ }
40
+
41
+ return files;
42
+ }
43
+
44
+ function walkFiles(dirPath, files = []) {
45
+ if (!fs.existsSync(dirPath)) {
46
+ return files;
47
+ }
48
+
49
+ for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {
50
+ const absolutePath = path.join(dirPath, entry.name);
51
+
52
+ if (entry.isDirectory()) {
53
+ walkFiles(absolutePath, files);
54
+ continue;
55
+ }
56
+
57
+ files.push(absolutePath);
58
+ }
59
+
60
+ return files;
61
+ }
62
+
63
+ function collectBrandSurfaceFiles(projectRoot) {
64
+ return [
65
+ path.join(projectRoot, 'README.md'),
66
+ path.join(projectRoot, 'CLAUDE.md'),
67
+ path.join(projectRoot, 'AGENTS.md'),
68
+ path.join(projectRoot, 'CHANGELOG.md'),
69
+ ...walkMarkdownFiles(path.join(projectRoot, 'docs')),
70
+ ...walkFiles(path.join(projectRoot, 'expertise')),
71
+ ...walkFiles(path.join(projectRoot, 'examples')),
72
+ ...walkFiles(path.join(projectRoot, 'roles')),
73
+ ...walkFiles(path.join(projectRoot, 'workflows')),
74
+ ...walkFiles(path.join(projectRoot, 'skills')),
75
+ path.join(projectRoot, 'hooks', 'README.md'),
76
+ path.join(projectRoot, 'hooks', 'session-start'),
77
+ ...walkFiles(path.join(projectRoot, 'templates', 'artifacts')),
78
+ path.join(projectRoot, 'templates', 'README.md'),
79
+ ...walkFiles(path.join(projectRoot, 'exports', 'hosts')),
80
+ ].filter((filePath) => fs.existsSync(filePath) && fs.statSync(filePath).isFile());
81
+ }
82
+
83
+ export function validateBrandTruthAtProjectRoot(projectRoot) {
84
+ const errors = [];
85
+
86
+ for (const filePath of collectBrandSurfaceFiles(projectRoot)) {
87
+ const relativePath = path.relative(projectRoot, filePath);
88
+ const content = normalizeAllowedLegacyReferences(fs.readFileSync(filePath, 'utf8'));
89
+
90
+ for (const pattern of BRAND_PATTERNS) {
91
+ pattern.regex.lastIndex = 0;
92
+
93
+ if (pattern.regex.test(content)) {
94
+ errors.push(`${relativePath}: contains forbidden brand term "${pattern.label}"`);
95
+ }
96
+ }
97
+ }
98
+
99
+ if (errors.length > 0) {
100
+ return {
101
+ exitCode: 1,
102
+ stderr: `Brand truth validation failed:\n- ${errors.join('\n- ')}\n`,
103
+ };
104
+ }
105
+
106
+ return {
107
+ exitCode: 0,
108
+ stdout: 'Brand truth validation passed.\n',
109
+ };
110
+ }
@@ -0,0 +1,231 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+
5
+ const VALID_CATEGORIES = new Set([
6
+ 'Added', 'Changed', 'Deprecated', 'Removed', 'Fixed', 'Security',
7
+ ]);
8
+
9
+ const UNRELEASED_PATTERN = /^## \[Unreleased\]/m;
10
+ const ENTRY_PATTERN = /^- .+$/m;
11
+ // Lowercase v + three-component semver. Filters out legacy tags like V5.1, V6.1 (capital V, two-component).
12
+ const SEMVER_TAG_PATTERN = /^v\d+\.\d+\.\d+$/;
13
+
14
+ function parseChangelog(content) {
15
+ const errors = [];
16
+
17
+ if (!UNRELEASED_PATTERN.test(content)) {
18
+ errors.push('Missing [Unreleased] section');
19
+ }
20
+
21
+ // Validate categories and check for empty ones
22
+ const categoryRegex = /^### (.+)$/gm;
23
+ let match;
24
+ while ((match = categoryRegex.exec(content)) !== null) {
25
+ const category = match[1].trim();
26
+ if (!VALID_CATEGORIES.has(category)) {
27
+ errors.push(`Invalid category "${category}" — allowed: ${[...VALID_CATEGORIES].join(', ')}`);
28
+ } else {
29
+ // Check if category has at least one entry before next heading or EOF
30
+ const afterCategory = content.slice(match.index + match[0].length);
31
+ const nextHeading = afterCategory.search(/^##/m);
32
+ const block = nextHeading === -1 ? afterCategory : afterCategory.slice(0, nextHeading);
33
+ if (!ENTRY_PATTERN.test(block)) {
34
+ errors.push(`Empty category "${category}" — remove it or add entries`);
35
+ }
36
+ }
37
+ }
38
+
39
+ return errors;
40
+ }
41
+
42
+ function getUnreleasedEntries(content) {
43
+ const unreleasedIdx = content.search(UNRELEASED_PATTERN);
44
+ if (unreleasedIdx === -1) return [];
45
+
46
+ const afterUnreleased = content.slice(unreleasedIdx + '## [Unreleased]'.length);
47
+ const nextSection = afterUnreleased.search(/^## \[/m);
48
+ const unreleasedBlock = nextSection === -1 ? afterUnreleased : afterUnreleased.slice(0, nextSection);
49
+
50
+ const entries = [];
51
+ const entryRegex = /^- (.+)$/gm;
52
+ let m;
53
+ while ((m = entryRegex.exec(unreleasedBlock)) !== null) {
54
+ entries.push(m[1].trim());
55
+ }
56
+ return entries;
57
+ }
58
+
59
+ function getLatestSemverTag(cwd) {
60
+ try {
61
+ const tags = execFileSync('git', ['tag', '--sort=-creatordate'], {
62
+ encoding: 'utf8',
63
+ cwd: cwd || process.cwd(),
64
+ }).trim().split('\n').filter(Boolean);
65
+
66
+ return tags.find((tag) => SEMVER_TAG_PATTERN.test(tag)) || null;
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+
72
+ function getFirstCommit(cwd) {
73
+ try {
74
+ return execFileSync('git', ['rev-list', '--max-parents=0', 'HEAD'], {
75
+ encoding: 'utf8',
76
+ cwd: cwd || process.cwd(),
77
+ }).trim().split('\n')[0] || null;
78
+ } catch {
79
+ return null;
80
+ }
81
+ }
82
+
83
+ function getCommitTypesSinceRef(ref, head, cwd) {
84
+ const range = head ? `${ref}..${head}` : `${ref}..HEAD`;
85
+ try {
86
+ const output = execFileSync('git', ['log', range, '--format=%s'], {
87
+ encoding: 'utf8',
88
+ cwd: cwd || process.cwd(),
89
+ });
90
+ const messages = output.trim().split('\n').filter(Boolean);
91
+ const types = messages.map((msg) => {
92
+ const m = msg.match(/^(feat|fix|docs|chore|refactor|test|ci|perf|build)/);
93
+ return m ? m[1] : null;
94
+ }).filter(Boolean);
95
+ return { types, count: messages.length };
96
+ } catch {
97
+ return { types: [], count: 0 };
98
+ }
99
+ }
100
+
101
+ function getChangelogContentAtRef(ref, cwd) {
102
+ return execFileSync(
103
+ 'git', ['show', `${ref}:CHANGELOG.md`],
104
+ { encoding: 'utf8', cwd, stdio: ['pipe', 'pipe', 'pipe'] },
105
+ );
106
+ }
107
+
108
+ function countNewEntriesSinceBase(projectRoot, base, head) {
109
+ // Read head changelog: use git show if head is explicit, else read worktree
110
+ const headContent = head
111
+ ? execFileSync('git', ['show', `${head}:CHANGELOG.md`], { encoding: 'utf8', cwd: projectRoot, stdio: ['pipe', 'pipe', 'pipe'] })
112
+ : fs.readFileSync(path.join(projectRoot, 'CHANGELOG.md'), 'utf8');
113
+ const headEntries = getUnreleasedEntries(headContent);
114
+
115
+ // Read base changelog — if base has no CHANGELOG.md, that's a real error
116
+ // unless this is the initial commit (no parent)
117
+ let baseEntries;
118
+ try {
119
+ const baseContent = getChangelogContentAtRef(base, projectRoot);
120
+ baseEntries = new Set(getUnreleasedEntries(baseContent));
121
+ } catch (err) {
122
+ // Safe cases: base doesn't have CHANGELOG.md at all (first creation)
123
+ // git show errors: "does not exist" or "exists on disk, but not in '<ref>'"
124
+ const stderr = err.stderr?.toString() || '';
125
+ if (err.status && (stderr.includes('does not exist') || stderr.includes('exists on disk, but not in'))) {
126
+ return headEntries.length; // All entries are new
127
+ }
128
+ throw err; // Surface the actual error
129
+ }
130
+
131
+ // Exact-match subtraction (reorder-safe, rename counts as new — documented limitation)
132
+ return headEntries.filter((e) => !baseEntries.has(e)).length;
133
+ }
134
+
135
+ function readChangelogContent(projectRoot, head) {
136
+ if (head) {
137
+ // When --head is specified, read changelog at that commit (not worktree)
138
+ return execFileSync(
139
+ 'git', ['show', `${head}:CHANGELOG.md`],
140
+ { encoding: 'utf8', cwd: projectRoot, stdio: ['pipe', 'pipe', 'pipe'] },
141
+ );
142
+ }
143
+ const changelogPath = path.join(projectRoot, 'CHANGELOG.md');
144
+ if (!fs.existsSync(changelogPath)) return null;
145
+ return fs.readFileSync(changelogPath, 'utf8');
146
+ }
147
+
148
+ export function validateChangelog(projectRoot, options = {}) {
149
+ let content;
150
+ try {
151
+ content = readChangelogContent(projectRoot, options.head);
152
+ } catch (err) {
153
+ return {
154
+ exitCode: 1,
155
+ stderr: `Changelog validation failed:\n- Could not read CHANGELOG.md at "${options.head}": ${err.message}\n`,
156
+ };
157
+ }
158
+
159
+ if (content === null) {
160
+ return {
161
+ exitCode: 1,
162
+ stderr: 'Changelog validation failed:\n- CHANGELOG.md not found\n',
163
+ };
164
+ }
165
+
166
+ const errors = parseChangelog(content);
167
+
168
+ if (errors.length > 0) {
169
+ return {
170
+ exitCode: 1,
171
+ stderr: `Changelog validation failed:\n- ${errors.join('\n- ')}\n`,
172
+ };
173
+ }
174
+
175
+ // --require-entries: diff-aware — compares entries against base branch
176
+ if (options.requireEntries) {
177
+ const base = options.base;
178
+ if (base) {
179
+ try {
180
+ const newEntryCount = countNewEntriesSinceBase(projectRoot, base, options.head);
181
+ if (newEntryCount === 0) {
182
+ return {
183
+ exitCode: 1,
184
+ stderr: 'Changelog validation failed:\n- No entries in [Unreleased] section since base branch (--require-entries was set)\n',
185
+ };
186
+ }
187
+ } catch (err) {
188
+ return {
189
+ exitCode: 1,
190
+ stderr: `Changelog validation failed:\n- Could not diff changelog against base "${base}": ${err.message}\n`,
191
+ };
192
+ }
193
+ } else if (getUnreleasedEntries(content).length === 0) {
194
+ return {
195
+ exitCode: 1,
196
+ stderr: 'Changelog validation failed:\n- No entries in [Unreleased] section (--require-entries was set)\n',
197
+ };
198
+ }
199
+ }
200
+
201
+ // Diff-aware gap detection (warning only, does not fail)
202
+ const warnings = [];
203
+ const diffRef = options.base || getLatestSemverTag(projectRoot) || getFirstCommit(projectRoot);
204
+ if (diffRef) {
205
+ try {
206
+ const { types } = getCommitTypesSinceRef(diffRef, options.head, projectRoot);
207
+ const userFacingTypes = types.filter((t) => t === 'feat' || t === 'fix');
208
+ if (userFacingTypes.length > 0) {
209
+ // Check for new entries relative to base, not just non-empty
210
+ let newCount;
211
+ try {
212
+ newCount = countNewEntriesSinceBase(projectRoot, diffRef, options.head);
213
+ } catch {
214
+ newCount = getUnreleasedEntries(content).length;
215
+ }
216
+ if (newCount === 0) {
217
+ warnings.push(`${userFacingTypes.length} feat/fix commit(s) since "${diffRef}" but no new [Unreleased] entries`);
218
+ }
219
+ }
220
+ } catch (err) {
221
+ warnings.push(`Could not perform diff-aware check: ${err.message}`);
222
+ }
223
+ }
224
+
225
+ const warningText = warnings.length > 0 ? `\nWarnings:\n- ${warnings.join('\n- ')}\n` : '';
226
+
227
+ return {
228
+ exitCode: 0,
229
+ stdout: `Changelog validation passed.${warningText}\n`,
230
+ };
231
+ }
@@ -0,0 +1,36 @@
1
+ export const SUPPORTED_COMMAND_SUBJECTS = new Set([
2
+ 'wazir validate',
3
+ 'wazir validate manifest',
4
+ 'wazir validate hooks',
5
+ 'wazir validate docs',
6
+ 'wazir validate brand',
7
+ 'wazir validate runtime',
8
+ 'wazir validate artifacts',
9
+ 'wazir validate branches',
10
+ 'wazir validate commits',
11
+ 'wazir validate changelog',
12
+ 'wazir validate docs-drift',
13
+ 'wazir export',
14
+ 'wazir export build',
15
+ 'wazir export --check',
16
+ 'wazir index',
17
+ 'wazir index build',
18
+ 'wazir index refresh',
19
+ 'wazir index stats',
20
+ 'wazir index summarize',
21
+ 'wazir index search-symbols',
22
+ 'wazir index get-symbol',
23
+ 'wazir index get-file-outline',
24
+ 'wazir recall',
25
+ 'wazir recall file',
26
+ 'wazir recall symbol',
27
+ 'wazir doctor',
28
+ 'wazir status',
29
+ 'wazir capture',
30
+ 'wazir capture init',
31
+ 'wazir capture event',
32
+ 'wazir capture route',
33
+ 'wazir capture output',
34
+ 'wazir capture summary',
35
+ 'wazir capture usage',
36
+ ]);