@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,735 @@
1
+ # Plugin Architecture — Architecture Expertise Module
2
+
3
+ > Plugin architecture (micro-kernel, extension point) separates a stable core from optional extensions that can be added, removed, or replaced without modifying the core. The core defines extension points — explicit contracts where third-party or first-party code can inject behavior — while a plugin loader discovers, validates, and manages the lifecycle of extensions at runtime. Used when the system needs third-party extensibility or when features must be optional and swappable.
4
+
5
+ > **Category:** Pattern
6
+ > **Complexity:** Complex
7
+ > **Applies when:** Platforms for third-party extension, systems with optional/swappable features, product tiers with different capabilities, community-driven ecosystems
8
+
9
+ ---
10
+
11
+ ## What This Is (and What It Isn't)
12
+
13
+ ### The Micro-Kernel Pattern
14
+
15
+ The micro-kernel (or plug-in) architecture pattern separates a **minimal, stable core system** from **variable plug-in modules** that extend its functionality. The core provides just enough infrastructure to operate — event routing, plugin lifecycle management, a registry, and a base set of capabilities. Everything else is a plugin.
16
+
17
+ This is the architecture behind VS Code, WordPress, IntelliJ IDEA, Figma, webpack, Eclipse, and every browser extension system. It is not new. The pattern traces back to operating system design (Mach, MINIX) where a small kernel provides IPC, scheduling, and memory management while file systems, device drivers, and networking run as user-space services.
18
+
19
+ In application software, the same idea applies: the **core** handles plugin discovery, loading, lifecycle, security boundaries, and inter-plugin communication. The **plugins** implement actual features — a syntax highlighter, a payment gateway, an image filter, a build optimization pass.
20
+
21
+ ### The Plugin Lifecycle
22
+
23
+ Every plugin system implements some variation of this lifecycle:
24
+
25
+ 1. **Discover** — The core finds available plugins. This happens through file system scanning (a `plugins/` directory), manifest registration (a `plugin.xml` or `package.json`), service loader mechanisms (Java `ServiceLoader`, Python `entry_points`), or a remote registry (npm, VS Code Marketplace, WordPress Plugin Directory).
26
+
27
+ 2. **Resolve** — The core checks that the plugin's declared dependencies are satisfied. Version constraints are validated. Conflicts are detected. Load order is determined from the dependency graph.
28
+
29
+ 3. **Load** — The plugin's code is loaded into memory. Depending on the isolation model, this might mean importing a module into the same process, spawning a child process, loading a WebAssembly module, or starting a container. Class loaders in Java (OSGi bundles), dynamic `import()` in JavaScript, and `dlopen` in C all serve this role.
30
+
31
+ 4. **Initialize** — The plugin's `activate` or `init` function is called. The core passes a context object providing the plugin with access to the APIs it is permitted to use. The plugin registers its contributions — commands, menu items, event handlers, UI components — with the core's registry.
32
+
33
+ 5. **Execute** — The plugin responds to events, handles requests, or extends behavior at defined extension points. This is the steady state. The core invokes plugin-registered callbacks when relevant events occur.
34
+
35
+ 6. **Deactivate / Unload** — The plugin is given a chance to clean up resources (close file handles, cancel timers, flush buffers) before being removed from memory. Hot-unloading without restart is a hallmark of mature plugin systems (OSGi, VS Code, Eclipse).
36
+
37
+ ### What This Is Not
38
+
39
+ **Not just "modular code."** Splitting an application into modules or packages does not make it a plugin architecture. Modules are compile-time organizational units with static dependencies. Plugins are runtime-discovered, independently deployable units with dynamic binding to extension points. A Go application with 50 well-organized packages is modular. It is not a plugin system unless those packages can be added and removed by end users without recompiling the core.
40
+
41
+ **Not dependency injection.** DI frameworks (Spring, Guice, .NET DI) swap implementations of interfaces at configuration time. This enables testability and loose coupling, but it does not provide a plugin lifecycle, discovery mechanism, manifest system, versioning model, or security boundary. A DI container wires up known components. A plugin loader discovers unknown components. The overlap is in interface-based contracts, but the operational model is fundamentally different.
42
+
43
+ **Not microservices.** Microservices decompose a system into independently deployable network services. Plugins decompose a system into independently deployable in-process (or sandboxed) extensions of a single host application. Microservices communicate over the network. Plugins communicate through the host's API. The deployment unit, communication mechanism, and failure isolation model are all different.
44
+
45
+ **Not feature flags.** Feature flags toggle behavior that already exists in the codebase. Plugins add behavior that does not exist in the codebase at all. Feature flags are a deployment mechanism. Plugins are an extensibility mechanism. They can be complementary — a plugin system might use feature flags internally — but they solve different problems.
46
+
47
+ ---
48
+
49
+ ## When to Use It
50
+
51
+ ### The Qualifying Conditions
52
+
53
+ Apply plugin architecture when **two or more** of these are true:
54
+
55
+ **You are building a platform for third-party extension.** This is the canonical use case. VS Code has over 60,000 extensions on its Marketplace, built by thousands of independent developers. WordPress powers 43% of the web and hosts over 60,000 free plugins in its official directory plus an estimated 30,000 premium plugins across third-party marketplaces. IntelliJ IDEA's JetBrains Marketplace lists over 8,000 plugins. Figma's community plugin ecosystem has over 3,000 plugins. These numbers are only possible because the core defines a stable, well-documented extension API that third parties can build against without coordinating with the core team.
56
+
57
+ **Features must be optional or swappable.** A product that ships different capabilities to different customer tiers (free vs. pro vs. enterprise) benefits from a plugin model where each tier simply activates different plugins. Eclipse pioneered this approach: even core features like the Java editor are plugins, and different Eclipse distributions (Eclipse IDE for Java, Eclipse IDE for C++, Eclipse for PHP) are simply different plugin configurations of the same core.
58
+
59
+ **The community must be able to contribute.** Open source projects that want to accept contributions without giving commit access to the core benefit from a plugin boundary. Contributors build plugins. The core team reviews plugin APIs, not plugin implementations. Babel's entire transformation pipeline is plugin-based — over 100 official plugins and thousands of community plugins transform JavaScript syntax, and the core parser/generator never needs modification.
60
+
61
+ **You need runtime extensibility.** The system must load new capabilities without restart, recompilation, or redeployment. Chat platforms (Slack apps, Discord bots), CI/CD systems (Jenkins with 1,800+ plugins, GitHub Actions), and monitoring platforms (Grafana with 200+ data source plugins) all need this.
62
+
63
+ **You are building developer tooling.** Build tools (webpack, Rollup, esbuild, Vite), linters (ESLint with 3,000+ community rules), test frameworks (Jest with custom matchers/transformers), and CLI frameworks (oclif, yargs) all benefit from plugin architecture because developers expect to customize every aspect of their toolchain.
64
+
65
+ ### Real-World Case Studies
66
+
67
+ **VS Code** — Microsoft designed VS Code as a thin Electron shell with a Node.js extension host running extensions in a separate process. The core provides: text editor (Monaco), file system access, terminal, debugger protocol, SCM integration, and a contribution point system declared in `package.json` manifests. Extensions cannot access the DOM directly — they interact through VS Code's API surface, which provides `vscode.window`, `vscode.workspace`, `vscode.commands`, and other namespaces. This isolation means a misbehaving extension cannot crash the editor. Extensions are lazily activated based on activation events (e.g., `onLanguage:python` only loads when a Python file is opened), keeping startup fast despite thousands of installed extensions.
68
+
69
+ **WordPress** — WordPress uses an event-driven hook system with two primitives: **actions** (fire-and-forget events like `init`, `wp_head`, `save_post`) and **filters** (data transformation pipelines like `the_content`, `the_title`). Plugins register callbacks via `add_action()` and `add_filter()` with priority numbers controlling execution order. This model is simple enough that non-programmers can write plugins, which explains the ecosystem's size. The downside is zero isolation — plugins run in the same PHP process, share global state, and a fatal error in one plugin crashes the entire site.
70
+
71
+ **Webpack** — Webpack's architecture is built on the Tapable library, which provides typed hook classes: `SyncHook`, `SyncBailHook`, `SyncWaterfallHook`, `AsyncSeriesHook`, `AsyncParallelHook`, and `AsyncSeriesBailHook`. The `Compiler` and `Compilation` objects expose dozens of hooks that plugins tap into. A plugin is a class with an `apply(compiler)` method that taps into specific hooks. The hook types encode execution semantics: bail hooks stop on the first non-undefined return, waterfall hooks pass each return value to the next tap, and parallel hooks run taps concurrently. This type system prevents an entire class of plugin interaction bugs at the API level.
72
+
73
+ **IntelliJ Platform** — JetBrains uses a declarative extension point system. Plugins declare their contributions in `plugin.xml` using extension point references like `com.intellij.fileType`, `com.intellij.annotator`, or `com.intellij.codeInsight.template.postfixTemplateProvider`. The platform provides three service scopes: application-level (global singleton), project-level (one per open project), and module-level (one per module). Since 2019.3, "Light Services" annotated with `@Service` skip XML registration entirely. Plugins can also declare their own extension points, enabling plugin-to-plugin extension.
74
+
75
+ ---
76
+
77
+ ## When NOT to Use It
78
+
79
+ This section is equally important. Plugin architecture is one of the most over-applied patterns in software, because the fantasy of third-party extensibility is appealing even when no third party will ever extend the system.
80
+
81
+ ### The Disqualifying Conditions
82
+
83
+ **Internal applications with a single development team.** If the only people who will ever modify the system are the team that builds it, a plugin architecture adds indirection without value. The team can modify the core directly. They do not need a plugin manifest, a loader, an extension point registry, or a versioned API contract. They need well-organized modules and good tests. An internal CRM, an admin dashboard, a reporting tool — these are not platforms. They are applications. Build them as applications.
84
+
85
+ **Speculative extensibility ("someday someone might want to extend this").** This is the most common YAGNI violation in architecture. A team builds a plugin system for an e-commerce checkout flow because "merchants might want custom checkout steps." Two years later, no merchant has written a plugin. The team has maintained a plugin API, a loader, manifest validation, and extension point documentation for zero external consumers while paying the complexity cost on every feature they ship. Martin Fowler's articulation of YAGNI is precise: you pay the cost of carrying the abstraction (increased complexity, slower feature development, harder debugging) whether or not the speculative use case materializes. If it never materializes, the cost is pure waste.
86
+
87
+ **Plugin APIs are permanent commitments.** Once you publish a plugin API and third parties build against it, that API surface becomes load-bearing. Changing it breaks external code you do not control and cannot update. Hyrum's Law applies with maximum force: every observable behavior of your API — including bugs, timing characteristics, and undocumented side effects — will be depended upon by someone. WordPress cannot change the signature of `add_filter()` without breaking millions of plugins. VS Code maintains meticulous API stability guarantees and runs extension tests against proposed API changes. Eclipse's history is littered with painful API migrations that fractured the plugin ecosystem. Do not publish an extension API until you are confident in its design and prepared to maintain it for years.
88
+
89
+ **When feature flags solve the problem.** If the goal is to enable/disable features per customer tier, environment, or rollout stage, feature flags are simpler, more predictable, and easier to test. Feature flags operate on code that already exists in the binary. Plugins operate on code that is discovered at runtime from external sources. If all your "plugins" ship inside the main binary and are written by your team, you have feature flags wearing a plugin costume.
90
+
91
+ **When the extension surface is tiny.** If there are only two or three points where behavior might vary, define interfaces for those variation points and use configuration or DI to select implementations. A notification service that can send via email, SMS, or push does not need a plugin system — it needs a `NotificationChannel` interface with three implementations and a configuration file that lists which channels are active.
92
+
93
+ **Fewer than five anticipated extensions.** A plugin system's overhead (loader, registry, manifest schema, lifecycle management, documentation, versioning) is amortized across extensions. With fewer than five, the overhead per extension is too high. Write the five implementations directly and revisit if the number grows past ten.
94
+
95
+ ### Real-World Cautionary Examples
96
+
97
+ **Over-engineered internal tools.** A fintech company built a plugin architecture for their internal reconciliation engine, anticipating that different teams would write reconciliation plugins. After 18 months, exactly one team used it — the team that built it. The plugin manifest schema, loader, and registry added 3,000 lines of infrastructure code that was maintained by one team for one consumer. They eventually ripped it out and replaced it with a strategy pattern and a configuration file.
98
+
99
+ **Eclipse's API surface problem.** Eclipse's commitment to backward compatibility across its vast extension point surface made evolution painful. API churn across major releases (Eclipse 3.x to Eclipse 4.x) broke thousands of plugins and fractured the community. Many plugin authors abandoned maintenance rather than migrating. The lesson: a large plugin API surface is a long-term maintenance liability, not just a short-term investment.
100
+
101
+ **Never-used extension points.** A CMS product shipped 47 extension points at launch. Usage telemetry after two years showed that only 8 were ever used by third-party plugins. The remaining 39 imposed ongoing maintenance cost — every internal refactoring had to preserve their contracts — for zero external value.
102
+
103
+ ---
104
+
105
+ ## How It Works
106
+
107
+ ### Core Responsibilities
108
+
109
+ The core system in a plugin architecture has a specific, limited set of responsibilities:
110
+
111
+ 1. **Plugin discovery** — Finding available plugins via file system scanning, manifest enumeration, service loader, or registry query.
112
+ 2. **Dependency resolution** — Building a dependency graph, detecting conflicts, and determining load order.
113
+ 3. **Lifecycle management** — Loading, initializing, activating, deactivating, and unloading plugins in the correct order.
114
+ 4. **Extension point registry** — Maintaining a registry of extension points (contracts that plugins can implement) and the plugins that have registered implementations for each.
115
+ 5. **API surface** — Providing the APIs that plugins use to interact with the core and with each other. This surface must be stable, versioned, and documented.
116
+ 6. **Security boundary enforcement** — Controlling what plugins can access (file system, network, other plugins' data, core internals).
117
+ 7. **Error isolation** — Ensuring that a failing plugin does not crash the core or other plugins.
118
+
119
+ ### Plugin Contracts
120
+
121
+ A plugin contract defines what a plugin must provide and what it receives in return:
122
+
123
+ **Manifest** — A declarative description of the plugin: name, version, author, dependencies, extension points it implements, activation conditions, permissions it requires. Examples: VS Code's `package.json` with `contributes` and `activationEvents`, IntelliJ's `plugin.xml` with `<extensions>` and `<depends>`, WordPress's plugin header comment block.
124
+
125
+ **Entry point** — A known function or class that the loader calls to initialize the plugin. VS Code: `activate(context: ExtensionContext)`. Webpack: `apply(compiler: Compiler)`. WordPress: the plugin's main PHP file with hooks registered at the top level.
126
+
127
+ **Extension point implementation** — The actual code that extends the core. A VS Code language extension implements `DocumentFormattingEditProvider`. A webpack plugin taps `compiler.hooks.emit`. A WordPress plugin calls `add_filter('the_content', myTransform)`.
128
+
129
+ **Capability declaration** — What the plugin needs access to. VS Code extensions declare capabilities in `package.json` (e.g., `"capabilities": { "untrustedWorkspaces": { "supported": true } }`). Browser extensions declare permissions in their manifest. Android apps declare permissions in `AndroidManifest.xml`. This enables the security model.
130
+
131
+ ### Discovery Mechanisms
132
+
133
+ | Mechanism | How It Works | Examples |
134
+ |---|---|---|
135
+ | **File system scanning** | Core scans a known directory for plugin files/folders | WordPress scans `wp-content/plugins/`, Jest scans `node_modules` for `jest-*` packages |
136
+ | **Manifest registration** | Plugins declare themselves in a configuration file | IntelliJ's `plugin.xml`, VS Code's `package.json` with `engines.vscode` |
137
+ | **Service loader** | Language-level service discovery | Java `ServiceLoader` reads `META-INF/services/`, Python `pkg_resources.iter_entry_points()` |
138
+ | **Remote registry** | Core queries an online registry for available plugins | VS Code Marketplace API, npm registry, WordPress Plugin Directory |
139
+ | **Convention-based** | Naming conventions identify plugins | Babel plugins prefixed `babel-plugin-*`, ESLint rules prefixed `eslint-plugin-*` |
140
+ | **Explicit registration** | Plugin is registered programmatically | `app.use(myPlugin)` in Express/Fastify, `Vue.use(plugin)` |
141
+
142
+ ### Loading and Isolation Models
143
+
144
+ **Same-process, no isolation** — The simplest model. Plugins run in the same process and address space as the core. WordPress, Express middleware, Babel plugins, and ESLint rules all use this model. The advantage is zero overhead for plugin-to-core communication. The disadvantage is that a crashing plugin crashes the host, and a malicious plugin has full access to the process.
145
+
146
+ **Separate process** — Plugins run in a child process or worker. VS Code runs extensions in a separate Node.js "Extension Host" process. The core communicates with extensions via JSON-RPC over IPC. This provides crash isolation (a failing extension does not crash the editor) and security isolation (extensions cannot access the editor's DOM). The cost is serialization overhead for every API call.
147
+
148
+ **Sandboxed execution** — Plugins run in a sandbox with restricted capabilities. Browser extensions run in content scripts with limited DOM access and background scripts with limited API access. Figma plugins run in a sandboxed iframe with a postMessage bridge. Envoy Proxy runs extensions as WebAssembly modules with resource constraints. Deno plugins run with explicit permission grants. This provides strong security guarantees at the cost of API design complexity.
149
+
150
+ **Container/VM isolation** — The strongest isolation model. Jenkins runs certain plugins in Docker containers. GitHub Actions runs each action in a container. Kubernetes operators run as separate pods. This enables language-agnostic plugins but introduces significant latency and resource overhead.
151
+
152
+ ### Inter-Plugin Communication
153
+
154
+ Plugins often need to interact with each other. The core mediates this through:
155
+
156
+ **Extension points declared by plugins** — IntelliJ allows plugins to declare their own extension points that other plugins implement. Plugin A defines an extension point; Plugin B implements it. The platform manages the wiring.
157
+
158
+ **Event bus / pub-sub** — Plugins emit and listen for events on a shared bus. VS Code's `EventEmitter` pattern, WordPress's action/filter hooks, and webpack's Tapable hooks all serve this purpose. The core acts as the message broker.
159
+
160
+ **Service registry** — Plugins register services that other plugins can look up. OSGi's service registry, IntelliJ's service locator (`ServiceManager.getService()`), and Eclipse's extension registry all provide this. The core owns the registry and controls visibility.
161
+
162
+ **Shared context object** — The core provides a context or workspace object that plugins read from and write to. VS Code's `ExtensionContext`, webpack's `Compilation` object, and Koa's `ctx` object all serve as shared state containers with defined access patterns.
163
+
164
+ ### Versioning and Compatibility
165
+
166
+ **Semantic versioning of the host API** — The host declares its API version. Plugins declare the range of host versions they support. VS Code extensions declare `"engines": { "vscode": "^1.74.0" }`. IntelliJ plugins declare `<idea-version since-build="223" until-build="232.*"/>`. The loader rejects plugins whose version constraints are not satisfied.
167
+
168
+ **API deprecation policy** — Mature plugin systems establish formal deprecation timelines: announce deprecation in version N, emit warnings in version N+1, remove in version N+2. VS Code marks APIs as `@deprecated` with migration guidance. JetBrains uses `@ApiStatus.ScheduledForRemoval(inVersion = "2024.2")`.
169
+
170
+ **Extension API vs. internal API** — A critical distinction. The extension API is the stable, public surface that plugins build against. Internal APIs are implementation details that can change freely. VS Code enforces this with a separate `vscode.d.ts` type definition file that includes only the public API. IntelliJ uses `@ApiStatus.Internal` annotations. Webpack distinguishes between documented hooks and internal implementation.
171
+
172
+ ### Security Model
173
+
174
+ **Permission system** — Plugins declare what they need (file system access, network access, clipboard, notifications). The host grants or denies based on policy. Browser extensions use a manifest-declared permission model. VS Code extensions declare capabilities. Mobile app stores enforce permission review.
175
+
176
+ **API surface restriction** — Plugins only see the APIs explicitly provided to them. VS Code passes a curated `vscode` namespace to extensions, not the entire Node.js API. Figma plugins receive a restricted `figma` API object, not browser globals. This is enforced architecturally, not by convention.
177
+
178
+ **Code review / marketplace review** — Human or automated review before publication. The VS Code Marketplace scans extensions for known vulnerability patterns. WordPress.org reviews all submitted plugins. Apple's App Store review process examines permissions usage. This is a social/process control, not a technical one.
179
+
180
+ **Runtime sandboxing** — Process isolation, WebAssembly sandboxing, iframe sandboxing, or capability-based security restricts what plugin code can do at runtime regardless of what it tries. This is the strongest technical control.
181
+
182
+ ---
183
+
184
+ ## Trade-Offs Matrix
185
+
186
+ | Dimension | Benefit | Cost |
187
+ |---|---|---|
188
+ | **Extensibility** | Third parties can add capabilities the core team never anticipated. VS Code's 60,000+ extensions cover use cases Microsoft could never staff. | The plugin API becomes a permanent public contract. Every change risks breaking external code. API design errors are costly to fix. |
189
+ | **Modularity** | Features are isolated in self-contained units with explicit boundaries. Adding or removing a feature is a plugin install/uninstall. | Debugging crosses plugin boundaries. Stack traces span the core, the loader, and the plugin. Error messages from deep in the plugin system are often opaque. |
190
+ | **Core stability** | The core changes less frequently because features live in plugins. Core releases can focus on infrastructure improvements. | Plugin authors must track core API changes. A major core version bump can orphan hundreds of plugins (Eclipse 3.x to 4.x). |
191
+ | **Independent deployment** | Plugins ship on their own schedule. A plugin author can fix a bug and release without waiting for a core release cycle. | Version matrix explosion. N core versions times M plugin versions creates N*M compatibility combinations to reason about. |
192
+ | **Community leverage** | A plugin ecosystem multiplies the core team's output by orders of magnitude. WordPress's 60,000 plugins represent millions of developer-hours the core team did not spend. | Quality variance is extreme. Plugin marketplaces contain abandoned, insecure, incompatible, and poorly written plugins. Curation, review, and rating systems are necessary but imperfect. |
193
+ | **Runtime flexibility** | Plugins can be loaded, unloaded, and updated at runtime without restarting the host. OSGi bundles support hot-swapping. | Hot-loading introduces state management complexity. What happens to in-flight requests when a plugin is unloaded? What about cached references to plugin-provided services? |
194
+ | **Security isolation** | Process/sandbox isolation means a compromised plugin cannot access the core's memory or other plugins' data. | Isolation mechanisms add latency (IPC serialization), memory overhead (per-plugin process/sandbox), and API design constraints (everything must be serializable). |
195
+ | **Performance** | Lazy loading means unused plugins consume zero resources. VS Code only activates extensions when their activation events fire. | Plugin boundaries prevent certain optimizations. Data must cross serialization boundaries. Hot paths through multiple plugins accumulate overhead. |
196
+ | **Testability** | Plugins can be tested in isolation against a mock core. The core can be tested without any plugins loaded. | Integration testing is harder. The combinatorial space of plugin interactions is large. Plugin A works alone, Plugin B works alone, but A+B together exhibit emergent bugs. |
197
+ | **Adoption and ecosystem** | A healthy plugin ecosystem is a powerful moat. Developers choose VS Code partly because of its extension ecosystem. | Bootstrap problem: no users without plugins, no plugin authors without users. Seeding the ecosystem requires the core team to write the first wave of plugins. |
198
+
199
+ ---
200
+
201
+ ## Evolution Path
202
+
203
+ Most plugin architectures evolve through a predictable sequence of stages. Jumping to the end is almost always a mistake.
204
+
205
+ ### Stage 1: Hardcoded Features
206
+
207
+ All features live in the core codebase. There is no extension mechanism. This is correct for early-stage products. Ship features, validate the product, learn what the actual variation points are.
208
+
209
+ **When to move on:** You find yourself adding `if/else` or `switch` statements for every new variation of the same concept. Or external developers are forking your project to add features you cannot accept into core.
210
+
211
+ ### Stage 2: Identify the Stable Core
212
+
213
+ Analyze your codebase to determine what changes frequently and what remains stable. The stable parts become the core. The frequently-changing parts become plugin candidates. This analysis requires real usage data, not speculation.
214
+
215
+ Common stable cores: text editor engine (VS Code), content management and rendering pipeline (WordPress), compilation pipeline stages (webpack), code model and PSI tree (IntelliJ).
216
+
217
+ Common plugin candidates: language-specific features, theme/appearance, integrations with external services, output format variations, custom rules/checks.
218
+
219
+ ### Stage 3: Extract Interfaces at Variation Points
220
+
221
+ Define interfaces (ports, contracts, extension points) at the boundaries between the stable core and the variable features. These interfaces become the plugin API. Start with a small number of high-value extension points — three to five — rather than trying to make everything extensible.
222
+
223
+ **Critical decision:** The interface design at this stage determines the long-term extensibility surface. Invest time in getting the abstractions right. Study how existing plugins in your domain (competitors, similar tools) define their extension contracts.
224
+
225
+ ### Stage 4: Build the Plugin Loader
226
+
227
+ Implement the minimal infrastructure: a discovery mechanism (scan a directory), a loader (import the module), a registry (track what is loaded), and lifecycle hooks (init/destroy). Resist the urge to build a sophisticated plugin framework. Start with the simplest thing that works.
228
+
229
+ A minimal plugin loader in most languages is 50-200 lines of code. If your loader is 2,000 lines before you have your first plugin, you are over-engineering.
230
+
231
+ ### Stage 5: Migrate Internal Features to Plugins
232
+
233
+ Move your own features from hardcoded core code to the plugin model. This is the critical validation step. If your own features are painful to implement as plugins, third-party developers will find it impossible. VS Code's built-in language features (TypeScript, JSON, Markdown) are implemented as built-in extensions using the same API available to third parties. This "eat your own dog food" approach ensures API quality.
234
+
235
+ ### Stage 6: Document and Open the API
236
+
237
+ Write comprehensive documentation: getting started guide, API reference, example plugins, migration guides. Establish versioning policy, deprecation timelines, and contribution guidelines. Set up a plugin template/scaffold (VS Code's Yeoman generator, IntelliJ's Plugin DevKit).
238
+
239
+ **Only open the API when you are confident in its stability.** Every extension point you publish is a commitment. It is easier to add extension points later than to remove or change existing ones.
240
+
241
+ ### Stage 7: Build the Ecosystem
242
+
243
+ Create a marketplace or registry. Establish review processes. Build tooling for plugin developers (debugging, testing, packaging). Foster a community. This stage is ongoing and requires sustained investment.
244
+
245
+ ---
246
+
247
+ ## Failure Modes
248
+
249
+ ### API Churn
250
+
251
+ **The problem:** The core team changes the plugin API frequently, breaking existing plugins with each release. Plugin authors spend more time adapting to API changes than building features. The ecosystem stagnates as authors abandon plugins rather than migrating.
252
+
253
+ **Real example:** Eclipse's transition from 3.x to 4.x (the "e4" platform) introduced a new dependency injection-based programming model that was incompatible with the existing extension point model. Thousands of plugins required significant rewriting. Many were never updated. The ecosystem fragmented.
254
+
255
+ **Prevention:** Establish a formal API stability policy before publishing any extension point. Use semantic versioning rigorously. Provide automated migration tools (codemods) for breaking changes. Maintain a compatibility layer for at least one major version cycle. Run the full suite of popular plugins against proposed API changes before releasing them.
256
+
257
+ ### Security Vulnerabilities
258
+
259
+ **The problem:** Plugins run with the same privileges as the core or have insufficient sandboxing. A malicious or compromised plugin can steal credentials, exfiltrate data, or compromise the host system.
260
+
261
+ **Real examples:** WordPress plugin vulnerabilities are a leading cause of website compromises — a 2023 study found that vulnerable plugins were responsible for the majority of WordPress security incidents. Browser extension malware has affected millions of users through permission abuse, with extensions requesting broad permissions (access to all websites) then injecting ads, tracking users, or stealing credentials. npm supply chain attacks (event-stream, ua-parser-js) compromised packages that were used as plugins/dependencies by thousands of projects.
262
+
263
+ **Prevention:** Implement least-privilege permission models. Run plugins in sandboxed processes. Review plugins before marketplace publication. Implement runtime monitoring for suspicious behavior. Provide users with clear permission prompts. Use capability-based security where the plugin only receives references to resources it needs.
264
+
265
+ ### Load Order Dependencies
266
+
267
+ **The problem:** Plugins assume other plugins are loaded first. Plugin A registers a service; Plugin B depends on that service during initialization. If B loads before A, B crashes. This creates fragile, order-dependent startup sequences.
268
+
269
+ **Real example:** WordPress plugins load in alphabetical order by directory name. Developers have resorted to naming their plugin directories with leading underscores or numbers to ensure early loading. Some plugins check for the existence of other plugins in their init hooks and retry on failure, creating timing-sensitive initialization races.
270
+
271
+ **Prevention:** Use a dependency graph with topological sort for load ordering. Require plugins to declare their dependencies explicitly in their manifest. Defer service consumption to lazy resolution (look up the service when first needed, not at init time). Provide lifecycle phases where all plugins are loaded before any plugin is initialized.
272
+
273
+ ### Memory Leaks and Resource Exhaustion
274
+
275
+ **The problem:** Plugins allocate resources (event listeners, timers, file handles, DOM nodes, WebSocket connections) during activation but fail to release them during deactivation. Over time, repeated plugin activate/deactivate cycles leak resources.
276
+
277
+ **Real example:** VS Code extensions that register `onDidChangeTextDocument` listeners without disposing them cause memory leaks that grow with each file opened. The VS Code team introduced the `ExtensionContext.subscriptions` array specifically to address this: extensions push disposables into this array, and the platform disposes them all when the extension deactivates.
278
+
279
+ **Prevention:** Provide a disposable/cleanup pattern (VS Code's `Disposable`, React's cleanup functions in `useEffect`). Track all resources registered by each plugin and forcibly clean them up on deactivation. Implement memory budgets per plugin. Monitor resource usage and warn or disable plugins that exceed thresholds.
280
+
281
+ ### Version Conflicts (Dependency Hell)
282
+
283
+ **The problem:** Two plugins depend on different, incompatible versions of the same library. Plugin A needs `lodash@3` and Plugin B needs `lodash@4`. In a shared-process model, only one version can be loaded.
284
+
285
+ **Real example:** OSGi struggled with this extensively. Java's original class loading model assumed global visibility, and many popular libraries used static singletons, `Thread.currentThread().getContextClassLoader()`, and other patterns that break under modular class loading. OSGi's per-bundle classloader solved the technical problem but introduced "class loading hell" — the same class loaded by two different classloaders is treated as two different types by the JVM.
286
+
287
+ **Prevention:** Provide per-plugin dependency isolation (separate node_modules, per-bundle classloaders, WebAssembly module instances). In ecosystems where full isolation is too expensive, establish conventions: the host provides common dependencies (peer dependencies in npm), and plugins must use the host-provided versions. Document which libraries are available from the host and which versions are guaranteed.
288
+
289
+ ### Plugin Interaction Bugs
290
+
291
+ **The problem:** Plugins work correctly in isolation but exhibit bugs when loaded together. Plugin A modifies shared state that Plugin B relies on. Plugin A's filter transforms data in a way that Plugin B's filter does not expect.
292
+
293
+ **Real example:** WordPress's filter pipeline allows multiple plugins to modify the same content. A security plugin that sanitizes HTML and a formatting plugin that adds HTML classes can interfere with each other depending on their priority ordering. These bugs are hard to reproduce because they depend on the exact combination of installed plugins.
294
+
295
+ **Prevention:** Minimize shared mutable state. Use immutable data structures in plugin pipelines. Provide typed hook signatures (webpack's Tapable) that constrain what plugins can return. Build combinatorial testing infrastructure that tests popular plugin combinations.
296
+
297
+ ### Ecosystem Fragmentation
298
+
299
+ **The problem:** Multiple competing plugin APIs emerge for the same host. Or a major version bump creates an ecosystem split between old-API and new-API plugins.
300
+
301
+ **Real example:** The Vim plugin ecosystem fragmented across multiple plugin managers (Vundle, Pathogen, vim-plug, dein.vim) with slightly different conventions. The Python packaging ecosystem has struggled with competing plugin mechanisms (`setuptools` entry points, namespace packages, `importlib.metadata`). Each mechanism has different discovery, loading, and compatibility characteristics.
302
+
303
+ **Prevention:** Establish one canonical plugin mechanism early. Invest in backward compatibility. When breaking changes are unavoidable, provide a compatibility shim that allows old plugins to run on the new API with deprecation warnings.
304
+
305
+ ---
306
+
307
+ ## Technology Landscape
308
+
309
+ ### JavaScript / TypeScript
310
+
311
+ **VS Code Extension API** — The gold standard for desktop application plugin architecture. Extensions are npm packages with a `package.json` manifest declaring `contributes` (contribution points for commands, views, languages, themes) and `activationEvents` (lazy loading triggers). Extensions run in a separate Extension Host process, communicating with the main process via JSON-RPC. The `vscode` module provides a typed API (`vscode.d.ts`) that is stable across releases. Extension development uses Yeoman scaffolding, `vsce` for packaging, and the Extension Development Host for debugging.
312
+
313
+ **Webpack Plugins** — Built on the Tapable library. Plugins are classes with an `apply(compiler)` method. They tap into typed hooks on `Compiler` and `Compilation` objects. Hook types (Sync, AsyncSeries, AsyncParallel, Bail, Waterfall, Loop) encode execution semantics, preventing misuse. The compiler hook pipeline covers the entire build lifecycle: `environment` → `afterEnvironment` → `entryOption` → `afterPlugins` → `compile` → `thisCompilation` → `compilation` → `make` → `afterCompile` → `emit` → `afterEmit` → `done`.
314
+
315
+ **Babel Plugins** — Visitor-pattern plugins that traverse and transform the AST. A plugin exports a function that receives a `babel` API object and returns a visitor object mapping AST node types to enter/exit handlers. Plugins compose in a pipeline: each plugin's output AST is the next plugin's input. Presets are ordered collections of plugins. The visitor pattern constrains what plugins can do — they transform AST nodes — making the system predictable but limiting extensibility to AST transformations.
316
+
317
+ **ESLint Rules** — Each rule is a plugin that exports a `create(context)` function returning a visitor. The `context` object provides `report()` for flagging violations, `getSourceCode()` for reading the AST, and `getFilename()` for context. Rules are pure functions from AST to reports, making them easy to test and compose.
318
+
319
+ **Rollup/Vite Plugins** — Rollup plugins implement a hooks-based interface with methods like `resolveId`, `load`, `transform`, `renderChunk`, and `generateBundle`. Vite extends this with additional hooks for dev server functionality. The hook interface is simpler than Webpack's Tapable system, trading flexibility for ease of authorship.
320
+
321
+ ### Java
322
+
323
+ **OSGi (Open Service Gateway Initiative)** — The most comprehensive plugin framework in the Java ecosystem. Bundles (plugins) are JARs with a `MANIFEST.MF` declaring exported packages, imported packages, required bundles, and service registrations. The OSGi container manages per-bundle classloaders, service registry, lifecycle (INSTALLED → RESOLVED → STARTING → ACTIVE → STOPPING → UNINSTALLED), and hot-swapping. Used by Eclipse IDE, Apache Felix, Apache Karaf, and many enterprise middleware platforms. The learning curve is steep, and non-modular libraries that assume global classloader visibility are a persistent source of pain.
324
+
325
+ **Java ServiceLoader** — A lightweight, built-in plugin mechanism since Java 6. Implementations of a service interface are listed in `META-INF/services/com.example.MyService`. `ServiceLoader.load(MyService.class)` discovers and instantiates them. Simple and zero-dependency, but provides no lifecycle management, dependency resolution, or isolation. Suitable for small extension points (JDBC drivers, charset providers) but insufficient for complex plugin systems.
326
+
327
+ **Spring Plugin (formerly Hera)** — Provides plugin discovery and ordering on top of Spring's DI container. Plugins implement a marker interface and are discovered via classpath scanning. Useful when the host is already a Spring application.
328
+
329
+ ### .NET
330
+
331
+ **Managed Extensibility Framework (MEF)** — Built into .NET Framework and .NET Core. Uses attributes (`[Export]`, `[Import]`, `[ImportMany]`) to declare and consume extension points. Catalogs scan assemblies for exports. Supports lazy loading, metadata filtering, and recomposition. Used by Visual Studio's extension system.
332
+
333
+ **System.Composition** — The lightweight successor to MEF in .NET Core. Same attribute-based model but with a smaller footprint and convention-based composition.
334
+
335
+ ### Python
336
+
337
+ **setuptools entry_points** — The standard Python plugin mechanism. Packages declare entry points in `setup.cfg` or `pyproject.toml` under `[options.entry_points]`. The host discovers plugins via `importlib.metadata.entry_points(group='myapp.plugins')`. Used by pytest (plugins discovered via `pytest11` entry point group), tox, flake8, and many CLI tools.
338
+
339
+ **pluggy** — The plugin framework used by pytest. Provides a hook specification/implementation model with `@hookspec` and `@hookimpl` decorators. Supports `firstresult` (bail) hooks, `tryfirst`/`trylast` ordering, and wrapper hooks. More structured than raw entry points.
340
+
341
+ ### Go
342
+
343
+ **hashicorp/go-plugin** — Uses gRPC over a local socket to communicate between the host and plugin processes. Plugins are compiled as separate binaries. The host launches the plugin binary as a subprocess and communicates via a typed gRPC interface. Used by Terraform (providers are go-plugin processes), Vault, Consul, Packer, and Nomad. Provides strong process isolation and language-agnostic plugins (any language that speaks gRPC can be a plugin) at the cost of startup latency and serialization overhead.
344
+
345
+ ### Cross-Language
346
+
347
+ **WebAssembly (Wasm)** — Emerging as a universal plugin format. Plugins compile to Wasm modules and run in a sandboxed VM (Wasmtime, Wasmer, V8). The host defines imports (functions the plugin can call) and exports (functions the host calls). Memory is isolated. CPU and memory limits are enforceable. Language-agnostic: plugins can be written in Rust, C, C++, Go, AssemblyScript, or any language targeting Wasm. Used by Envoy Proxy, Zellij terminal multiplexer, Fermyon Spin, and Extism. The tooling is maturing rapidly.
348
+
349
+ **gRPC-based plugin protocols** — Similar to HashiCorp's go-plugin model. The host and plugin communicate via gRPC over a local socket or stdio. Language-agnostic but requires gRPC tooling for each target language. Suitable when strong isolation and multi-language support are requirements.
350
+
351
+ ---
352
+
353
+ ## Decision Tree
354
+
355
+ Use this decision tree to determine whether plugin architecture is appropriate:
356
+
357
+ ```
358
+ Is a third-party ecosystem a product requirement?
359
+ ├─ YES → Plugin architecture is likely correct.
360
+ │ Define extension points carefully.
361
+ │ Budget for ecosystem tooling and documentation.
362
+
363
+ └─ NO → Is runtime extensibility required (load new code without restart)?
364
+ ├─ YES → Plugin architecture may be appropriate.
365
+ │ Consider lighter alternatives first:
366
+ │ - Dynamic imports with a convention
367
+ │ - Script evaluation in a sandbox
368
+ │ - Configuration-driven behavior
369
+
370
+ └─ NO → Do features need to be independently deployable by different teams?
371
+ ├─ YES → Consider microservices or modular monolith first.
372
+ │ Plugin architecture within a monolith is unusual
373
+ │ for this use case.
374
+
375
+ └─ NO → Do you need to enable/disable features per customer or tier?
376
+ ├─ YES → Feature flags are almost certainly simpler.
377
+ │ Use plugin architecture only if:
378
+ │ - Features are large (> 5K LOC each)
379
+ │ - Features have independent dependencies
380
+ │ - Features must be deployable by non-core teams
381
+
382
+ └─ NO → Is the extensibility "just in case" or "someday"?
383
+ ├─ YES → Do NOT build a plugin system.
384
+ │ Apply YAGNI. Use well-structured
385
+ │ modules with interfaces at known
386
+ │ variation points. Revisit when a
387
+ │ concrete need materializes.
388
+
389
+ └─ NO → Internal app with < 5 variation points?
390
+ ├─ YES → Strategy pattern + config.
391
+ │ No plugin infrastructure needed.
392
+
393
+ └─ NO → Evaluate case-by-case.
394
+ Consider modular monolith or
395
+ hexagonal architecture first.
396
+ ```
397
+
398
+ ---
399
+
400
+ ## Implementation Sketch
401
+
402
+ ### Plugin Interface (TypeScript)
403
+
404
+ ```typescript
405
+ /**
406
+ * Every plugin must implement this interface.
407
+ * The host calls these methods in lifecycle order.
408
+ */
409
+ interface Plugin {
410
+ /** Unique identifier, e.g., "com.example.my-plugin" */
411
+ readonly id: string;
412
+
413
+ /** Semver version string */
414
+ readonly version: string;
415
+
416
+ /**
417
+ * Called once when the plugin is loaded.
418
+ * Receives a context object with the host's API surface.
419
+ * Register contributions (commands, handlers, providers) here.
420
+ * Return a disposable or cleanup function.
421
+ */
422
+ activate(context: PluginContext): Promise<Disposable | void>;
423
+
424
+ /**
425
+ * Called when the plugin is being unloaded.
426
+ * Release all resources: close connections, cancel timers,
427
+ * remove event listeners.
428
+ */
429
+ deactivate?(): Promise<void>;
430
+ }
431
+
432
+ interface PluginContext {
433
+ /** Subscribe to host events */
434
+ readonly events: EventBus;
435
+
436
+ /** Register commands that users or other plugins can invoke */
437
+ registerCommand(id: string, handler: CommandHandler): Disposable;
438
+
439
+ /** Register a provider for an extension point */
440
+ registerProvider<T>(extensionPoint: string, provider: T): Disposable;
441
+
442
+ /** Plugin-scoped storage */
443
+ readonly storage: PluginStorage;
444
+
445
+ /** Logger scoped to this plugin */
446
+ readonly logger: Logger;
447
+
448
+ /** Subscriptions array — all disposables here are cleaned up on deactivate */
449
+ readonly subscriptions: Disposable[];
450
+ }
451
+
452
+ interface Disposable {
453
+ dispose(): void;
454
+ }
455
+ ```
456
+
457
+ ### Plugin Manifest
458
+
459
+ ```json
460
+ {
461
+ "id": "com.example.markdown-preview",
462
+ "name": "Markdown Preview",
463
+ "version": "1.2.0",
464
+ "description": "Live preview for Markdown files",
465
+ "author": "Example Corp",
466
+ "license": "MIT",
467
+ "main": "./dist/index.js",
468
+ "engines": {
469
+ "host": ">=2.0.0 <4.0.0"
470
+ },
471
+ "dependencies": {
472
+ "com.example.file-watcher": "^1.0.0"
473
+ },
474
+ "activationEvents": [
475
+ "onFileType:markdown",
476
+ "onCommand:markdown.preview"
477
+ ],
478
+ "contributes": {
479
+ "commands": [
480
+ {
481
+ "id": "markdown.preview",
482
+ "title": "Open Markdown Preview"
483
+ }
484
+ ]
485
+ },
486
+ "permissions": [
487
+ "filesystem:read",
488
+ "webview:create"
489
+ ]
490
+ }
491
+ ```
492
+
493
+ ### Plugin Loader
494
+
495
+ ```typescript
496
+ import { readdir, readFile } from 'fs/promises';
497
+ import { join, resolve } from 'path';
498
+
499
+ interface LoadedPlugin {
500
+ manifest: PluginManifest;
501
+ instance: Plugin;
502
+ disposables: Disposable[];
503
+ state: 'discovered' | 'resolved' | 'active' | 'failed';
504
+ }
505
+
506
+ class PluginLoader {
507
+ private plugins = new Map<string, LoadedPlugin>();
508
+ private extensionPoints = new Map<string, Set<unknown>>();
509
+
510
+ constructor(
511
+ private pluginDir: string,
512
+ private hostVersion: string,
513
+ ) {}
514
+
515
+ /**
516
+ * Phase 1: Discover — scan plugin directory for manifests
517
+ */
518
+ async discover(): Promise<PluginManifest[]> {
519
+ const entries = await readdir(this.pluginDir, { withFileTypes: true });
520
+ const manifests: PluginManifest[] = [];
521
+
522
+ for (const entry of entries) {
523
+ if (!entry.isDirectory()) continue;
524
+ const manifestPath = join(this.pluginDir, entry.name, 'manifest.json');
525
+ try {
526
+ const raw = await readFile(manifestPath, 'utf-8');
527
+ const manifest = JSON.parse(raw) as PluginManifest;
528
+ manifests.push(manifest);
529
+ this.plugins.set(manifest.id, {
530
+ manifest,
531
+ instance: null!,
532
+ disposables: [],
533
+ state: 'discovered',
534
+ });
535
+ } catch {
536
+ // Skip directories without valid manifests
537
+ }
538
+ }
539
+ return manifests;
540
+ }
541
+
542
+ /**
543
+ * Phase 2: Resolve — check version constraints and dependency graph
544
+ */
545
+ resolve(): string[] {
546
+ const errors: string[] = [];
547
+
548
+ for (const [id, plugin] of this.plugins) {
549
+ // Check host version compatibility
550
+ if (!satisfiesVersion(this.hostVersion, plugin.manifest.engines.host)) {
551
+ errors.push(
552
+ `${id}: requires host ${plugin.manifest.engines.host}, ` +
553
+ `have ${this.hostVersion}`
554
+ );
555
+ plugin.state = 'failed';
556
+ continue;
557
+ }
558
+
559
+ // Check plugin dependencies
560
+ for (const [depId, depRange] of
561
+ Object.entries(plugin.manifest.dependencies ?? {})) {
562
+ const dep = this.plugins.get(depId);
563
+ if (!dep) {
564
+ errors.push(`${id}: missing dependency ${depId}`);
565
+ plugin.state = 'failed';
566
+ } else if (!satisfiesVersion(dep.manifest.version, depRange)) {
567
+ errors.push(
568
+ `${id}: needs ${depId}@${depRange}, ` +
569
+ `have ${dep.manifest.version}`
570
+ );
571
+ plugin.state = 'failed';
572
+ }
573
+ }
574
+
575
+ if (plugin.state !== 'failed') {
576
+ plugin.state = 'resolved';
577
+ }
578
+ }
579
+ return errors;
580
+ }
581
+
582
+ /**
583
+ * Phase 3: Activate — load code and call activate() in dependency order
584
+ */
585
+ async activateAll(): Promise<void> {
586
+ const order = this.topologicalSort();
587
+
588
+ for (const id of order) {
589
+ const plugin = this.plugins.get(id)!;
590
+ if (plugin.state !== 'resolved') continue;
591
+
592
+ try {
593
+ const modulePath = resolve(
594
+ this.pluginDir, id, plugin.manifest.main
595
+ );
596
+ const mod = await import(modulePath);
597
+ plugin.instance = mod.default ?? mod;
598
+
599
+ const context = this.createContext(id);
600
+ const disposable = await plugin.instance.activate(context);
601
+ if (disposable) {
602
+ plugin.disposables.push(disposable);
603
+ }
604
+ plugin.disposables.push(...context.subscriptions);
605
+ plugin.state = 'active';
606
+ } catch (err) {
607
+ plugin.state = 'failed';
608
+ console.error(`Failed to activate plugin ${id}:`, err);
609
+ }
610
+ }
611
+ }
612
+
613
+ /**
614
+ * Deactivate a single plugin — cleanup resources
615
+ */
616
+ async deactivate(id: string): Promise<void> {
617
+ const plugin = this.plugins.get(id);
618
+ if (!plugin || plugin.state !== 'active') return;
619
+
620
+ try {
621
+ await plugin.instance.deactivate?.();
622
+ } finally {
623
+ // Always dispose resources, even if deactivate() throws
624
+ for (const d of plugin.disposables) {
625
+ try { d.dispose(); } catch { /* swallow */ }
626
+ }
627
+ plugin.disposables = [];
628
+ plugin.state = 'resolved';
629
+ }
630
+ }
631
+
632
+ private createContext(pluginId: string): PluginContext {
633
+ const subscriptions: Disposable[] = [];
634
+ return {
635
+ events: this.createScopedEventBus(pluginId),
636
+ registerCommand: (cmdId, handler) => {
637
+ return this.registerCommand(`${pluginId}.${cmdId}`, handler);
638
+ },
639
+ registerProvider: (ep, provider) => {
640
+ if (!this.extensionPoints.has(ep)) {
641
+ this.extensionPoints.set(ep, new Set());
642
+ }
643
+ this.extensionPoints.get(ep)!.add(provider);
644
+ return {
645
+ dispose: () => this.extensionPoints.get(ep)?.delete(provider),
646
+ };
647
+ },
648
+ storage: this.createPluginStorage(pluginId),
649
+ logger: this.createScopedLogger(pluginId),
650
+ subscriptions,
651
+ };
652
+ }
653
+
654
+ private topologicalSort(): string[] {
655
+ // Standard topological sort on dependency graph
656
+ const visited = new Set<string>();
657
+ const result: string[] = [];
658
+
659
+ const visit = (id: string) => {
660
+ if (visited.has(id)) return;
661
+ visited.add(id);
662
+ const plugin = this.plugins.get(id);
663
+ if (!plugin) return;
664
+ for (const depId of Object.keys(plugin.manifest.dependencies ?? {})) {
665
+ visit(depId);
666
+ }
667
+ result.push(id);
668
+ };
669
+
670
+ for (const id of this.plugins.keys()) visit(id);
671
+ return result;
672
+ }
673
+
674
+ // Stub methods — implementations depend on host application
675
+ private createScopedEventBus(pluginId: string): EventBus { /* ... */ }
676
+ private registerCommand(id: string, handler: CommandHandler): Disposable { /* ... */ }
677
+ private createPluginStorage(pluginId: string): PluginStorage { /* ... */ }
678
+ private createScopedLogger(pluginId: string): Logger { /* ... */ }
679
+ }
680
+ ```
681
+
682
+ ### Example Plugin
683
+
684
+ ```typescript
685
+ import type { Plugin, PluginContext, Disposable } from '@host/plugin-api';
686
+
687
+ const markdownPreview: Plugin = {
688
+ id: 'com.example.markdown-preview',
689
+ version: '1.2.0',
690
+
691
+ async activate(context: PluginContext): Promise<void> {
692
+ // Register a command
693
+ context.subscriptions.push(
694
+ context.registerCommand('preview', async (args) => {
695
+ const content = await args.document.getText();
696
+ const html = renderMarkdown(content);
697
+ await context.events.emit('webview:create', {
698
+ title: 'Markdown Preview',
699
+ html,
700
+ });
701
+ })
702
+ );
703
+
704
+ // Listen for file changes to update preview
705
+ context.subscriptions.push(
706
+ context.events.on('document:change', async (event) => {
707
+ if (event.languageId !== 'markdown') return;
708
+ const html = renderMarkdown(event.document.getText());
709
+ await context.events.emit('webview:update', { html });
710
+ })
711
+ );
712
+
713
+ context.logger.info('Markdown Preview activated');
714
+ },
715
+
716
+ async deactivate(): Promise<void> {
717
+ // subscriptions are auto-disposed by the host
718
+ // only manual cleanup needed here (e.g., close network connections)
719
+ },
720
+ };
721
+
722
+ export default markdownPreview;
723
+ ```
724
+
725
+ ---
726
+
727
+ ## Cross-References
728
+
729
+ - **[hexagonal-clean-architecture](./hexagonal-clean-architecture.md)** — Plugin architecture and hexagonal architecture are complementary. The core of a plugin system often uses hexagonal architecture internally, with plugins acting as adapters that plug into ports (extension points). The Dependency Rule applies: plugins depend on the core's API, never the reverse.
730
+
731
+ - **[microservices](../../microservices.md)** — Microservices decompose across network boundaries; plugins decompose within a single application boundary. Choose microservices when teams need independent deployment and technology heterogeneity. Choose plugins when extensions must integrate tightly with a host application's UI, data model, or runtime.
732
+
733
+ - **[feature-flags-and-rollouts](../../../design/feature-flags-and-rollouts.md)** — Feature flags toggle existing code; plugins add new code. For internal feature variation, feature flags are almost always simpler. For external extensibility, plugins are necessary. The two can coexist: a plugin system might use feature flags to gate experimental extension points.
734
+
735
+ - **[coupling-and-cohesion](../../../design/coupling-and-cohesion.md)** — Plugin architecture achieves low coupling between the core and extensions through interface contracts and lifecycle isolation. High cohesion within each plugin (a plugin does one thing well) is a design goal. The plugin API surface is the coupling boundary — wider APIs create tighter coupling between core and plugins.