aiox-core 5.0.2 → 5.0.4

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 (667) hide show
  1. package/.aiox-core/core/execution/predictive-pipeline.js +1283 -0
  2. package/.aiox-core/core/memory/decision-memory.js +564 -0
  3. package/.aiox-core/data/entity-registry.yaml +1068 -1043
  4. package/.aiox-core/data/registry-update-log.jsonl +2 -2
  5. package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
  6. package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
  7. package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
  8. package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
  9. package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
  10. package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
  11. package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
  12. package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
  13. package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
  14. package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
  15. package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
  16. package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
  17. package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
  18. package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
  19. package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
  20. package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
  21. package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
  22. package/.aiox-core/install-manifest.yaml +63 -55
  23. package/.aiox-core/local-config.yaml.template +71 -71
  24. package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
  25. package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
  26. package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
  27. package/.aiox-core/monitor/hooks/notification.py +29 -29
  28. package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
  29. package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
  30. package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
  31. package/.aiox-core/monitor/hooks/stop.py +29 -29
  32. package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
  33. package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
  34. package/.aiox-core/product/templates/adr.hbs +125 -125
  35. package/.aiox-core/product/templates/dbdr.hbs +241 -241
  36. package/.aiox-core/product/templates/epic.hbs +212 -212
  37. package/.aiox-core/product/templates/pmdr.hbs +186 -186
  38. package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
  39. package/.aiox-core/product/templates/prd.hbs +201 -201
  40. package/.aiox-core/product/templates/story.hbs +263 -263
  41. package/.aiox-core/product/templates/task.hbs +170 -170
  42. package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
  43. package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
  44. package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
  45. package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
  46. package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
  47. package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
  48. package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
  49. package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
  50. package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
  51. package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
  52. package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
  53. package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
  54. package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
  55. package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
  56. package/.aiox-core/product/templates/tmpl-view.sql +177 -177
  57. package/.aiox-core/scripts/pm.sh +0 -0
  58. package/.claude/hooks/enforce-architecture-first.py +196 -196
  59. package/.claude/hooks/mind-clone-governance.py +192 -192
  60. package/.claude/hooks/read-protection.py +151 -151
  61. package/.claude/hooks/slug-validation.py +176 -176
  62. package/.claude/hooks/sql-governance.py +182 -182
  63. package/.claude/hooks/write-path-validation.py +194 -194
  64. package/LICENSE +33 -33
  65. package/bin/aiox-graph.js +0 -0
  66. package/bin/aiox-minimal.js +0 -0
  67. package/bin/aiox.js +0 -0
  68. package/package.json +6 -1
  69. package/packages/aiox-install/bin/aiox-install.js +0 -0
  70. package/packages/aiox-install/bin/edmcp.js +0 -0
  71. package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
  72. package/packages/installer/src/wizard/pro-setup.js +28 -0
  73. package/pro/README.md +66 -66
  74. package/pro/feature-registry.yaml +225 -0
  75. package/pro/license/license-api.js +701 -679
  76. package/pro/package.json +39 -0
  77. package/pro/pro-config.yaml +63 -0
  78. package/pro/squads/README.md +24 -0
  79. package/pro/squads/design/HEADLINE.md +3 -0
  80. package/pro/squads/design/README.md +109 -0
  81. package/pro/squads/design/agents/brad-frost.md +1097 -0
  82. package/pro/squads/design/agents/dan-mall.md +857 -0
  83. package/pro/squads/design/agents/dave-malouf.md +2272 -0
  84. package/pro/squads/design/agents/design-chief.md +114 -0
  85. package/pro/squads/design/agents/ds-foundations-lead.md +194 -0
  86. package/pro/squads/design/agents/ds-token-architect.md +361 -0
  87. package/pro/squads/design/agents/nano-banana-generator.md +162 -0
  88. package/pro/squads/design/agents/storybook-expert.md +809 -0
  89. package/pro/squads/design/checklists/atomic-refactor-checklist.md +299 -0
  90. package/pro/squads/design/checklists/component-adaptation-checklist.md +81 -0
  91. package/pro/squads/design/checklists/design-fidelity-checklist.md +283 -0
  92. package/pro/squads/design/checklists/design-handoff-checklist.md +55 -0
  93. package/pro/squads/design/checklists/design-team-health-checklist.md +454 -0
  94. package/pro/squads/design/checklists/designops-maturity-checklist.md +518 -0
  95. package/pro/squads/design/checklists/ds-a11y-release-gate-checklist.md +45 -0
  96. package/pro/squads/design/checklists/ds-accessibility-wcag-checklist.md +147 -0
  97. package/pro/squads/design/checklists/ds-component-quality-checklist.md +150 -0
  98. package/pro/squads/design/checklists/ds-critical-eye-review-checklist.md +147 -0
  99. package/pro/squads/design/checklists/ds-migration-readiness-checklist.md +99 -0
  100. package/pro/squads/design/checklists/ds-pattern-audit-checklist.md +164 -0
  101. package/pro/squads/design/checklists/reading-accessibility-checklist.md +275 -0
  102. package/pro/squads/design/checklists/token-mapping-checklist.md +107 -0
  103. package/pro/squads/design/config/coding-standards.md +286 -0
  104. package/pro/squads/design/config/source-tree.md +59 -0
  105. package/pro/squads/design/config/tech-stack.md +48 -0
  106. package/pro/squads/design/config.yaml +204 -0
  107. package/pro/squads/design/data/agentic-design-systems-guide.md +46 -0
  108. package/pro/squads/design/data/agentic-ds-principles.md +100 -0
  109. package/pro/squads/design/data/atomic-design-principles.md +108 -0
  110. package/pro/squads/design/data/atomic-refactor-rules.md +582 -0
  111. package/pro/squads/design/data/base-component-specs.md +972 -0
  112. package/pro/squads/design/data/brad-frost-analysis-extract-implicit.yaml +270 -0
  113. package/pro/squads/design/data/brad-frost-analysis-find-0.8.yaml +176 -0
  114. package/pro/squads/design/data/brad-frost-analysis-qa-report.yaml +168 -0
  115. package/pro/squads/design/data/brad-frost-dna.yaml +713 -0
  116. package/pro/squads/design/data/capability-tools.yaml +124 -0
  117. package/pro/squads/design/data/component-adaptation-changelog.md +318 -0
  118. package/pro/squads/design/data/consolidation-algorithms.md +168 -0
  119. package/pro/squads/design/data/critical-eye-scoring-rules.yaml +240 -0
  120. package/pro/squads/design/data/design-token-best-practices.md +107 -0
  121. package/pro/squads/design/data/design-tokens-spec.yaml +418 -0
  122. package/pro/squads/design/data/ds-reference-architectures.md +93 -0
  123. package/pro/squads/design/data/f2-qa-report.md +168 -0
  124. package/pro/squads/design/data/f3-derived-components-changelog.md +100 -0
  125. package/pro/squads/design/data/f3-qa-report.md +208 -0
  126. package/pro/squads/design/data/figma-base-components-raw.md +102 -0
  127. package/pro/squads/design/data/figma-tokens-raw.md +1549 -0
  128. package/pro/squads/design/data/fluent2-design-principles.md +114 -0
  129. package/pro/squads/design/data/high-retention-reading-guide.md +349 -0
  130. package/pro/squads/design/data/integration-patterns.md +207 -0
  131. package/pro/squads/design/data/internal-quality-chain.yaml +48 -0
  132. package/pro/squads/design/data/motion-tokens-guide.md +202 -0
  133. package/pro/squads/design/data/roi-calculation-guide.md +142 -0
  134. package/pro/squads/design/data/token-mapping-reference.md +213 -0
  135. package/pro/squads/design/data/w3c-dtcg-spec-reference.md +149 -0
  136. package/pro/squads/design/data/wcag-compliance-guide.md +267 -0
  137. package/pro/squads/design/docs/AUDIT_REPORT.md +97 -0
  138. package/pro/squads/design/docs/DS-CURATION-PIPELINE-PROPOSAL.md +577 -0
  139. package/pro/squads/design/docs/UPGRADE_PLAN.md +618 -0
  140. package/pro/squads/design/docs/brad-frost-research-validation.md +372 -0
  141. package/pro/squads/design/docs/dave-malouf-research-validation.md +391 -0
  142. package/pro/squads/design/docs/tool-discovery-report.md +87 -0
  143. package/pro/squads/design/docs/tool-integration-plan.md +44 -0
  144. package/pro/squads/design/protocols/ai-first-governance.md +56 -0
  145. package/pro/squads/design/protocols/governance-execution-boundary.md +59 -0
  146. package/pro/squads/design/protocols/handoff.md +60 -0
  147. package/pro/squads/design/rules/.claude-rules.md +88 -0
  148. package/pro/squads/design/scripts/design-system/curate_colors.cjs +447 -0
  149. package/pro/squads/design/scripts/design-system/curate_components.cjs +217 -0
  150. package/pro/squads/design/scripts/design-system/curate_radius.cjs +190 -0
  151. package/pro/squads/design/scripts/design-system/curate_shadows.cjs +208 -0
  152. package/pro/squads/design/scripts/design-system/curate_spacing.cjs +243 -0
  153. package/pro/squads/design/scripts/design-system/curate_typography.cjs +404 -0
  154. package/pro/squads/design/scripts/design-system/design-system-metadata.test.js +49 -0
  155. package/pro/squads/design/scripts/design-system/design_manifest_lib.cjs +142 -0
  156. package/pro/squads/design/scripts/design-system/fetch_page_images.cjs +195 -0
  157. package/pro/squads/design/scripts/design-system/generate_components_metadata.cjs +114 -0
  158. package/pro/squads/design/scripts/design-system/generate_curation_report.cjs +258 -0
  159. package/pro/squads/design/scripts/design-system/generate_tokens.cjs +342 -0
  160. package/pro/squads/design/scripts/design-system/sync_design_manifest.cjs +27 -0
  161. package/pro/squads/design/scripts/design-system/test_mcp_tools.cjs +232 -0
  162. package/pro/squads/design/scripts/design-system/validate_components_metadata.cjs +96 -0
  163. package/pro/squads/design/scripts/design-system/validate_curation.cjs +226 -0
  164. package/pro/squads/design/scripts/design-system/validate_design_manifest_drift.cjs +72 -0
  165. package/pro/squads/design/scripts/design-system/validate_mcp_skeleton.cjs +38 -0
  166. package/pro/squads/design/scripts/design-system/validate_registry.cjs +186 -0
  167. package/pro/squads/design/scripts/design-system/validate_task_checklist_bindings.cjs +78 -0
  168. package/pro/squads/design/scripts/dissect-artifact.cjs +806 -0
  169. package/pro/squads/design/scripts/validate-a11y-integration.cjs +40 -0
  170. package/pro/squads/design/scripts/validate-design-squad.py +411 -0
  171. package/pro/squads/design/squad.yaml +714 -0
  172. package/pro/squads/design/tasks/a11y-audit.md +340 -0
  173. package/pro/squads/design/tasks/aria-audit.md +525 -0
  174. package/pro/squads/design/tasks/atomic-refactor-execute.md +391 -0
  175. package/pro/squads/design/tasks/atomic-refactor-plan.md +262 -0
  176. package/pro/squads/design/tasks/audit-reading-experience.md +350 -0
  177. package/pro/squads/design/tasks/audit-tailwind-config.md +101 -0
  178. package/pro/squads/design/tasks/bootstrap-shadcn-library.md +96 -0
  179. package/pro/squads/design/tasks/bundle-audit.md +245 -0
  180. package/pro/squads/design/tasks/contrast-matrix.md +373 -0
  181. package/pro/squads/design/tasks/create-doc.md +135 -0
  182. package/pro/squads/design/tasks/dead-code-detection.md +329 -0
  183. package/pro/squads/design/tasks/design-compare.md +414 -0
  184. package/pro/squads/design/tasks/design-process-optimization.md +407 -0
  185. package/pro/squads/design/tasks/design-review-orchestration.md +99 -0
  186. package/pro/squads/design/tasks/design-team-scaling.md +407 -0
  187. package/pro/squads/design/tasks/design-tooling-audit.md +404 -0
  188. package/pro/squads/design/tasks/design-triage.md +89 -0
  189. package/pro/squads/design/tasks/designops-maturity-assessment.md +364 -0
  190. package/pro/squads/design/tasks/designops-metrics-setup.md +465 -0
  191. package/pro/squads/design/tasks/ds-agentic-audit.md +100 -0
  192. package/pro/squads/design/tasks/ds-agentic-setup.md +103 -0
  193. package/pro/squads/design/tasks/ds-audit-codebase.md +273 -0
  194. package/pro/squads/design/tasks/ds-build-component.md +349 -0
  195. package/pro/squads/design/tasks/ds-build-mcp-server.md +84 -0
  196. package/pro/squads/design/tasks/ds-calculate-roi.md +282 -0
  197. package/pro/squads/design/tasks/ds-compose-molecule.md +106 -0
  198. package/pro/squads/design/tasks/ds-consolidate-patterns.md +253 -0
  199. package/pro/squads/design/tasks/ds-context-contract.md +194 -0
  200. package/pro/squads/design/tasks/ds-critical-eye-compare.md +130 -0
  201. package/pro/squads/design/tasks/ds-critical-eye-decide.md +139 -0
  202. package/pro/squads/design/tasks/ds-critical-eye-inventory.md +111 -0
  203. package/pro/squads/design/tasks/ds-critical-eye-report.md +101 -0
  204. package/pro/squads/design/tasks/ds-critical-eye-score.md +109 -0
  205. package/pro/squads/design/tasks/ds-designops.md +99 -0
  206. package/pro/squads/design/tasks/ds-extend-pattern.md +91 -0
  207. package/pro/squads/design/tasks/ds-extract-tokens.md +312 -0
  208. package/pro/squads/design/tasks/ds-figma-pipeline.md +95 -0
  209. package/pro/squads/design/tasks/ds-fluent-audit.md +105 -0
  210. package/pro/squads/design/tasks/ds-fluent-build.md +110 -0
  211. package/pro/squads/design/tasks/ds-generate-ai-metadata.md +81 -0
  212. package/pro/squads/design/tasks/ds-generate-cursor-rules.md +74 -0
  213. package/pro/squads/design/tasks/ds-generate-documentation.md +101 -0
  214. package/pro/squads/design/tasks/ds-generate-migration-strategy.md +331 -0
  215. package/pro/squads/design/tasks/ds-generate-shock-report.md +323 -0
  216. package/pro/squads/design/tasks/ds-govern-a11y-compliance.md +93 -0
  217. package/pro/squads/design/tasks/ds-governance.md +187 -0
  218. package/pro/squads/design/tasks/ds-health-metrics.md +278 -0
  219. package/pro/squads/design/tasks/ds-integrate-squad.md +130 -0
  220. package/pro/squads/design/tasks/ds-integrate-workspace.md +100 -0
  221. package/pro/squads/design/tasks/ds-legacy-modernization.md +302 -0
  222. package/pro/squads/design/tasks/ds-mcp-status.md +65 -0
  223. package/pro/squads/design/tasks/ds-motion-audit.md +118 -0
  224. package/pro/squads/design/tasks/ds-multi-framework.md +96 -0
  225. package/pro/squads/design/tasks/ds-parallelization-gate.md +246 -0
  226. package/pro/squads/design/tasks/ds-query.md +90 -0
  227. package/pro/squads/design/tasks/ds-rebuild-artifact.md +369 -0
  228. package/pro/squads/design/tasks/ds-reverse-engineer.md +194 -0
  229. package/pro/squads/design/tasks/ds-scan-artifact.md +131 -0
  230. package/pro/squads/design/tasks/ds-setup-design-system.md +297 -0
  231. package/pro/squads/design/tasks/ds-sync-registry.md +287 -0
  232. package/pro/squads/design/tasks/ds-theme-multi-brand.md +90 -0
  233. package/pro/squads/design/tasks/ds-token-modes.md +108 -0
  234. package/pro/squads/design/tasks/ds-token-w3c-extract.md +105 -0
  235. package/pro/squads/design/tasks/ds-validate-ai-readiness.md +69 -0
  236. package/pro/squads/design/tasks/ds-visual-regression.md +130 -0
  237. package/pro/squads/design/tasks/execute-checklist.md +141 -0
  238. package/pro/squads/design/tasks/export-design-tokens-dtcg.md +97 -0
  239. package/pro/squads/design/tasks/f1-apply-foundations.md +154 -0
  240. package/pro/squads/design/tasks/f1-ingest-figma-tokens.md +130 -0
  241. package/pro/squads/design/tasks/f1-map-tokens-to-shadcn.md +145 -0
  242. package/pro/squads/design/tasks/f1-qa-foundations.md +95 -0
  243. package/pro/squads/design/tasks/f2-adapt-shadcn-components.md +155 -0
  244. package/pro/squads/design/tasks/f2-ingest-base-components.md +148 -0
  245. package/pro/squads/design/tasks/f2-qa-base-components.md +98 -0
  246. package/pro/squads/design/tasks/f3-derive-components.md +145 -0
  247. package/pro/squads/design/tasks/f3-qa-derived-components.md +101 -0
  248. package/pro/squads/design/tasks/focus-order-audit.md +450 -0
  249. package/pro/squads/design/tasks/sb-brownfield-migrate.md +367 -0
  250. package/pro/squads/design/tasks/sb-brownfield-scan.md +318 -0
  251. package/pro/squads/design/tasks/sb-configure.md +230 -0
  252. package/pro/squads/design/tasks/sb-expand-shadcn.md +213 -0
  253. package/pro/squads/design/tasks/sb-generate-all-stories.md +288 -0
  254. package/pro/squads/design/tasks/sb-install.md +152 -0
  255. package/pro/squads/design/tasks/sb-sync-workspace.md +239 -0
  256. package/pro/squads/design/tasks/sb-verify.md +203 -0
  257. package/pro/squads/design/tasks/tailwind-upgrade.md +117 -0
  258. package/pro/squads/design/tasks/token-usage-analytics.md +262 -0
  259. package/pro/squads/design/tasks/ux-rewrite-sixth-grade.md +82 -0
  260. package/pro/squads/design/tasks/validate-design-fidelity.md +222 -0
  261. package/pro/squads/design/templates/agent-template.yaml +46 -0
  262. package/pro/squads/design/templates/clone-mind-template.md +352 -0
  263. package/pro/squads/design/templates/component-prompt-injection-tmpl.md +236 -0
  264. package/pro/squads/design/templates/component-visual-spec-tmpl.md +378 -0
  265. package/pro/squads/design/templates/critical-eye-cycle-report-tmpl.md +165 -0
  266. package/pro/squads/design/templates/design-fidelity-report-tmpl.md +155 -0
  267. package/pro/squads/design/templates/ds-ai-component-metadata-schema-tmpl.json +138 -0
  268. package/pro/squads/design/templates/ds-artifact-analysis.md +70 -0
  269. package/pro/squads/design/templates/ds-health-report-tmpl.md +236 -0
  270. package/pro/squads/design/templates/ds-migration-strategy-tmpl.md +524 -0
  271. package/pro/squads/design/templates/ds-state-persistence-tmpl.yaml +194 -0
  272. package/pro/squads/design/templates/ds-tokens-schema-tmpl.yaml +139 -0
  273. package/pro/squads/design/templates/migration-strategy-tmpl.md +524 -0
  274. package/pro/squads/design/templates/reading-design-tokens.css +26 -0
  275. package/pro/squads/design/templates/state-persistence-tmpl.yaml +219 -0
  276. package/pro/squads/design/templates/tokens-schema-tmpl.yaml +305 -0
  277. package/pro/squads/design/workflows/agentic-readiness.yaml +83 -0
  278. package/pro/squads/design/workflows/audit-only.yaml +198 -0
  279. package/pro/squads/design/workflows/brownfield-complete.yaml +257 -0
  280. package/pro/squads/design/workflows/critical-eye.yaml +184 -0
  281. package/pro/squads/design/workflows/dtcg-tokens-governance.yaml +64 -0
  282. package/pro/squads/design/workflows/foundations-pipeline.yaml +192 -0
  283. package/pro/squads/design/workflows/greenfield-new.yaml +192 -0
  284. package/pro/squads/design/workflows/motion-quality.yaml +65 -0
  285. package/pro/squads/design/workflows/self-healing-workflow.yaml +237 -0
  286. package/pro/squads/design/workflows/storybook-brownfield-migration.yaml +400 -0
  287. package/pro/squads/design/workflows/storybook-full-setup.yaml +280 -0
  288. package/pro/squads/index.js +145 -0
  289. package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/ARQUITETURA_COGNITIVA_DE_ALEX_HORMOZI_EXTRA/303/207/303/203O_COMPLETA.md +215 -0
  290. package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/A_Rotina_de_Alta_Performance_de_Alex_Hormozi_Arquitetura,_Motiva/303/247/303/265es_e_Replica/303/247/303/243o.md +309 -0
  291. package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/O_sistema_completo_de_cria/303/247/303/243o_de_conte/303/272do_de_Alex_Hormozi.md +416 -0
  292. package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/Processo_Cria/303/247/303/243o_Conte/303/272do_Hormozi.md +0 -0
  293. package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
  294. package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
  295. package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
  296. package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
  297. package/pro/squads/mmos-squad/minds/brad_frost/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
  298. package/pro/squads/mmos-squad/minds/brad_frost/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
  299. package/pro/squads/mmos-squad/minds/brad_frost/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
  300. package/pro/squads/mmos-squad/minds/brad_frost/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
  301. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_ELON_MUSK.md +291 -0
  302. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/ASSINATURA_LINGU/303/215STICA_ELON_MUSK.md +485 -0
  303. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/A_Arquitetura_Mental_de_Elon_Musk_Uma_An/303/241lise_Sistem/303/241tica_dos_Frameworks_de_Pensamento.md +907 -0
  304. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Dossi/303/252_Estrat/303/251gico_A_Arquitetura_Psicol/303/263gica_de_Elon_Musk.md +252 -0
  305. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Os_Padr/303/265es_de_Leitura_de_Elon_Musk_e_Sua_Influ/303/252ncia_Sistem/303/241tica.md +287 -0
  306. package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Uma_an/303/241lise_psicol/303/263gica_abrangente.md +187 -0
  307. package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_EUGENE_M._SCHWARTZ.md +790 -0
  308. package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/An/303/241lise_Completa_Eugene_Schwartz_Arquitetura_Cognitiva_DEEP.md +210 -0
  309. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/5H_EXTRA/303/207/303/203O_COGNITIVA_COMPLETA_PEDRO_VAL/303/211RIO_LOPEZ.md +226 -0
  310. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_COMPARATIVA_REVISADA_PEDRO_VAL/303/211RIO_LOPEZ.md +246 -0
  311. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_LINGU/303/215STICA_CARIOCA_PEDRO_VAL/303/211RIO_LOPEZ.md +274 -0
  312. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_DEFINITIVA_PEDRO_VAL/303/211RIO_LOPEZ.md +821 -0
  313. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_PEDRO_VAL/303/211RIO.md +1844 -0
  314. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/C/303/201LCULO_DE_RARIDADE_ESTAT/303/215STICA_PEDRO_VAL/303/211RIO_LOPEZ.md +154 -0
  315. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/EXTRA/303/207/303/203O_PEDRO_VAL/303/211RIO.md +237 -0
  316. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/MAPEAMENTO_LINGU/303/215STICO_PROFUNDO.md +161 -0
  317. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/META_AXIOMAS_DE_PEDRO_VAL/303/211RIO.md +256 -0
  318. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_PEDRO_VAL/303/211RIO_LOPEZ.md +586 -0
  319. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_V2_/342/200/224_CLONE_IA.md +452 -0
  320. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/TABELA_COMPARATIVA_AN/303/201LISE_COMPLETA_DOS_CLONES_IA.md +102 -0
  321. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/WHATSAPP_PADR/303/225ES_LINGU/303/215STICOS_PEDRO_VAL/303/211RIO_LOPEZ.md +286 -0
  322. package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/heur/303/255sticas_de_decis/303/243o_e_algoritmos_mentais_/303/272nicos.md +268 -0
  323. package/pro/squads/mmos-squad/minds/ray_kurzweil/sources/books/PROTOCOLO_COMPLETO_DE_INTERROGA/303/207/303/203O_-_NAVAL_RAVIKANT.md +3624 -0
  324. package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_JOBS.md +488 -0
  325. package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Framework_Cabe/303/247a_Steve.md +257 -0
  326. package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Relat/303/263rio_Abrangente_sobre_Steve_Jobs_para_Cria/303/247/303/243o_de_Clone_de_IA.md +370 -0
  327. package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Steve_Jobs_An/303/241lise_Psicol/303/263gica_Profunda_e_Valida/303/247/303/243o_Comportamental.md +65 -0
  328. package/pro/squads/squad-creator-pro/.state.json +32 -0
  329. package/pro/squads/squad-creator-pro/CHANGELOG.md +275 -0
  330. package/pro/squads/squad-creator-pro/HEADLINE.md +3 -0
  331. package/pro/squads/squad-creator-pro/README.md +1059 -0
  332. package/pro/squads/squad-creator-pro/agents/oalanicolas.md +438 -0
  333. package/pro/squads/squad-creator-pro/agents/pedro-valerio.md +449 -0
  334. package/pro/squads/squad-creator-pro/agents/squad-chief.md +1651 -0
  335. package/pro/squads/squad-creator-pro/agents/thiago_finch.md +976 -0
  336. package/pro/squads/squad-creator-pro/assessments/axioma-assessment-wf-create-squad.yaml +325 -0
  337. package/pro/squads/squad-creator-pro/checklists/.gitkeep +1 -0
  338. package/pro/squads/squad-creator-pro/checklists/agent-depth-checklist.md +244 -0
  339. package/pro/squads/squad-creator-pro/checklists/agent-quality-gate.md +434 -0
  340. package/pro/squads/squad-creator-pro/checklists/create-agent-checklist.md +184 -0
  341. package/pro/squads/squad-creator-pro/checklists/create-squad-checklist.md +219 -0
  342. package/pro/squads/squad-creator-pro/checklists/create-workflow-checklist.md +224 -0
  343. package/pro/squads/squad-creator-pro/checklists/deep-research-quality.md +506 -0
  344. package/pro/squads/squad-creator-pro/checklists/executor-matrix-checklist.md +260 -0
  345. package/pro/squads/squad-creator-pro/checklists/mental-model-integration-checklist.md +95 -0
  346. package/pro/squads/squad-creator-pro/checklists/mind-validation.md +374 -0
  347. package/pro/squads/squad-creator-pro/checklists/quality-gate-checklist.md +385 -0
  348. package/pro/squads/squad-creator-pro/checklists/smoke-test-agent.md +313 -0
  349. package/pro/squads/squad-creator-pro/checklists/sop-validation.md +250 -0
  350. package/pro/squads/squad-creator-pro/checklists/squad-checklist.md +1014 -0
  351. package/pro/squads/squad-creator-pro/checklists/squad-overview-checklist.md +393 -0
  352. package/pro/squads/squad-creator-pro/checklists/task-anatomy-checklist.md +626 -0
  353. package/pro/squads/squad-creator-pro/config/.gitkeep +1 -0
  354. package/pro/squads/squad-creator-pro/config/axioma-validator.yaml +371 -0
  355. package/pro/squads/squad-creator-pro/config/heuristics.yaml +753 -0
  356. package/pro/squads/squad-creator-pro/config/model-routing.yaml +693 -0
  357. package/pro/squads/squad-creator-pro/config/quality-gates.yaml +415 -0
  358. package/pro/squads/squad-creator-pro/config/scoring-rubric.yaml +199 -0
  359. package/pro/squads/squad-creator-pro/config/squad-config.yaml +165 -0
  360. package/pro/squads/squad-creator-pro/config/task-anatomy.yaml +263 -0
  361. package/pro/squads/squad-creator-pro/config/veto-conditions.yaml +455 -0
  362. package/pro/squads/squad-creator-pro/config.yaml +35 -0
  363. package/pro/squads/squad-creator-pro/data/.gitkeep +1 -0
  364. package/pro/squads/squad-creator-pro/data/an-anchor-words.yaml +78 -0
  365. package/pro/squads/squad-creator-pro/data/an-clone-anti-patterns.yaml +148 -0
  366. package/pro/squads/squad-creator-pro/data/an-clone-validation.yaml +190 -0
  367. package/pro/squads/squad-creator-pro/data/an-diagnostic-framework.yaml +164 -0
  368. package/pro/squads/squad-creator-pro/data/an-output-examples.yaml +102 -0
  369. package/pro/squads/squad-creator-pro/data/an-source-signals.yaml +98 -0
  370. package/pro/squads/squad-creator-pro/data/an-source-tiers.yaml +119 -0
  371. package/pro/squads/squad-creator-pro/data/best-practices.md +986 -0
  372. package/pro/squads/squad-creator-pro/data/core-heuristics.md +510 -0
  373. package/pro/squads/squad-creator-pro/data/decision-heuristics-framework.md +620 -0
  374. package/pro/squads/squad-creator-pro/data/executor-decision-tree.md +774 -0
  375. package/pro/squads/squad-creator-pro/data/executor-matrix-framework.md +441 -0
  376. package/pro/squads/squad-creator-pro/data/fusion-decision-points-analysis.md +397 -0
  377. package/pro/squads/squad-creator-pro/data/fusion-executor-analysis.md +677 -0
  378. package/pro/squads/squad-creator-pro/data/hybridops-patterns.md +1351 -0
  379. package/pro/squads/squad-creator-pro/data/internal-infrastructure-library.yaml +99 -0
  380. package/pro/squads/squad-creator-pro/data/mental-model-task-matrix.yaml +692 -0
  381. package/pro/squads/squad-creator-pro/data/pipeline-patterns.md +352 -0
  382. package/pro/squads/squad-creator-pro/data/pm-best-practices.md +440 -0
  383. package/pro/squads/squad-creator-pro/data/pv-anchor-words.yaml +64 -0
  384. package/pro/squads/squad-creator-pro/data/pv-authenticity-markers.yaml +200 -0
  385. package/pro/squads/squad-creator-pro/data/pv-meta-axiomas.yaml +162 -0
  386. package/pro/squads/squad-creator-pro/data/pv-output-examples.yaml +342 -0
  387. package/pro/squads/squad-creator-pro/data/pv-workflow-validation.yaml +318 -0
  388. package/pro/squads/squad-creator-pro/data/quality-dimensions-framework.md +405 -0
  389. package/pro/squads/squad-creator-pro/data/squad-analytics-guide.md +252 -0
  390. package/pro/squads/squad-creator-pro/data/squad-kb.md +987 -0
  391. package/pro/squads/squad-creator-pro/data/squad-registry.yaml +841 -0
  392. package/pro/squads/squad-creator-pro/data/squad-type-definitions.yaml +578 -0
  393. package/pro/squads/squad-creator-pro/data/tier-system-framework.md +475 -0
  394. package/pro/squads/squad-creator-pro/data/tool-evaluation-framework.md +847 -0
  395. package/pro/squads/squad-creator-pro/data/tool-registry.yaml +700 -0
  396. package/pro/squads/squad-creator-pro/docs/ADR-001-model-tier-qualification.md +344 -0
  397. package/pro/squads/squad-creator-pro/docs/AGENT-COLLABORATION.md +609 -0
  398. package/pro/squads/squad-creator-pro/docs/ARCHITECTURE-DIAGRAMS.md +1466 -0
  399. package/pro/squads/squad-creator-pro/docs/COMMANDS.md +544 -0
  400. package/pro/squads/squad-creator-pro/docs/CONCEPTS.md +584 -0
  401. package/pro/squads/squad-creator-pro/docs/FAQ.md +731 -0
  402. package/pro/squads/squad-creator-pro/docs/HITL-FLOW.md +255 -0
  403. package/pro/squads/squad-creator-pro/docs/MIGRATION-PLAN-AGENT-CONFORMITY.md +861 -0
  404. package/pro/squads/squad-creator-pro/docs/MIGRATION-ROADMAP-HYBRIDOPS.md +1161 -0
  405. package/pro/squads/squad-creator-pro/docs/MODEL-TIER-QUALIFICATION.md +337 -0
  406. package/pro/squads/squad-creator-pro/docs/PATTERN-LIBRARY.md +333 -0
  407. package/pro/squads/squad-creator-pro/docs/PEDRO-VALERIO-ARCHITECTURE.md +456 -0
  408. package/pro/squads/squad-creator-pro/docs/POR-ONDE-COMECAR.md +210 -0
  409. package/pro/squads/squad-creator-pro/docs/QUICK-START.md +205 -0
  410. package/pro/squads/squad-creator-pro/docs/RFC-001-deterministic-refactoring.md +463 -0
  411. package/pro/squads/squad-creator-pro/docs/TOOL-RECOMMENDATIONS.md +379 -0
  412. package/pro/squads/squad-creator-pro/docs/TROUBLESHOOTING.md +412 -0
  413. package/pro/squads/squad-creator-pro/docs/TUTORIAL-COMPLETO.md +458 -0
  414. package/pro/squads/squad-creator-pro/docs/optimize-v4-proposal.md +354 -0
  415. package/pro/squads/squad-creator-pro/docs/session-report-2026-02-01.md +411 -0
  416. package/pro/squads/squad-creator-pro/docs/sop-extraction-process.md +674 -0
  417. package/pro/squads/squad-creator-pro/docs/squad-chief-agent-flow.md +981 -0
  418. package/pro/squads/squad-creator-pro/docs/squad-creation-pipeline-workflow.md +937 -0
  419. package/pro/squads/squad-creator-pro/docs/task-optimization-framework.md +229 -0
  420. package/pro/squads/squad-creator-pro/docs/validation-report-2026-02-01.md +439 -0
  421. package/pro/squads/squad-creator-pro/minds/oalanicolas/artifacts/HANDOFF_PROTOCOL.md +269 -0
  422. package/pro/squads/squad-creator-pro/minds/oalanicolas/artifacts/SOURCE_CLASSIFICATION.md +258 -0
  423. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_001.md +166 -0
  424. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_002.md +206 -0
  425. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_003.md +239 -0
  426. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_004.md +153 -0
  427. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_005.md +161 -0
  428. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_006.md +166 -0
  429. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_007.md +190 -0
  430. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_008.md +191 -0
  431. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_009.md +234 -0
  432. package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_010.md +240 -0
  433. package/pro/squads/squad-creator-pro/minds/pedro_valerio/artifacts/Assinatura_Linguistica.md +355 -0
  434. package/pro/squads/squad-creator-pro/minds/pedro_valerio/artifacts/META_AXIOMAS.md +277 -0
  435. package/pro/squads/squad-creator-pro/minds/pedro_valerio/heuristics/PV_BS_001.md +144 -0
  436. package/pro/squads/squad-creator-pro/minds/pedro_valerio/heuristics/PV_PA_001.md +174 -0
  437. package/pro/squads/squad-creator-pro/minds/pedro_valerio/heuristics/PV_PM_001.md +191 -0
  438. package/pro/squads/squad-creator-pro/package.json +26 -0
  439. package/pro/squads/squad-creator-pro/protocols/ai-first-governance.md +63 -0
  440. package/pro/squads/squad-creator-pro/scripts/README.md +246 -0
  441. package/pro/squads/squad-creator-pro/scripts/__pycache__/dependency_check.cpython-314.pyc +0 -0
  442. package/pro/squads/squad-creator-pro/scripts/__pycache__/inventory.cpython-314.pyc +0 -0
  443. package/pro/squads/squad-creator-pro/scripts/__pycache__/naming_validator.cpython-314.pyc +0 -0
  444. package/pro/squads/squad-creator-pro/scripts/__pycache__/quality_gate.cpython-314.pyc +0 -0
  445. package/pro/squads/squad-creator-pro/scripts/__pycache__/scoring.cpython-314.pyc +0 -0
  446. package/pro/squads/squad-creator-pro/scripts/__pycache__/yaml_validator.cpython-314.pyc +0 -0
  447. package/pro/squads/squad-creator-pro/scripts/assess-sources.sh +443 -0
  448. package/pro/squads/squad-creator-pro/scripts/checklist_validator.py +451 -0
  449. package/pro/squads/squad-creator-pro/scripts/clone-review.sh +394 -0
  450. package/pro/squads/squad-creator-pro/scripts/coherence-validator.py +836 -0
  451. package/pro/squads/squad-creator-pro/scripts/create-agent-preflight.py +243 -0
  452. package/pro/squads/squad-creator-pro/scripts/cross-provider/compare-results.js +281 -0
  453. package/pro/squads/squad-creator-pro/scripts/cross-provider/cross-provider-runner.js +462 -0
  454. package/pro/squads/squad-creator-pro/scripts/dependency_check.py +333 -0
  455. package/pro/squads/squad-creator-pro/scripts/fidelity-score.sh +519 -0
  456. package/pro/squads/squad-creator-pro/scripts/generate-squad-greeting.js +426 -0
  457. package/pro/squads/squad-creator-pro/scripts/generate-squad-guide.js +558 -0
  458. package/pro/squads/squad-creator-pro/scripts/inventory.py +269 -0
  459. package/pro/squads/squad-creator-pro/scripts/lib/config-loader.js +151 -0
  460. package/pro/squads/squad-creator-pro/scripts/model-tier-validator.cjs +369 -0
  461. package/pro/squads/squad-creator-pro/scripts/model-usage-logger.cjs +245 -0
  462. package/pro/squads/squad-creator-pro/scripts/modernization-score.sh +308 -0
  463. package/pro/squads/squad-creator-pro/scripts/naming_validator.py +299 -0
  464. package/pro/squads/squad-creator-pro/scripts/on-specialist-complete.py +98 -0
  465. package/pro/squads/squad-creator-pro/scripts/quality_gate.py +413 -0
  466. package/pro/squads/squad-creator-pro/scripts/refresh-registry.py +270 -0
  467. package/pro/squads/squad-creator-pro/scripts/save-session-metrics.py +136 -0
  468. package/pro/squads/squad-creator-pro/scripts/scaffold-squad.cjs +281 -0
  469. package/pro/squads/squad-creator-pro/scripts/scoring.py +395 -0
  470. package/pro/squads/squad-creator-pro/scripts/security_scanner.py +378 -0
  471. package/pro/squads/squad-creator-pro/scripts/squad-analytics.py +585 -0
  472. package/pro/squads/squad-creator-pro/scripts/squad-context-loader.cjs +205 -0
  473. package/pro/squads/squad-creator-pro/scripts/squad-state-manager.cjs +451 -0
  474. package/pro/squads/squad-creator-pro/scripts/squad-workflow-runner.cjs +471 -0
  475. package/pro/squads/squad-creator-pro/scripts/squad_utils.py +261 -0
  476. package/pro/squads/squad-creator-pro/scripts/sync-ide-command.py +590 -0
  477. package/pro/squads/squad-creator-pro/scripts/tests/__init__.py +1 -0
  478. package/pro/squads/squad-creator-pro/scripts/tests/conftest.py +309 -0
  479. package/pro/squads/squad-creator-pro/scripts/tests/run_bash_tests.sh +29 -0
  480. package/pro/squads/squad-creator-pro/scripts/tests/test_assess_sources.sh +216 -0
  481. package/pro/squads/squad-creator-pro/scripts/tests/test_checklist_validator.py +396 -0
  482. package/pro/squads/squad-creator-pro/scripts/tests/test_clone_review.sh +239 -0
  483. package/pro/squads/squad-creator-pro/scripts/tests/test_coherence_validator.py +212 -0
  484. package/pro/squads/squad-creator-pro/scripts/tests/test_dependency_check.py +361 -0
  485. package/pro/squads/squad-creator-pro/scripts/tests/test_fidelity_score.sh +298 -0
  486. package/pro/squads/squad-creator-pro/scripts/tests/test_inventory.py +307 -0
  487. package/pro/squads/squad-creator-pro/scripts/tests/test_modernization_score.sh +211 -0
  488. package/pro/squads/squad-creator-pro/scripts/tests/test_naming_validator.py +373 -0
  489. package/pro/squads/squad-creator-pro/scripts/tests/test_quality_gate.py +280 -0
  490. package/pro/squads/squad-creator-pro/scripts/tests/test_refresh_registry.py +338 -0
  491. package/pro/squads/squad-creator-pro/scripts/tests/test_scoring.py +366 -0
  492. package/pro/squads/squad-creator-pro/scripts/tests/test_security_scanner.py +354 -0
  493. package/pro/squads/squad-creator-pro/scripts/tests/test_squad_analytics.py +450 -0
  494. package/pro/squads/squad-creator-pro/scripts/tests/test_validate_clone.sh +252 -0
  495. package/pro/squads/squad-creator-pro/scripts/tests/test_yaml_validator.py +412 -0
  496. package/pro/squads/squad-creator-pro/scripts/validate-agent-output.py +115 -0
  497. package/pro/squads/squad-creator-pro/scripts/validate-all.sh +49 -0
  498. package/pro/squads/squad-creator-pro/scripts/validate-squad-structure.py +535 -0
  499. package/pro/squads/squad-creator-pro/scripts/validate-squad.sh +944 -0
  500. package/pro/squads/squad-creator-pro/scripts/yaml_validator.py +528 -0
  501. package/pro/squads/squad-creator-pro/skills/squad.md +301 -0
  502. package/pro/squads/squad-creator-pro/squad.yaml +36 -0
  503. package/pro/squads/squad-creator-pro/tasks/CHANGELOG.md +80 -0
  504. package/pro/squads/squad-creator-pro/tasks/an-assess-sources.md +78 -0
  505. package/pro/squads/squad-creator-pro/tasks/an-clone-review.md +104 -0
  506. package/pro/squads/squad-creator-pro/tasks/an-compare-outputs.md +354 -0
  507. package/pro/squads/squad-creator-pro/tasks/an-design-clone.md +79 -0
  508. package/pro/squads/squad-creator-pro/tasks/an-diagnose-clone.md +87 -0
  509. package/pro/squads/squad-creator-pro/tasks/an-extract-dna.md +90 -0
  510. package/pro/squads/squad-creator-pro/tasks/an-extract-framework.md +100 -0
  511. package/pro/squads/squad-creator-pro/tasks/an-fidelity-score.md +108 -0
  512. package/pro/squads/squad-creator-pro/tasks/an-validate-clone.md +96 -0
  513. package/pro/squads/squad-creator-pro/tasks/auto-acquire-sources.md +349 -0
  514. package/pro/squads/squad-creator-pro/tasks/collect-sources.md +533 -0
  515. package/pro/squads/squad-creator-pro/tasks/create-agent.md +768 -0
  516. package/pro/squads/squad-creator-pro/tasks/create-documentation.md +258 -0
  517. package/pro/squads/squad-creator-pro/tasks/create-pipeline.md +296 -0
  518. package/pro/squads/squad-creator-pro/tasks/create-squad.md +933 -0
  519. package/pro/squads/squad-creator-pro/tasks/create-task.md +1148 -0
  520. package/pro/squads/squad-creator-pro/tasks/create-template.md +474 -0
  521. package/pro/squads/squad-creator-pro/tasks/create-workflow.md +720 -0
  522. package/pro/squads/squad-creator-pro/tasks/deconstruct.md +167 -0
  523. package/pro/squads/squad-creator-pro/tasks/deep-research-pre-agent.md +566 -0
  524. package/pro/squads/squad-creator-pro/tasks/detect-squad-context.md +81 -0
  525. package/pro/squads/squad-creator-pro/tasks/discover-tools.md +944 -0
  526. package/pro/squads/squad-creator-pro/tasks/extract-implicit.md +352 -0
  527. package/pro/squads/squad-creator-pro/tasks/extract-knowledge.md +577 -0
  528. package/pro/squads/squad-creator-pro/tasks/extract-sop.md +320 -0
  529. package/pro/squads/squad-creator-pro/tasks/extract-thinking-dna.md +653 -0
  530. package/pro/squads/squad-creator-pro/tasks/extract-voice-dna.md +619 -0
  531. package/pro/squads/squad-creator-pro/tasks/find-0.8.md +222 -0
  532. package/pro/squads/squad-creator-pro/tasks/install-commands.md +373 -0
  533. package/pro/squads/squad-creator-pro/tasks/lookup-model.md +78 -0
  534. package/pro/squads/squad-creator-pro/tasks/migrate-workflows-to-yaml.md +259 -0
  535. package/pro/squads/squad-creator-pro/tasks/next-squad.md +487 -0
  536. package/pro/squads/squad-creator-pro/tasks/optimize-workflow.md +851 -0
  537. package/pro/squads/squad-creator-pro/tasks/optimize.md +1082 -0
  538. package/pro/squads/squad-creator-pro/tasks/parallel-discovery.md +58 -0
  539. package/pro/squads/squad-creator-pro/tasks/pv-audit.md +244 -0
  540. package/pro/squads/squad-creator-pro/tasks/pv-axioma-assessment-wf-clone-mind.yaml +256 -0
  541. package/pro/squads/squad-creator-pro/tasks/pv-axioma-assessment.md +83 -0
  542. package/pro/squads/squad-creator-pro/tasks/pv-modernization-score.md +83 -0
  543. package/pro/squads/squad-creator-pro/tasks/qa-after-creation.md +475 -0
  544. package/pro/squads/squad-creator-pro/tasks/qualify-task.md +265 -0
  545. package/pro/squads/squad-creator-pro/tasks/reexecute-squad-phase.md +64 -0
  546. package/pro/squads/squad-creator-pro/tasks/refresh-registry.md +403 -0
  547. package/pro/squads/squad-creator-pro/tasks/smoke-test-model-routing.md +167 -0
  548. package/pro/squads/squad-creator-pro/tasks/squad-analytics.md +265 -0
  549. package/pro/squads/squad-creator-pro/tasks/squad-fusion.md +817 -0
  550. package/pro/squads/squad-creator-pro/tasks/squad-overview.md +683 -0
  551. package/pro/squads/squad-creator-pro/tasks/sync-ide-command.md +392 -0
  552. package/pro/squads/squad-creator-pro/tasks/update-mind.md +428 -0
  553. package/pro/squads/squad-creator-pro/tasks/upgrade-squad.md +919 -0
  554. package/pro/squads/squad-creator-pro/tasks/validate-extraction.md +209 -0
  555. package/pro/squads/squad-creator-pro/tasks/validate-final-artifacts.md +80 -0
  556. package/pro/squads/squad-creator-pro/tasks/validate-squad.md +1385 -0
  557. package/pro/squads/squad-creator-pro/templates/.gitkeep +1 -0
  558. package/pro/squads/squad-creator-pro/templates/agent-flow-doc-tmpl.md +512 -0
  559. package/pro/squads/squad-creator-pro/templates/agent-tmpl.md +697 -0
  560. package/pro/squads/squad-creator-pro/templates/config-tmpl.yaml +352 -0
  561. package/pro/squads/squad-creator-pro/templates/handoff-insumos-tmpl.yaml +112 -0
  562. package/pro/squads/squad-creator-pro/templates/orchestrator-tmpl.md +74 -0
  563. package/pro/squads/squad-creator-pro/templates/pipeline-progress-tmpl.py +373 -0
  564. package/pro/squads/squad-creator-pro/templates/pipeline-runner-tmpl.py +444 -0
  565. package/pro/squads/squad-creator-pro/templates/pipeline-state-tmpl.py +413 -0
  566. package/pro/squads/squad-creator-pro/templates/pop-extractor-prompt.md +549 -0
  567. package/pro/squads/squad-creator-pro/templates/quality-dashboard-tmpl.md +286 -0
  568. package/pro/squads/squad-creator-pro/templates/quality-gate-tmpl.yaml +589 -0
  569. package/pro/squads/squad-creator-pro/templates/readme-tmpl.md +231 -0
  570. package/pro/squads/squad-creator-pro/templates/research-output-tmpl.md +625 -0
  571. package/pro/squads/squad-creator-pro/templates/research-prompt-tmpl.md +479 -0
  572. package/pro/squads/squad-creator-pro/templates/squad-prd-tmpl.md +464 -0
  573. package/pro/squads/squad-creator-pro/templates/squad-readme-tmpl.md +170 -0
  574. package/pro/squads/squad-creator-pro/templates/story-create-agent-tmpl.md +284 -0
  575. package/pro/squads/squad-creator-pro/templates/task-tmpl.md +461 -0
  576. package/pro/squads/squad-creator-pro/templates/template-tmpl.yaml +227 -0
  577. package/pro/squads/squad-creator-pro/templates/workflow-doc-tmpl.md +860 -0
  578. package/pro/squads/squad-creator-pro/templates/workflow-tmpl.yaml +394 -0
  579. package/pro/squads/squad-creator-pro/test-cases/BATCH-PROGRESS.md +268 -0
  580. package/pro/squads/squad-creator-pro/test-cases/QUALIFICATION-DASHBOARD.yaml +13 -0
  581. package/pro/squads/squad-creator-pro/test-cases/_template.yaml +147 -0
  582. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT-SUMMARY.md +275 -0
  583. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT_SUMMARY.md +140 -0
  584. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/CHECKPOINT_MATRIX.md +202 -0
  585. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION-REPORT.md +413 -0
  586. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION_NOTES.md +358 -0
  587. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README-v2.2.2.md +299 -0
  588. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README.md +320 -0
  589. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/TEST-REPORT-v2.1.md +351 -0
  590. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/VERIFICATION-CHECKLIST.txt +247 -0
  591. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/formal-qualification-report.yaml +389 -0
  592. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-output.yaml +366 -0
  593. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.1-output.yaml +452 -0
  594. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.1-output.yaml +281 -0
  595. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.2-output.yaml +332 -0
  596. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/opus-baseline.yaml +517 -0
  597. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/qualification-report.yaml +213 -0
  598. package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/test-case.yaml +69 -0
  599. package/pro/squads/squad-creator-pro/test-cases/an-clone-review/haiku-round-1.yaml +213 -0
  600. package/pro/squads/squad-creator-pro/test-cases/an-clone-review/opus-baseline.yaml +566 -0
  601. package/pro/squads/squad-creator-pro/test-cases/an-clone-review/qualification-report.yaml +82 -0
  602. package/pro/squads/squad-creator-pro/test-cases/an-design-clone/test-case.yaml +102 -0
  603. package/pro/squads/squad-creator-pro/test-cases/an-extract-dna/test-case.yaml +105 -0
  604. package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/haiku-round-1.yaml +262 -0
  605. package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/opus-baseline.yaml +266 -0
  606. package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/qualification-report.yaml +94 -0
  607. package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/haiku-round-1.yaml +282 -0
  608. package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/opus-baseline.yaml +470 -0
  609. package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/qualification-report.yaml +106 -0
  610. package/pro/squads/squad-creator-pro/test-cases/collect-sources/test-case.yaml +105 -0
  611. package/pro/squads/squad-creator-pro/test-cases/create-task/test-case.yaml +104 -0
  612. package/pro/squads/squad-creator-pro/test-cases/cross-provider/DASHBOARD.yaml +11 -0
  613. package/pro/squads/squad-creator-pro/test-cases/pv-audit/test-case.yaml +106 -0
  614. package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/haiku-output.yaml +209 -0
  615. package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/opus-baseline.yaml +96 -0
  616. package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/sonnet-output.yaml +30 -0
  617. package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/test-case.yaml +129 -0
  618. package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/comparison-round-1.yaml +242 -0
  619. package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/haiku-round-1.yaml +393 -0
  620. package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/opus-baseline.yaml +488 -0
  621. package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/qualification-report.yaml +74 -0
  622. package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/haiku-round-1.yaml +292 -0
  623. package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/opus-baseline.yaml +603 -0
  624. package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/qualification-report.yaml +97 -0
  625. package/pro/squads/squad-creator-pro/test-cases/smoke-test-model-routing/test-case.yaml +100 -0
  626. package/pro/squads/squad-creator-pro/test-cases/upgrade-squad/test-case.yaml +106 -0
  627. package/pro/squads/squad-creator-pro/test-cases/validate-squad/comparison-round-1.yaml +223 -0
  628. package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1-MINE.yaml +36 -0
  629. package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1.yaml +193 -0
  630. package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-2.yaml +303 -0
  631. package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-3-v4-task.yaml +149 -0
  632. package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-baseline.yaml +529 -0
  633. package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-round-3-v4-task.yaml +132 -0
  634. package/pro/squads/squad-creator-pro/test-cases/validate-squad/qualification-report.yaml +104 -0
  635. package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output-v2-calibrated.yaml +200 -0
  636. package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output.yaml +183 -0
  637. package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/opus-baseline.yaml +112 -0
  638. package/pro/squads/squad-creator-pro/utils/.gitkeep +1 -0
  639. package/pro/squads/squad-creator-pro/workflows/.gitkeep +1 -0
  640. package/pro/squads/squad-creator-pro/workflows/create-squad.yaml +348 -0
  641. package/pro/squads/squad-creator-pro/workflows/modules/module-discovery.yaml +16 -0
  642. package/pro/squads/squad-creator-pro/workflows/modules/module-integration.yaml +16 -0
  643. package/pro/squads/squad-creator-pro/workflows/modules/module-quality-gates.yaml +15 -0
  644. package/pro/squads/squad-creator-pro/workflows/validate-squad.yaml +582 -0
  645. package/pro/squads/squad-creator-pro/workflows/wf-auto-acquire-sources.yaml +518 -0
  646. package/pro/squads/squad-creator-pro/workflows/wf-brownfield-upgrade-squad.yaml +46 -0
  647. package/pro/squads/squad-creator-pro/workflows/wf-clone-mind.yaml +521 -0
  648. package/pro/squads/squad-creator-pro/workflows/wf-context-aware-create-squad.yaml +47 -0
  649. package/pro/squads/squad-creator-pro/workflows/wf-create-squad.yaml +1619 -0
  650. package/pro/squads/squad-creator-pro/workflows/wf-cross-provider-qualification.yaml +711 -0
  651. package/pro/squads/squad-creator-pro/workflows/wf-discover-tools.yaml +1439 -0
  652. package/pro/squads/squad-creator-pro/workflows/wf-extraction-pipeline.yaml +486 -0
  653. package/pro/squads/squad-creator-pro/workflows/wf-mind-research-loop.yaml +668 -0
  654. package/pro/squads/squad-creator-pro/workflows/wf-model-tier-qualification.yaml +800 -0
  655. package/pro/squads/squad-creator-pro/workflows/wf-optimize-squad.yaml +684 -0
  656. package/pro/squads/squad-creator-pro/workflows/wf-research-then-create-agent.yaml +921 -0
  657. package/pro/squads/squad-creator-pro/workflows/wf-squad-fusion.yaml +1684 -0
  658. package/scripts/check-markdown-links.py +352 -352
  659. package/scripts/dashboard-parallel-dev.sh +0 -0
  660. package/scripts/dashboard-parallel-phase3.sh +0 -0
  661. package/scripts/dashboard-parallel-phase4.sh +0 -0
  662. package/scripts/install-monitor-hooks.sh +0 -0
  663. package/.claude/hooks/code-intel-pretool.cjs +0 -107
  664. package/docs/guides/aios-workflows/README.md +0 -247
  665. package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +0 -1536
  666. package/scripts/glue/README.md +0 -355
  667. package/scripts/glue/compose-agent-prompt.cjs +0 -362
@@ -1,679 +1,701 @@
1
- /**
2
- * License API Client
3
- *
4
- * HTTP client for communicating with the license validation server.
5
- * Supports activation, validation, deactivation, and offline sync.
6
- *
7
- * @module pro/license/license-api
8
- * @see ADR-PRO-003 - Feature Gating & Licensing
9
- * @see Story PRO-6 - License Key & Feature Gating System
10
- */
11
-
12
- 'use strict';
13
-
14
- const https = require('https');
15
- const http = require('http');
16
- const { URL } = require('url');
17
- const { LicenseActivationError, AuthError, BuyerValidationError } = require('./errors');
18
- const { hasPendingDeactivation, clearPendingDeactivation } = require('./license-cache');
19
-
20
- /**
21
- * Default configuration.
22
- */
23
- const CONFIG = {
24
- BASE_URL: process.env.AIOX_LICENSE_API_URL || 'https://aios-license-server.vercel.app',
25
- TIMEOUT_MS: 10000,
26
- MAX_RETRIES: 3,
27
- RETRY_DELAY_MS: 1000,
28
- USER_AGENT: 'AIOX-Pro-License-Client/1.0',
29
- };
30
-
31
- /**
32
- * LicenseApiClient - HTTP client for license operations.
33
- */
34
- class LicenseApiClient {
35
- /**
36
- * Create a LicenseApiClient.
37
- *
38
- * @param {object} [options] - Client options
39
- * @param {string} [options.baseUrl] - Base URL for API (default: api.synkra.ai)
40
- * @param {number} [options.timeoutMs] - Request timeout in ms (default: 10000)
41
- */
42
- constructor(options = {}) {
43
- this.baseUrl = options.baseUrl || CONFIG.BASE_URL;
44
- this.timeoutMs = options.timeoutMs || CONFIG.TIMEOUT_MS;
45
- }
46
-
47
- /**
48
- * Make an HTTP request with timeout and abort support.
49
- *
50
- * @private
51
- * @param {string} method - HTTP method
52
- * @param {string} path - API path
53
- * @param {object} body - Request body
54
- * @returns {Promise<object>} Response data
55
- * @throws {LicenseActivationError} On network or server errors
56
- */
57
- async _request(method, path, body) {
58
- const url = new URL(path, this.baseUrl);
59
- const isHttps = url.protocol === 'https:';
60
- const client = isHttps ? https : http;
61
-
62
- const requestData = JSON.stringify(body);
63
-
64
- const options = {
65
- method,
66
- hostname: url.hostname,
67
- port: url.port || (isHttps ? 443 : 80),
68
- path: url.pathname + url.search,
69
- headers: {
70
- 'Content-Type': 'application/json',
71
- 'Content-Length': Buffer.byteLength(requestData),
72
- 'User-Agent': CONFIG.USER_AGENT,
73
- Accept: 'application/json',
74
- },
75
- timeout: this.timeoutMs,
76
- };
77
-
78
- return new Promise((resolve, reject) => {
79
- const req = client.request(options, (res) => {
80
- let data = '';
81
-
82
- res.on('data', (chunk) => {
83
- data += chunk;
84
- });
85
-
86
- res.on('end', () => {
87
- try {
88
- const response = data ? JSON.parse(data) : {};
89
- this._handleResponse(res.statusCode, response, resolve, reject);
90
- } catch {
91
- reject(
92
- new LicenseActivationError(
93
- 'Invalid response from license server',
94
- 'INVALID_RESPONSE',
95
- { rawData: data.substring(0, 200) },
96
- ),
97
- );
98
- }
99
- });
100
- });
101
-
102
- // Handle request timeout
103
- req.on('timeout', () => {
104
- req.destroy();
105
- reject(LicenseActivationError.networkError(new Error('Request timeout')));
106
- });
107
-
108
- // Handle request error
109
- req.on('error', (error) => {
110
- reject(LicenseActivationError.networkError(error));
111
- });
112
-
113
- // Send request body
114
- req.write(requestData);
115
- req.end();
116
- });
117
- }
118
-
119
- /**
120
- * Handle HTTP response based on status code.
121
- *
122
- * @private
123
- * @param {number} statusCode - HTTP status code
124
- * @param {object} response - Parsed response body
125
- * @param {Function} resolve - Promise resolve
126
- * @param {Function} reject - Promise reject
127
- */
128
- _handleResponse(statusCode, response, resolve, reject) {
129
- // Success
130
- if (statusCode >= 200 && statusCode < 300) {
131
- resolve(response);
132
- return;
133
- }
134
-
135
- // Normalize server error envelope: { error: { code, message, details } } → flat
136
- const err = response.error || response;
137
- const code = err.code;
138
- const message = err.message;
139
- const details = err.details;
140
-
141
- // Client errors
142
- switch (statusCode) {
143
- case 400:
144
- reject(
145
- new LicenseActivationError(
146
- message || 'Invalid request',
147
- code || 'BAD_REQUEST',
148
- details,
149
- ),
150
- );
151
- break;
152
-
153
- case 401:
154
- // Preserve server error code (e.g., INVALID_CREDENTIALS, EMAIL_NOT_VERIFIED)
155
- reject(
156
- new LicenseActivationError(
157
- message || 'Unauthorized',
158
- code || 'INVALID_KEY',
159
- details,
160
- ),
161
- );
162
- break;
163
-
164
- case 409:
165
- reject(
166
- new LicenseActivationError(
167
- message || 'Conflict',
168
- code || 'CONFLICT',
169
- details,
170
- ),
171
- );
172
- break;
173
-
174
- case 403:
175
- if (code === 'EXPIRED_KEY') {
176
- reject(LicenseActivationError.expiredKey());
177
- } else if (code === 'SEAT_LIMIT_EXCEEDED') {
178
- reject(
179
- LicenseActivationError.seatLimitExceeded(
180
- details?.used || 0,
181
- details?.max || 0,
182
- ),
183
- );
184
- } else {
185
- reject(
186
- new LicenseActivationError(
187
- message || 'Access forbidden',
188
- code || 'FORBIDDEN',
189
- details,
190
- ),
191
- );
192
- }
193
- break;
194
-
195
- case 429:
196
- reject(LicenseActivationError.rateLimited(err.retryAfter || response.retryAfter));
197
- break;
198
-
199
- case 500:
200
- case 502:
201
- case 503:
202
- case 504:
203
- // Preserve server error code if provided (e.g., BUYER_SERVICE_UNAVAILABLE)
204
- if (code) {
205
- reject(
206
- new LicenseActivationError(
207
- message || 'Server error',
208
- code,
209
- details,
210
- ),
211
- );
212
- } else {
213
- reject(LicenseActivationError.serverError());
214
- }
215
- break;
216
-
217
- default:
218
- // Preserve server error code/message when available
219
- reject(
220
- new LicenseActivationError(
221
- message || `Unexpected response: ${statusCode}`,
222
- code || 'UNEXPECTED_STATUS',
223
- details || { statusCode, response },
224
- ),
225
- );
226
- }
227
- }
228
-
229
- /**
230
- * Activate a license key.
231
- *
232
- * @param {string} key - License key (PRO-XXXX-XXXX-XXXX-XXXX)
233
- * @param {string} machineId - Machine fingerprint
234
- * @param {string} aiosCoreVersion - AIOX Core version
235
- * @returns {Promise<object>} Activation result with features, seats, cache info
236
- * @throws {LicenseActivationError} On activation failure
237
- */
238
- async activate(key, machineId, aiosCoreVersion) {
239
- // First, sync any pending deactivations
240
- await this.syncPendingDeactivation(machineId);
241
-
242
- const response = await this._request('POST', '/v1/license/activate', {
243
- key,
244
- machineId,
245
- aiosCoreVersion,
246
- });
247
-
248
- // Validate response structure
249
- if (!response.features || !Array.isArray(response.features)) {
250
- throw new LicenseActivationError(
251
- 'Invalid activation response: missing features',
252
- 'INVALID_RESPONSE',
253
- );
254
- }
255
-
256
- return {
257
- key: response.key || key,
258
- features: response.features,
259
- seats: response.seats || { used: 1, max: 1 },
260
- expiresAt: response.expiresAt,
261
- cacheValidDays: response.cacheValidDays || 30,
262
- gracePeriodDays: response.gracePeriodDays || 7,
263
- activatedAt: new Date().toISOString(),
264
- };
265
- }
266
-
267
- /**
268
- * Validate an existing license.
269
- *
270
- * @param {string} key - License key
271
- * @param {string} machineId - Machine fingerprint
272
- * @returns {Promise<object>} Validation result
273
- * @throws {LicenseActivationError} On validation failure
274
- */
275
- async validate(key, machineId) {
276
- // First, sync any pending deactivations
277
- await this.syncPendingDeactivation(machineId);
278
-
279
- const response = await this._request('POST', '/v1/license/validate', {
280
- key,
281
- machineId,
282
- });
283
-
284
- return {
285
- valid: response.valid !== false,
286
- features: response.features || [],
287
- seats: response.seats || { used: 1, max: 1 },
288
- expiresAt: response.expiresAt,
289
- cacheValidDays: response.cacheValidDays || 30,
290
- gracePeriodDays: response.gracePeriodDays || 7,
291
- };
292
- }
293
-
294
- /**
295
- * Deactivate a license from this machine.
296
- *
297
- * @param {string} key - License key
298
- * @param {string} machineId - Machine fingerprint
299
- * @returns {Promise<object>} Deactivation result
300
- * @throws {LicenseActivationError} On deactivation failure
301
- */
302
- async deactivate(key, machineId) {
303
- const response = await this._request('POST', '/v1/license/deactivate', {
304
- key,
305
- machineId,
306
- });
307
-
308
- return {
309
- success: response.success !== false,
310
- seatFreed: response.seatFreed !== false,
311
- message: response.message || 'License deactivated successfully',
312
- };
313
- }
314
-
315
- /**
316
- * Sync any pending offline deactivations with the server.
317
- *
318
- * This is called automatically before activate/validate operations.
319
- *
320
- * @param {string} machineId - Current machine ID for verification
321
- * @param {string} [baseDir] - Base directory for cache (optional)
322
- * @returns {Promise<boolean>} true if sync was performed
323
- */
324
- async syncPendingDeactivation(machineId, baseDir) {
325
- try {
326
- const pendingResult = hasPendingDeactivation(baseDir);
327
-
328
- if (!pendingResult.pending) {
329
- return false;
330
- }
331
-
332
- const pending = pendingResult.data;
333
-
334
- if (!pending || !pending.licenseKey) {
335
- // Invalid pending data, clear it
336
- clearPendingDeactivation(baseDir);
337
- return false;
338
- }
339
-
340
- // Attempt to deactivate on server
341
- try {
342
- await this._request('POST', '/v1/license/deactivate', {
343
- key: pending.licenseKey,
344
- machineId: pending.machineId || machineId,
345
- offlineDeactivation: true,
346
- offlineTimestamp: pending.deactivatedAt,
347
- });
348
-
349
- // Success - clear the pending flag
350
- clearPendingDeactivation(baseDir);
351
- return true;
352
- } catch (error) {
353
- // If the key is already deactivated or invalid, clear pending
354
- if (error.code === 'INVALID_KEY' || error.code === 'NOT_ACTIVATED') {
355
- clearPendingDeactivation(baseDir);
356
- return true;
357
- }
358
-
359
- // For other errors (network, server), keep pending for next sync
360
- // Don't throw - allow the main operation to continue
361
- return false;
362
- }
363
- } catch {
364
- // If we can't read pending state, continue anyway
365
- return false;
366
- }
367
- }
368
-
369
- // ────────────────────────────────────────────────────────────────
370
- // Auth methods (Story PRO-11 - Email Authentication)
371
- // ────────────────────────────────────────────────────────────────
372
-
373
- /**
374
- * Pre-flight check: verify buyer status and account existence for an email.
375
- *
376
- * @param {string} email - User email
377
- * @returns {Promise<object>} Result with { isBuyer, hasAccount, email }
378
- * @throws {AuthError} On check failure
379
- */
380
- async checkEmail(email) {
381
- try {
382
- const response = await this._request('POST', '/api/v1/auth/check-email', {
383
- email,
384
- });
385
-
386
- return {
387
- isBuyer: response.isBuyer === true,
388
- hasAccount: response.hasAccount === true,
389
- email: response.email || email,
390
- };
391
- } catch (error) {
392
- if (error.code === 'RATE_LIMITED') {
393
- throw AuthError.rateLimited(error.details?.retryAfter);
394
- }
395
- throw new AuthError(
396
- error.message || 'Failed to check email',
397
- error.code || 'CHECK_EMAIL_FAILED',
398
- error.details,
399
- );
400
- }
401
- }
402
-
403
- /**
404
- * Register a new user with email and password.
405
- *
406
- * @param {string} email - User email
407
- * @param {string} password - User password (min 8 characters)
408
- * @returns {Promise<object>} Signup result with { userId, message }
409
- * @throws {AuthError} On signup failure
410
- */
411
- async signup(email, password) {
412
- try {
413
- const response = await this._request('POST', '/api/v1/auth/signup', {
414
- email,
415
- password,
416
- });
417
-
418
- return {
419
- userId: response.userId,
420
- message: response.message || 'Verification email sent. Please check your inbox.',
421
- };
422
- } catch (error) {
423
- if (
424
- error.code === 'EMAIL_ALREADY_REGISTERED' ||
425
- (error.code === 'BAD_REQUEST' && error.message.includes('already'))
426
- ) {
427
- throw AuthError.emailAlreadyRegistered();
428
- }
429
- if (error.code === 'RATE_LIMITED') {
430
- throw AuthError.rateLimited(error.details?.retryAfter);
431
- }
432
- throw new AuthError(
433
- error.message || 'Signup failed',
434
- error.code || 'SIGNUP_FAILED',
435
- error.details,
436
- );
437
- }
438
- }
439
-
440
- /**
441
- * Login with email and password.
442
- *
443
- * @param {string} email - User email
444
- * @param {string} password - User password
445
- * @returns {Promise<object>} Login result with { sessionToken, userId, emailVerified }
446
- * @throws {AuthError} On login failure
447
- */
448
- async login(email, password) {
449
- try {
450
- const response = await this._request('POST', '/api/v1/auth/login', {
451
- email,
452
- password,
453
- });
454
-
455
- return {
456
- sessionToken: response.accessToken,
457
- userId: response.userId,
458
- emailVerified: response.emailVerified !== false,
459
- };
460
- } catch (error) {
461
- if (error.code === 'EMAIL_NOT_VERIFIED') {
462
- throw AuthError.emailNotVerified();
463
- }
464
- if (
465
- error.code === 'INVALID_KEY' ||
466
- error.code === 'INVALID_CREDENTIALS' ||
467
- error.code === 'BAD_REQUEST'
468
- ) {
469
- throw AuthError.invalidCredentials();
470
- }
471
- if (error.code === 'RATE_LIMITED') {
472
- throw AuthError.rateLimited(error.details?.retryAfter);
473
- }
474
- throw new AuthError(
475
- error.message || 'Login failed',
476
- error.code || 'LOGIN_FAILED',
477
- error.details,
478
- );
479
- }
480
- }
481
-
482
- /**
483
- * Check if user's email has been verified.
484
- *
485
- * @param {string} sessionToken - Session token from login/signup
486
- * @returns {Promise<object>} Status with { verified, email }
487
- * @throws {AuthError} On verification check failure
488
- */
489
- async checkEmailVerified(sessionToken) {
490
- try {
491
- const response = await this._request('POST', '/api/v1/auth/verify-status', {
492
- accessToken: sessionToken,
493
- });
494
-
495
- return {
496
- verified: response.emailVerified === true,
497
- email: response.email,
498
- };
499
- } catch (error) {
500
- throw new AuthError(
501
- error.message || 'Failed to check email verification status',
502
- error.code || 'VERIFY_CHECK_FAILED',
503
- error.details,
504
- );
505
- }
506
- }
507
-
508
- /**
509
- * Activate Pro via authenticated session.
510
- *
511
- * Server-side flow: verify session → check email verified → validate buyer → generate/recover key → activate.
512
- *
513
- * @param {string} sessionToken - Session token from login
514
- * @param {string} machineId - Machine fingerprint
515
- * @param {string} aiosCoreVersion - AIOX Core version
516
- * @returns {Promise<object>} Activation result (same shape as activate())
517
- * @throws {AuthError} On auth failure
518
- * @throws {BuyerValidationError} If user is not a buyer
519
- * @throws {LicenseActivationError} On activation failure
520
- */
521
- async activateByAuth(sessionToken, machineId, aiosCoreVersion) {
522
- try {
523
- const response = await this._request('POST', '/api/v1/auth/activate-pro', {
524
- accessToken: sessionToken,
525
- machineId,
526
- aiosCoreVersion,
527
- });
528
-
529
- if (!response.features || !Array.isArray(response.features)) {
530
- throw new LicenseActivationError(
531
- 'Invalid activation response: missing features',
532
- 'INVALID_RESPONSE',
533
- );
534
- }
535
-
536
- return {
537
- key: response.licenseKey || response.key,
538
- features: response.features,
539
- seats: response.seats || { used: 1, max: 3 },
540
- expiresAt: response.expiresAt,
541
- cacheValidDays: response.cacheValidDays || 30,
542
- gracePeriodDays: response.gracePeriodDays || 7,
543
- activatedAt: new Date().toISOString(),
544
- };
545
- } catch (error) {
546
- // Re-throw typed errors
547
- if (error instanceof AuthError || error instanceof BuyerValidationError) {
548
- throw error;
549
- }
550
-
551
- if (error.code === 'EMAIL_NOT_VERIFIED') {
552
- throw AuthError.emailNotVerified();
553
- }
554
- if (error.code === 'NOT_A_BUYER') {
555
- throw BuyerValidationError.notABuyer();
556
- }
557
- if (error.code === 'BUYER_SERVICE_UNAVAILABLE') {
558
- throw BuyerValidationError.serviceUnavailable();
559
- }
560
- if (error.code === 'SEAT_LIMIT_EXCEEDED') {
561
- throw LicenseActivationError.seatLimitExceeded(
562
- error.details?.used || 0,
563
- error.details?.max || 0,
564
- );
565
- }
566
-
567
- throw new AuthError(
568
- error.message || 'Pro activation failed',
569
- error.code || 'ACTIVATE_PRO_FAILED',
570
- error.details,
571
- );
572
- }
573
- }
574
-
575
- /**
576
- * Request a password reset email via Supabase.
577
- *
578
- * @param {string} email - User email address
579
- * @returns {Promise<object>} Result with { message }
580
- * @throws {AuthError} On failure
581
- */
582
- async requestPasswordReset(email) {
583
- try {
584
- const response = await this._request('POST', '/api/v1/auth/request-reset', {
585
- email,
586
- });
587
-
588
- return {
589
- message: response.message || 'If this email is associated with an account, you will receive reset instructions.',
590
- };
591
- } catch (error) {
592
- if (error.code === 'RATE_LIMITED') {
593
- throw AuthError.rateLimited(error.details?.retryAfter);
594
- }
595
- throw new AuthError(
596
- error.message || 'Failed to request password reset',
597
- error.code || 'REQUEST_RESET_FAILED',
598
- error.details,
599
- );
600
- }
601
- }
602
-
603
- /**
604
- * Resend email verification.
605
- *
606
- * @param {string} email - User email address
607
- * @returns {Promise<object>} Result with { message }
608
- * @throws {AuthError} On failure
609
- */
610
- async resendVerification(email) {
611
- try {
612
- const response = await this._request('POST', '/api/v1/auth/resend-verification', {
613
- email,
614
- });
615
-
616
- return {
617
- message: response.message || 'Verification email resent.',
618
- };
619
- } catch (error) {
620
- if (error.code === 'RATE_LIMITED') {
621
- throw AuthError.rateLimited(error.details?.retryAfter);
622
- }
623
- throw new AuthError(
624
- error.message || 'Failed to resend verification email',
625
- error.code || 'RESEND_FAILED',
626
- error.details,
627
- );
628
- }
629
- }
630
-
631
- /**
632
- * Check if the API server is reachable.
633
- *
634
- * @returns {Promise<boolean>} true if server is reachable
635
- */
636
- async isOnline() {
637
- try {
638
- const url = new URL('/health', this.baseUrl);
639
- const isHttps = url.protocol === 'https:';
640
- const client = isHttps ? https : http;
641
-
642
- return new Promise((resolve) => {
643
- const req = client.request(
644
- {
645
- method: 'HEAD',
646
- hostname: url.hostname,
647
- port: url.port || (isHttps ? 443 : 80),
648
- path: url.pathname,
649
- timeout: 3000, // Quick check
650
- },
651
- (res) => {
652
- resolve(res.statusCode < 500);
653
- },
654
- );
655
-
656
- req.on('timeout', () => {
657
- req.destroy();
658
- resolve(false);
659
- });
660
-
661
- req.on('error', () => {
662
- resolve(false);
663
- });
664
-
665
- req.end();
666
- });
667
- } catch {
668
- return false;
669
- }
670
- }
671
- }
672
-
673
- // Singleton instance
674
- const licenseApi = new LicenseApiClient();
675
-
676
- module.exports = {
677
- LicenseApiClient,
678
- licenseApi,
679
- };
1
+ /**
2
+ * License API Client
3
+ *
4
+ * HTTP client for communicating with the license validation server.
5
+ * Supports activation, validation, deactivation, and offline sync.
6
+ *
7
+ * @module pro/license/license-api
8
+ * @see ADR-PRO-003 - Feature Gating & Licensing
9
+ * @see Story PRO-6 - License Key & Feature Gating System
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ const https = require('https');
15
+ const http = require('http');
16
+ const { URL } = require('url');
17
+ const { LicenseActivationError, AuthError, BuyerValidationError } = require('./errors');
18
+ const { hasPendingDeactivation, clearPendingDeactivation } = require('./license-cache');
19
+
20
+ /**
21
+ * Default configuration.
22
+ */
23
+ const CONFIG = {
24
+ BASE_URL: process.env.AIOX_LICENSE_API_URL || 'https://aiox-license-server.vercel.app',
25
+ TIMEOUT_MS: 10000,
26
+ MAX_RETRIES: 3,
27
+ RETRY_DELAY_MS: 1000,
28
+ USER_AGENT: 'AIOX-Pro-License-Client/1.0',
29
+ };
30
+
31
+ /**
32
+ * LicenseApiClient - HTTP client for license operations.
33
+ */
34
+ class LicenseApiClient {
35
+ /**
36
+ * Create a LicenseApiClient.
37
+ *
38
+ * @param {object} [options] - Client options
39
+ * @param {string} [options.baseUrl] - Base URL for API (default: api.synkra.ai)
40
+ * @param {number} [options.timeoutMs] - Request timeout in ms (default: 10000)
41
+ */
42
+ constructor(options = {}) {
43
+ this.baseUrl = options.baseUrl || CONFIG.BASE_URL;
44
+ this.timeoutMs = options.timeoutMs || CONFIG.TIMEOUT_MS;
45
+ }
46
+
47
+ /**
48
+ * Make an HTTP request with timeout and abort support.
49
+ *
50
+ * @private
51
+ * @param {string} method - HTTP method
52
+ * @param {string} path - API path
53
+ * @param {object} body - Request body
54
+ * @returns {Promise<object>} Response data
55
+ * @throws {LicenseActivationError} On network or server errors
56
+ */
57
+ async _request(method, path, body) {
58
+ const url = new URL(path, this.baseUrl);
59
+ const isHttps = url.protocol === 'https:';
60
+ const client = isHttps ? https : http;
61
+
62
+ const requestData = JSON.stringify(body);
63
+
64
+ const options = {
65
+ method,
66
+ hostname: url.hostname,
67
+ port: url.port || (isHttps ? 443 : 80),
68
+ path: url.pathname + url.search,
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ 'Content-Length': Buffer.byteLength(requestData),
72
+ 'User-Agent': CONFIG.USER_AGENT,
73
+ Accept: 'application/json',
74
+ },
75
+ timeout: this.timeoutMs,
76
+ };
77
+
78
+ return new Promise((resolve, reject) => {
79
+ const req = client.request(options, (res) => {
80
+ // Follow 301/302/307/308 redirects (safety net for domain migrations)
81
+ if ([301, 302, 307, 308].includes(res.statusCode) && res.headers.location) {
82
+ const redirectUrl = new (require('url').URL)(res.headers.location);
83
+ const redirectOpts = { ...options, hostname: redirectUrl.hostname, path: redirectUrl.pathname + redirectUrl.search };
84
+ const rReq = client.request(redirectOpts, (rRes) => {
85
+ let rData = '';
86
+ rRes.on('data', (chunk) => { rData += chunk; });
87
+ rRes.on('end', () => {
88
+ try {
89
+ const response = rData ? JSON.parse(rData) : {};
90
+ this._handleResponse(rRes.statusCode, response, resolve, reject);
91
+ } catch {
92
+ reject(new LicenseActivationError('Invalid response from license server', 'INVALID_RESPONSE', { rawData: rData.substring(0, 200) }));
93
+ }
94
+ });
95
+ });
96
+ rReq.on('error', (error) => reject(LicenseActivationError.networkError(error)));
97
+ rReq.write(requestData);
98
+ rReq.end();
99
+ return;
100
+ }
101
+
102
+ let data = '';
103
+
104
+ res.on('data', (chunk) => {
105
+ data += chunk;
106
+ });
107
+
108
+ res.on('end', () => {
109
+ try {
110
+ const response = data ? JSON.parse(data) : {};
111
+ this._handleResponse(res.statusCode, response, resolve, reject);
112
+ } catch {
113
+ reject(
114
+ new LicenseActivationError(
115
+ 'Invalid response from license server',
116
+ 'INVALID_RESPONSE',
117
+ { rawData: data.substring(0, 200) },
118
+ ),
119
+ );
120
+ }
121
+ });
122
+ });
123
+
124
+ // Handle request timeout
125
+ req.on('timeout', () => {
126
+ req.destroy();
127
+ reject(LicenseActivationError.networkError(new Error('Request timeout')));
128
+ });
129
+
130
+ // Handle request error
131
+ req.on('error', (error) => {
132
+ reject(LicenseActivationError.networkError(error));
133
+ });
134
+
135
+ // Send request body
136
+ req.write(requestData);
137
+ req.end();
138
+ });
139
+ }
140
+
141
+ /**
142
+ * Handle HTTP response based on status code.
143
+ *
144
+ * @private
145
+ * @param {number} statusCode - HTTP status code
146
+ * @param {object} response - Parsed response body
147
+ * @param {Function} resolve - Promise resolve
148
+ * @param {Function} reject - Promise reject
149
+ */
150
+ _handleResponse(statusCode, response, resolve, reject) {
151
+ // Success
152
+ if (statusCode >= 200 && statusCode < 300) {
153
+ resolve(response);
154
+ return;
155
+ }
156
+
157
+ // Normalize server error envelope: { error: { code, message, details } } → flat
158
+ const err = response.error || response;
159
+ const code = err.code;
160
+ const message = err.message;
161
+ const details = err.details;
162
+
163
+ // Client errors
164
+ switch (statusCode) {
165
+ case 400:
166
+ reject(
167
+ new LicenseActivationError(
168
+ message || 'Invalid request',
169
+ code || 'BAD_REQUEST',
170
+ details,
171
+ ),
172
+ );
173
+ break;
174
+
175
+ case 401:
176
+ // Preserve server error code (e.g., INVALID_CREDENTIALS, EMAIL_NOT_VERIFIED)
177
+ reject(
178
+ new LicenseActivationError(
179
+ message || 'Unauthorized',
180
+ code || 'INVALID_KEY',
181
+ details,
182
+ ),
183
+ );
184
+ break;
185
+
186
+ case 409:
187
+ reject(
188
+ new LicenseActivationError(
189
+ message || 'Conflict',
190
+ code || 'CONFLICT',
191
+ details,
192
+ ),
193
+ );
194
+ break;
195
+
196
+ case 403:
197
+ if (code === 'EXPIRED_KEY') {
198
+ reject(LicenseActivationError.expiredKey());
199
+ } else if (code === 'SEAT_LIMIT_EXCEEDED') {
200
+ reject(
201
+ LicenseActivationError.seatLimitExceeded(
202
+ details?.used || 0,
203
+ details?.max || 0,
204
+ ),
205
+ );
206
+ } else {
207
+ reject(
208
+ new LicenseActivationError(
209
+ message || 'Access forbidden',
210
+ code || 'FORBIDDEN',
211
+ details,
212
+ ),
213
+ );
214
+ }
215
+ break;
216
+
217
+ case 429:
218
+ reject(LicenseActivationError.rateLimited(err.retryAfter || response.retryAfter));
219
+ break;
220
+
221
+ case 500:
222
+ case 502:
223
+ case 503:
224
+ case 504:
225
+ // Preserve server error code if provided (e.g., BUYER_SERVICE_UNAVAILABLE)
226
+ if (code) {
227
+ reject(
228
+ new LicenseActivationError(
229
+ message || 'Server error',
230
+ code,
231
+ details,
232
+ ),
233
+ );
234
+ } else {
235
+ reject(LicenseActivationError.serverError());
236
+ }
237
+ break;
238
+
239
+ default:
240
+ // Preserve server error code/message when available
241
+ reject(
242
+ new LicenseActivationError(
243
+ message || `Unexpected response: ${statusCode}`,
244
+ code || 'UNEXPECTED_STATUS',
245
+ details || { statusCode, response },
246
+ ),
247
+ );
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Activate a license key.
253
+ *
254
+ * @param {string} key - License key (PRO-XXXX-XXXX-XXXX-XXXX)
255
+ * @param {string} machineId - Machine fingerprint
256
+ * @param {string} aiosCoreVersion - AIOX Core version
257
+ * @returns {Promise<object>} Activation result with features, seats, cache info
258
+ * @throws {LicenseActivationError} On activation failure
259
+ */
260
+ async activate(key, machineId, aiosCoreVersion) {
261
+ // First, sync any pending deactivations
262
+ await this.syncPendingDeactivation(machineId);
263
+
264
+ const response = await this._request('POST', '/v1/license/activate', {
265
+ key,
266
+ machineId,
267
+ aiosCoreVersion,
268
+ });
269
+
270
+ // Validate response structure
271
+ if (!response.features || !Array.isArray(response.features)) {
272
+ throw new LicenseActivationError(
273
+ 'Invalid activation response: missing features',
274
+ 'INVALID_RESPONSE',
275
+ );
276
+ }
277
+
278
+ return {
279
+ key: response.key || key,
280
+ features: response.features,
281
+ seats: response.seats || { used: 1, max: 1 },
282
+ expiresAt: response.expiresAt,
283
+ cacheValidDays: response.cacheValidDays || 30,
284
+ gracePeriodDays: response.gracePeriodDays || 7,
285
+ activatedAt: new Date().toISOString(),
286
+ };
287
+ }
288
+
289
+ /**
290
+ * Validate an existing license.
291
+ *
292
+ * @param {string} key - License key
293
+ * @param {string} machineId - Machine fingerprint
294
+ * @returns {Promise<object>} Validation result
295
+ * @throws {LicenseActivationError} On validation failure
296
+ */
297
+ async validate(key, machineId) {
298
+ // First, sync any pending deactivations
299
+ await this.syncPendingDeactivation(machineId);
300
+
301
+ const response = await this._request('POST', '/v1/license/validate', {
302
+ key,
303
+ machineId,
304
+ });
305
+
306
+ return {
307
+ valid: response.valid !== false,
308
+ features: response.features || [],
309
+ seats: response.seats || { used: 1, max: 1 },
310
+ expiresAt: response.expiresAt,
311
+ cacheValidDays: response.cacheValidDays || 30,
312
+ gracePeriodDays: response.gracePeriodDays || 7,
313
+ };
314
+ }
315
+
316
+ /**
317
+ * Deactivate a license from this machine.
318
+ *
319
+ * @param {string} key - License key
320
+ * @param {string} machineId - Machine fingerprint
321
+ * @returns {Promise<object>} Deactivation result
322
+ * @throws {LicenseActivationError} On deactivation failure
323
+ */
324
+ async deactivate(key, machineId) {
325
+ const response = await this._request('POST', '/v1/license/deactivate', {
326
+ key,
327
+ machineId,
328
+ });
329
+
330
+ return {
331
+ success: response.success !== false,
332
+ seatFreed: response.seatFreed !== false,
333
+ message: response.message || 'License deactivated successfully',
334
+ };
335
+ }
336
+
337
+ /**
338
+ * Sync any pending offline deactivations with the server.
339
+ *
340
+ * This is called automatically before activate/validate operations.
341
+ *
342
+ * @param {string} machineId - Current machine ID for verification
343
+ * @param {string} [baseDir] - Base directory for cache (optional)
344
+ * @returns {Promise<boolean>} true if sync was performed
345
+ */
346
+ async syncPendingDeactivation(machineId, baseDir) {
347
+ try {
348
+ const pendingResult = hasPendingDeactivation(baseDir);
349
+
350
+ if (!pendingResult.pending) {
351
+ return false;
352
+ }
353
+
354
+ const pending = pendingResult.data;
355
+
356
+ if (!pending || !pending.licenseKey) {
357
+ // Invalid pending data, clear it
358
+ clearPendingDeactivation(baseDir);
359
+ return false;
360
+ }
361
+
362
+ // Attempt to deactivate on server
363
+ try {
364
+ await this._request('POST', '/v1/license/deactivate', {
365
+ key: pending.licenseKey,
366
+ machineId: pending.machineId || machineId,
367
+ offlineDeactivation: true,
368
+ offlineTimestamp: pending.deactivatedAt,
369
+ });
370
+
371
+ // Success - clear the pending flag
372
+ clearPendingDeactivation(baseDir);
373
+ return true;
374
+ } catch (error) {
375
+ // If the key is already deactivated or invalid, clear pending
376
+ if (error.code === 'INVALID_KEY' || error.code === 'NOT_ACTIVATED') {
377
+ clearPendingDeactivation(baseDir);
378
+ return true;
379
+ }
380
+
381
+ // For other errors (network, server), keep pending for next sync
382
+ // Don't throw - allow the main operation to continue
383
+ return false;
384
+ }
385
+ } catch {
386
+ // If we can't read pending state, continue anyway
387
+ return false;
388
+ }
389
+ }
390
+
391
+ // ────────────────────────────────────────────────────────────────
392
+ // Auth methods (Story PRO-11 - Email Authentication)
393
+ // ────────────────────────────────────────────────────────────────
394
+
395
+ /**
396
+ * Pre-flight check: verify buyer status and account existence for an email.
397
+ *
398
+ * @param {string} email - User email
399
+ * @returns {Promise<object>} Result with { isBuyer, hasAccount, email }
400
+ * @throws {AuthError} On check failure
401
+ */
402
+ async checkEmail(email) {
403
+ try {
404
+ const response = await this._request('POST', '/api/v1/auth/check-email', {
405
+ email,
406
+ });
407
+
408
+ return {
409
+ isBuyer: response.isBuyer === true,
410
+ hasAccount: response.hasAccount === true,
411
+ email: response.email || email,
412
+ };
413
+ } catch (error) {
414
+ if (error.code === 'RATE_LIMITED') {
415
+ throw AuthError.rateLimited(error.details?.retryAfter);
416
+ }
417
+ throw new AuthError(
418
+ error.message || 'Failed to check email',
419
+ error.code || 'CHECK_EMAIL_FAILED',
420
+ error.details,
421
+ );
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Register a new user with email and password.
427
+ *
428
+ * @param {string} email - User email
429
+ * @param {string} password - User password (min 8 characters)
430
+ * @returns {Promise<object>} Signup result with { userId, message }
431
+ * @throws {AuthError} On signup failure
432
+ */
433
+ async signup(email, password) {
434
+ try {
435
+ const response = await this._request('POST', '/api/v1/auth/signup', {
436
+ email,
437
+ password,
438
+ });
439
+
440
+ return {
441
+ userId: response.userId,
442
+ message: response.message || 'Verification email sent. Please check your inbox.',
443
+ };
444
+ } catch (error) {
445
+ if (
446
+ error.code === 'EMAIL_ALREADY_REGISTERED' ||
447
+ (error.code === 'BAD_REQUEST' && error.message.includes('already'))
448
+ ) {
449
+ throw AuthError.emailAlreadyRegistered();
450
+ }
451
+ if (error.code === 'RATE_LIMITED') {
452
+ throw AuthError.rateLimited(error.details?.retryAfter);
453
+ }
454
+ throw new AuthError(
455
+ error.message || 'Signup failed',
456
+ error.code || 'SIGNUP_FAILED',
457
+ error.details,
458
+ );
459
+ }
460
+ }
461
+
462
+ /**
463
+ * Login with email and password.
464
+ *
465
+ * @param {string} email - User email
466
+ * @param {string} password - User password
467
+ * @returns {Promise<object>} Login result with { sessionToken, userId, emailVerified }
468
+ * @throws {AuthError} On login failure
469
+ */
470
+ async login(email, password) {
471
+ try {
472
+ const response = await this._request('POST', '/api/v1/auth/login', {
473
+ email,
474
+ password,
475
+ });
476
+
477
+ return {
478
+ sessionToken: response.accessToken,
479
+ userId: response.userId,
480
+ emailVerified: response.emailVerified !== false,
481
+ };
482
+ } catch (error) {
483
+ if (error.code === 'EMAIL_NOT_VERIFIED') {
484
+ throw AuthError.emailNotVerified();
485
+ }
486
+ if (
487
+ error.code === 'INVALID_KEY' ||
488
+ error.code === 'INVALID_CREDENTIALS' ||
489
+ error.code === 'BAD_REQUEST'
490
+ ) {
491
+ throw AuthError.invalidCredentials();
492
+ }
493
+ if (error.code === 'RATE_LIMITED') {
494
+ throw AuthError.rateLimited(error.details?.retryAfter);
495
+ }
496
+ throw new AuthError(
497
+ error.message || 'Login failed',
498
+ error.code || 'LOGIN_FAILED',
499
+ error.details,
500
+ );
501
+ }
502
+ }
503
+
504
+ /**
505
+ * Check if user's email has been verified.
506
+ *
507
+ * @param {string} sessionToken - Session token from login/signup
508
+ * @returns {Promise<object>} Status with { verified, email }
509
+ * @throws {AuthError} On verification check failure
510
+ */
511
+ async checkEmailVerified(sessionToken) {
512
+ try {
513
+ const response = await this._request('POST', '/api/v1/auth/verify-status', {
514
+ accessToken: sessionToken,
515
+ });
516
+
517
+ return {
518
+ verified: response.emailVerified === true,
519
+ email: response.email,
520
+ };
521
+ } catch (error) {
522
+ throw new AuthError(
523
+ error.message || 'Failed to check email verification status',
524
+ error.code || 'VERIFY_CHECK_FAILED',
525
+ error.details,
526
+ );
527
+ }
528
+ }
529
+
530
+ /**
531
+ * Activate Pro via authenticated session.
532
+ *
533
+ * Server-side flow: verify session → check email verified → validate buyer → generate/recover key → activate.
534
+ *
535
+ * @param {string} sessionToken - Session token from login
536
+ * @param {string} machineId - Machine fingerprint
537
+ * @param {string} aiosCoreVersion - AIOX Core version
538
+ * @returns {Promise<object>} Activation result (same shape as activate())
539
+ * @throws {AuthError} On auth failure
540
+ * @throws {BuyerValidationError} If user is not a buyer
541
+ * @throws {LicenseActivationError} On activation failure
542
+ */
543
+ async activateByAuth(sessionToken, machineId, aiosCoreVersion) {
544
+ try {
545
+ const response = await this._request('POST', '/api/v1/auth/activate-pro', {
546
+ accessToken: sessionToken,
547
+ machineId,
548
+ aiosCoreVersion,
549
+ });
550
+
551
+ if (!response.features || !Array.isArray(response.features)) {
552
+ throw new LicenseActivationError(
553
+ 'Invalid activation response: missing features',
554
+ 'INVALID_RESPONSE',
555
+ );
556
+ }
557
+
558
+ return {
559
+ key: response.licenseKey || response.key,
560
+ features: response.features,
561
+ seats: response.seats || { used: 1, max: 3 },
562
+ expiresAt: response.expiresAt,
563
+ cacheValidDays: response.cacheValidDays || 30,
564
+ gracePeriodDays: response.gracePeriodDays || 7,
565
+ activatedAt: new Date().toISOString(),
566
+ };
567
+ } catch (error) {
568
+ // Re-throw typed errors
569
+ if (error instanceof AuthError || error instanceof BuyerValidationError) {
570
+ throw error;
571
+ }
572
+
573
+ if (error.code === 'EMAIL_NOT_VERIFIED') {
574
+ throw AuthError.emailNotVerified();
575
+ }
576
+ if (error.code === 'NOT_A_BUYER') {
577
+ throw BuyerValidationError.notABuyer();
578
+ }
579
+ if (error.code === 'BUYER_SERVICE_UNAVAILABLE') {
580
+ throw BuyerValidationError.serviceUnavailable();
581
+ }
582
+ if (error.code === 'SEAT_LIMIT_EXCEEDED') {
583
+ throw LicenseActivationError.seatLimitExceeded(
584
+ error.details?.used || 0,
585
+ error.details?.max || 0,
586
+ );
587
+ }
588
+
589
+ throw new AuthError(
590
+ error.message || 'Pro activation failed',
591
+ error.code || 'ACTIVATE_PRO_FAILED',
592
+ error.details,
593
+ );
594
+ }
595
+ }
596
+
597
+ /**
598
+ * Request a password reset email via Supabase.
599
+ *
600
+ * @param {string} email - User email address
601
+ * @returns {Promise<object>} Result with { message }
602
+ * @throws {AuthError} On failure
603
+ */
604
+ async requestPasswordReset(email) {
605
+ try {
606
+ const response = await this._request('POST', '/api/v1/auth/request-reset', {
607
+ email,
608
+ });
609
+
610
+ return {
611
+ message: response.message || 'If this email is associated with an account, you will receive reset instructions.',
612
+ };
613
+ } catch (error) {
614
+ if (error.code === 'RATE_LIMITED') {
615
+ throw AuthError.rateLimited(error.details?.retryAfter);
616
+ }
617
+ throw new AuthError(
618
+ error.message || 'Failed to request password reset',
619
+ error.code || 'REQUEST_RESET_FAILED',
620
+ error.details,
621
+ );
622
+ }
623
+ }
624
+
625
+ /**
626
+ * Resend email verification.
627
+ *
628
+ * @param {string} email - User email address
629
+ * @returns {Promise<object>} Result with { message }
630
+ * @throws {AuthError} On failure
631
+ */
632
+ async resendVerification(email) {
633
+ try {
634
+ const response = await this._request('POST', '/api/v1/auth/resend-verification', {
635
+ email,
636
+ });
637
+
638
+ return {
639
+ message: response.message || 'Verification email resent.',
640
+ };
641
+ } catch (error) {
642
+ if (error.code === 'RATE_LIMITED') {
643
+ throw AuthError.rateLimited(error.details?.retryAfter);
644
+ }
645
+ throw new AuthError(
646
+ error.message || 'Failed to resend verification email',
647
+ error.code || 'RESEND_FAILED',
648
+ error.details,
649
+ );
650
+ }
651
+ }
652
+
653
+ /**
654
+ * Check if the API server is reachable.
655
+ *
656
+ * @returns {Promise<boolean>} true if server is reachable
657
+ */
658
+ async isOnline() {
659
+ try {
660
+ const url = new URL('/health', this.baseUrl);
661
+ const isHttps = url.protocol === 'https:';
662
+ const client = isHttps ? https : http;
663
+
664
+ return new Promise((resolve) => {
665
+ const req = client.request(
666
+ {
667
+ method: 'HEAD',
668
+ hostname: url.hostname,
669
+ port: url.port || (isHttps ? 443 : 80),
670
+ path: url.pathname,
671
+ timeout: 3000, // Quick check
672
+ },
673
+ (res) => {
674
+ resolve(res.statusCode < 500);
675
+ },
676
+ );
677
+
678
+ req.on('timeout', () => {
679
+ req.destroy();
680
+ resolve(false);
681
+ });
682
+
683
+ req.on('error', () => {
684
+ resolve(false);
685
+ });
686
+
687
+ req.end();
688
+ });
689
+ } catch {
690
+ return false;
691
+ }
692
+ }
693
+ }
694
+
695
+ // Singleton instance
696
+ const licenseApi = new LicenseApiClient();
697
+
698
+ module.exports = {
699
+ LicenseApiClient,
700
+ licenseApi,
701
+ };