aiox-core 5.0.3 ā 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.
- package/.aiox-core/core/execution/predictive-pipeline.js +1283 -0
- package/.aiox-core/core/memory/decision-memory.js +564 -0
- package/.aiox-core/data/entity-registry.yaml +1068 -1028
- package/.aiox-core/data/registry-update-log.jsonl +2 -2
- package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
- package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
- package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
- package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
- package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
- package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
- package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
- package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
- package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
- package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aiox-core/install-manifest.yaml +63 -55
- package/.aiox-core/local-config.yaml.template +71 -71
- package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
- package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
- package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
- package/.aiox-core/monitor/hooks/notification.py +29 -29
- package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
- package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
- package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
- package/.aiox-core/monitor/hooks/stop.py +29 -29
- package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
- package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
- package/.aiox-core/product/templates/adr.hbs +125 -125
- package/.aiox-core/product/templates/dbdr.hbs +241 -241
- package/.aiox-core/product/templates/epic.hbs +212 -212
- package/.aiox-core/product/templates/pmdr.hbs +186 -186
- package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aiox-core/product/templates/prd.hbs +201 -201
- package/.aiox-core/product/templates/story.hbs +263 -263
- package/.aiox-core/product/templates/task.hbs +170 -170
- package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aiox-core/product/templates/tmpl-view.sql +177 -177
- package/.aiox-core/scripts/pm.sh +0 -0
- package/.claude/hooks/enforce-architecture-first.py +196 -196
- package/.claude/hooks/mind-clone-governance.py +192 -192
- package/.claude/hooks/read-protection.py +151 -151
- package/.claude/hooks/slug-validation.py +176 -176
- package/.claude/hooks/sql-governance.py +182 -182
- package/.claude/hooks/write-path-validation.py +194 -194
- package/LICENSE +33 -33
- package/bin/aiox-graph.js +0 -0
- package/bin/aiox-minimal.js +0 -0
- package/bin/aiox.js +0 -0
- package/package.json +1 -1
- package/packages/aiox-install/bin/aiox-install.js +0 -0
- package/packages/aiox-install/bin/edmcp.js +0 -0
- package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
- package/packages/installer/src/wizard/pro-setup.js +28 -0
- package/pro/README.md +66 -66
- package/pro/feature-registry.yaml +225 -223
- package/pro/license/license-api.js +701 -679
- package/pro/package.json +39 -39
- package/pro/pro-config.yaml +63 -63
- package/pro/squads/README.md +24 -24
- package/pro/squads/design/HEADLINE.md +3 -3
- package/pro/squads/design/README.md +109 -109
- package/pro/squads/design/agents/brad-frost.md +1097 -1097
- package/pro/squads/design/agents/dan-mall.md +857 -857
- package/pro/squads/design/agents/dave-malouf.md +2272 -2272
- package/pro/squads/design/agents/design-chief.md +114 -114
- package/pro/squads/design/agents/ds-foundations-lead.md +194 -194
- package/pro/squads/design/agents/ds-token-architect.md +361 -361
- package/pro/squads/design/agents/nano-banana-generator.md +162 -162
- package/pro/squads/design/agents/storybook-expert.md +809 -809
- package/pro/squads/design/checklists/atomic-refactor-checklist.md +299 -299
- package/pro/squads/design/checklists/component-adaptation-checklist.md +81 -81
- package/pro/squads/design/checklists/design-fidelity-checklist.md +283 -283
- package/pro/squads/design/checklists/design-handoff-checklist.md +55 -55
- package/pro/squads/design/checklists/design-team-health-checklist.md +454 -454
- package/pro/squads/design/checklists/designops-maturity-checklist.md +518 -518
- package/pro/squads/design/checklists/ds-a11y-release-gate-checklist.md +45 -45
- package/pro/squads/design/checklists/ds-accessibility-wcag-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-component-quality-checklist.md +150 -150
- package/pro/squads/design/checklists/ds-critical-eye-review-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-migration-readiness-checklist.md +99 -99
- package/pro/squads/design/checklists/ds-pattern-audit-checklist.md +164 -164
- package/pro/squads/design/checklists/reading-accessibility-checklist.md +275 -275
- package/pro/squads/design/checklists/token-mapping-checklist.md +107 -107
- package/pro/squads/design/config/coding-standards.md +286 -286
- package/pro/squads/design/config/source-tree.md +59 -59
- package/pro/squads/design/config/tech-stack.md +48 -48
- package/pro/squads/design/config.yaml +204 -204
- package/pro/squads/design/data/agentic-design-systems-guide.md +46 -46
- package/pro/squads/design/data/agentic-ds-principles.md +100 -100
- package/pro/squads/design/data/atomic-design-principles.md +108 -108
- package/pro/squads/design/data/atomic-refactor-rules.md +582 -582
- package/pro/squads/design/data/base-component-specs.md +972 -972
- package/pro/squads/design/data/brad-frost-analysis-extract-implicit.yaml +270 -270
- package/pro/squads/design/data/brad-frost-analysis-find-0.8.yaml +176 -176
- package/pro/squads/design/data/brad-frost-analysis-qa-report.yaml +168 -168
- package/pro/squads/design/data/brad-frost-dna.yaml +713 -713
- package/pro/squads/design/data/capability-tools.yaml +124 -124
- package/pro/squads/design/data/component-adaptation-changelog.md +318 -318
- package/pro/squads/design/data/consolidation-algorithms.md +168 -168
- package/pro/squads/design/data/critical-eye-scoring-rules.yaml +240 -240
- package/pro/squads/design/data/design-token-best-practices.md +107 -107
- package/pro/squads/design/data/design-tokens-spec.yaml +418 -418
- package/pro/squads/design/data/ds-reference-architectures.md +93 -93
- package/pro/squads/design/data/f2-qa-report.md +168 -168
- package/pro/squads/design/data/f3-derived-components-changelog.md +100 -100
- package/pro/squads/design/data/f3-qa-report.md +208 -208
- package/pro/squads/design/data/figma-base-components-raw.md +101 -101
- package/pro/squads/design/data/figma-tokens-raw.md +1548 -1548
- package/pro/squads/design/data/fluent2-design-principles.md +114 -114
- package/pro/squads/design/data/high-retention-reading-guide.md +349 -349
- package/pro/squads/design/data/integration-patterns.md +207 -207
- package/pro/squads/design/data/internal-quality-chain.yaml +48 -48
- package/pro/squads/design/data/motion-tokens-guide.md +202 -202
- package/pro/squads/design/data/roi-calculation-guide.md +142 -142
- package/pro/squads/design/data/token-mapping-reference.md +213 -213
- package/pro/squads/design/data/w3c-dtcg-spec-reference.md +149 -149
- package/pro/squads/design/data/wcag-compliance-guide.md +267 -267
- package/pro/squads/design/docs/AUDIT_REPORT.md +97 -97
- package/pro/squads/design/docs/DS-CURATION-PIPELINE-PROPOSAL.md +577 -577
- package/pro/squads/design/docs/UPGRADE_PLAN.md +618 -618
- package/pro/squads/design/docs/brad-frost-research-validation.md +372 -372
- package/pro/squads/design/docs/dave-malouf-research-validation.md +391 -391
- package/pro/squads/design/docs/tool-discovery-report.md +87 -87
- package/pro/squads/design/docs/tool-integration-plan.md +44 -44
- package/pro/squads/design/protocols/ai-first-governance.md +56 -56
- package/pro/squads/design/protocols/governance-execution-boundary.md +59 -59
- package/pro/squads/design/protocols/handoff.md +60 -60
- package/pro/squads/design/rules/.claude-rules.md +88 -88
- package/pro/squads/design/scripts/design-system/curate_colors.cjs +447 -447
- package/pro/squads/design/scripts/design-system/curate_components.cjs +217 -217
- package/pro/squads/design/scripts/design-system/curate_radius.cjs +190 -190
- package/pro/squads/design/scripts/design-system/curate_shadows.cjs +208 -208
- package/pro/squads/design/scripts/design-system/curate_spacing.cjs +243 -243
- package/pro/squads/design/scripts/design-system/curate_typography.cjs +404 -404
- package/pro/squads/design/scripts/design-system/design-system-metadata.test.js +49 -49
- package/pro/squads/design/scripts/design-system/design_manifest_lib.cjs +142 -142
- package/pro/squads/design/scripts/design-system/fetch_page_images.cjs +195 -195
- package/pro/squads/design/scripts/design-system/generate_components_metadata.cjs +114 -114
- package/pro/squads/design/scripts/design-system/generate_curation_report.cjs +258 -258
- package/pro/squads/design/scripts/design-system/generate_tokens.cjs +342 -342
- package/pro/squads/design/scripts/design-system/sync_design_manifest.cjs +27 -27
- package/pro/squads/design/scripts/design-system/test_mcp_tools.cjs +232 -232
- package/pro/squads/design/scripts/design-system/validate_components_metadata.cjs +96 -96
- package/pro/squads/design/scripts/design-system/validate_curation.cjs +226 -226
- package/pro/squads/design/scripts/design-system/validate_design_manifest_drift.cjs +72 -72
- package/pro/squads/design/scripts/design-system/validate_mcp_skeleton.cjs +38 -38
- package/pro/squads/design/scripts/design-system/validate_registry.cjs +186 -186
- package/pro/squads/design/scripts/design-system/validate_task_checklist_bindings.cjs +78 -78
- package/pro/squads/design/scripts/dissect-artifact.cjs +806 -806
- package/pro/squads/design/scripts/validate-a11y-integration.cjs +40 -40
- package/pro/squads/design/scripts/validate-design-squad.py +411 -411
- package/pro/squads/design/squad.yaml +714 -714
- package/pro/squads/design/tasks/a11y-audit.md +340 -340
- package/pro/squads/design/tasks/aria-audit.md +525 -525
- package/pro/squads/design/tasks/atomic-refactor-execute.md +391 -391
- package/pro/squads/design/tasks/atomic-refactor-plan.md +262 -262
- package/pro/squads/design/tasks/audit-reading-experience.md +350 -350
- package/pro/squads/design/tasks/audit-tailwind-config.md +101 -101
- package/pro/squads/design/tasks/bootstrap-shadcn-library.md +96 -96
- package/pro/squads/design/tasks/bundle-audit.md +245 -245
- package/pro/squads/design/tasks/contrast-matrix.md +373 -373
- package/pro/squads/design/tasks/create-doc.md +135 -135
- package/pro/squads/design/tasks/dead-code-detection.md +329 -329
- package/pro/squads/design/tasks/design-compare.md +414 -414
- package/pro/squads/design/tasks/design-process-optimization.md +407 -407
- package/pro/squads/design/tasks/design-review-orchestration.md +99 -99
- package/pro/squads/design/tasks/design-team-scaling.md +407 -407
- package/pro/squads/design/tasks/design-tooling-audit.md +404 -404
- package/pro/squads/design/tasks/design-triage.md +89 -89
- package/pro/squads/design/tasks/designops-maturity-assessment.md +364 -364
- package/pro/squads/design/tasks/designops-metrics-setup.md +465 -465
- package/pro/squads/design/tasks/ds-agentic-audit.md +100 -100
- package/pro/squads/design/tasks/ds-agentic-setup.md +103 -103
- package/pro/squads/design/tasks/ds-audit-codebase.md +273 -273
- package/pro/squads/design/tasks/ds-build-component.md +349 -349
- package/pro/squads/design/tasks/ds-build-mcp-server.md +84 -84
- package/pro/squads/design/tasks/ds-calculate-roi.md +282 -282
- package/pro/squads/design/tasks/ds-compose-molecule.md +106 -106
- package/pro/squads/design/tasks/ds-consolidate-patterns.md +253 -253
- package/pro/squads/design/tasks/ds-context-contract.md +194 -194
- package/pro/squads/design/tasks/ds-critical-eye-compare.md +130 -130
- package/pro/squads/design/tasks/ds-critical-eye-decide.md +139 -139
- package/pro/squads/design/tasks/ds-critical-eye-inventory.md +111 -111
- package/pro/squads/design/tasks/ds-critical-eye-report.md +101 -101
- package/pro/squads/design/tasks/ds-critical-eye-score.md +109 -109
- package/pro/squads/design/tasks/ds-designops.md +99 -99
- package/pro/squads/design/tasks/ds-extend-pattern.md +91 -91
- package/pro/squads/design/tasks/ds-extract-tokens.md +312 -312
- package/pro/squads/design/tasks/ds-figma-pipeline.md +95 -95
- package/pro/squads/design/tasks/ds-fluent-audit.md +105 -105
- package/pro/squads/design/tasks/ds-fluent-build.md +110 -110
- package/pro/squads/design/tasks/ds-generate-ai-metadata.md +81 -81
- package/pro/squads/design/tasks/ds-generate-cursor-rules.md +74 -74
- package/pro/squads/design/tasks/ds-generate-documentation.md +101 -101
- package/pro/squads/design/tasks/ds-generate-migration-strategy.md +331 -331
- package/pro/squads/design/tasks/ds-generate-shock-report.md +323 -323
- package/pro/squads/design/tasks/ds-govern-a11y-compliance.md +93 -93
- package/pro/squads/design/tasks/ds-governance.md +187 -187
- package/pro/squads/design/tasks/ds-health-metrics.md +278 -278
- package/pro/squads/design/tasks/ds-integrate-squad.md +130 -130
- package/pro/squads/design/tasks/ds-integrate-workspace.md +100 -100
- package/pro/squads/design/tasks/ds-legacy-modernization.md +302 -302
- package/pro/squads/design/tasks/ds-mcp-status.md +65 -65
- package/pro/squads/design/tasks/ds-motion-audit.md +118 -118
- package/pro/squads/design/tasks/ds-multi-framework.md +96 -96
- package/pro/squads/design/tasks/ds-parallelization-gate.md +246 -246
- package/pro/squads/design/tasks/ds-query.md +90 -90
- package/pro/squads/design/tasks/ds-rebuild-artifact.md +369 -369
- package/pro/squads/design/tasks/ds-reverse-engineer.md +194 -194
- package/pro/squads/design/tasks/ds-scan-artifact.md +131 -131
- package/pro/squads/design/tasks/ds-setup-design-system.md +297 -297
- package/pro/squads/design/tasks/ds-sync-registry.md +287 -287
- package/pro/squads/design/tasks/ds-theme-multi-brand.md +90 -90
- package/pro/squads/design/tasks/ds-token-modes.md +108 -108
- package/pro/squads/design/tasks/ds-token-w3c-extract.md +105 -105
- package/pro/squads/design/tasks/ds-validate-ai-readiness.md +69 -69
- package/pro/squads/design/tasks/ds-visual-regression.md +130 -130
- package/pro/squads/design/tasks/execute-checklist.md +141 -141
- package/pro/squads/design/tasks/export-design-tokens-dtcg.md +97 -97
- package/pro/squads/design/tasks/f1-apply-foundations.md +154 -154
- package/pro/squads/design/tasks/f1-ingest-figma-tokens.md +130 -130
- package/pro/squads/design/tasks/f1-map-tokens-to-shadcn.md +145 -145
- package/pro/squads/design/tasks/f1-qa-foundations.md +95 -95
- package/pro/squads/design/tasks/f2-adapt-shadcn-components.md +155 -155
- package/pro/squads/design/tasks/f2-ingest-base-components.md +148 -148
- package/pro/squads/design/tasks/f2-qa-base-components.md +98 -98
- package/pro/squads/design/tasks/f3-derive-components.md +145 -145
- package/pro/squads/design/tasks/f3-qa-derived-components.md +101 -101
- package/pro/squads/design/tasks/focus-order-audit.md +450 -450
- package/pro/squads/design/tasks/sb-brownfield-migrate.md +367 -367
- package/pro/squads/design/tasks/sb-brownfield-scan.md +318 -318
- package/pro/squads/design/tasks/sb-configure.md +230 -230
- package/pro/squads/design/tasks/sb-expand-shadcn.md +213 -213
- package/pro/squads/design/tasks/sb-generate-all-stories.md +288 -288
- package/pro/squads/design/tasks/sb-install.md +152 -152
- package/pro/squads/design/tasks/sb-sync-workspace.md +239 -239
- package/pro/squads/design/tasks/sb-verify.md +203 -203
- package/pro/squads/design/tasks/tailwind-upgrade.md +117 -117
- package/pro/squads/design/tasks/token-usage-analytics.md +262 -262
- package/pro/squads/design/tasks/ux-rewrite-sixth-grade.md +82 -82
- package/pro/squads/design/tasks/validate-design-fidelity.md +222 -222
- package/pro/squads/design/templates/agent-template.yaml +46 -46
- package/pro/squads/design/templates/clone-mind-template.md +352 -352
- package/pro/squads/design/templates/component-prompt-injection-tmpl.md +236 -236
- package/pro/squads/design/templates/component-visual-spec-tmpl.md +378 -378
- package/pro/squads/design/templates/critical-eye-cycle-report-tmpl.md +165 -165
- package/pro/squads/design/templates/design-fidelity-report-tmpl.md +155 -155
- package/pro/squads/design/templates/ds-ai-component-metadata-schema-tmpl.json +138 -138
- package/pro/squads/design/templates/ds-artifact-analysis.md +70 -70
- package/pro/squads/design/templates/ds-health-report-tmpl.md +236 -236
- package/pro/squads/design/templates/ds-migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/ds-state-persistence-tmpl.yaml +194 -194
- package/pro/squads/design/templates/ds-tokens-schema-tmpl.yaml +139 -139
- package/pro/squads/design/templates/migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/reading-design-tokens.css +26 -26
- package/pro/squads/design/templates/state-persistence-tmpl.yaml +219 -219
- package/pro/squads/design/templates/tokens-schema-tmpl.yaml +305 -305
- package/pro/squads/design/workflows/agentic-readiness.yaml +83 -83
- package/pro/squads/design/workflows/audit-only.yaml +198 -198
- package/pro/squads/design/workflows/brownfield-complete.yaml +257 -257
- package/pro/squads/design/workflows/critical-eye.yaml +184 -184
- package/pro/squads/design/workflows/dtcg-tokens-governance.yaml +64 -64
- package/pro/squads/design/workflows/foundations-pipeline.yaml +192 -192
- package/pro/squads/design/workflows/greenfield-new.yaml +192 -192
- package/pro/squads/design/workflows/motion-quality.yaml +65 -65
- package/pro/squads/design/workflows/self-healing-workflow.yaml +237 -237
- package/pro/squads/design/workflows/storybook-brownfield-migration.yaml +400 -400
- package/pro/squads/design/workflows/storybook-full-setup.yaml +280 -280
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/ARQUITETURA_COGNITIVA_DE_ALEX_HORMOZI_EXTRA/303/207/303/203O_COMPLETA.md +215 -0
- 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
- 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
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/Processo_Cria/303/247/303/243o_Conte/303/272do_Hormozi.md +0 -0
- 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
- 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
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_ELON_MUSK.md +291 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/ASSINATURA_LINGU/303/215STICA_ELON_MUSK.md +485 -0
- 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
- 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
- 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
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Uma_an/303/241lise_psicol/303/263gica_abrangente.md +187 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_EUGENE_M._SCHWARTZ.md +790 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/An/303/241lise_Completa_Eugene_Schwartz_Arquitetura_Cognitiva_DEEP.md +210 -0
- 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
- 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
- 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
- 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
- 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
- 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
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/EXTRA/303/207/303/203O_PEDRO_VAL/303/211RIO.md +237 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/MAPEAMENTO_LINGU/303/215STICO_PROFUNDO.md +161 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/META_AXIOMAS_DE_PEDRO_VAL/303/211RIO.md +256 -0
- 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
- 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
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/TABELA_COMPARATIVA_AN/303/201LISE_COMPLETA_DOS_CLONES_IA.md +102 -0
- 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
- 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
- package/pro/squads/mmos-squad/minds/ray_kurzweil/sources/books/PROTOCOLO_COMPLETO_DE_INTERROGA/303/207/303/203O_-_NAVAL_RAVIKANT.md +3624 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_JOBS.md +488 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Framework_Cabe/303/247a_Steve.md +257 -0
- 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
- 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
- package/pro/squads/squad-creator-pro/HEADLINE.md +3 -3
- package/pro/squads/squad-creator-pro/agents/oalanicolas.md +438 -438
- package/pro/squads/squad-creator-pro/agents/squad-chief.md +1651 -1651
- package/pro/squads/squad-creator-pro/agents/thiago_finch.md +976 -976
- package/pro/squads/squad-creator-pro/assessments/axioma-assessment-wf-create-squad.yaml +325 -325
- package/pro/squads/squad-creator-pro/checklists/create-agent-checklist.md +184 -184
- package/pro/squads/squad-creator-pro/checklists/create-squad-checklist.md +219 -219
- package/pro/squads/squad-creator-pro/checklists/create-workflow-checklist.md +224 -224
- package/pro/squads/squad-creator-pro/checklists/mental-model-integration-checklist.md +95 -95
- package/pro/squads/squad-creator-pro/checklists/squad-overview-checklist.md +393 -393
- package/pro/squads/squad-creator-pro/config/model-routing.yaml +693 -693
- package/pro/squads/squad-creator-pro/config/scoring-rubric.yaml +199 -199
- package/pro/squads/squad-creator-pro/config.yaml +35 -35
- package/pro/squads/squad-creator-pro/data/internal-infrastructure-library.yaml +99 -99
- package/pro/squads/squad-creator-pro/data/mental-model-task-matrix.yaml +692 -692
- package/pro/squads/squad-creator-pro/docs/ADR-001-model-tier-qualification.md +344 -344
- package/pro/squads/squad-creator-pro/docs/AGENT-COLLABORATION.md +609 -609
- package/pro/squads/squad-creator-pro/docs/MIGRATION-PLAN-AGENT-CONFORMITY.md +861 -861
- package/pro/squads/squad-creator-pro/docs/MODEL-TIER-QUALIFICATION.md +337 -337
- package/pro/squads/squad-creator-pro/docs/optimize-v4-proposal.md +354 -354
- package/pro/squads/squad-creator-pro/docs/task-optimization-framework.md +229 -229
- package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_010.md +240 -240
- package/pro/squads/squad-creator-pro/protocols/ai-first-governance.md +63 -63
- package/pro/squads/squad-creator-pro/scripts/assess-sources.sh +443 -443
- package/pro/squads/squad-creator-pro/scripts/clone-review.sh +394 -394
- package/pro/squads/squad-creator-pro/scripts/create-agent-preflight.py +243 -243
- package/pro/squads/squad-creator-pro/scripts/cross-provider/compare-results.js +281 -281
- package/pro/squads/squad-creator-pro/scripts/cross-provider/cross-provider-runner.js +462 -462
- package/pro/squads/squad-creator-pro/scripts/fidelity-score.sh +519 -519
- package/pro/squads/squad-creator-pro/scripts/generate-squad-guide.js +558 -558
- package/pro/squads/squad-creator-pro/scripts/lib/config-loader.js +151 -151
- package/pro/squads/squad-creator-pro/scripts/model-tier-validator.cjs +369 -369
- package/pro/squads/squad-creator-pro/scripts/model-usage-logger.cjs +245 -245
- package/pro/squads/squad-creator-pro/scripts/modernization-score.sh +308 -308
- package/pro/squads/squad-creator-pro/scripts/scaffold-squad.cjs +281 -281
- package/pro/squads/squad-creator-pro/scripts/security_scanner.py +378 -378
- package/pro/squads/squad-creator-pro/scripts/squad-context-loader.cjs +205 -205
- package/pro/squads/squad-creator-pro/scripts/squad-state-manager.cjs +451 -451
- package/pro/squads/squad-creator-pro/scripts/squad-workflow-runner.cjs +471 -471
- package/pro/squads/squad-creator-pro/scripts/squad_utils.py +261 -261
- package/pro/squads/squad-creator-pro/scripts/tests/run_bash_tests.sh +29 -29
- package/pro/squads/squad-creator-pro/scripts/tests/test_assess_sources.sh +216 -216
- package/pro/squads/squad-creator-pro/scripts/tests/test_clone_review.sh +239 -239
- package/pro/squads/squad-creator-pro/scripts/tests/test_coherence_validator.py +212 -212
- package/pro/squads/squad-creator-pro/scripts/tests/test_fidelity_score.sh +298 -298
- package/pro/squads/squad-creator-pro/scripts/tests/test_modernization_score.sh +211 -211
- package/pro/squads/squad-creator-pro/scripts/tests/test_security_scanner.py +354 -354
- package/pro/squads/squad-creator-pro/scripts/tests/test_validate_clone.sh +252 -252
- package/pro/squads/squad-creator-pro/squad.yaml +36 -36
- package/pro/squads/squad-creator-pro/tasks/an-compare-outputs.md +354 -354
- package/pro/squads/squad-creator-pro/tasks/create-squad.md +933 -933
- package/pro/squads/squad-creator-pro/tasks/detect-squad-context.md +81 -81
- package/pro/squads/squad-creator-pro/tasks/lookup-model.md +78 -78
- package/pro/squads/squad-creator-pro/tasks/next-squad.md +487 -487
- package/pro/squads/squad-creator-pro/tasks/optimize-workflow.md +851 -851
- package/pro/squads/squad-creator-pro/tasks/parallel-discovery.md +58 -58
- package/pro/squads/squad-creator-pro/tasks/pv-axioma-assessment-wf-clone-mind.yaml +256 -256
- package/pro/squads/squad-creator-pro/tasks/qualify-task.md +265 -265
- package/pro/squads/squad-creator-pro/tasks/reexecute-squad-phase.md +64 -64
- package/pro/squads/squad-creator-pro/tasks/smoke-test-model-routing.md +167 -167
- package/pro/squads/squad-creator-pro/tasks/squad-overview.md +683 -683
- package/pro/squads/squad-creator-pro/tasks/validate-final-artifacts.md +80 -80
- package/pro/squads/squad-creator-pro/templates/orchestrator-tmpl.md +74 -74
- package/pro/squads/squad-creator-pro/test-cases/BATCH-PROGRESS.md +268 -268
- package/pro/squads/squad-creator-pro/test-cases/QUALIFICATION-DASHBOARD.yaml +13 -13
- package/pro/squads/squad-creator-pro/test-cases/_template.yaml +147 -147
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT-SUMMARY.md +275 -275
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT_SUMMARY.md +140 -140
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/CHECKPOINT_MATRIX.md +202 -202
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION-REPORT.md +413 -413
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION_NOTES.md +358 -358
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README-v2.2.2.md +299 -299
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README.md +320 -320
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/TEST-REPORT-v2.1.md +351 -351
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/VERIFICATION-CHECKLIST.txt +247 -247
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/formal-qualification-report.yaml +389 -389
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-output.yaml +366 -366
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.1-output.yaml +452 -452
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.1-output.yaml +281 -281
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.2-output.yaml +332 -332
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/opus-baseline.yaml +517 -517
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/qualification-report.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/test-case.yaml +69 -69
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/haiku-round-1.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/opus-baseline.yaml +566 -566
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/qualification-report.yaml +82 -82
- package/pro/squads/squad-creator-pro/test-cases/an-design-clone/test-case.yaml +102 -102
- package/pro/squads/squad-creator-pro/test-cases/an-extract-dna/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/haiku-round-1.yaml +262 -262
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/opus-baseline.yaml +266 -266
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/qualification-report.yaml +94 -94
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/haiku-round-1.yaml +282 -282
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/opus-baseline.yaml +470 -470
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/qualification-report.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/collect-sources/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/create-task/test-case.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/cross-provider/DASHBOARD.yaml +11 -11
- package/pro/squads/squad-creator-pro/test-cases/pv-audit/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/haiku-output.yaml +209 -209
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/opus-baseline.yaml +96 -96
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/sonnet-output.yaml +30 -30
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/test-case.yaml +129 -129
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/comparison-round-1.yaml +242 -242
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/haiku-round-1.yaml +393 -393
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/opus-baseline.yaml +488 -488
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/qualification-report.yaml +74 -74
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/haiku-round-1.yaml +292 -292
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/opus-baseline.yaml +603 -603
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/qualification-report.yaml +97 -97
- package/pro/squads/squad-creator-pro/test-cases/smoke-test-model-routing/test-case.yaml +100 -100
- package/pro/squads/squad-creator-pro/test-cases/upgrade-squad/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/comparison-round-1.yaml +223 -223
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1-MINE.yaml +36 -36
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1.yaml +193 -193
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-2.yaml +303 -303
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-3-v4-task.yaml +149 -149
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-baseline.yaml +529 -529
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-round-3-v4-task.yaml +132 -132
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/qualification-report.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output-v2-calibrated.yaml +200 -200
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output.yaml +183 -183
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/opus-baseline.yaml +112 -112
- package/pro/squads/squad-creator-pro/workflows/create-squad.yaml +348 -348
- package/pro/squads/squad-creator-pro/workflows/modules/module-discovery.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-integration.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-quality-gates.yaml +15 -15
- package/pro/squads/squad-creator-pro/workflows/wf-brownfield-upgrade-squad.yaml +46 -46
- package/pro/squads/squad-creator-pro/workflows/wf-context-aware-create-squad.yaml +47 -47
- package/pro/squads/squad-creator-pro/workflows/wf-create-squad.yaml +1619 -1619
- package/pro/squads/squad-creator-pro/workflows/wf-cross-provider-qualification.yaml +711 -711
- package/pro/squads/squad-creator-pro/workflows/wf-model-tier-qualification.yaml +800 -800
- package/pro/squads/squad-creator-pro/workflows/wf-optimize-squad.yaml +684 -684
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/dashboard-parallel-dev.sh +0 -0
- package/scripts/dashboard-parallel-phase3.sh +0 -0
- package/scripts/dashboard-parallel-phase4.sh +0 -0
- package/scripts/install-monitor-hooks.sh +0 -0
- package/.claude/hooks/code-intel-pretool.cjs +0 -107
- package/docs/guides/aios-workflows/README.md +0 -247
- package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +0 -1536
- package/scripts/glue/README.md +0 -355
- package/scripts/glue/compose-agent-prompt.cjs +0 -362
|
@@ -1,462 +1,462 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Cross-Provider Model Qualification Runner
|
|
4
|
-
*
|
|
5
|
-
* Executa testes de qualificação comparando modelos externos (GLM-5, Kimi)
|
|
6
|
-
* contra Opus baseline usando as TASKS REAIS do squad-creator.
|
|
7
|
-
*
|
|
8
|
-
* Features:
|
|
9
|
-
* - Carrega task real (sem duplicação)
|
|
10
|
-
* - Salva snapshot da versão testada
|
|
11
|
-
* - Suporta mĆŗltiplos modelos
|
|
12
|
-
* - Gera relatório de comparação automÔtico
|
|
13
|
-
* - Usa paths do squad-config.yaml (zero hardcoded paths)
|
|
14
|
-
*
|
|
15
|
-
* Usage:
|
|
16
|
-
* node cross-provider-runner.js --task extract-knowledge --model glm5 --input hormozi-value-equation.md
|
|
17
|
-
* node cross-provider-runner.js --task extract-voice-dna --model glm5 --input halbert-voice.md
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
const fs = require('fs');
|
|
21
|
-
const path = require('path');
|
|
22
|
-
const crypto = require('crypto');
|
|
23
|
-
|
|
24
|
-
// Load config (auto-detects project root)
|
|
25
|
-
const config = require('../lib/config-loader');
|
|
26
|
-
|
|
27
|
-
// Load env variables
|
|
28
|
-
require(config.paths.envLoader);
|
|
29
|
-
|
|
30
|
-
// ============================================================================
|
|
31
|
-
// CONFIG
|
|
32
|
-
// ============================================================================
|
|
33
|
-
|
|
34
|
-
const PATHS = {
|
|
35
|
-
tasksDir: config.paths.tasks,
|
|
36
|
-
outputDir: config.paths.llmTests,
|
|
37
|
-
inputsDir: config.paths.llmTestInputs,
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const MODELS = {
|
|
41
|
-
opus: {
|
|
42
|
-
provider: 'anthropic',
|
|
43
|
-
model_id: 'claude-opus-4-5-20250514',
|
|
44
|
-
via: 'task-tool',
|
|
45
|
-
cost: { input: 15.00, output: 75.00 }
|
|
46
|
-
},
|
|
47
|
-
glm5: {
|
|
48
|
-
provider: 'openrouter',
|
|
49
|
-
model_id: 'z-ai/glm-5',
|
|
50
|
-
via: 'api',
|
|
51
|
-
cost: { input: 0.80, output: 3.20 }
|
|
52
|
-
},
|
|
53
|
-
kimi: {
|
|
54
|
-
provider: 'openrouter',
|
|
55
|
-
model_id: 'moonshotai/kimi-k2.5',
|
|
56
|
-
via: 'api',
|
|
57
|
-
cost: { input: 0.50, output: 2.80 }
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
const DEFAULTS = {
|
|
62
|
-
temperature: 0.3,
|
|
63
|
-
maxTokens: 8000,
|
|
64
|
-
timeoutMs: 180000
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
// ============================================================================
|
|
68
|
-
// TASK LOADER
|
|
69
|
-
// ============================================================================
|
|
70
|
-
|
|
71
|
-
function loadTask(taskName) {
|
|
72
|
-
const taskPath = path.join(PATHS.tasksDir, `${taskName}.md`);
|
|
73
|
-
|
|
74
|
-
if (!fs.existsSync(taskPath)) {
|
|
75
|
-
throw new Error(`Task not found: ${taskPath}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const content = fs.readFileSync(taskPath, 'utf-8');
|
|
79
|
-
const hash = crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
name: taskName,
|
|
83
|
-
path: taskPath,
|
|
84
|
-
content,
|
|
85
|
-
hash,
|
|
86
|
-
loadedAt: new Date().toISOString()
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ============================================================================
|
|
91
|
-
// INPUT RESOLVER
|
|
92
|
-
// ============================================================================
|
|
93
|
-
|
|
94
|
-
function resolveInputPath(inputArg) {
|
|
95
|
-
// If it's already an absolute path, use it
|
|
96
|
-
if (path.isAbsolute(inputArg)) {
|
|
97
|
-
return inputArg;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// If it's just a filename, look in the inputs directory
|
|
101
|
-
if (!inputArg.includes('/') && !inputArg.includes('\\')) {
|
|
102
|
-
const inInputsDir = path.join(PATHS.inputsDir, inputArg);
|
|
103
|
-
if (fs.existsSync(inInputsDir)) {
|
|
104
|
-
return inInputsDir;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Otherwise, resolve relative to current working directory
|
|
109
|
-
const relativePath = path.resolve(process.cwd(), inputArg);
|
|
110
|
-
if (fs.existsSync(relativePath)) {
|
|
111
|
-
return relativePath;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
throw new Error(`Input file not found: ${inputArg}\nLooked in:\n - ${path.join(PATHS.inputsDir, inputArg)}\n - ${relativePath}`);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// ============================================================================
|
|
118
|
-
// PROMPT BUILDER
|
|
119
|
-
// ============================================================================
|
|
120
|
-
|
|
121
|
-
function buildTestPrompt(task, testInput, options = {}) {
|
|
122
|
-
// v2.0: Pass FULL task content (truncated if too large)
|
|
123
|
-
// This ensures QUALITY CHECK and all requirements reach the model
|
|
124
|
-
const taskContent = truncateTaskContent(task.content, 12000);
|
|
125
|
-
|
|
126
|
-
const prompt = `# Task Execution: ${task.name}
|
|
127
|
-
|
|
128
|
-
## TASK COMPLETA (Siga TODAS as instruƧƵes abaixo)
|
|
129
|
-
|
|
130
|
-
${taskContent}
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## INPUT DE TESTE
|
|
135
|
-
|
|
136
|
-
${testInput}
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## INSTRUĆĆES FINAIS
|
|
141
|
-
|
|
142
|
-
1. Execute a task acima usando o input fornecido
|
|
143
|
-
2. SIGA TODAS as regras da task, especialmente QUALITY CHECK
|
|
144
|
-
3. Responda APENAS com o output estruturado (YAML/MD)
|
|
145
|
-
4. ZERO INVENĆĆO - Só extraia o que estĆ” LITERALMENTE no input
|
|
146
|
-
5. CITE TUDO - Cada item deve ter [SOURCE: ...]
|
|
147
|
-
|
|
148
|
-
${options.additionalInstructions || ''}`;
|
|
149
|
-
|
|
150
|
-
return prompt;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Truncate task content intelligently:
|
|
155
|
-
* - Keep frontmatter + first sections
|
|
156
|
-
* - Keep QUALITY CHECK section (critical for quality)
|
|
157
|
-
* - Keep OUTPUT section (defines expected format)
|
|
158
|
-
* - Truncate middle sections if needed
|
|
159
|
-
*/
|
|
160
|
-
function truncateTaskContent(content, maxChars) {
|
|
161
|
-
if (content.length <= maxChars) {
|
|
162
|
-
return content;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Extract key sections that MUST be included
|
|
166
|
-
const qualityCheckMatch = content.match(/## QUALITY CHECK[\s\S]*?(?=\n## [A-Z]|\n---\n\*\*|$)/);
|
|
167
|
-
const outputMatch = content.match(/## OUTPUT:[\s\S]*?(?=\n## [A-Z]|\n---\n\*\*|$)/);
|
|
168
|
-
|
|
169
|
-
const qualityCheck = qualityCheckMatch ? qualityCheckMatch[0] : '';
|
|
170
|
-
const outputSection = outputMatch ? outputMatch[0] : '';
|
|
171
|
-
|
|
172
|
-
// Calculate how much space we have for the main content
|
|
173
|
-
const reservedChars = qualityCheck.length + outputSection.length + 500; // 500 for headers
|
|
174
|
-
const mainContentMax = maxChars - reservedChars;
|
|
175
|
-
|
|
176
|
-
// Get content up to QUALITY CHECK or OUTPUT (whichever comes first)
|
|
177
|
-
let mainContent = content;
|
|
178
|
-
const qualityIdx = content.indexOf('## QUALITY CHECK');
|
|
179
|
-
const outputIdx = content.indexOf('## OUTPUT:');
|
|
180
|
-
const cutoffIdx = Math.min(
|
|
181
|
-
qualityIdx > 0 ? qualityIdx : Infinity,
|
|
182
|
-
outputIdx > 0 ? outputIdx : Infinity
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
if (cutoffIdx < Infinity) {
|
|
186
|
-
mainContent = content.slice(0, cutoffIdx);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Truncate main content if needed
|
|
190
|
-
if (mainContent.length > mainContentMax) {
|
|
191
|
-
mainContent = mainContent.slice(0, mainContentMax) + '\n\n[... truncated for length ...]\n\n';
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Rebuild with key sections
|
|
195
|
-
let result = mainContent;
|
|
196
|
-
if (qualityCheck && !result.includes('## QUALITY CHECK')) {
|
|
197
|
-
result += '\n\n' + qualityCheck;
|
|
198
|
-
}
|
|
199
|
-
if (outputSection && !result.includes('## OUTPUT:')) {
|
|
200
|
-
result += '\n\n' + outputSection;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return result;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Legacy function kept for reference
|
|
207
|
-
function extractTaskSections(content) {
|
|
208
|
-
const sections = {};
|
|
209
|
-
|
|
210
|
-
const purposeMatch = content.match(/## Purpose\n\n([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
211
|
-
if (purposeMatch) sections.purpose = purposeMatch[1].trim();
|
|
212
|
-
|
|
213
|
-
const executionMatch = content.match(/## Execution\n\n([\s\S]*?)(?=\n## Validation|\n## Error|\Z)/);
|
|
214
|
-
if (executionMatch) sections.execution = executionMatch[1].slice(0, 3000);
|
|
215
|
-
|
|
216
|
-
const antiMatch = content.match(/## Anti-Invention[\s\S]*?([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
217
|
-
if (antiMatch) sections.antiInvention = antiMatch[1].trim();
|
|
218
|
-
|
|
219
|
-
const outputMatch = content.match(/## Outputs?\n\n([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
220
|
-
if (outputMatch) sections.outputs = outputMatch[1].trim();
|
|
221
|
-
|
|
222
|
-
return sections;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// ============================================================================
|
|
226
|
-
// MODEL RUNNERS
|
|
227
|
-
// ============================================================================
|
|
228
|
-
|
|
229
|
-
async function runOpenRouterModel(modelConfig, prompt, options = {}) {
|
|
230
|
-
const start = Date.now();
|
|
231
|
-
|
|
232
|
-
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
233
|
-
method: 'POST',
|
|
234
|
-
headers: {
|
|
235
|
-
'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
236
|
-
'Content-Type': 'application/json',
|
|
237
|
-
'HTTP-Referer': 'https://lendario.ai',
|
|
238
|
-
'X-Title': 'Cross-Provider Qualification Test'
|
|
239
|
-
},
|
|
240
|
-
body: JSON.stringify({
|
|
241
|
-
model: modelConfig.model_id,
|
|
242
|
-
messages: [{ role: 'user', content: prompt }],
|
|
243
|
-
max_tokens: options.maxTokens || DEFAULTS.maxTokens,
|
|
244
|
-
temperature: options.temperature || DEFAULTS.temperature
|
|
245
|
-
})
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
const data = await response.json();
|
|
249
|
-
const elapsed = (Date.now() - start) / 1000;
|
|
250
|
-
|
|
251
|
-
if (data.error) {
|
|
252
|
-
throw new Error(`API Error: ${JSON.stringify(data.error)}`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return {
|
|
256
|
-
content: data.choices[0].message.content,
|
|
257
|
-
usage: data.usage,
|
|
258
|
-
latency: elapsed,
|
|
259
|
-
cost: calculateCost(data.usage, modelConfig.cost),
|
|
260
|
-
raw: data
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
function calculateCost(usage, costConfig) {
|
|
265
|
-
if (!usage) return 0;
|
|
266
|
-
const inputCost = (usage.prompt_tokens / 1_000_000) * costConfig.input;
|
|
267
|
-
const outputCost = (usage.completion_tokens / 1_000_000) * costConfig.output;
|
|
268
|
-
return inputCost + outputCost;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// ============================================================================
|
|
272
|
-
// TEST EXECUTOR
|
|
273
|
-
// ============================================================================
|
|
274
|
-
|
|
275
|
-
async function runTest(taskName, modelName, inputArg, options = {}) {
|
|
276
|
-
console.log(`\n${'='.repeat(60)}`);
|
|
277
|
-
console.log(`Cross-Provider Test: ${taskName} with ${modelName}`);
|
|
278
|
-
console.log(`${'='.repeat(60)}\n`);
|
|
279
|
-
|
|
280
|
-
// 1. Load task
|
|
281
|
-
console.log('š Loading task...');
|
|
282
|
-
const task = loadTask(taskName);
|
|
283
|
-
console.log(` Hash: ${task.hash}`);
|
|
284
|
-
|
|
285
|
-
// 2. Resolve and load test input
|
|
286
|
-
console.log('š„ Loading test input...');
|
|
287
|
-
const testInputPath = resolveInputPath(inputArg);
|
|
288
|
-
const testInput = fs.readFileSync(testInputPath, 'utf-8');
|
|
289
|
-
console.log(` Path: ${testInputPath}`);
|
|
290
|
-
console.log(` Size: ${testInput.length} chars`);
|
|
291
|
-
|
|
292
|
-
// 3. Build prompt
|
|
293
|
-
console.log('š§ Building prompt...');
|
|
294
|
-
const prompt = buildTestPrompt(task, testInput, options);
|
|
295
|
-
console.log(` Prompt size: ${prompt.length} chars`);
|
|
296
|
-
|
|
297
|
-
// 4. Get model config
|
|
298
|
-
const modelConfig = MODELS[modelName];
|
|
299
|
-
if (!modelConfig) {
|
|
300
|
-
throw new Error(`Unknown model: ${modelName}. Available: ${Object.keys(MODELS).join(', ')}`);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// 5. Execute
|
|
304
|
-
console.log(`\nš Running ${modelName}...`);
|
|
305
|
-
let result;
|
|
306
|
-
|
|
307
|
-
if (modelConfig.via === 'api') {
|
|
308
|
-
result = await runOpenRouterModel(modelConfig, prompt, options);
|
|
309
|
-
} else {
|
|
310
|
-
console.log(' ā ļø Opus requires Task tool execution. Run separately.');
|
|
311
|
-
result = { content: null, usage: null, latency: null, cost: null };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
if (result.content) {
|
|
315
|
-
console.log(`\nā
Complete!`);
|
|
316
|
-
console.log(` Latency: ${result.latency.toFixed(1)}s`);
|
|
317
|
-
console.log(` Cost: $${result.cost.toFixed(4)}`);
|
|
318
|
-
console.log(` Tokens: ${JSON.stringify(result.usage)}`);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// 6. Save results
|
|
322
|
-
const outputDir = path.join(PATHS.outputDir, taskName, modelName);
|
|
323
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
324
|
-
|
|
325
|
-
const timestamp = new Date().toISOString().split('T')[0];
|
|
326
|
-
const runId = `run-${Date.now()}`;
|
|
327
|
-
|
|
328
|
-
// Save task snapshot (only if new)
|
|
329
|
-
const snapshotPath = path.join(outputDir, `task-snapshot-${task.hash}.md`);
|
|
330
|
-
if (!fs.existsSync(snapshotPath)) {
|
|
331
|
-
fs.writeFileSync(snapshotPath, task.content);
|
|
332
|
-
console.log(`\nšø Saved task snapshot: ${snapshotPath}`);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// Save result
|
|
336
|
-
const resultFile = {
|
|
337
|
-
meta: {
|
|
338
|
-
task: taskName,
|
|
339
|
-
task_hash: task.hash,
|
|
340
|
-
model: modelName,
|
|
341
|
-
model_id: modelConfig.model_id,
|
|
342
|
-
timestamp,
|
|
343
|
-
run_id: runId
|
|
344
|
-
},
|
|
345
|
-
metrics: {
|
|
346
|
-
latency_seconds: result.latency,
|
|
347
|
-
cost_usd: result.cost,
|
|
348
|
-
tokens: result.usage
|
|
349
|
-
},
|
|
350
|
-
input: {
|
|
351
|
-
path: path.basename(testInputPath),
|
|
352
|
-
size_chars: testInput.length
|
|
353
|
-
},
|
|
354
|
-
output: result.content
|
|
355
|
-
};
|
|
356
|
-
|
|
357
|
-
const resultPath = path.join(outputDir, `${runId}.yaml`);
|
|
358
|
-
fs.writeFileSync(resultPath, formatAsYaml(resultFile));
|
|
359
|
-
console.log(`š¾ Saved result: ${resultPath}`);
|
|
360
|
-
|
|
361
|
-
return { task, result, outputDir, runId };
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
function formatAsYaml(obj) {
|
|
365
|
-
let yaml = `# Cross-Provider Test Result\n# Generated: ${new Date().toISOString()}\n\n`;
|
|
366
|
-
|
|
367
|
-
yaml += `meta:\n`;
|
|
368
|
-
yaml += ` task: "${obj.meta.task}"\n`;
|
|
369
|
-
yaml += ` task_hash: "${obj.meta.task_hash}"\n`;
|
|
370
|
-
yaml += ` model: "${obj.meta.model}"\n`;
|
|
371
|
-
yaml += ` model_id: "${obj.meta.model_id}"\n`;
|
|
372
|
-
yaml += ` timestamp: "${obj.meta.timestamp}"\n`;
|
|
373
|
-
yaml += ` run_id: "${obj.meta.run_id}"\n\n`;
|
|
374
|
-
|
|
375
|
-
yaml += `metrics:\n`;
|
|
376
|
-
yaml += ` latency_seconds: ${obj.metrics.latency_seconds?.toFixed(1) || 'null'}\n`;
|
|
377
|
-
yaml += ` cost_usd: ${obj.metrics.cost_usd?.toFixed(4) || 'null'}\n`;
|
|
378
|
-
if (obj.metrics.tokens) {
|
|
379
|
-
yaml += ` tokens:\n`;
|
|
380
|
-
yaml += ` prompt: ${obj.metrics.tokens.prompt_tokens}\n`;
|
|
381
|
-
yaml += ` completion: ${obj.metrics.tokens.completion_tokens}\n`;
|
|
382
|
-
yaml += ` total: ${obj.metrics.tokens.total_tokens}\n`;
|
|
383
|
-
}
|
|
384
|
-
yaml += `\n`;
|
|
385
|
-
|
|
386
|
-
yaml += `input:\n`;
|
|
387
|
-
yaml += ` path: "${obj.input.path}"\n`;
|
|
388
|
-
yaml += ` size_chars: ${obj.input.size_chars}\n\n`;
|
|
389
|
-
|
|
390
|
-
yaml += `output: |\n`;
|
|
391
|
-
if (obj.output) {
|
|
392
|
-
obj.output.split('\n').forEach(line => {
|
|
393
|
-
yaml += ` ${line}\n`;
|
|
394
|
-
});
|
|
395
|
-
} else {
|
|
396
|
-
yaml += ` null\n`;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
return yaml;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// ============================================================================
|
|
403
|
-
// CLI
|
|
404
|
-
// ============================================================================
|
|
405
|
-
|
|
406
|
-
async function main() {
|
|
407
|
-
const args = process.argv.slice(2);
|
|
408
|
-
|
|
409
|
-
if (args.includes('--help') || args.length === 0) {
|
|
410
|
-
console.log(`
|
|
411
|
-
Cross-Provider Model Qualification Runner
|
|
412
|
-
|
|
413
|
-
Usage:
|
|
414
|
-
node cross-provider-runner.js --task <name> --model <model> --input <file>
|
|
415
|
-
|
|
416
|
-
Options:
|
|
417
|
-
--task Task name (e.g., extract-knowledge, extract-voice-dna)
|
|
418
|
-
--model Model to test (${Object.keys(MODELS).join(', ')})
|
|
419
|
-
--input Input file (filename in inputs/ or full path)
|
|
420
|
-
--temp Temperature (default: ${DEFAULTS.temperature})
|
|
421
|
-
--tokens Max tokens (default: ${DEFAULTS.maxTokens})
|
|
422
|
-
|
|
423
|
-
Paths (from squad-config.yaml):
|
|
424
|
-
Tasks: ${PATHS.tasksDir}
|
|
425
|
-
Output: ${PATHS.outputDir}
|
|
426
|
-
Inputs: ${PATHS.inputsDir}
|
|
427
|
-
|
|
428
|
-
Examples:
|
|
429
|
-
# Using input filename (auto-resolves to inputs/ dir)
|
|
430
|
-
node cross-provider-runner.js --task extract-knowledge --model glm5 --input hormozi-value-equation.md
|
|
431
|
-
|
|
432
|
-
# Using relative path
|
|
433
|
-
node cross-provider-runner.js --task extract-voice-dna --model glm5 --input ./my-input.md
|
|
434
|
-
`);
|
|
435
|
-
process.exit(0);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
const getArg = (name) => {
|
|
439
|
-
const idx = args.indexOf(`--${name}`);
|
|
440
|
-
return idx !== -1 ? args[idx + 1] : null;
|
|
441
|
-
};
|
|
442
|
-
|
|
443
|
-
const taskName = getArg('task');
|
|
444
|
-
const modelName = getArg('model');
|
|
445
|
-
const inputArg = getArg('input');
|
|
446
|
-
const temperature = parseFloat(getArg('temp')) || DEFAULTS.temperature;
|
|
447
|
-
const maxTokens = parseInt(getArg('tokens')) || DEFAULTS.maxTokens;
|
|
448
|
-
|
|
449
|
-
if (!taskName || !modelName || !inputArg) {
|
|
450
|
-
console.error('ā Missing required arguments. Use --help for usage.');
|
|
451
|
-
process.exit(1);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
try {
|
|
455
|
-
await runTest(taskName, modelName, inputArg, { temperature, maxTokens });
|
|
456
|
-
} catch (error) {
|
|
457
|
-
console.error(`\nā Error: ${error.message}`);
|
|
458
|
-
process.exit(1);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cross-Provider Model Qualification Runner
|
|
4
|
+
*
|
|
5
|
+
* Executa testes de qualificação comparando modelos externos (GLM-5, Kimi)
|
|
6
|
+
* contra Opus baseline usando as TASKS REAIS do squad-creator.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Carrega task real (sem duplicação)
|
|
10
|
+
* - Salva snapshot da versão testada
|
|
11
|
+
* - Suporta mĆŗltiplos modelos
|
|
12
|
+
* - Gera relatório de comparação automÔtico
|
|
13
|
+
* - Usa paths do squad-config.yaml (zero hardcoded paths)
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* node cross-provider-runner.js --task extract-knowledge --model glm5 --input hormozi-value-equation.md
|
|
17
|
+
* node cross-provider-runner.js --task extract-voice-dna --model glm5 --input halbert-voice.md
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
const path = require('path');
|
|
22
|
+
const crypto = require('crypto');
|
|
23
|
+
|
|
24
|
+
// Load config (auto-detects project root)
|
|
25
|
+
const config = require('../lib/config-loader');
|
|
26
|
+
|
|
27
|
+
// Load env variables
|
|
28
|
+
require(config.paths.envLoader);
|
|
29
|
+
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// CONFIG
|
|
32
|
+
// ============================================================================
|
|
33
|
+
|
|
34
|
+
const PATHS = {
|
|
35
|
+
tasksDir: config.paths.tasks,
|
|
36
|
+
outputDir: config.paths.llmTests,
|
|
37
|
+
inputsDir: config.paths.llmTestInputs,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const MODELS = {
|
|
41
|
+
opus: {
|
|
42
|
+
provider: 'anthropic',
|
|
43
|
+
model_id: 'claude-opus-4-5-20250514',
|
|
44
|
+
via: 'task-tool',
|
|
45
|
+
cost: { input: 15.00, output: 75.00 }
|
|
46
|
+
},
|
|
47
|
+
glm5: {
|
|
48
|
+
provider: 'openrouter',
|
|
49
|
+
model_id: 'z-ai/glm-5',
|
|
50
|
+
via: 'api',
|
|
51
|
+
cost: { input: 0.80, output: 3.20 }
|
|
52
|
+
},
|
|
53
|
+
kimi: {
|
|
54
|
+
provider: 'openrouter',
|
|
55
|
+
model_id: 'moonshotai/kimi-k2.5',
|
|
56
|
+
via: 'api',
|
|
57
|
+
cost: { input: 0.50, output: 2.80 }
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const DEFAULTS = {
|
|
62
|
+
temperature: 0.3,
|
|
63
|
+
maxTokens: 8000,
|
|
64
|
+
timeoutMs: 180000
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// TASK LOADER
|
|
69
|
+
// ============================================================================
|
|
70
|
+
|
|
71
|
+
function loadTask(taskName) {
|
|
72
|
+
const taskPath = path.join(PATHS.tasksDir, `${taskName}.md`);
|
|
73
|
+
|
|
74
|
+
if (!fs.existsSync(taskPath)) {
|
|
75
|
+
throw new Error(`Task not found: ${taskPath}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const content = fs.readFileSync(taskPath, 'utf-8');
|
|
79
|
+
const hash = crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
name: taskName,
|
|
83
|
+
path: taskPath,
|
|
84
|
+
content,
|
|
85
|
+
hash,
|
|
86
|
+
loadedAt: new Date().toISOString()
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// INPUT RESOLVER
|
|
92
|
+
// ============================================================================
|
|
93
|
+
|
|
94
|
+
function resolveInputPath(inputArg) {
|
|
95
|
+
// If it's already an absolute path, use it
|
|
96
|
+
if (path.isAbsolute(inputArg)) {
|
|
97
|
+
return inputArg;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// If it's just a filename, look in the inputs directory
|
|
101
|
+
if (!inputArg.includes('/') && !inputArg.includes('\\')) {
|
|
102
|
+
const inInputsDir = path.join(PATHS.inputsDir, inputArg);
|
|
103
|
+
if (fs.existsSync(inInputsDir)) {
|
|
104
|
+
return inInputsDir;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Otherwise, resolve relative to current working directory
|
|
109
|
+
const relativePath = path.resolve(process.cwd(), inputArg);
|
|
110
|
+
if (fs.existsSync(relativePath)) {
|
|
111
|
+
return relativePath;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
throw new Error(`Input file not found: ${inputArg}\nLooked in:\n - ${path.join(PATHS.inputsDir, inputArg)}\n - ${relativePath}`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// PROMPT BUILDER
|
|
119
|
+
// ============================================================================
|
|
120
|
+
|
|
121
|
+
function buildTestPrompt(task, testInput, options = {}) {
|
|
122
|
+
// v2.0: Pass FULL task content (truncated if too large)
|
|
123
|
+
// This ensures QUALITY CHECK and all requirements reach the model
|
|
124
|
+
const taskContent = truncateTaskContent(task.content, 12000);
|
|
125
|
+
|
|
126
|
+
const prompt = `# Task Execution: ${task.name}
|
|
127
|
+
|
|
128
|
+
## TASK COMPLETA (Siga TODAS as instruƧƵes abaixo)
|
|
129
|
+
|
|
130
|
+
${taskContent}
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## INPUT DE TESTE
|
|
135
|
+
|
|
136
|
+
${testInput}
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## INSTRUĆĆES FINAIS
|
|
141
|
+
|
|
142
|
+
1. Execute a task acima usando o input fornecido
|
|
143
|
+
2. SIGA TODAS as regras da task, especialmente QUALITY CHECK
|
|
144
|
+
3. Responda APENAS com o output estruturado (YAML/MD)
|
|
145
|
+
4. ZERO INVENĆĆO - Só extraia o que estĆ” LITERALMENTE no input
|
|
146
|
+
5. CITE TUDO - Cada item deve ter [SOURCE: ...]
|
|
147
|
+
|
|
148
|
+
${options.additionalInstructions || ''}`;
|
|
149
|
+
|
|
150
|
+
return prompt;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Truncate task content intelligently:
|
|
155
|
+
* - Keep frontmatter + first sections
|
|
156
|
+
* - Keep QUALITY CHECK section (critical for quality)
|
|
157
|
+
* - Keep OUTPUT section (defines expected format)
|
|
158
|
+
* - Truncate middle sections if needed
|
|
159
|
+
*/
|
|
160
|
+
function truncateTaskContent(content, maxChars) {
|
|
161
|
+
if (content.length <= maxChars) {
|
|
162
|
+
return content;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Extract key sections that MUST be included
|
|
166
|
+
const qualityCheckMatch = content.match(/## QUALITY CHECK[\s\S]*?(?=\n## [A-Z]|\n---\n\*\*|$)/);
|
|
167
|
+
const outputMatch = content.match(/## OUTPUT:[\s\S]*?(?=\n## [A-Z]|\n---\n\*\*|$)/);
|
|
168
|
+
|
|
169
|
+
const qualityCheck = qualityCheckMatch ? qualityCheckMatch[0] : '';
|
|
170
|
+
const outputSection = outputMatch ? outputMatch[0] : '';
|
|
171
|
+
|
|
172
|
+
// Calculate how much space we have for the main content
|
|
173
|
+
const reservedChars = qualityCheck.length + outputSection.length + 500; // 500 for headers
|
|
174
|
+
const mainContentMax = maxChars - reservedChars;
|
|
175
|
+
|
|
176
|
+
// Get content up to QUALITY CHECK or OUTPUT (whichever comes first)
|
|
177
|
+
let mainContent = content;
|
|
178
|
+
const qualityIdx = content.indexOf('## QUALITY CHECK');
|
|
179
|
+
const outputIdx = content.indexOf('## OUTPUT:');
|
|
180
|
+
const cutoffIdx = Math.min(
|
|
181
|
+
qualityIdx > 0 ? qualityIdx : Infinity,
|
|
182
|
+
outputIdx > 0 ? outputIdx : Infinity
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
if (cutoffIdx < Infinity) {
|
|
186
|
+
mainContent = content.slice(0, cutoffIdx);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Truncate main content if needed
|
|
190
|
+
if (mainContent.length > mainContentMax) {
|
|
191
|
+
mainContent = mainContent.slice(0, mainContentMax) + '\n\n[... truncated for length ...]\n\n';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Rebuild with key sections
|
|
195
|
+
let result = mainContent;
|
|
196
|
+
if (qualityCheck && !result.includes('## QUALITY CHECK')) {
|
|
197
|
+
result += '\n\n' + qualityCheck;
|
|
198
|
+
}
|
|
199
|
+
if (outputSection && !result.includes('## OUTPUT:')) {
|
|
200
|
+
result += '\n\n' + outputSection;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Legacy function kept for reference
|
|
207
|
+
function extractTaskSections(content) {
|
|
208
|
+
const sections = {};
|
|
209
|
+
|
|
210
|
+
const purposeMatch = content.match(/## Purpose\n\n([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
211
|
+
if (purposeMatch) sections.purpose = purposeMatch[1].trim();
|
|
212
|
+
|
|
213
|
+
const executionMatch = content.match(/## Execution\n\n([\s\S]*?)(?=\n## Validation|\n## Error|\Z)/);
|
|
214
|
+
if (executionMatch) sections.execution = executionMatch[1].slice(0, 3000);
|
|
215
|
+
|
|
216
|
+
const antiMatch = content.match(/## Anti-Invention[\s\S]*?([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
217
|
+
if (antiMatch) sections.antiInvention = antiMatch[1].trim();
|
|
218
|
+
|
|
219
|
+
const outputMatch = content.match(/## Outputs?\n\n([\s\S]*?)(?=\n## |\n---|\Z)/);
|
|
220
|
+
if (outputMatch) sections.outputs = outputMatch[1].trim();
|
|
221
|
+
|
|
222
|
+
return sections;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ============================================================================
|
|
226
|
+
// MODEL RUNNERS
|
|
227
|
+
// ============================================================================
|
|
228
|
+
|
|
229
|
+
async function runOpenRouterModel(modelConfig, prompt, options = {}) {
|
|
230
|
+
const start = Date.now();
|
|
231
|
+
|
|
232
|
+
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
233
|
+
method: 'POST',
|
|
234
|
+
headers: {
|
|
235
|
+
'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
|
|
236
|
+
'Content-Type': 'application/json',
|
|
237
|
+
'HTTP-Referer': 'https://lendario.ai',
|
|
238
|
+
'X-Title': 'Cross-Provider Qualification Test'
|
|
239
|
+
},
|
|
240
|
+
body: JSON.stringify({
|
|
241
|
+
model: modelConfig.model_id,
|
|
242
|
+
messages: [{ role: 'user', content: prompt }],
|
|
243
|
+
max_tokens: options.maxTokens || DEFAULTS.maxTokens,
|
|
244
|
+
temperature: options.temperature || DEFAULTS.temperature
|
|
245
|
+
})
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
const data = await response.json();
|
|
249
|
+
const elapsed = (Date.now() - start) / 1000;
|
|
250
|
+
|
|
251
|
+
if (data.error) {
|
|
252
|
+
throw new Error(`API Error: ${JSON.stringify(data.error)}`);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return {
|
|
256
|
+
content: data.choices[0].message.content,
|
|
257
|
+
usage: data.usage,
|
|
258
|
+
latency: elapsed,
|
|
259
|
+
cost: calculateCost(data.usage, modelConfig.cost),
|
|
260
|
+
raw: data
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function calculateCost(usage, costConfig) {
|
|
265
|
+
if (!usage) return 0;
|
|
266
|
+
const inputCost = (usage.prompt_tokens / 1_000_000) * costConfig.input;
|
|
267
|
+
const outputCost = (usage.completion_tokens / 1_000_000) * costConfig.output;
|
|
268
|
+
return inputCost + outputCost;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ============================================================================
|
|
272
|
+
// TEST EXECUTOR
|
|
273
|
+
// ============================================================================
|
|
274
|
+
|
|
275
|
+
async function runTest(taskName, modelName, inputArg, options = {}) {
|
|
276
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
277
|
+
console.log(`Cross-Provider Test: ${taskName} with ${modelName}`);
|
|
278
|
+
console.log(`${'='.repeat(60)}\n`);
|
|
279
|
+
|
|
280
|
+
// 1. Load task
|
|
281
|
+
console.log('š Loading task...');
|
|
282
|
+
const task = loadTask(taskName);
|
|
283
|
+
console.log(` Hash: ${task.hash}`);
|
|
284
|
+
|
|
285
|
+
// 2. Resolve and load test input
|
|
286
|
+
console.log('š„ Loading test input...');
|
|
287
|
+
const testInputPath = resolveInputPath(inputArg);
|
|
288
|
+
const testInput = fs.readFileSync(testInputPath, 'utf-8');
|
|
289
|
+
console.log(` Path: ${testInputPath}`);
|
|
290
|
+
console.log(` Size: ${testInput.length} chars`);
|
|
291
|
+
|
|
292
|
+
// 3. Build prompt
|
|
293
|
+
console.log('š§ Building prompt...');
|
|
294
|
+
const prompt = buildTestPrompt(task, testInput, options);
|
|
295
|
+
console.log(` Prompt size: ${prompt.length} chars`);
|
|
296
|
+
|
|
297
|
+
// 4. Get model config
|
|
298
|
+
const modelConfig = MODELS[modelName];
|
|
299
|
+
if (!modelConfig) {
|
|
300
|
+
throw new Error(`Unknown model: ${modelName}. Available: ${Object.keys(MODELS).join(', ')}`);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// 5. Execute
|
|
304
|
+
console.log(`\nš Running ${modelName}...`);
|
|
305
|
+
let result;
|
|
306
|
+
|
|
307
|
+
if (modelConfig.via === 'api') {
|
|
308
|
+
result = await runOpenRouterModel(modelConfig, prompt, options);
|
|
309
|
+
} else {
|
|
310
|
+
console.log(' ā ļø Opus requires Task tool execution. Run separately.');
|
|
311
|
+
result = { content: null, usage: null, latency: null, cost: null };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (result.content) {
|
|
315
|
+
console.log(`\nā
Complete!`);
|
|
316
|
+
console.log(` Latency: ${result.latency.toFixed(1)}s`);
|
|
317
|
+
console.log(` Cost: $${result.cost.toFixed(4)}`);
|
|
318
|
+
console.log(` Tokens: ${JSON.stringify(result.usage)}`);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// 6. Save results
|
|
322
|
+
const outputDir = path.join(PATHS.outputDir, taskName, modelName);
|
|
323
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
324
|
+
|
|
325
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
326
|
+
const runId = `run-${Date.now()}`;
|
|
327
|
+
|
|
328
|
+
// Save task snapshot (only if new)
|
|
329
|
+
const snapshotPath = path.join(outputDir, `task-snapshot-${task.hash}.md`);
|
|
330
|
+
if (!fs.existsSync(snapshotPath)) {
|
|
331
|
+
fs.writeFileSync(snapshotPath, task.content);
|
|
332
|
+
console.log(`\nšø Saved task snapshot: ${snapshotPath}`);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Save result
|
|
336
|
+
const resultFile = {
|
|
337
|
+
meta: {
|
|
338
|
+
task: taskName,
|
|
339
|
+
task_hash: task.hash,
|
|
340
|
+
model: modelName,
|
|
341
|
+
model_id: modelConfig.model_id,
|
|
342
|
+
timestamp,
|
|
343
|
+
run_id: runId
|
|
344
|
+
},
|
|
345
|
+
metrics: {
|
|
346
|
+
latency_seconds: result.latency,
|
|
347
|
+
cost_usd: result.cost,
|
|
348
|
+
tokens: result.usage
|
|
349
|
+
},
|
|
350
|
+
input: {
|
|
351
|
+
path: path.basename(testInputPath),
|
|
352
|
+
size_chars: testInput.length
|
|
353
|
+
},
|
|
354
|
+
output: result.content
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
const resultPath = path.join(outputDir, `${runId}.yaml`);
|
|
358
|
+
fs.writeFileSync(resultPath, formatAsYaml(resultFile));
|
|
359
|
+
console.log(`š¾ Saved result: ${resultPath}`);
|
|
360
|
+
|
|
361
|
+
return { task, result, outputDir, runId };
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function formatAsYaml(obj) {
|
|
365
|
+
let yaml = `# Cross-Provider Test Result\n# Generated: ${new Date().toISOString()}\n\n`;
|
|
366
|
+
|
|
367
|
+
yaml += `meta:\n`;
|
|
368
|
+
yaml += ` task: "${obj.meta.task}"\n`;
|
|
369
|
+
yaml += ` task_hash: "${obj.meta.task_hash}"\n`;
|
|
370
|
+
yaml += ` model: "${obj.meta.model}"\n`;
|
|
371
|
+
yaml += ` model_id: "${obj.meta.model_id}"\n`;
|
|
372
|
+
yaml += ` timestamp: "${obj.meta.timestamp}"\n`;
|
|
373
|
+
yaml += ` run_id: "${obj.meta.run_id}"\n\n`;
|
|
374
|
+
|
|
375
|
+
yaml += `metrics:\n`;
|
|
376
|
+
yaml += ` latency_seconds: ${obj.metrics.latency_seconds?.toFixed(1) || 'null'}\n`;
|
|
377
|
+
yaml += ` cost_usd: ${obj.metrics.cost_usd?.toFixed(4) || 'null'}\n`;
|
|
378
|
+
if (obj.metrics.tokens) {
|
|
379
|
+
yaml += ` tokens:\n`;
|
|
380
|
+
yaml += ` prompt: ${obj.metrics.tokens.prompt_tokens}\n`;
|
|
381
|
+
yaml += ` completion: ${obj.metrics.tokens.completion_tokens}\n`;
|
|
382
|
+
yaml += ` total: ${obj.metrics.tokens.total_tokens}\n`;
|
|
383
|
+
}
|
|
384
|
+
yaml += `\n`;
|
|
385
|
+
|
|
386
|
+
yaml += `input:\n`;
|
|
387
|
+
yaml += ` path: "${obj.input.path}"\n`;
|
|
388
|
+
yaml += ` size_chars: ${obj.input.size_chars}\n\n`;
|
|
389
|
+
|
|
390
|
+
yaml += `output: |\n`;
|
|
391
|
+
if (obj.output) {
|
|
392
|
+
obj.output.split('\n').forEach(line => {
|
|
393
|
+
yaml += ` ${line}\n`;
|
|
394
|
+
});
|
|
395
|
+
} else {
|
|
396
|
+
yaml += ` null\n`;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return yaml;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// ============================================================================
|
|
403
|
+
// CLI
|
|
404
|
+
// ============================================================================
|
|
405
|
+
|
|
406
|
+
async function main() {
|
|
407
|
+
const args = process.argv.slice(2);
|
|
408
|
+
|
|
409
|
+
if (args.includes('--help') || args.length === 0) {
|
|
410
|
+
console.log(`
|
|
411
|
+
Cross-Provider Model Qualification Runner
|
|
412
|
+
|
|
413
|
+
Usage:
|
|
414
|
+
node cross-provider-runner.js --task <name> --model <model> --input <file>
|
|
415
|
+
|
|
416
|
+
Options:
|
|
417
|
+
--task Task name (e.g., extract-knowledge, extract-voice-dna)
|
|
418
|
+
--model Model to test (${Object.keys(MODELS).join(', ')})
|
|
419
|
+
--input Input file (filename in inputs/ or full path)
|
|
420
|
+
--temp Temperature (default: ${DEFAULTS.temperature})
|
|
421
|
+
--tokens Max tokens (default: ${DEFAULTS.maxTokens})
|
|
422
|
+
|
|
423
|
+
Paths (from squad-config.yaml):
|
|
424
|
+
Tasks: ${PATHS.tasksDir}
|
|
425
|
+
Output: ${PATHS.outputDir}
|
|
426
|
+
Inputs: ${PATHS.inputsDir}
|
|
427
|
+
|
|
428
|
+
Examples:
|
|
429
|
+
# Using input filename (auto-resolves to inputs/ dir)
|
|
430
|
+
node cross-provider-runner.js --task extract-knowledge --model glm5 --input hormozi-value-equation.md
|
|
431
|
+
|
|
432
|
+
# Using relative path
|
|
433
|
+
node cross-provider-runner.js --task extract-voice-dna --model glm5 --input ./my-input.md
|
|
434
|
+
`);
|
|
435
|
+
process.exit(0);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const getArg = (name) => {
|
|
439
|
+
const idx = args.indexOf(`--${name}`);
|
|
440
|
+
return idx !== -1 ? args[idx + 1] : null;
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
const taskName = getArg('task');
|
|
444
|
+
const modelName = getArg('model');
|
|
445
|
+
const inputArg = getArg('input');
|
|
446
|
+
const temperature = parseFloat(getArg('temp')) || DEFAULTS.temperature;
|
|
447
|
+
const maxTokens = parseInt(getArg('tokens')) || DEFAULTS.maxTokens;
|
|
448
|
+
|
|
449
|
+
if (!taskName || !modelName || !inputArg) {
|
|
450
|
+
console.error('ā Missing required arguments. Use --help for usage.');
|
|
451
|
+
process.exit(1);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
try {
|
|
455
|
+
await runTest(taskName, modelName, inputArg, { temperature, maxTokens });
|
|
456
|
+
} catch (error) {
|
|
457
|
+
console.error(`\nā Error: ${error.message}`);
|
|
458
|
+
process.exit(1);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
main();
|