@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,261 @@
1
+ /**
2
+ * Heuristic summarizers for L0/L1 file-level and symbol-level summaries.
3
+ * All functions are pure: input is indexed data, output is a string.
4
+ */
5
+
6
+ const BOM_UTF16_LE = '\xFF\xFE';
7
+ const BOM_UTF16_BE = '\xFE\xFF';
8
+ const BOM_UTF32_LE = '\xFF\xFE\x00\x00';
9
+ const BOM_UTF32_BE = '\x00\x00\xFE\xFF';
10
+
11
+ const BINARY_CHECK_LIMIT = 8192;
12
+ const L0_CAP = 400;
13
+ const L1_CAP = 8000;
14
+ const SYMBOL_L1_CODE_CAP = 2000;
15
+ const SYMBOL_L1_DATA_CAP = 800;
16
+ const KEY_VALUE_PREVIEW_CAP = 200;
17
+ const MAX_IMPORTS = 10;
18
+
19
+ const CODE_LANGUAGES = new Set([
20
+ 'javascript', 'typescript', 'python', 'go', 'rust', 'java', 'sql',
21
+ ]);
22
+
23
+ const STRUCTURED_DATA_LANGUAGES = new Set(['json', 'yaml']);
24
+
25
+ /**
26
+ * Detect binary content with BOM guard.
27
+ * Checks for UTF-16/UTF-32 BOMs first (return false if found),
28
+ * then checks for null bytes in the first 8192 characters.
29
+ *
30
+ * @param {string} content - File content read as UTF-8 string.
31
+ * @returns {boolean} True if content appears to be binary.
32
+ */
33
+ export function isBinaryContent(content) {
34
+ if (content.length === 0) return false;
35
+
36
+ // Check for UTF-32 BOMs first (4-byte, must check before 2-byte)
37
+ if (content.length >= 4) {
38
+ if (content.startsWith(BOM_UTF32_LE)) return false;
39
+ if (content.startsWith(BOM_UTF32_BE)) return false;
40
+ }
41
+
42
+ // Check for UTF-16 BOMs (2-byte)
43
+ if (content.length >= 2) {
44
+ if (content.startsWith(BOM_UTF16_LE)) return false;
45
+ if (content.startsWith(BOM_UTF16_BE)) return false;
46
+ }
47
+
48
+ // Check for null bytes in first BINARY_CHECK_LIMIT characters
49
+ const limit = Math.min(content.length, BINARY_CHECK_LIMIT);
50
+ return content.slice(0, limit).includes('\0');
51
+ }
52
+
53
+ /**
54
+ * Extract top-level keys from JSON content.
55
+ * @param {string} content
56
+ * @returns {string[]}
57
+ */
58
+ function extractJsonTopLevelKeys(content) {
59
+ const keys = [];
60
+ for (const line of content.split('\n')) {
61
+ const match = line.match(/^\s*"([^"]+)"\s*:/);
62
+ if (match) keys.push(match[1]);
63
+ }
64
+ return keys;
65
+ }
66
+
67
+ /**
68
+ * Extract top-level keys from YAML content.
69
+ * @param {string} content
70
+ * @returns {string[]}
71
+ */
72
+ function extractYamlTopLevelKeys(content) {
73
+ const keys = [];
74
+ for (const line of content.split('\n')) {
75
+ const match = line.match(/^([A-Za-z0-9_-]+):\s*/);
76
+ if (match) keys.push(match[1]);
77
+ }
78
+ return keys;
79
+ }
80
+
81
+ /**
82
+ * Generate a file-level L0 summary (single-line abstract, capped at 400 chars).
83
+ *
84
+ * @param {string} language - Detected language (javascript, markdown, json, etc.)
85
+ * @param {number} lineCount - Number of lines in the file.
86
+ * @param {Array<{name: string, kind: string}>} symbols - Extracted symbols.
87
+ * @param {string} content - File content.
88
+ * @returns {string}
89
+ */
90
+ export function generateFileL0(language, lineCount, symbols, content) {
91
+ if (lineCount === 0) return `${language} file (empty)`;
92
+ if (lineCount === 1) return `${language} file (1 line) -- ${content.trim().slice(0, 80)}`.slice(0, L0_CAP);
93
+
94
+ if (language === 'markdown') {
95
+ return generateMarkdownL0(content);
96
+ }
97
+
98
+ if (STRUCTURED_DATA_LANGUAGES.has(language)) {
99
+ return generateStructuredDataL0(language, lineCount, content);
100
+ }
101
+
102
+ return generateCodeL0(language, lineCount, symbols, content);
103
+ }
104
+
105
+ function generateMarkdownL0(content) {
106
+ const lines = content.split('\n');
107
+ const heading = lines.find((l) => /^#{1,6}\s+/.test(l));
108
+ const headingText = heading ? heading.replace(/^#{1,6}\s+/, '').trim() : '';
109
+ const firstParagraph = lines.find((l) => l.trim().length > 0 && !/^#/.test(l));
110
+ const parts = [headingText, firstParagraph?.trim()].filter(Boolean);
111
+ return parts.join(' -- ').slice(0, L0_CAP);
112
+ }
113
+
114
+ function generateStructuredDataL0(language, lineCount, content) {
115
+ const keys = language === 'json'
116
+ ? extractJsonTopLevelKeys(content)
117
+ : extractYamlTopLevelKeys(content);
118
+
119
+ if (keys.length === 0) {
120
+ const firstLine = content.split('\n').find((l) => l.trim().length > 0) || '';
121
+ return `${language} file (${lineCount} lines) -- ${firstLine.trim().slice(0, 80)}`.slice(0, L0_CAP);
122
+ }
123
+
124
+ return `${language} file (${lineCount} lines) -- keys: ${keys.join(', ')}`.slice(0, L0_CAP);
125
+ }
126
+
127
+ function generateCodeL0(language, lineCount, symbols, content) {
128
+ const topNames = symbols
129
+ .filter((s) => s.kind === 'function' || s.kind === 'class' || s.kind === 'type')
130
+ .slice(0, 5)
131
+ .map((s) => s.name);
132
+
133
+ if (topNames.length > 0) {
134
+ return `${language} file (${lineCount} lines) -- ${topNames.join(', ')}`.slice(0, L0_CAP);
135
+ }
136
+
137
+ const firstLine = content.split('\n').find((l) => l.trim().length > 0) || '';
138
+ return `${language} file (${lineCount} lines) -- ${firstLine.trim().slice(0, 80)}`.slice(0, L0_CAP);
139
+ }
140
+
141
+ /**
142
+ * Generate a file-level L1 summary (detailed overview, capped at 8000 chars).
143
+ *
144
+ * @param {string} language - Detected language.
145
+ * @param {Array<{name: string, kind: string, signature: string}>} symbols - Extracted symbols.
146
+ * @param {string} content - File content.
147
+ * @returns {string}
148
+ */
149
+ export function generateFileL1(language, symbols, content) {
150
+ if (language === 'markdown') return generateMarkdownL1(content);
151
+ if (STRUCTURED_DATA_LANGUAGES.has(language)) return generateStructuredDataL1(language, content);
152
+ return generateCodeL1(symbols, content);
153
+ }
154
+
155
+ function generateCodeL1(symbols, content) {
156
+ const lines = content.split('\n');
157
+ const parts = [];
158
+
159
+ const imports = lines
160
+ .filter((l) => /^\s*(import\s|from\s|require\(|use\s)/.test(l))
161
+ .slice(0, MAX_IMPORTS);
162
+ if (imports.length > 0) parts.push('## Imports\n' + imports.join('\n'));
163
+
164
+ const sigs = symbols.map((s) => `${s.kind} ${s.name}: ${s.signature}`);
165
+ if (sigs.length > 0) parts.push('## Symbols\n' + sigs.join('\n'));
166
+
167
+ return parts.join('\n\n').slice(0, L1_CAP);
168
+ }
169
+
170
+ function generateMarkdownL1(content) {
171
+ const lines = content.split('\n');
172
+ const headings = lines.filter((l) => /^#{1,6}\s+/.test(l));
173
+ return headings.join('\n').slice(0, L1_CAP);
174
+ }
175
+
176
+ function generateStructuredDataL1(language, content) {
177
+ const lines = content.split('\n');
178
+ const parts = [];
179
+
180
+ for (const line of lines) {
181
+ const jsonMatch = line.match(/^\s*"([^"]+)"\s*:\s*(.*)/);
182
+ const yamlMatch = line.match(/^([A-Za-z0-9_-]+):\s*(.*)/);
183
+ const match = jsonMatch || yamlMatch;
184
+
185
+ if (match) {
186
+ const key = match[1];
187
+ const valuePreview = match[2].trim().slice(0, 200);
188
+ parts.push(`${key}: ${valuePreview}`);
189
+ }
190
+ }
191
+
192
+ return parts.join('\n').slice(0, L1_CAP);
193
+ }
194
+
195
+ /**
196
+ * Generate a symbol-level L0 summary (single line, capped at 400 chars).
197
+ *
198
+ * @param {{name: string, kind: string, signature: string}} symbol
199
+ * @returns {string}
200
+ */
201
+ export function generateSymbolL0(symbol) {
202
+ const prefix = symbol.kind === 'key' ? 'key' : symbol.kind;
203
+ const firstLine = symbol.signature.split('\n')[0];
204
+ return `${prefix} ${symbol.name} -- ${firstLine}`.slice(0, L0_CAP);
205
+ }
206
+
207
+ /**
208
+ * Generate a symbol-level L1 summary.
209
+ * Code symbols: full signature + first comment block, capped at 2000 chars.
210
+ * JSON/YAML key symbols: key name + value preview, capped at 800 chars.
211
+ *
212
+ * @param {{name: string, kind: string, signature: string, line_start: number, line_end: number}} symbol
213
+ * @param {string} fileContent - Full file content.
214
+ * @returns {string}
215
+ */
216
+ export function generateSymbolL1(symbol, fileContent) {
217
+ if (symbol.kind === 'key') {
218
+ return generateKeySymbolL1(symbol);
219
+ }
220
+ return generateCodeSymbolL1(symbol, fileContent);
221
+ }
222
+
223
+ function generateCodeSymbolL1(symbol, fileContent) {
224
+ const lines = fileContent.split('\n');
225
+ const parts = [];
226
+
227
+ // Look backward from line_start for a comment block (/** ... */ or # ...)
228
+ const commentBlock = extractCommentBlock(lines, symbol.line_start - 1);
229
+ if (commentBlock) parts.push(commentBlock);
230
+
231
+ parts.push(symbol.signature);
232
+
233
+ return parts.join('\n').slice(0, SYMBOL_L1_CODE_CAP);
234
+ }
235
+
236
+ function extractCommentBlock(lines, symbolLineIndex) {
237
+ const commentLines = [];
238
+ // Walk backward from the line before the symbol definition
239
+ for (let i = symbolLineIndex - 1; i >= 0; i--) {
240
+ const trimmed = lines[i].trim();
241
+ // JSDoc/block comment lines
242
+ if (trimmed.startsWith('*') || trimmed.startsWith('/**') || trimmed.startsWith('*/') || trimmed.startsWith('*')) {
243
+ commentLines.unshift(lines[i]);
244
+ if (trimmed.startsWith('/**') || trimmed === '/*') break;
245
+ // Hash comment lines (Python, etc.)
246
+ } else if (trimmed.startsWith('#') && !trimmed.startsWith('#!')) {
247
+ commentLines.unshift(lines[i]);
248
+ // Empty line between comments and symbol is ok if we already have comments
249
+ } else if (trimmed === '' && commentLines.length === 0) {
250
+ continue;
251
+ } else {
252
+ break;
253
+ }
254
+ }
255
+ return commentLines.length > 0 ? commentLines.join('\n') : null;
256
+ }
257
+
258
+ function generateKeySymbolL1(symbol) {
259
+ const valuePreview = symbol.signature.slice(0, KEY_VALUE_PREVIEW_CAP);
260
+ return `key ${symbol.name}\n${valuePreview}`.slice(0, SYMBOL_L1_DATA_CAP);
261
+ }
@@ -0,0 +1,18 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+
5
+ export function readJsonFile(filePath) {
6
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
7
+ }
8
+
9
+ export function readYamlFile(filePath) {
10
+ return YAML.parse(fs.readFileSync(filePath, 'utf8'));
11
+ }
12
+
13
+ export function listYamlFiles(dirPath) {
14
+ return fs.readdirSync(dirPath)
15
+ .filter((entry) => entry.endsWith('.yaml') || entry.endsWith('.yml'))
16
+ .sort()
17
+ .map((entry) => path.join(dirPath, entry));
18
+ }
@@ -0,0 +1,22 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ const MANIFEST_FILE = 'wazir.manifest.yaml';
5
+
6
+ export function findProjectRoot(startDir = process.cwd()) {
7
+ let currentDir = path.resolve(startDir);
8
+
9
+ while (true) {
10
+ if (fs.existsSync(path.join(currentDir, MANIFEST_FILE))) {
11
+ return currentDir;
12
+ }
13
+
14
+ const parentDir = path.dirname(currentDir);
15
+
16
+ if (parentDir === currentDir) {
17
+ throw new Error(`Could not find ${MANIFEST_FILE} from ${startDir}`);
18
+ }
19
+
20
+ currentDir = parentDir;
21
+ }
22
+ }
@@ -0,0 +1,225 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ import { parseCommandOptions, parsePositiveInteger } from '../command-options.js';
5
+ import { readYamlFile } from '../loaders.js';
6
+ import { findProjectRoot } from '../project-root.js';
7
+ import { resolveStateRoot } from '../state-root.js';
8
+ import {
9
+ findSymbol,
10
+ hashContent,
11
+ logRetrieval,
12
+ readFileSummary,
13
+ readIndexedFile,
14
+ readSymbolSummary,
15
+ } from '../index/storage.js';
16
+
17
+ function success(payload, options = {}) {
18
+ if (options.json) {
19
+ return {
20
+ exitCode: 0,
21
+ stdout: `${JSON.stringify(payload, null, 2)}\n`,
22
+ };
23
+ }
24
+
25
+ return {
26
+ exitCode: 0,
27
+ stdout: `${options.formatText ? options.formatText(payload) : String(payload)}\n`,
28
+ };
29
+ }
30
+
31
+ function failure(message, exitCode = 1) {
32
+ return {
33
+ exitCode,
34
+ stderr: `${message}\n`,
35
+ };
36
+ }
37
+
38
+ function loadProjectContext(context, stateRootOverride) {
39
+ const projectRoot = findProjectRoot(context.cwd ?? process.cwd());
40
+ const manifest = readYamlFile(path.join(projectRoot, 'wazir.manifest.yaml'));
41
+ const stateRoot = resolveStateRoot(projectRoot, manifest, {
42
+ cwd: context.cwd ?? process.cwd(),
43
+ override: stateRootOverride,
44
+ });
45
+
46
+ return {
47
+ projectRoot,
48
+ stateRoot,
49
+ };
50
+ }
51
+
52
+ function readSlice(projectRoot, relativePath, lineStart, lineEnd, contextLines = 0) {
53
+ const absolutePath = path.join(projectRoot, relativePath);
54
+ const lines = fs.readFileSync(absolutePath, 'utf8').split('\n');
55
+ const boundedStart = Math.max(1, lineStart);
56
+ const boundedEnd = Math.min(lines.length, lineEnd);
57
+ const expandedStart = Math.max(1, boundedStart - contextLines);
58
+ const expandedEnd = Math.min(lines.length, boundedEnd + contextLines);
59
+
60
+ return {
61
+ relative_path: relativePath,
62
+ line_start: boundedStart,
63
+ line_end: boundedEnd,
64
+ slice: lines.slice(boundedStart - 1, boundedEnd).join('\n'),
65
+ context_before: lines.slice(expandedStart - 1, boundedStart - 1).join('\n'),
66
+ context_after: lines.slice(boundedEnd, expandedEnd).join('\n'),
67
+ };
68
+ }
69
+
70
+ export function runRecallCommand(parsed, context = {}) {
71
+ try {
72
+ const { positional, options } = parseCommandOptions(parsed.args, {
73
+ boolean: ['json'],
74
+ string: ['state-root', 'start-line', 'end-line', 'context', 'tier'],
75
+ });
76
+
77
+ if (options.tier && options.tier !== 'L0' && options.tier !== 'L1') {
78
+ return failure('--tier must be L0 or L1');
79
+ }
80
+
81
+ if (options.tier && (options.startLine || options.endLine || options.context)) {
82
+ return failure('--tier is mutually exclusive with --start-line, --end-line, and --context');
83
+ }
84
+
85
+ const { projectRoot, stateRoot } = loadProjectContext(context, options.stateRoot);
86
+ const contextLines = options.context ? parsePositiveInteger(options.context, '--context') : 0;
87
+
88
+ switch (parsed.subcommand) {
89
+ case 'file': {
90
+ const relativePath = positional[0];
91
+
92
+ if (!relativePath) {
93
+ return failure('Usage: wazir recall file <relative-path> --start-line <n> --end-line <n> [--context <n>] [--state-root <path>] [--json]');
94
+ }
95
+
96
+ const fileRecord = readIndexedFile(stateRoot, relativePath);
97
+
98
+ if (!fileRecord) {
99
+ return failure(`File is not indexed: ${relativePath}`);
100
+ }
101
+
102
+ if (options.tier) {
103
+ const summary = readFileSummary(stateRoot, fileRecord.file_id, options.tier);
104
+
105
+ if (!summary) {
106
+ return failure(`No ${options.tier} summary found for ${relativePath}. Run 'wazir index summarize' first.`);
107
+ }
108
+
109
+ let liveContent;
110
+ try {
111
+ liveContent = fs.readFileSync(path.join(projectRoot, relativePath), 'utf8');
112
+ } catch (err) {
113
+ if (err.code === 'ENOENT') {
114
+ return failure(`File not found on disk: ${relativePath}`);
115
+ }
116
+ return failure(`Cannot read file: ${relativePath}: ${err.message}`);
117
+ }
118
+
119
+ const liveHash = hashContent(liveContent);
120
+ const fresh = liveHash === summary.source_hash;
121
+
122
+ logRetrieval(stateRoot, 'recall-file', relativePath, 1);
123
+ return success({
124
+ relative_path: relativePath,
125
+ tier: options.tier,
126
+ slice: summary.content,
127
+ generator: summary.generator,
128
+ generated_at: summary.generated_at,
129
+ fresh,
130
+ }, {
131
+ json: options.json,
132
+ formatText: (value) => value.slice,
133
+ });
134
+ }
135
+
136
+ if (!options.startLine || !options.endLine) {
137
+ return failure('wazir recall file requires --start-line and --end-line');
138
+ }
139
+
140
+ const slice = readSlice(
141
+ projectRoot,
142
+ relativePath,
143
+ parsePositiveInteger(options.startLine, '--start-line'),
144
+ parsePositiveInteger(options.endLine, '--end-line'),
145
+ contextLines,
146
+ );
147
+ logRetrieval(stateRoot, 'recall-file', relativePath, 1);
148
+ return success(slice, {
149
+ json: options.json,
150
+ formatText: (value) => value.slice,
151
+ });
152
+ }
153
+ case 'symbol': {
154
+ const query = positional[0];
155
+
156
+ if (!query) {
157
+ return failure('Usage: wazir recall symbol <name-or-id> [--context <n>] [--state-root <path>] [--json]');
158
+ }
159
+
160
+ const symbol = findSymbol(stateRoot, query);
161
+
162
+ if (!symbol) {
163
+ return failure(`No indexed symbol found for "${query}"`);
164
+ }
165
+
166
+ if (options.tier) {
167
+ const summary = readSymbolSummary(stateRoot, symbol.symbol_id, options.tier);
168
+
169
+ if (!summary) {
170
+ return failure(`No ${options.tier} summary found for ${symbol.name}. Run 'wazir index summarize' first.`);
171
+ }
172
+
173
+ let liveContent;
174
+ try {
175
+ liveContent = fs.readFileSync(path.join(projectRoot, symbol.relative_path), 'utf8');
176
+ } catch (err) {
177
+ if (err.code === 'ENOENT') {
178
+ return failure(`File not found on disk: ${symbol.relative_path}`);
179
+ }
180
+ return failure(`Cannot read file: ${symbol.relative_path}: ${err.message}`);
181
+ }
182
+
183
+ const liveHash = hashContent(liveContent);
184
+ const fresh = liveHash === summary.source_hash;
185
+
186
+ logRetrieval(stateRoot, 'recall-symbol', query, 1);
187
+ return success({
188
+ relative_path: symbol.relative_path,
189
+ name: symbol.name,
190
+ kind: symbol.kind,
191
+ signature: symbol.signature,
192
+ tier: options.tier,
193
+ slice: summary.content,
194
+ generator: summary.generator,
195
+ generated_at: summary.generated_at,
196
+ fresh,
197
+ }, {
198
+ json: options.json,
199
+ formatText: (value) => value.slice,
200
+ });
201
+ }
202
+
203
+ const slice = readSlice(
204
+ projectRoot,
205
+ symbol.relative_path,
206
+ symbol.line_start,
207
+ symbol.line_end,
208
+ contextLines,
209
+ );
210
+ logRetrieval(stateRoot, 'recall-symbol', query, 1);
211
+ return success({
212
+ ...symbol,
213
+ ...slice,
214
+ }, {
215
+ json: options.json,
216
+ formatText: (value) => value.slice,
217
+ });
218
+ }
219
+ default:
220
+ return failure('Usage: wazir recall <file|symbol> [options]');
221
+ }
222
+ } catch (error) {
223
+ return failure(error.message);
224
+ }
225
+ }
@@ -0,0 +1,30 @@
1
+ import Ajv2020 from 'ajv/dist/2020.js';
2
+
3
+ const ajv = new Ajv2020({
4
+ allErrors: true,
5
+ strict: false,
6
+ validateFormats: false,
7
+ });
8
+ const validatorCache = new Map();
9
+
10
+ function formatError(error) {
11
+ const pointer = error.instancePath || '/';
12
+ return `${pointer} ${error.message}`;
13
+ }
14
+
15
+ export function validateAgainstSchema(schema, data) {
16
+ const schemaKey = schema.$id ?? JSON.stringify(schema);
17
+ let validate = validatorCache.get(schemaKey);
18
+
19
+ if (!validate) {
20
+ validate = ajv.compile(schema);
21
+ validatorCache.set(schemaKey, validate);
22
+ }
23
+
24
+ const valid = validate(data);
25
+
26
+ return {
27
+ valid,
28
+ errors: valid ? [] : (validate.errors ?? []).map(formatError),
29
+ };
30
+ }
@@ -0,0 +1,40 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+
4
+ function expandHomeDir(filePath) {
5
+ if (filePath === '~') {
6
+ return os.homedir();
7
+ }
8
+
9
+ if (filePath.startsWith('~/')) {
10
+ return path.join(os.homedir(), filePath.slice(2));
11
+ }
12
+
13
+ return filePath;
14
+ }
15
+
16
+ function slugifyProjectName(name) {
17
+ return name
18
+ .toLowerCase()
19
+ .replace(/[^a-z0-9]+/g, '-')
20
+ .replace(/^-+|-+$/g, '') || 'wazir-project';
21
+ }
22
+
23
+ export function resolveStateRoot(projectRoot, manifest, context = {}) {
24
+ const cwd = context.cwd ?? process.cwd();
25
+ const override = context.override;
26
+
27
+ if (override) {
28
+ return path.resolve(cwd, override);
29
+ }
30
+
31
+ const template = manifest.paths.state_root_default;
32
+ const projectSlug = slugifyProjectName(manifest.project.name || path.basename(projectRoot));
33
+ const interpolated = template.replace('{project_slug}', projectSlug);
34
+
35
+ return path.resolve(expandHomeDir(interpolated));
36
+ }
37
+
38
+ export function getIndexDatabasePath(stateRoot) {
39
+ return path.join(stateRoot, 'index', 'index.sqlite');
40
+ }
@@ -0,0 +1,71 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ import { parseCommandOptions } from '../command-options.js';
5
+ import { readYamlFile } from '../loaders.js';
6
+ import { findProjectRoot } from '../project-root.js';
7
+ import { resolveStateRoot } from '../state-root.js';
8
+
9
+ function success(payload, options = {}) {
10
+ if (options.json) {
11
+ return {
12
+ exitCode: 0,
13
+ stdout: `${JSON.stringify(payload, null, 2)}\n`,
14
+ };
15
+ }
16
+
17
+ return {
18
+ exitCode: 0,
19
+ stdout: `${payload.run_id} ${payload.phase} ${payload.status}\n`,
20
+ };
21
+ }
22
+
23
+ export function runStatusCommand(parsed, context = {}) {
24
+ try {
25
+ if (parsed.subcommand) {
26
+ return {
27
+ exitCode: 1,
28
+ stderr: 'Usage: wazir status --run <id> [--state-root <path>] [--json]\n',
29
+ };
30
+ }
31
+
32
+ const { options } = parseCommandOptions(parsed.args, {
33
+ boolean: ['json'],
34
+ string: ['run', 'state-root'],
35
+ });
36
+
37
+ if (!options.run) {
38
+ return {
39
+ exitCode: 1,
40
+ stderr: 'wazir status requires --run <id>\n',
41
+ };
42
+ }
43
+
44
+ const projectRoot = findProjectRoot(context.cwd ?? process.cwd());
45
+ const manifest = readYamlFile(path.join(projectRoot, 'wazir.manifest.yaml'));
46
+ const stateRoot = resolveStateRoot(projectRoot, manifest, {
47
+ cwd: context.cwd ?? process.cwd(),
48
+ override: options.stateRoot,
49
+ });
50
+ const statusPath = path.join(stateRoot, 'runs', options.run, 'status.json');
51
+
52
+ if (!fs.existsSync(statusPath)) {
53
+ return {
54
+ exitCode: 1,
55
+ stderr: `Run status not found: ${statusPath}\n`,
56
+ };
57
+ }
58
+
59
+ const payload = {
60
+ ...JSON.parse(fs.readFileSync(statusPath, 'utf8')),
61
+ status_path: statusPath,
62
+ };
63
+
64
+ return success(payload, { json: options.json });
65
+ } catch (error) {
66
+ return {
67
+ exitCode: 1,
68
+ stderr: `${error.message}\n`,
69
+ };
70
+ }
71
+ }