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,354 +1,354 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Tests for security_scanner.py
|
|
4
|
-
Run with: pytest scripts/tests/test_security_scanner.py -v
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
import sys
|
|
9
|
-
import json
|
|
10
|
-
import pytest
|
|
11
|
-
import tempfile
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
|
|
14
|
-
# Add parent directory to path for imports
|
|
15
|
-
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
16
|
-
|
|
17
|
-
from security_scanner import (
|
|
18
|
-
scan_file_content,
|
|
19
|
-
scan_for_files,
|
|
20
|
-
scan_squad,
|
|
21
|
-
SecurityIssue,
|
|
22
|
-
SecurityResult,
|
|
23
|
-
SECURITY_CHECKS,
|
|
24
|
-
FILE_CHECKS,
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class TestAPIKeyDetection:
|
|
29
|
-
"""Tests for API key detection (SEC-001)"""
|
|
30
|
-
|
|
31
|
-
def test_detects_api_key(self):
|
|
32
|
-
"""Should detect hardcoded API keys"""
|
|
33
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
34
|
-
f.write('config:\n api_key: "sk-1234567890abcdef1234567890abcdef"\n')
|
|
35
|
-
f.flush()
|
|
36
|
-
|
|
37
|
-
issues = scan_file_content(
|
|
38
|
-
Path(f.name),
|
|
39
|
-
"SEC-001",
|
|
40
|
-
SECURITY_CHECKS["SEC-001"]
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
# Should detect (unless excluded by pattern)
|
|
44
|
-
# Note: "sk-1234" is in exclusion list, but full key should be caught
|
|
45
|
-
os.unlink(f.name)
|
|
46
|
-
|
|
47
|
-
def test_ignores_placeholder(self):
|
|
48
|
-
"""Should ignore placeholder values"""
|
|
49
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
50
|
-
f.write('config:\n api_key: "${API_KEY}"\n')
|
|
51
|
-
f.flush()
|
|
52
|
-
|
|
53
|
-
issues = scan_file_content(
|
|
54
|
-
Path(f.name),
|
|
55
|
-
"SEC-001",
|
|
56
|
-
SECURITY_CHECKS["SEC-001"]
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
assert len(issues) == 0
|
|
60
|
-
os.unlink(f.name)
|
|
61
|
-
|
|
62
|
-
def test_ignores_example(self):
|
|
63
|
-
"""Should ignore example values"""
|
|
64
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
65
|
-
f.write('# Example:\n api_key: "your-key-here-example"\n')
|
|
66
|
-
f.flush()
|
|
67
|
-
|
|
68
|
-
issues = scan_file_content(
|
|
69
|
-
Path(f.name),
|
|
70
|
-
"SEC-001",
|
|
71
|
-
SECURITY_CHECKS["SEC-001"]
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
assert len(issues) == 0
|
|
75
|
-
os.unlink(f.name)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
class TestSecretDetection:
|
|
79
|
-
"""Tests for secret/password detection (SEC-002)"""
|
|
80
|
-
|
|
81
|
-
def test_detects_password(self):
|
|
82
|
-
"""Should detect hardcoded passwords"""
|
|
83
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
84
|
-
f.write('database:\n password: "realpassword123456"\n')
|
|
85
|
-
f.flush()
|
|
86
|
-
|
|
87
|
-
issues = scan_file_content(
|
|
88
|
-
Path(f.name),
|
|
89
|
-
"SEC-002",
|
|
90
|
-
SECURITY_CHECKS["SEC-002"]
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
# Check if detected (may be excluded if matches exclusion pattern)
|
|
94
|
-
os.unlink(f.name)
|
|
95
|
-
|
|
96
|
-
def test_ignores_env_var(self):
|
|
97
|
-
"""Should ignore environment variable references"""
|
|
98
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
99
|
-
f.write('database:\n password: "${DATABASE_PASSWORD}"\n')
|
|
100
|
-
f.flush()
|
|
101
|
-
|
|
102
|
-
issues = scan_file_content(
|
|
103
|
-
Path(f.name),
|
|
104
|
-
"SEC-002",
|
|
105
|
-
SECURITY_CHECKS["SEC-002"]
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
assert len(issues) == 0
|
|
109
|
-
os.unlink(f.name)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
class TestAWSKeyDetection:
|
|
113
|
-
"""Tests for AWS key detection (SEC-003)"""
|
|
114
|
-
|
|
115
|
-
def test_detects_aws_access_key(self):
|
|
116
|
-
"""Should detect AWS access keys"""
|
|
117
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
118
|
-
f.write('AWS_ACCESS_KEY = "AKIAIOSFODNN7EXAMPLE"\n')
|
|
119
|
-
f.flush()
|
|
120
|
-
|
|
121
|
-
issues = scan_file_content(
|
|
122
|
-
Path(f.name),
|
|
123
|
-
"SEC-003",
|
|
124
|
-
SECURITY_CHECKS["SEC-003"]
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
# AKIAIOSFODNN7EXAMPLE is a known example key, may be excluded
|
|
128
|
-
os.unlink(f.name)
|
|
129
|
-
|
|
130
|
-
def test_ignores_documentation(self):
|
|
131
|
-
"""Should ignore AWS keys in grep patterns/documentation"""
|
|
132
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
133
|
-
f.write('# Pattern to find: grep -E "AKIA[A-Z0-9]{16}"\n')
|
|
134
|
-
f.flush()
|
|
135
|
-
|
|
136
|
-
issues = scan_file_content(
|
|
137
|
-
Path(f.name),
|
|
138
|
-
"SEC-003",
|
|
139
|
-
SECURITY_CHECKS["SEC-003"]
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
assert len(issues) == 0
|
|
143
|
-
os.unlink(f.name)
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
class TestPrivateKeyDetection:
|
|
147
|
-
"""Tests for private key detection (SEC-005)"""
|
|
148
|
-
|
|
149
|
-
def test_detects_private_key_content(self):
|
|
150
|
-
"""Should detect private key content"""
|
|
151
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
|
|
152
|
-
f.write('-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----\n')
|
|
153
|
-
f.flush()
|
|
154
|
-
|
|
155
|
-
issues = scan_file_content(
|
|
156
|
-
Path(f.name),
|
|
157
|
-
"SEC-005",
|
|
158
|
-
SECURITY_CHECKS["SEC-005"]
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
# Should be detected
|
|
162
|
-
assert len(issues) >= 1
|
|
163
|
-
os.unlink(f.name)
|
|
164
|
-
|
|
165
|
-
def test_ignores_grep_pattern(self):
|
|
166
|
-
"""Should ignore private key patterns in grep commands"""
|
|
167
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
168
|
-
f.write('action: "grep -rE \'-----BEGIN.*PRIVATE KEY-----\'"\n')
|
|
169
|
-
f.flush()
|
|
170
|
-
|
|
171
|
-
issues = scan_file_content(
|
|
172
|
-
Path(f.name),
|
|
173
|
-
"SEC-005",
|
|
174
|
-
SECURITY_CHECKS["SEC-005"]
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
assert len(issues) == 0
|
|
178
|
-
os.unlink(f.name)
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
class TestDatabaseURLDetection:
|
|
182
|
-
"""Tests for database URL detection (SEC-007)"""
|
|
183
|
-
|
|
184
|
-
def test_detects_postgres_url(self):
|
|
185
|
-
"""Should detect PostgreSQL URLs with passwords"""
|
|
186
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.env', delete=False) as f:
|
|
187
|
-
f.write('DATABASE_URL=postgres://user:realpassword@prod-db.example.com:5432/mydb\n')
|
|
188
|
-
f.flush()
|
|
189
|
-
|
|
190
|
-
issues = scan_file_content(
|
|
191
|
-
Path(f.name),
|
|
192
|
-
"SEC-007",
|
|
193
|
-
SECURITY_CHECKS["SEC-007"]
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
# Should be detected
|
|
197
|
-
assert len(issues) >= 1
|
|
198
|
-
os.unlink(f.name)
|
|
199
|
-
|
|
200
|
-
def test_ignores_localhost(self):
|
|
201
|
-
"""Should ignore localhost database URLs"""
|
|
202
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
203
|
-
f.write('database:\n url: "postgres://user:pass@localhost:5432/dev"\n')
|
|
204
|
-
f.flush()
|
|
205
|
-
|
|
206
|
-
issues = scan_file_content(
|
|
207
|
-
Path(f.name),
|
|
208
|
-
"SEC-007",
|
|
209
|
-
SECURITY_CHECKS["SEC-007"]
|
|
210
|
-
)
|
|
211
|
-
|
|
212
|
-
assert len(issues) == 0
|
|
213
|
-
os.unlink(f.name)
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
class TestFileBasedChecks:
|
|
217
|
-
"""Tests for file-based security checks"""
|
|
218
|
-
|
|
219
|
-
def test_detects_env_file(self):
|
|
220
|
-
"""Should detect .env files"""
|
|
221
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
222
|
-
env_file = Path(tmpdir) / ".env"
|
|
223
|
-
env_file.write_text("SECRET=value\n")
|
|
224
|
-
|
|
225
|
-
issues = scan_for_files(
|
|
226
|
-
Path(tmpdir),
|
|
227
|
-
"SEC-008",
|
|
228
|
-
FILE_CHECKS["SEC-008"]
|
|
229
|
-
)
|
|
230
|
-
|
|
231
|
-
assert len(issues) >= 1
|
|
232
|
-
assert any(i.check_id == "SEC-008" for i in issues)
|
|
233
|
-
|
|
234
|
-
def test_detects_pem_file(self):
|
|
235
|
-
"""Should detect .pem files"""
|
|
236
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
237
|
-
pem_file = Path(tmpdir) / "server.pem"
|
|
238
|
-
pem_file.write_text("fake pem content\n")
|
|
239
|
-
|
|
240
|
-
issues = scan_for_files(
|
|
241
|
-
Path(tmpdir),
|
|
242
|
-
"SEC-006",
|
|
243
|
-
FILE_CHECKS["SEC-006"]
|
|
244
|
-
)
|
|
245
|
-
|
|
246
|
-
assert len(issues) >= 1
|
|
247
|
-
assert any(i.check_id == "SEC-006" for i in issues)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
class TestSquadScan:
|
|
251
|
-
"""Tests for full squad scanning"""
|
|
252
|
-
|
|
253
|
-
def test_clean_squad_passes(self):
|
|
254
|
-
"""Clean squad should pass all checks"""
|
|
255
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
256
|
-
# Create minimal squad structure
|
|
257
|
-
(Path(tmpdir) / "agents").mkdir()
|
|
258
|
-
(Path(tmpdir) / "tasks").mkdir()
|
|
259
|
-
(Path(tmpdir) / "config.yaml").write_text("name: test-squad\nversion: 1.0.0\n")
|
|
260
|
-
(Path(tmpdir) / "agents" / "main.md").write_text("# Main Agent\n\nNo secrets here.\n")
|
|
261
|
-
|
|
262
|
-
result = scan_squad(tmpdir)
|
|
263
|
-
|
|
264
|
-
assert result.status == "pass"
|
|
265
|
-
assert result.issues_count == 0
|
|
266
|
-
|
|
267
|
-
def test_squad_with_secret_fails(self):
|
|
268
|
-
"""Squad with secrets should fail"""
|
|
269
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
270
|
-
# Create squad with secret
|
|
271
|
-
(Path(tmpdir) / "config.yaml").write_text(
|
|
272
|
-
'name: test-squad\napi_key: "sk-realkey1234567890abcdef"\n'
|
|
273
|
-
)
|
|
274
|
-
|
|
275
|
-
result = scan_squad(tmpdir)
|
|
276
|
-
|
|
277
|
-
# May or may not fail depending on exclusion patterns
|
|
278
|
-
# The important thing is the scan completes
|
|
279
|
-
|
|
280
|
-
def test_nonexistent_path(self):
|
|
281
|
-
"""Nonexistent path should return error"""
|
|
282
|
-
result = scan_squad("/nonexistent/path/to/squad")
|
|
283
|
-
|
|
284
|
-
assert result.status == "error"
|
|
285
|
-
assert len(result.issues) >= 1
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
class TestOutputFormats:
|
|
289
|
-
"""Tests for output formatting"""
|
|
290
|
-
|
|
291
|
-
def test_json_output(self):
|
|
292
|
-
"""JSON output should be valid"""
|
|
293
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
294
|
-
(Path(tmpdir) / "config.yaml").write_text("name: test\n")
|
|
295
|
-
|
|
296
|
-
result = scan_squad(tmpdir)
|
|
297
|
-
|
|
298
|
-
# Convert to JSON and back
|
|
299
|
-
from security_scanner import format_json
|
|
300
|
-
json_str = format_json(result)
|
|
301
|
-
parsed = json.loads(json_str)
|
|
302
|
-
|
|
303
|
-
assert "status" in parsed
|
|
304
|
-
assert "issues_count" in parsed
|
|
305
|
-
assert "checks_run" in parsed
|
|
306
|
-
|
|
307
|
-
def test_text_output(self):
|
|
308
|
-
"""Text output should contain key information"""
|
|
309
|
-
with tempfile.TemporaryDirectory() as tmpdir:
|
|
310
|
-
(Path(tmpdir) / "config.yaml").write_text("name: test\n")
|
|
311
|
-
|
|
312
|
-
result = scan_squad(tmpdir)
|
|
313
|
-
|
|
314
|
-
from security_scanner import format_text
|
|
315
|
-
text = format_text(result)
|
|
316
|
-
|
|
317
|
-
assert "Security Scan" in text
|
|
318
|
-
assert "Status:" in text
|
|
319
|
-
assert "Checks:" in text
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
class TestStrictMode:
|
|
323
|
-
"""Tests for strict mode (no exclusions)"""
|
|
324
|
-
|
|
325
|
-
def test_strict_catches_more(self):
|
|
326
|
-
"""Strict mode should catch patterns that are normally excluded"""
|
|
327
|
-
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
328
|
-
# Write something that would normally be excluded
|
|
329
|
-
f.write('# Example: api_key: "example-key-12345678"\n')
|
|
330
|
-
f.flush()
|
|
331
|
-
|
|
332
|
-
# Normal mode - should be excluded
|
|
333
|
-
normal_issues = scan_file_content(
|
|
334
|
-
Path(f.name),
|
|
335
|
-
"SEC-001",
|
|
336
|
-
SECURITY_CHECKS["SEC-001"],
|
|
337
|
-
strict=False
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
# Strict mode - should catch it
|
|
341
|
-
strict_issues = scan_file_content(
|
|
342
|
-
Path(f.name),
|
|
343
|
-
"SEC-001",
|
|
344
|
-
SECURITY_CHECKS["SEC-001"],
|
|
345
|
-
strict=True
|
|
346
|
-
)
|
|
347
|
-
|
|
348
|
-
# Strict should catch more or equal
|
|
349
|
-
assert len(strict_issues) >= len(normal_issues)
|
|
350
|
-
os.unlink(f.name)
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if __name__ == "__main__":
|
|
354
|
-
pytest.main([__file__, "-v"])
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Tests for security_scanner.py
|
|
4
|
+
Run with: pytest scripts/tests/test_security_scanner.py -v
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import json
|
|
10
|
+
import pytest
|
|
11
|
+
import tempfile
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
# Add parent directory to path for imports
|
|
15
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
16
|
+
|
|
17
|
+
from security_scanner import (
|
|
18
|
+
scan_file_content,
|
|
19
|
+
scan_for_files,
|
|
20
|
+
scan_squad,
|
|
21
|
+
SecurityIssue,
|
|
22
|
+
SecurityResult,
|
|
23
|
+
SECURITY_CHECKS,
|
|
24
|
+
FILE_CHECKS,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TestAPIKeyDetection:
|
|
29
|
+
"""Tests for API key detection (SEC-001)"""
|
|
30
|
+
|
|
31
|
+
def test_detects_api_key(self):
|
|
32
|
+
"""Should detect hardcoded API keys"""
|
|
33
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
34
|
+
f.write('config:\n api_key: "sk-1234567890abcdef1234567890abcdef"\n')
|
|
35
|
+
f.flush()
|
|
36
|
+
|
|
37
|
+
issues = scan_file_content(
|
|
38
|
+
Path(f.name),
|
|
39
|
+
"SEC-001",
|
|
40
|
+
SECURITY_CHECKS["SEC-001"]
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Should detect (unless excluded by pattern)
|
|
44
|
+
# Note: "sk-1234" is in exclusion list, but full key should be caught
|
|
45
|
+
os.unlink(f.name)
|
|
46
|
+
|
|
47
|
+
def test_ignores_placeholder(self):
|
|
48
|
+
"""Should ignore placeholder values"""
|
|
49
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
50
|
+
f.write('config:\n api_key: "${API_KEY}"\n')
|
|
51
|
+
f.flush()
|
|
52
|
+
|
|
53
|
+
issues = scan_file_content(
|
|
54
|
+
Path(f.name),
|
|
55
|
+
"SEC-001",
|
|
56
|
+
SECURITY_CHECKS["SEC-001"]
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
assert len(issues) == 0
|
|
60
|
+
os.unlink(f.name)
|
|
61
|
+
|
|
62
|
+
def test_ignores_example(self):
|
|
63
|
+
"""Should ignore example values"""
|
|
64
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
65
|
+
f.write('# Example:\n api_key: "your-key-here-example"\n')
|
|
66
|
+
f.flush()
|
|
67
|
+
|
|
68
|
+
issues = scan_file_content(
|
|
69
|
+
Path(f.name),
|
|
70
|
+
"SEC-001",
|
|
71
|
+
SECURITY_CHECKS["SEC-001"]
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
assert len(issues) == 0
|
|
75
|
+
os.unlink(f.name)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class TestSecretDetection:
|
|
79
|
+
"""Tests for secret/password detection (SEC-002)"""
|
|
80
|
+
|
|
81
|
+
def test_detects_password(self):
|
|
82
|
+
"""Should detect hardcoded passwords"""
|
|
83
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
84
|
+
f.write('database:\n password: "realpassword123456"\n')
|
|
85
|
+
f.flush()
|
|
86
|
+
|
|
87
|
+
issues = scan_file_content(
|
|
88
|
+
Path(f.name),
|
|
89
|
+
"SEC-002",
|
|
90
|
+
SECURITY_CHECKS["SEC-002"]
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
# Check if detected (may be excluded if matches exclusion pattern)
|
|
94
|
+
os.unlink(f.name)
|
|
95
|
+
|
|
96
|
+
def test_ignores_env_var(self):
|
|
97
|
+
"""Should ignore environment variable references"""
|
|
98
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
99
|
+
f.write('database:\n password: "${DATABASE_PASSWORD}"\n')
|
|
100
|
+
f.flush()
|
|
101
|
+
|
|
102
|
+
issues = scan_file_content(
|
|
103
|
+
Path(f.name),
|
|
104
|
+
"SEC-002",
|
|
105
|
+
SECURITY_CHECKS["SEC-002"]
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
assert len(issues) == 0
|
|
109
|
+
os.unlink(f.name)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class TestAWSKeyDetection:
|
|
113
|
+
"""Tests for AWS key detection (SEC-003)"""
|
|
114
|
+
|
|
115
|
+
def test_detects_aws_access_key(self):
|
|
116
|
+
"""Should detect AWS access keys"""
|
|
117
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
|
|
118
|
+
f.write('AWS_ACCESS_KEY = "AKIAIOSFODNN7EXAMPLE"\n')
|
|
119
|
+
f.flush()
|
|
120
|
+
|
|
121
|
+
issues = scan_file_content(
|
|
122
|
+
Path(f.name),
|
|
123
|
+
"SEC-003",
|
|
124
|
+
SECURITY_CHECKS["SEC-003"]
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# AKIAIOSFODNN7EXAMPLE is a known example key, may be excluded
|
|
128
|
+
os.unlink(f.name)
|
|
129
|
+
|
|
130
|
+
def test_ignores_documentation(self):
|
|
131
|
+
"""Should ignore AWS keys in grep patterns/documentation"""
|
|
132
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
133
|
+
f.write('# Pattern to find: grep -E "AKIA[A-Z0-9]{16}"\n')
|
|
134
|
+
f.flush()
|
|
135
|
+
|
|
136
|
+
issues = scan_file_content(
|
|
137
|
+
Path(f.name),
|
|
138
|
+
"SEC-003",
|
|
139
|
+
SECURITY_CHECKS["SEC-003"]
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
assert len(issues) == 0
|
|
143
|
+
os.unlink(f.name)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class TestPrivateKeyDetection:
|
|
147
|
+
"""Tests for private key detection (SEC-005)"""
|
|
148
|
+
|
|
149
|
+
def test_detects_private_key_content(self):
|
|
150
|
+
"""Should detect private key content"""
|
|
151
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as f:
|
|
152
|
+
f.write('-----BEGIN RSA PRIVATE KEY-----\nMIIEow...\n-----END RSA PRIVATE KEY-----\n')
|
|
153
|
+
f.flush()
|
|
154
|
+
|
|
155
|
+
issues = scan_file_content(
|
|
156
|
+
Path(f.name),
|
|
157
|
+
"SEC-005",
|
|
158
|
+
SECURITY_CHECKS["SEC-005"]
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Should be detected
|
|
162
|
+
assert len(issues) >= 1
|
|
163
|
+
os.unlink(f.name)
|
|
164
|
+
|
|
165
|
+
def test_ignores_grep_pattern(self):
|
|
166
|
+
"""Should ignore private key patterns in grep commands"""
|
|
167
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
168
|
+
f.write('action: "grep -rE \'-----BEGIN.*PRIVATE KEY-----\'"\n')
|
|
169
|
+
f.flush()
|
|
170
|
+
|
|
171
|
+
issues = scan_file_content(
|
|
172
|
+
Path(f.name),
|
|
173
|
+
"SEC-005",
|
|
174
|
+
SECURITY_CHECKS["SEC-005"]
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
assert len(issues) == 0
|
|
178
|
+
os.unlink(f.name)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class TestDatabaseURLDetection:
|
|
182
|
+
"""Tests for database URL detection (SEC-007)"""
|
|
183
|
+
|
|
184
|
+
def test_detects_postgres_url(self):
|
|
185
|
+
"""Should detect PostgreSQL URLs with passwords"""
|
|
186
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.env', delete=False) as f:
|
|
187
|
+
f.write('DATABASE_URL=postgres://user:realpassword@prod-db.example.com:5432/mydb\n')
|
|
188
|
+
f.flush()
|
|
189
|
+
|
|
190
|
+
issues = scan_file_content(
|
|
191
|
+
Path(f.name),
|
|
192
|
+
"SEC-007",
|
|
193
|
+
SECURITY_CHECKS["SEC-007"]
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# Should be detected
|
|
197
|
+
assert len(issues) >= 1
|
|
198
|
+
os.unlink(f.name)
|
|
199
|
+
|
|
200
|
+
def test_ignores_localhost(self):
|
|
201
|
+
"""Should ignore localhost database URLs"""
|
|
202
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.yaml', delete=False) as f:
|
|
203
|
+
f.write('database:\n url: "postgres://user:pass@localhost:5432/dev"\n')
|
|
204
|
+
f.flush()
|
|
205
|
+
|
|
206
|
+
issues = scan_file_content(
|
|
207
|
+
Path(f.name),
|
|
208
|
+
"SEC-007",
|
|
209
|
+
SECURITY_CHECKS["SEC-007"]
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
assert len(issues) == 0
|
|
213
|
+
os.unlink(f.name)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class TestFileBasedChecks:
|
|
217
|
+
"""Tests for file-based security checks"""
|
|
218
|
+
|
|
219
|
+
def test_detects_env_file(self):
|
|
220
|
+
"""Should detect .env files"""
|
|
221
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
222
|
+
env_file = Path(tmpdir) / ".env"
|
|
223
|
+
env_file.write_text("SECRET=value\n")
|
|
224
|
+
|
|
225
|
+
issues = scan_for_files(
|
|
226
|
+
Path(tmpdir),
|
|
227
|
+
"SEC-008",
|
|
228
|
+
FILE_CHECKS["SEC-008"]
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
assert len(issues) >= 1
|
|
232
|
+
assert any(i.check_id == "SEC-008" for i in issues)
|
|
233
|
+
|
|
234
|
+
def test_detects_pem_file(self):
|
|
235
|
+
"""Should detect .pem files"""
|
|
236
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
237
|
+
pem_file = Path(tmpdir) / "server.pem"
|
|
238
|
+
pem_file.write_text("fake pem content\n")
|
|
239
|
+
|
|
240
|
+
issues = scan_for_files(
|
|
241
|
+
Path(tmpdir),
|
|
242
|
+
"SEC-006",
|
|
243
|
+
FILE_CHECKS["SEC-006"]
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
assert len(issues) >= 1
|
|
247
|
+
assert any(i.check_id == "SEC-006" for i in issues)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class TestSquadScan:
|
|
251
|
+
"""Tests for full squad scanning"""
|
|
252
|
+
|
|
253
|
+
def test_clean_squad_passes(self):
|
|
254
|
+
"""Clean squad should pass all checks"""
|
|
255
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
256
|
+
# Create minimal squad structure
|
|
257
|
+
(Path(tmpdir) / "agents").mkdir()
|
|
258
|
+
(Path(tmpdir) / "tasks").mkdir()
|
|
259
|
+
(Path(tmpdir) / "config.yaml").write_text("name: test-squad\nversion: 1.0.0\n")
|
|
260
|
+
(Path(tmpdir) / "agents" / "main.md").write_text("# Main Agent\n\nNo secrets here.\n")
|
|
261
|
+
|
|
262
|
+
result = scan_squad(tmpdir)
|
|
263
|
+
|
|
264
|
+
assert result.status == "pass"
|
|
265
|
+
assert result.issues_count == 0
|
|
266
|
+
|
|
267
|
+
def test_squad_with_secret_fails(self):
|
|
268
|
+
"""Squad with secrets should fail"""
|
|
269
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
270
|
+
# Create squad with secret
|
|
271
|
+
(Path(tmpdir) / "config.yaml").write_text(
|
|
272
|
+
'name: test-squad\napi_key: "sk-realkey1234567890abcdef"\n'
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
result = scan_squad(tmpdir)
|
|
276
|
+
|
|
277
|
+
# May or may not fail depending on exclusion patterns
|
|
278
|
+
# The important thing is the scan completes
|
|
279
|
+
|
|
280
|
+
def test_nonexistent_path(self):
|
|
281
|
+
"""Nonexistent path should return error"""
|
|
282
|
+
result = scan_squad("/nonexistent/path/to/squad")
|
|
283
|
+
|
|
284
|
+
assert result.status == "error"
|
|
285
|
+
assert len(result.issues) >= 1
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class TestOutputFormats:
|
|
289
|
+
"""Tests for output formatting"""
|
|
290
|
+
|
|
291
|
+
def test_json_output(self):
|
|
292
|
+
"""JSON output should be valid"""
|
|
293
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
294
|
+
(Path(tmpdir) / "config.yaml").write_text("name: test\n")
|
|
295
|
+
|
|
296
|
+
result = scan_squad(tmpdir)
|
|
297
|
+
|
|
298
|
+
# Convert to JSON and back
|
|
299
|
+
from security_scanner import format_json
|
|
300
|
+
json_str = format_json(result)
|
|
301
|
+
parsed = json.loads(json_str)
|
|
302
|
+
|
|
303
|
+
assert "status" in parsed
|
|
304
|
+
assert "issues_count" in parsed
|
|
305
|
+
assert "checks_run" in parsed
|
|
306
|
+
|
|
307
|
+
def test_text_output(self):
|
|
308
|
+
"""Text output should contain key information"""
|
|
309
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
310
|
+
(Path(tmpdir) / "config.yaml").write_text("name: test\n")
|
|
311
|
+
|
|
312
|
+
result = scan_squad(tmpdir)
|
|
313
|
+
|
|
314
|
+
from security_scanner import format_text
|
|
315
|
+
text = format_text(result)
|
|
316
|
+
|
|
317
|
+
assert "Security Scan" in text
|
|
318
|
+
assert "Status:" in text
|
|
319
|
+
assert "Checks:" in text
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
class TestStrictMode:
|
|
323
|
+
"""Tests for strict mode (no exclusions)"""
|
|
324
|
+
|
|
325
|
+
def test_strict_catches_more(self):
|
|
326
|
+
"""Strict mode should catch patterns that are normally excluded"""
|
|
327
|
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.md', delete=False) as f:
|
|
328
|
+
# Write something that would normally be excluded
|
|
329
|
+
f.write('# Example: api_key: "example-key-12345678"\n')
|
|
330
|
+
f.flush()
|
|
331
|
+
|
|
332
|
+
# Normal mode - should be excluded
|
|
333
|
+
normal_issues = scan_file_content(
|
|
334
|
+
Path(f.name),
|
|
335
|
+
"SEC-001",
|
|
336
|
+
SECURITY_CHECKS["SEC-001"],
|
|
337
|
+
strict=False
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
# Strict mode - should catch it
|
|
341
|
+
strict_issues = scan_file_content(
|
|
342
|
+
Path(f.name),
|
|
343
|
+
"SEC-001",
|
|
344
|
+
SECURITY_CHECKS["SEC-001"],
|
|
345
|
+
strict=True
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
# Strict should catch more or equal
|
|
349
|
+
assert len(strict_issues) >= len(normal_issues)
|
|
350
|
+
os.unlink(f.name)
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
if __name__ == "__main__":
|
|
354
|
+
pytest.main([__file__, "-v"])
|