aios-core 4.2.15 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.aios-core/cli/commands/validate/index.js +1 -1
  2. package/.aios-core/core/code-intel/code-intel-client.js +19 -5
  3. package/.aios-core/core/code-intel/helpers/creation-helper.js +183 -0
  4. package/.aios-core/core/code-intel/helpers/devops-helper.js +166 -0
  5. package/.aios-core/core/code-intel/helpers/planning-helper.js +248 -0
  6. package/.aios-core/core/code-intel/helpers/qa-helper.js +187 -0
  7. package/.aios-core/core/code-intel/helpers/story-helper.js +146 -0
  8. package/.aios-core/core/code-intel/hook-runtime.js +186 -0
  9. package/.aios-core/core/code-intel/index.js +2 -0
  10. package/.aios-core/core/code-intel/providers/code-graph-provider.js +8 -0
  11. package/.aios-core/core/code-intel/providers/provider-interface.js +9 -0
  12. package/.aios-core/core/code-intel/providers/registry-provider.js +515 -0
  13. package/.aios-core/core/config/schemas/framework-config.schema.json +155 -7
  14. package/.aios-core/core/config/schemas/project-config.schema.json +329 -15
  15. package/.aios-core/core/config/template-overrides.js +84 -0
  16. package/.aios-core/core/docs/troubleshooting-guide.md +1 -1
  17. package/.aios-core/core/doctor/checks/agent-memory.js +63 -0
  18. package/.aios-core/core/doctor/checks/claude-md.js +56 -0
  19. package/.aios-core/core/doctor/checks/code-intel.js +131 -0
  20. package/.aios-core/core/doctor/checks/commands-count.js +81 -0
  21. package/.aios-core/core/doctor/checks/core-config.js +53 -0
  22. package/.aios-core/core/doctor/checks/entity-registry.js +53 -0
  23. package/.aios-core/core/doctor/checks/git-hooks.js +50 -0
  24. package/.aios-core/core/doctor/checks/graph-dashboard.js +48 -0
  25. package/.aios-core/core/doctor/checks/hooks-claude-count.js +118 -0
  26. package/.aios-core/core/doctor/checks/ide-sync.js +85 -0
  27. package/.aios-core/core/doctor/checks/index.js +46 -0
  28. package/.aios-core/core/doctor/checks/node-version.js +33 -0
  29. package/.aios-core/core/doctor/checks/npm-packages.js +35 -0
  30. package/.aios-core/core/doctor/checks/rules-files.js +61 -0
  31. package/.aios-core/core/doctor/checks/settings-json.js +121 -0
  32. package/.aios-core/core/doctor/checks/skills-count.js +72 -0
  33. package/.aios-core/core/doctor/fix-handler.js +165 -0
  34. package/.aios-core/core/doctor/formatters/json.js +14 -0
  35. package/.aios-core/core/doctor/formatters/text.js +59 -0
  36. package/.aios-core/core/doctor/index.js +94 -0
  37. package/.aios-core/core/graph-dashboard/cli.js +361 -0
  38. package/.aios-core/core/graph-dashboard/data-sources/code-intel-source.js +234 -0
  39. package/.aios-core/core/graph-dashboard/data-sources/metrics-source.js +95 -0
  40. package/.aios-core/core/graph-dashboard/data-sources/registry-source.js +106 -0
  41. package/.aios-core/core/graph-dashboard/formatters/dot-formatter.js +45 -0
  42. package/.aios-core/core/graph-dashboard/formatters/html-formatter.js +1437 -0
  43. package/.aios-core/core/graph-dashboard/formatters/json-formatter.js +13 -0
  44. package/.aios-core/core/graph-dashboard/formatters/mermaid-formatter.js +59 -0
  45. package/.aios-core/core/graph-dashboard/index.js +21 -0
  46. package/.aios-core/core/graph-dashboard/renderers/stats-renderer.js +217 -0
  47. package/.aios-core/core/graph-dashboard/renderers/status-renderer.js +125 -0
  48. package/.aios-core/core/graph-dashboard/renderers/tree-renderer.js +119 -0
  49. package/.aios-core/core/health-check/base-check.js +1 -1
  50. package/.aios-core/core/health-check/check-registry.js +1 -1
  51. package/.aios-core/core/health-check/checks/deployment/build-config.js +1 -1
  52. package/.aios-core/core/health-check/checks/deployment/ci-config.js +1 -1
  53. package/.aios-core/core/health-check/checks/deployment/deployment-readiness.js +1 -1
  54. package/.aios-core/core/health-check/checks/deployment/docker-config.js +1 -1
  55. package/.aios-core/core/health-check/checks/deployment/env-file.js +1 -1
  56. package/.aios-core/core/health-check/checks/deployment/index.js +1 -1
  57. package/.aios-core/core/health-check/checks/index.js +1 -1
  58. package/.aios-core/core/health-check/checks/local/disk-space.js +1 -1
  59. package/.aios-core/core/health-check/checks/local/environment-vars.js +1 -1
  60. package/.aios-core/core/health-check/checks/local/git-install.js +1 -1
  61. package/.aios-core/core/health-check/checks/local/ide-detection.js +1 -1
  62. package/.aios-core/core/health-check/checks/local/index.js +1 -1
  63. package/.aios-core/core/health-check/checks/local/memory.js +1 -1
  64. package/.aios-core/core/health-check/checks/local/network.js +1 -1
  65. package/.aios-core/core/health-check/checks/local/npm-install.js +1 -1
  66. package/.aios-core/core/health-check/checks/local/shell-environment.js +1 -1
  67. package/.aios-core/core/health-check/checks/project/agent-config.js +1 -1
  68. package/.aios-core/core/health-check/checks/project/aios-directory.js +1 -1
  69. package/.aios-core/core/health-check/checks/project/dependencies.js +1 -1
  70. package/.aios-core/core/health-check/checks/project/framework-config.js +1 -1
  71. package/.aios-core/core/health-check/checks/project/index.js +1 -1
  72. package/.aios-core/core/health-check/checks/project/node-version.js +1 -1
  73. package/.aios-core/core/health-check/checks/project/package-json.js +1 -1
  74. package/.aios-core/core/health-check/checks/project/task-definitions.js +1 -1
  75. package/.aios-core/core/health-check/checks/project/workflow-dependencies.js +1 -1
  76. package/.aios-core/core/health-check/checks/repository/branch-protection.js +1 -1
  77. package/.aios-core/core/health-check/checks/repository/commit-history.js +1 -1
  78. package/.aios-core/core/health-check/checks/repository/conflicts.js +1 -1
  79. package/.aios-core/core/health-check/checks/repository/git-repo.js +1 -1
  80. package/.aios-core/core/health-check/checks/repository/git-status.js +1 -1
  81. package/.aios-core/core/health-check/checks/repository/gitignore.js +1 -1
  82. package/.aios-core/core/health-check/checks/repository/index.js +1 -1
  83. package/.aios-core/core/health-check/checks/repository/large-files.js +1 -1
  84. package/.aios-core/core/health-check/checks/repository/lockfile-integrity.js +1 -1
  85. package/.aios-core/core/health-check/checks/services/api-endpoints.js +1 -1
  86. package/.aios-core/core/health-check/checks/services/claude-code.js +1 -1
  87. package/.aios-core/core/health-check/checks/services/gemini-cli.js +1 -1
  88. package/.aios-core/core/health-check/checks/services/github-cli.js +1 -1
  89. package/.aios-core/core/health-check/checks/services/index.js +1 -1
  90. package/.aios-core/core/health-check/checks/services/mcp-integration.js +1 -1
  91. package/.aios-core/core/health-check/engine.js +1 -1
  92. package/.aios-core/core/health-check/healers/backup-manager.js +1 -1
  93. package/.aios-core/core/health-check/healers/index.js +1 -1
  94. package/.aios-core/core/health-check/index.js +9 -2
  95. package/.aios-core/core/health-check/reporters/console.js +1 -1
  96. package/.aios-core/core/health-check/reporters/index.js +1 -1
  97. package/.aios-core/core/health-check/reporters/json.js +1 -1
  98. package/.aios-core/core/health-check/reporters/markdown.js +1 -1
  99. package/.aios-core/core/ids/layer-classifier.js +65 -0
  100. package/.aios-core/core/ids/registry-updater.js +49 -0
  101. package/.aios-core/core/index.esm.js +1 -1
  102. package/.aios-core/core/index.js +1 -1
  103. package/.aios-core/core/session/context-detector.js +2 -7
  104. package/.aios-core/core/synapse/context/context-tracker.js +9 -1
  105. package/.aios-core/core/synapse/engine.js +33 -13
  106. package/.aios-core/core/synapse/memory/memory-bridge.js +17 -43
  107. package/.aios-core/core/synapse/memory/synapse-memory-provider.js +201 -0
  108. package/.aios-core/core/synapse/runtime/hook-runtime.js +40 -2
  109. package/.aios-core/core/synapse/session/session-manager.js +3 -2
  110. package/.aios-core/core/synapse/utils/atomic-write.js +79 -0
  111. package/.aios-core/core-config.yaml +34 -1
  112. package/.aios-core/data/aios-kb.md +2 -2
  113. package/.aios-core/data/capability-detection.js +290 -0
  114. package/.aios-core/data/entity-registry.yaml +10450 -2129
  115. package/.aios-core/data/mcp-discipline.js +166 -0
  116. package/.aios-core/data/mcp-tool-examples.yaml +215 -0
  117. package/.aios-core/data/tok2-validation.js +168 -0
  118. package/.aios-core/data/tok3-token-comparison.js +123 -0
  119. package/.aios-core/data/tool-registry.yaml +648 -0
  120. package/.aios-core/data/tool-search-validation.js +174 -0
  121. package/.aios-core/data/workflow-chains.yaml +156 -0
  122. package/.aios-core/development/agents/aios-master.md +17 -10
  123. package/.aios-core/development/agents/analyst/MEMORY.md +33 -0
  124. package/.aios-core/development/agents/analyst.md +17 -10
  125. package/.aios-core/development/agents/architect/MEMORY.md +39 -0
  126. package/.aios-core/development/agents/architect.md +17 -10
  127. package/.aios-core/development/agents/data-engineer/MEMORY.md +32 -0
  128. package/.aios-core/development/agents/data-engineer.md +17 -10
  129. package/.aios-core/development/agents/dev/MEMORY.md +46 -0
  130. package/.aios-core/development/agents/dev.md +18 -11
  131. package/.aios-core/development/agents/devops/MEMORY.md +39 -0
  132. package/.aios-core/development/agents/devops.md +44 -10
  133. package/.aios-core/development/agents/pm/MEMORY.md +38 -0
  134. package/.aios-core/development/agents/pm.md +17 -10
  135. package/.aios-core/development/agents/po/MEMORY.md +45 -0
  136. package/.aios-core/development/agents/po.md +17 -10
  137. package/.aios-core/development/agents/qa/MEMORY.md +42 -0
  138. package/.aios-core/development/agents/qa.md +18 -11
  139. package/.aios-core/development/agents/sm/MEMORY.md +31 -0
  140. package/.aios-core/development/agents/sm.md +17 -10
  141. package/.aios-core/development/agents/squad-creator.md +18 -9
  142. package/.aios-core/development/agents/ux/MEMORY.md +31 -0
  143. package/.aios-core/development/agents/ux-design-expert.md +16 -9
  144. package/.aios-core/development/checklists/issue-triage-checklist.md +35 -0
  145. package/.aios-core/development/checklists/memory-audit-checklist.md +53 -0
  146. package/.aios-core/development/scripts/issue-triage.js +171 -0
  147. package/.aios-core/development/scripts/populate-entity-registry.js +412 -19
  148. package/.aios-core/development/scripts/unified-activation-pipeline.js +31 -10
  149. package/.aios-core/development/tasks/analyze-project-structure.md +48 -0
  150. package/.aios-core/development/tasks/apply-qa-fixes.md +7 -0
  151. package/.aios-core/development/tasks/architect-analyze-impact.md +8 -1
  152. package/.aios-core/development/tasks/brownfield-create-epic.md +41 -0
  153. package/.aios-core/development/tasks/brownfield-create-story.md +7 -0
  154. package/.aios-core/development/tasks/build-autonomous.md +7 -0
  155. package/.aios-core/development/tasks/create-deep-research-prompt.md +7 -0
  156. package/.aios-core/development/tasks/create-doc.md +44 -0
  157. package/.aios-core/development/tasks/create-next-story.md +17 -0
  158. package/.aios-core/development/tasks/create-suite.md +7 -0
  159. package/.aios-core/development/tasks/dev-develop-story.md +9 -1
  160. package/.aios-core/development/tasks/execute-checklist.md +7 -0
  161. package/.aios-core/development/tasks/github-devops-github-pr-automation.md +56 -0
  162. package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +70 -0
  163. package/.aios-core/development/tasks/github-issue-triage.md +118 -0
  164. package/.aios-core/development/tasks/health-check.yaml +206 -171
  165. package/.aios-core/development/tasks/kb-mode-interaction.md +3 -3
  166. package/.aios-core/development/tasks/plan-create-context.md +47 -1
  167. package/.aios-core/development/tasks/plan-create-implementation.md +55 -0
  168. package/.aios-core/development/tasks/po-close-story.md +7 -0
  169. package/.aios-core/development/tasks/pr-automation.md +5 -5
  170. package/.aios-core/development/tasks/qa-create-fix-request.md +7 -0
  171. package/.aios-core/development/tasks/qa-fix-issues.md +7 -0
  172. package/.aios-core/development/tasks/qa-gate.md +56 -0
  173. package/.aios-core/development/tasks/qa-review-story.md +32 -1
  174. package/.aios-core/development/tasks/release-management.md +7 -0
  175. package/.aios-core/development/tasks/resolve-github-issue.md +608 -0
  176. package/.aios-core/development/tasks/review-contributor-pr.md +152 -0
  177. package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
  178. package/.aios-core/development/tasks/spec-critique.md +8 -0
  179. package/.aios-core/development/tasks/spec-gather-requirements.md +7 -0
  180. package/.aios-core/development/tasks/spec-research-dependencies.md +4 -0
  181. package/.aios-core/development/tasks/spec-write-spec.md +5 -0
  182. package/.aios-core/development/tasks/triage-github-issues.md +356 -0
  183. package/.aios-core/development/tasks/validate-agents.md +4 -0
  184. package/.aios-core/development/tasks/validate-next-story.md +17 -0
  185. package/.aios-core/development/templates/agent-handoff-tmpl.yaml +48 -0
  186. package/.aios-core/development/templates/code-intel-integration-pattern.md +199 -0
  187. package/.aios-core/development/templates/ptc-entity-validation.md +113 -0
  188. package/.aios-core/development/templates/ptc-qa-gate.md +100 -0
  189. package/.aios-core/development/templates/ptc-research-aggregation.md +94 -0
  190. package/.aios-core/development/templates/service-template/README.md.hbs +158 -158
  191. package/.aios-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
  192. package/.aios-core/development/templates/service-template/client.ts.hbs +403 -403
  193. package/.aios-core/development/templates/service-template/errors.ts.hbs +182 -182
  194. package/.aios-core/development/templates/service-template/index.ts.hbs +120 -120
  195. package/.aios-core/development/templates/service-template/package.json.hbs +87 -87
  196. package/.aios-core/development/templates/service-template/types.ts.hbs +145 -145
  197. package/.aios-core/development/templates/squad/agent-template.md +11 -0
  198. package/.aios-core/development/templates/squad/task-template.md +21 -0
  199. package/.aios-core/development/templates/squad-template/LICENSE +21 -21
  200. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +1 -1
  201. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1 -1
  202. package/.aios-core/framework-config.yaml +8 -0
  203. package/.aios-core/index.esm.js +1 -1
  204. package/.aios-core/index.js +1 -1
  205. package/.aios-core/infrastructure/integrations/ai-providers/index.js +1 -1
  206. package/.aios-core/infrastructure/schemas/task-v3-schema.json +6 -0
  207. package/.aios-core/infrastructure/scripts/collect-tool-usage.js +311 -0
  208. package/.aios-core/infrastructure/scripts/generate-optimization-report.js +497 -0
  209. package/.aios-core/infrastructure/scripts/generate-settings-json.js +300 -0
  210. package/.aios-core/infrastructure/scripts/git-config-detector.js +65 -9
  211. package/.aios-core/infrastructure/scripts/ide-sync/index.js +3 -1
  212. package/.aios-core/infrastructure/scripts/ide-sync/transformers/github-copilot.js +184 -0
  213. package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
  214. package/.aios-core/infrastructure/templates/aios-sync.yaml.template +182 -182
  215. package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -279
  216. package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
  217. package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
  218. package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
  219. package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -63
  220. package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
  221. package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
  222. package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
  223. package/.aios-core/install-manifest.yaml +613 -305
  224. package/.aios-core/lib/build.json +1 -0
  225. package/.aios-core/local-config.yaml.template +71 -71
  226. package/.aios-core/monitor/hooks/lib/__init__.py +1 -1
  227. package/.aios-core/monitor/hooks/lib/enrich.py +58 -58
  228. package/.aios-core/monitor/hooks/lib/send_event.py +47 -47
  229. package/.aios-core/monitor/hooks/notification.py +29 -29
  230. package/.aios-core/monitor/hooks/post_tool_use.py +45 -45
  231. package/.aios-core/monitor/hooks/pre_compact.py +29 -29
  232. package/.aios-core/monitor/hooks/pre_tool_use.py +40 -40
  233. package/.aios-core/monitor/hooks/stop.py +29 -29
  234. package/.aios-core/monitor/hooks/subagent_stop.py +29 -29
  235. package/.aios-core/monitor/hooks/user_prompt_submit.py +38 -38
  236. package/.aios-core/product/templates/adr.hbs +125 -125
  237. package/.aios-core/product/templates/dbdr.hbs +241 -241
  238. package/.aios-core/product/templates/epic.hbs +212 -212
  239. package/.aios-core/product/templates/ide-rules/claude-rules.md +125 -0
  240. package/.aios-core/product/templates/pmdr.hbs +186 -186
  241. package/.aios-core/product/templates/prd-v2.0.hbs +216 -216
  242. package/.aios-core/product/templates/prd.hbs +201 -201
  243. package/.aios-core/product/templates/story.hbs +263 -263
  244. package/.aios-core/product/templates/task.hbs +170 -170
  245. package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -158
  246. package/.aios-core/product/templates/tmpl-migration-script.sql +91 -91
  247. package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
  248. package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
  249. package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -135
  250. package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -77
  251. package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -152
  252. package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -77
  253. package/.aios-core/product/templates/tmpl-seed-data.sql +140 -140
  254. package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -16
  255. package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
  256. package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -140
  257. package/.aios-core/product/templates/tmpl-trigger.sql +152 -152
  258. package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -133
  259. package/.aios-core/product/templates/tmpl-view.sql +177 -177
  260. package/.aios-core/scripts/pm.sh +0 -0
  261. package/.aios-core/user-guide.md +15 -15
  262. package/.aios-core/utils/filters/constants.js +10 -0
  263. package/.aios-core/utils/filters/content-filter.js +223 -0
  264. package/.aios-core/utils/filters/field-filter.js +126 -0
  265. package/.aios-core/utils/filters/index.js +180 -0
  266. package/.aios-core/utils/filters/schema-filter.js +157 -0
  267. package/.claude/CLAUDE.md +62 -0
  268. package/.claude/hooks/enforce-architecture-first.py +196 -196
  269. package/.claude/hooks/enforce-git-push-authority.sh +33 -0
  270. package/.claude/hooks/mind-clone-governance.py +192 -192
  271. package/.claude/hooks/read-protection.py +151 -151
  272. package/.claude/hooks/slug-validation.py +176 -176
  273. package/.claude/hooks/sql-governance.py +182 -182
  274. package/.claude/hooks/synapse-engine.cjs +28 -5
  275. package/.claude/hooks/write-path-validation.py +194 -194
  276. package/.claude/rules/agent-authority.md +105 -0
  277. package/.claude/rules/agent-handoff.md +97 -0
  278. package/.claude/rules/agent-memory-imports.md +15 -0
  279. package/.claude/rules/coderabbit-integration.md +101 -0
  280. package/.claude/rules/ids-principles.md +119 -0
  281. package/.claude/rules/story-lifecycle.md +145 -0
  282. package/.claude/rules/tool-examples.md +64 -0
  283. package/.claude/rules/tool-response-filtering.md +57 -0
  284. package/.claude/rules/workflow-execution.md +150 -0
  285. package/LICENSE +33 -33
  286. package/bin/aios-graph.js +9 -0
  287. package/bin/aios-init.js +2 -2
  288. package/bin/aios-minimal.js +0 -0
  289. package/bin/aios.js +17 -221
  290. package/bin/utils/detect-fsmonitor.js +70 -0
  291. package/bin/utils/framework-guard.js +238 -0
  292. package/bin/utils/validate-publish.js +108 -0
  293. package/package.json +6 -3
  294. package/packages/aios-install/bin/aios-install.js +0 -0
  295. package/packages/aios-install/bin/edmcp.js +0 -0
  296. package/packages/aios-pro-cli/bin/aios-pro.js +2 -0
  297. package/packages/installer/src/config/templates/core-config-template.js +25 -0
  298. package/packages/installer/src/installer/brownfield-upgrader.js +68 -5
  299. package/packages/installer/src/merger/index.js +3 -0
  300. package/packages/installer/src/merger/strategies/index.js +6 -0
  301. package/packages/installer/src/merger/strategies/yaml-merger.js +181 -0
  302. package/packages/installer/src/updater/index.js +4 -4
  303. package/packages/installer/src/wizard/i18n.js +321 -3
  304. package/packages/installer/src/wizard/ide-config-generator.js +173 -25
  305. package/packages/installer/src/wizard/index.js +119 -1
  306. package/packages/installer/src/wizard/pro-setup.js +137 -121
  307. package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +271 -0
  308. package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +192 -0
  309. package/packages/installer/tests/unit/doctor/doctor-checks.test.js +610 -0
  310. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +134 -0
  311. package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +186 -0
  312. package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +309 -0
  313. package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +230 -0
  314. package/packages/installer/tests/unit/merger/strategies.test.js +2 -2
  315. package/packages/installer/tests/unit/merger/yaml-merger.test.js +327 -0
  316. package/scripts/check-markdown-links.py +352 -352
  317. package/scripts/dashboard-parallel-dev.sh +0 -0
  318. package/scripts/dashboard-parallel-phase3.sh +0 -0
  319. package/scripts/dashboard-parallel-phase4.sh +0 -0
  320. package/scripts/install-monitor-hooks.sh +0 -0
  321. package/scripts/package-synapse.js +2 -1
  322. package/pro/README.md +0 -66
  323. package/pro/license/degradation.js +0 -220
  324. package/pro/license/errors.js +0 -450
  325. package/pro/license/feature-gate.js +0 -354
  326. package/pro/license/index.js +0 -181
  327. package/pro/license/license-api.js +0 -651
  328. package/pro/license/license-cache.js +0 -523
  329. package/pro/license/license-crypto.js +0 -303
@@ -0,0 +1,515 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { CodeIntelProvider } = require('./provider-interface');
6
+
7
+ // Layer priority for disambiguation (lower index = higher priority)
8
+ const LAYER_PRIORITY = { L1: 0, L2: 1, L3: 2, L4: 3 };
9
+
10
+ /**
11
+ * RegistryProvider — Native code intelligence provider using Entity Registry.
12
+ *
13
+ * Implements 5 of 8 primitives without requiring any MCP server.
14
+ * Data source: .aios-core/data/entity-registry.yaml (737+ entities, 14 categories).
15
+ *
16
+ * AST-only primitives (findCallers, findCallees, analyzeComplexity) return null.
17
+ */
18
+ class RegistryProvider extends CodeIntelProvider {
19
+ constructor(options = {}) {
20
+ super('registry', options);
21
+
22
+ this._registryPath = options.registryPath || null;
23
+ this._registry = null;
24
+ this._registryMtime = null;
25
+
26
+ // In-memory indexes (built on first load)
27
+ this._byName = null; // Map<string, Array<Entity>>
28
+ this._byPath = null; // Map<string, Entity>
29
+ this._byCategory = null; // Map<string, Array<Entity>>
30
+ this._byKeyword = null; // Map<string, Array<Entity>> (inverted index)
31
+ }
32
+
33
+ /**
34
+ * Check if this provider is available (registry loaded and non-empty).
35
+ * @returns {boolean}
36
+ */
37
+ isAvailable() {
38
+ this._ensureLoaded();
39
+ return this._registry !== null && this._byName !== null && this._byName.size > 0;
40
+ }
41
+
42
+ // --- Lazy Loading ---
43
+
44
+ /**
45
+ * Resolve the registry file path from options or default location.
46
+ * @returns {string|null}
47
+ * @private
48
+ */
49
+ _resolveRegistryPath() {
50
+ if (this._registryPath) return this._registryPath;
51
+
52
+ // Default: resolve from project root
53
+ const projectRoot = this.options.projectRoot || process.cwd();
54
+ const defaultPath = path.join(projectRoot, '.aios-core', 'data', 'entity-registry.yaml');
55
+
56
+ if (fs.existsSync(defaultPath)) {
57
+ this._registryPath = defaultPath;
58
+ return defaultPath;
59
+ }
60
+
61
+ return null;
62
+ }
63
+
64
+ /**
65
+ * Ensure registry is loaded (lazy-load on first call).
66
+ * Reloads if file mtime has changed.
67
+ * @private
68
+ */
69
+ _ensureLoaded() {
70
+ const filePath = this._resolveRegistryPath();
71
+ if (!filePath) return;
72
+
73
+ try {
74
+ const stat = fs.statSync(filePath);
75
+ const currentMtime = stat.mtimeMs;
76
+
77
+ // Already loaded and file hasn't changed
78
+ if (this._registry && this._registryMtime === currentMtime) return;
79
+
80
+ const content = fs.readFileSync(filePath, 'utf8');
81
+
82
+ // Use js-yaml with JSON_SCHEMA for safe parsing (no arbitrary types)
83
+ let yaml;
84
+ try {
85
+ yaml = require('js-yaml');
86
+ } catch (_e) {
87
+ // Fallback to yaml package
88
+ yaml = require('yaml');
89
+ const parsed = yaml.parse(content);
90
+ this._buildIndexes(parsed);
91
+ this._registryMtime = currentMtime;
92
+ return;
93
+ }
94
+
95
+ const parsed = yaml.load(content, { schema: yaml.JSON_SCHEMA });
96
+ this._buildIndexes(parsed);
97
+ this._registryMtime = currentMtime;
98
+ } catch (_error) {
99
+ // Graceful degradation: if parse fails, provider returns null for all calls
100
+ this._registry = null;
101
+ this._byName = null;
102
+ this._byPath = null;
103
+ this._byCategory = null;
104
+ this._byKeyword = null;
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Build in-memory indexes from parsed registry.
110
+ * @param {Object} parsed - Parsed YAML object
111
+ * @private
112
+ */
113
+ _buildIndexes(parsed) {
114
+ if (!parsed || !parsed.entities) {
115
+ this._registry = null;
116
+ this._byName = null;
117
+ this._byPath = null;
118
+ this._byCategory = null;
119
+ this._byKeyword = null;
120
+ return;
121
+ }
122
+
123
+ this._registry = parsed;
124
+ this._byName = new Map();
125
+ this._byPath = new Map();
126
+ this._byCategory = new Map();
127
+ this._byKeyword = new Map();
128
+
129
+ const entities = parsed.entities;
130
+
131
+ for (const [category, categoryEntities] of Object.entries(entities)) {
132
+ if (!categoryEntities || typeof categoryEntities !== 'object') continue;
133
+
134
+ // byCategory
135
+ if (!this._byCategory.has(category)) {
136
+ this._byCategory.set(category, []);
137
+ }
138
+
139
+ for (const [entityName, entityData] of Object.entries(categoryEntities)) {
140
+ if (!entityData || typeof entityData !== 'object') continue;
141
+
142
+ // Validate path: reject entries with '..' segments (defense-in-depth)
143
+ if (entityData.path && entityData.path.includes('..')) continue;
144
+
145
+ const entity = {
146
+ name: entityName,
147
+ category,
148
+ ...entityData,
149
+ };
150
+
151
+ // byName — Map<string, Array<Entity>> to handle duplicates
152
+ if (!this._byName.has(entityName)) {
153
+ this._byName.set(entityName, []);
154
+ }
155
+ this._byName.get(entityName).push(entity);
156
+
157
+ // byPath
158
+ if (entityData.path) {
159
+ this._byPath.set(entityData.path, entity);
160
+ }
161
+
162
+ // byCategory
163
+ this._byCategory.get(category).push(entity);
164
+
165
+ // byKeyword (inverted index)
166
+ if (Array.isArray(entityData.keywords)) {
167
+ for (const keyword of entityData.keywords) {
168
+ const kw = String(keyword).toLowerCase();
169
+ if (!this._byKeyword.has(kw)) {
170
+ this._byKeyword.set(kw, []);
171
+ }
172
+ this._byKeyword.get(kw).push(entity);
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ // --- Disambiguation ---
180
+
181
+ /**
182
+ * Score and rank candidates for a symbol lookup.
183
+ * Scoring: exact name+type > exact name > layer priority > alphabetical path.
184
+ * @param {Array<Object>} candidates - Array of entity objects
185
+ * @param {string} symbol - The search symbol
186
+ * @param {Object} [options] - Optional type/layer hints
187
+ * @returns {Array<Object>} Sorted candidates (best match first)
188
+ * @private
189
+ */
190
+ _rankCandidates(candidates, symbol, options = {}) {
191
+ if (!candidates || candidates.length === 0) return [];
192
+
193
+ const symbolLower = symbol.toLowerCase();
194
+
195
+ return candidates
196
+ .map((entity) => {
197
+ let score = 0;
198
+
199
+ // Exact name match
200
+ if (entity.name === symbol) score += 100;
201
+ else if (entity.name.toLowerCase() === symbolLower) score += 90;
202
+
203
+ // Type hint match
204
+ if (options.type && entity.type === options.type) score += 50;
205
+
206
+ // Layer priority (L1=40, L2=30, L3=20, L4=10)
207
+ const layerPriority = LAYER_PRIORITY[entity.layer];
208
+ if (layerPriority !== undefined) {
209
+ score += (4 - layerPriority) * 10;
210
+ }
211
+
212
+ return { entity, score };
213
+ })
214
+ .sort((a, b) => {
215
+ if (b.score !== a.score) return b.score - a.score;
216
+ // Tie-break: alphabetical path
217
+ const pathA = a.entity.path || '';
218
+ const pathB = b.entity.path || '';
219
+ return pathA.localeCompare(pathB);
220
+ })
221
+ .map((item) => item.entity);
222
+ }
223
+
224
+ // --- Fuzzy Matching ---
225
+
226
+ /**
227
+ * Find entities matching a symbol using fuzzy matching.
228
+ * Order: exact name > path contains > keywords contains.
229
+ * @param {string} symbol - Symbol to search
230
+ * @param {Object} [options] - Search options
231
+ * @returns {Array<Object>} Matched entities sorted by relevance
232
+ * @private
233
+ */
234
+ _fuzzyMatch(symbol, _options = {}) {
235
+ this._ensureLoaded();
236
+ if (!this._byName) return [];
237
+
238
+ const symbolLower = symbol.toLowerCase();
239
+ const results = [];
240
+ const seen = new Set();
241
+
242
+ // 1. Exact name match (may return multiple for duplicate names)
243
+ const exactMatches = this._byName.get(symbol) || this._byName.get(symbolLower) || [];
244
+ for (const entity of exactMatches) {
245
+ const key = `${entity.name}:${entity.category}:${entity.path}`;
246
+ if (!seen.has(key)) {
247
+ results.push({ entity, matchType: 'exact', score: 100 });
248
+ seen.add(key);
249
+ }
250
+ }
251
+
252
+ // Also check case-insensitive
253
+ if (exactMatches.length === 0) {
254
+ for (const [name, entities] of this._byName) {
255
+ if (name.toLowerCase() === symbolLower) {
256
+ for (const entity of entities) {
257
+ const key = `${entity.name}:${entity.category}:${entity.path}`;
258
+ if (!seen.has(key)) {
259
+ results.push({ entity, matchType: 'exact-ci', score: 90 });
260
+ seen.add(key);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ }
266
+
267
+ // 2. Path contains
268
+ for (const [filePath, entity] of this._byPath) {
269
+ const key = `${entity.name}:${entity.category}:${entity.path}`;
270
+ if (seen.has(key)) continue;
271
+ if (filePath.toLowerCase().includes(symbolLower)) {
272
+ results.push({ entity, matchType: 'path', score: 60 });
273
+ seen.add(key);
274
+ }
275
+ }
276
+
277
+ // 3. Keywords contains
278
+ const keywordMatches = this._byKeyword.get(symbolLower) || [];
279
+ for (const entity of keywordMatches) {
280
+ const key = `${entity.name}:${entity.category}:${entity.path}`;
281
+ if (seen.has(key)) continue;
282
+ results.push({ entity, matchType: 'keyword', score: 40 });
283
+ seen.add(key);
284
+ }
285
+
286
+ // Sort by score, then by layer priority, then alphabetical path
287
+ return results
288
+ .sort((a, b) => {
289
+ if (b.score !== a.score) return b.score - a.score;
290
+ const layerA = LAYER_PRIORITY[a.entity.layer] ?? 99;
291
+ const layerB = LAYER_PRIORITY[b.entity.layer] ?? 99;
292
+ if (layerA !== layerB) return layerA - layerB;
293
+ return (a.entity.path || '').localeCompare(b.entity.path || '');
294
+ })
295
+ .map((r) => r.entity);
296
+ }
297
+
298
+ // --- 5 Implemented Primitives ---
299
+
300
+ async findDefinition(symbol, options = {}) {
301
+ this._ensureLoaded();
302
+ if (!this._byName) return null;
303
+
304
+ const matches = this._fuzzyMatch(symbol, options);
305
+ if (matches.length === 0) return null;
306
+
307
+ const best = this._rankCandidates(matches, symbol, options)[0] || matches[0];
308
+
309
+ return {
310
+ file: best.path || null,
311
+ line: 1,
312
+ column: 0,
313
+ context: best.purpose || `${best.type} in ${best.category}`,
314
+ };
315
+ }
316
+
317
+ async findReferences(symbol, _options = {}) {
318
+ this._ensureLoaded();
319
+ if (!this._byName) return null;
320
+
321
+ const references = [];
322
+ const symbolLower = symbol.toLowerCase();
323
+
324
+ // Search usedBy and dependencies fields across all entities
325
+ for (const [_category, categoryEntities] of Object.entries(this._registry.entities)) {
326
+ if (!categoryEntities || typeof categoryEntities !== 'object') continue;
327
+
328
+ for (const [_entityName, entityData] of Object.entries(categoryEntities)) {
329
+ if (!entityData || typeof entityData !== 'object') continue;
330
+
331
+ const usedBy = Array.isArray(entityData.usedBy) ? entityData.usedBy : [];
332
+ const deps = Array.isArray(entityData.dependencies) ? entityData.dependencies : [];
333
+
334
+ // Check if this entity references the symbol
335
+ const referencesSymbol =
336
+ usedBy.some((u) => String(u).toLowerCase() === symbolLower) ||
337
+ deps.some((d) => String(d).toLowerCase() === symbolLower);
338
+
339
+ if (referencesSymbol) {
340
+ references.push({
341
+ file: entityData.path || null,
342
+ line: 1,
343
+ context: entityData.purpose || `References ${symbol}`,
344
+ });
345
+ }
346
+ }
347
+ }
348
+
349
+ // Also find entities that the symbol's usedBy/deps point to
350
+ const symbolEntities = this._byName.get(symbol) || [];
351
+ for (const entity of symbolEntities) {
352
+ if (Array.isArray(entity.usedBy)) {
353
+ for (const refName of entity.usedBy) {
354
+ const refEntities = this._byName.get(refName) || [];
355
+ for (const ref of refEntities) {
356
+ references.push({
357
+ file: ref.path || null,
358
+ line: 1,
359
+ context: `${ref.name} uses ${symbol}`,
360
+ });
361
+ }
362
+ }
363
+ }
364
+ }
365
+
366
+ return references.length > 0 ? references : null;
367
+ }
368
+
369
+ async analyzeDependencies(targetPath, options = {}) {
370
+ this._ensureLoaded();
371
+ if (!this._byName || !this._registry) return null;
372
+
373
+ const nodes = [];
374
+ const edges = [];
375
+ let unresolvedCount = 0;
376
+ const visited = new Set();
377
+
378
+ // Find entity by path or name
379
+ let rootEntities = [];
380
+ if (this._byPath.has(targetPath)) {
381
+ rootEntities = [this._byPath.get(targetPath)];
382
+ } else {
383
+ rootEntities = this._byName.get(targetPath) || [];
384
+ }
385
+
386
+ if (rootEntities.length === 0) {
387
+ // Try fuzzy match
388
+ const fuzzy = this._fuzzyMatch(targetPath, options);
389
+ if (fuzzy.length > 0) rootEntities = [fuzzy[0]];
390
+ }
391
+
392
+ const queue = [...rootEntities];
393
+
394
+ while (queue.length > 0) {
395
+ const entity = queue.shift();
396
+ const entityKey = `${entity.name}:${entity.category}`;
397
+
398
+ if (visited.has(entityKey)) continue;
399
+ visited.add(entityKey);
400
+
401
+ nodes.push({
402
+ name: entity.name,
403
+ path: entity.path || null,
404
+ layer: entity.layer || null,
405
+ category: entity.category || null,
406
+ });
407
+
408
+ const deps = Array.isArray(entity.dependencies) ? entity.dependencies : [];
409
+ for (const depName of deps) {
410
+ const depEntities = this._byName.get(depName);
411
+ if (depEntities && depEntities.length > 0) {
412
+ const dep = depEntities[0]; // Take first match
413
+ edges.push({
414
+ from: entity.name,
415
+ to: dep.name,
416
+ resolved: true,
417
+ });
418
+
419
+ const depKey = `${dep.name}:${dep.category}`;
420
+ if (!visited.has(depKey)) {
421
+ queue.push(dep);
422
+ }
423
+ } else {
424
+ // Unresolved dependency
425
+ edges.push({
426
+ from: entity.name,
427
+ to: depName,
428
+ resolved: false,
429
+ });
430
+ unresolvedCount++;
431
+ }
432
+ }
433
+ }
434
+
435
+ return {
436
+ nodes,
437
+ edges,
438
+ unresolvedCount,
439
+ };
440
+ }
441
+
442
+ async analyzeCodebase(targetPath, _options = {}) {
443
+ this._ensureLoaded();
444
+ if (!this._byCategory) return null;
445
+
446
+ const files = [];
447
+ const structure = {};
448
+ const patterns = [];
449
+
450
+ for (const [category, entities] of this._byCategory) {
451
+ structure[category] = {
452
+ count: entities.length,
453
+ layers: {},
454
+ };
455
+
456
+ for (const entity of entities) {
457
+ if (entity.path) files.push(entity.path);
458
+
459
+ const layer = entity.layer || 'unknown';
460
+ if (!structure[category].layers[layer]) {
461
+ structure[category].layers[layer] = 0;
462
+ }
463
+ structure[category].layers[layer]++;
464
+ }
465
+
466
+ // Detect patterns from category
467
+ if (entities.length > 5) {
468
+ patterns.push({
469
+ name: `${category}-convention`,
470
+ description: `${entities.length} ${category} entities follow consistent structure`,
471
+ count: entities.length,
472
+ });
473
+ }
474
+ }
475
+
476
+ return { files, structure, patterns };
477
+ }
478
+
479
+ async getProjectStats(_options = {}) {
480
+ this._ensureLoaded();
481
+ if (!this._byCategory || !this._byPath) return null;
482
+
483
+ const languages = {};
484
+ const layerCounts = { L1: 0, L2: 0, L3: 0, L4: 0 };
485
+
486
+ for (const [_path, entity] of this._byPath) {
487
+ // Count by layer
488
+ if (entity.layer && layerCounts[entity.layer] !== undefined) {
489
+ layerCounts[entity.layer]++;
490
+ }
491
+
492
+ // Detect language from file extension
493
+ const ext = path.extname(entity.path || '').slice(1);
494
+ if (ext) {
495
+ languages[ext] = (languages[ext] || 0) + 1;
496
+ }
497
+ }
498
+
499
+ return {
500
+ files: this._byPath.size,
501
+ lines: 0, // Cannot determine without reading files
502
+ languages,
503
+ layers: layerCounts,
504
+ categories: this._byCategory.size,
505
+ totalEntities: this._byName
506
+ ? Array.from(this._byName.values()).reduce((sum, arr) => sum + arr.length, 0)
507
+ : 0,
508
+ };
509
+ }
510
+
511
+ // --- 3 AST-only primitives inherit null from base class ---
512
+ // findCallers, findCallees, analyzeComplexity → return null (base class default)
513
+ }
514
+
515
+ module.exports = { RegistryProvider, LAYER_PRIORITY };
@@ -5,14 +5,162 @@
5
5
  "description": "Read-only framework defaults shipped with the npm package",
6
6
  "type": "object",
7
7
  "properties": {
8
- "version": {
9
- "type": "string",
10
- "description": "Framework version"
8
+ "metadata": {
9
+ "type": "object",
10
+ "description": "Framework metadata — name and version",
11
+ "properties": {
12
+ "name": {
13
+ "type": "string",
14
+ "description": "Framework display name"
15
+ },
16
+ "framework_version": {
17
+ "type": "string",
18
+ "description": "Semantic version of the framework"
19
+ }
20
+ },
21
+ "required": ["name", "framework_version"],
22
+ "additionalProperties": false
11
23
  },
12
- "framework_name": {
13
- "type": "string",
14
- "description": "Framework name"
24
+ "markdownExploder": {
25
+ "type": "boolean",
26
+ "description": "Enable markdown exploder for document processing",
27
+ "default": true
28
+ },
29
+ "resource_locations": {
30
+ "type": "object",
31
+ "description": "Default paths for framework resources",
32
+ "properties": {
33
+ "agents_dir": { "type": "string", "description": "Path to agent definitions" },
34
+ "tasks_dir": { "type": "string", "description": "Path to task definitions" },
35
+ "templates_dir": { "type": "string", "description": "Path to templates" },
36
+ "checklists_dir": { "type": "string", "description": "Path to checklists" },
37
+ "tools_dir": { "type": "string", "description": "Path to tools" },
38
+ "scripts": {
39
+ "type": "object",
40
+ "description": "Script directory paths by category",
41
+ "properties": {
42
+ "core": { "type": "string" },
43
+ "development": { "type": "string" },
44
+ "infrastructure": { "type": "string" },
45
+ "legacy": { "type": "string" }
46
+ },
47
+ "additionalProperties": false
48
+ },
49
+ "data_dir": { "type": "string", "description": "Path to data directory" },
50
+ "elicitation_dir": { "type": "string", "description": "Path to elicitation templates" },
51
+ "squads_template_dir": { "type": "string", "description": "Path to squad templates" },
52
+ "minds_dir": { "type": "string", "description": "Path to minds output" }
53
+ },
54
+ "additionalProperties": false
55
+ },
56
+ "performance_defaults": {
57
+ "type": "object",
58
+ "description": "Default performance tuning options",
59
+ "properties": {
60
+ "lazy_loading": {
61
+ "type": "object",
62
+ "properties": {
63
+ "enabled": { "type": "boolean", "default": true },
64
+ "heavy_sections": {
65
+ "type": "array",
66
+ "items": { "type": "string" },
67
+ "description": "Config sections loaded lazily"
68
+ }
69
+ },
70
+ "additionalProperties": false
71
+ },
72
+ "git": {
73
+ "type": "object",
74
+ "properties": {
75
+ "show_config_warning": { "type": "boolean", "default": true },
76
+ "cache_time_seconds": { "type": "integer", "minimum": 0 }
77
+ },
78
+ "additionalProperties": false
79
+ }
80
+ },
81
+ "additionalProperties": false
82
+ },
83
+ "utility_scripts_registry": {
84
+ "type": "object",
85
+ "description": "Registry of utility scripts by category",
86
+ "properties": {
87
+ "helpers": {
88
+ "type": "array",
89
+ "items": { "type": "string" },
90
+ "description": "Agent helper utility names"
91
+ },
92
+ "executors": {
93
+ "type": "array",
94
+ "items": { "type": "string" },
95
+ "description": "Task execution utility names"
96
+ },
97
+ "framework": {
98
+ "type": "array",
99
+ "items": { "type": "string" },
100
+ "description": "Framework-level utility names"
101
+ }
102
+ },
103
+ "additionalProperties": false
104
+ },
105
+ "ide_sync_system": {
106
+ "type": "object",
107
+ "description": "IDE synchronization system for agent definitions",
108
+ "properties": {
109
+ "enabled": { "type": "boolean", "default": true },
110
+ "source": { "type": "string", "description": "Source directory for agent definitions" },
111
+ "targets": {
112
+ "type": "object",
113
+ "description": "IDE target configurations",
114
+ "additionalProperties": {
115
+ "type": "object",
116
+ "properties": {
117
+ "enabled": { "type": "boolean" },
118
+ "path": { "type": "string" },
119
+ "format": { "type": "string", "enum": ["full-markdown-yaml", "condensed-rules", "cursor-style"] }
120
+ },
121
+ "additionalProperties": false
122
+ }
123
+ },
124
+ "redirects": { "type": "object", "additionalProperties": true },
125
+ "validation": {
126
+ "type": "object",
127
+ "properties": {
128
+ "strict_mode": { "type": "boolean" },
129
+ "fail_on_drift": { "type": "boolean" },
130
+ "fail_on_orphaned": { "type": "boolean" }
131
+ },
132
+ "additionalProperties": false
133
+ }
134
+ },
135
+ "additionalProperties": false
136
+ },
137
+ "template_overrides": {
138
+ "type": "object",
139
+ "description": "Template customization defaults (override at L2)",
140
+ "properties": {
141
+ "story": {
142
+ "type": "object",
143
+ "properties": {
144
+ "sections_order": {
145
+ "oneOf": [
146
+ { "type": "array", "items": { "type": "string" } },
147
+ { "type": "null" }
148
+ ],
149
+ "description": "Custom section order for story templates. null = use template default.",
150
+ "default": null
151
+ },
152
+ "optional_sections": {
153
+ "type": "array",
154
+ "items": { "type": "string" },
155
+ "description": "Section IDs that can be skipped in story templates",
156
+ "default": []
157
+ }
158
+ },
159
+ "additionalProperties": false
160
+ }
161
+ },
162
+ "additionalProperties": false
15
163
  }
16
164
  },
17
- "additionalProperties": true
165
+ "additionalProperties": false
18
166
  }