iron-edge 1.2.0 → 2.0.1
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/LICENSE +21 -0
- package/README.md +118 -26
- package/agents/iron-3d.md +1 -1
- package/agents/iron-animations.md +3 -2
- package/agents/iron-auditor.md +175 -0
- package/agents/iron-brand.md +3 -2
- package/agents/iron-ceo.md +150 -0
- package/agents/iron-claude.md +54 -0
- package/agents/iron-clone.md +87 -0
- package/agents/iron-cloning.md +21 -3
- package/agents/iron-commercial.md +3 -2
- package/agents/iron-community.md +1 -1
- package/agents/iron-content.md +3 -2
- package/agents/iron-copy.md +3 -2
- package/agents/iron-council.md +3 -2
- package/agents/iron-courses.md +3 -2
- package/agents/iron-cyber.md +3 -2
- package/agents/iron-design.md +3 -2
- package/agents/iron-eng.md +138 -0
- package/agents/iron-finance.md +3 -2
- package/agents/iron-forge.md +147 -0
- package/agents/iron-growth.md +3 -2
- package/agents/iron-install.md +15 -13
- package/agents/iron-paidmedia.md +3 -2
- package/agents/iron-premium.md +146 -0
- package/agents/iron-product.md +3 -2
- package/agents/iron-research.md +3 -2
- package/agents/iron-search.md +82 -0
- package/agents/iron-shopify.md +80 -4
- package/agents/iron-spy.md +1 -1
- package/agents/iron-storytelling.md +3 -2
- package/agents/iron-video.md +1 -1
- package/agents/lp-cinematico.md +2 -2
- package/agents/xq-advisory.md +1 -1
- package/agents/xq-brand.md +1 -1
- package/agents/xq-clevel.md +1 -1
- package/agents/xq-codecore.md +19 -19
- package/agents/xq-copy.md +1 -1
- package/agents/xq-copymaster.md +1 -1
- package/agents/xq-cyber.md +1 -1
- package/agents/xq-data.md +1 -1
- package/agents/xq-design.md +1 -1
- package/agents/xq-hormozi.md +2 -2
- package/agents/xq-movement.md +1 -1
- package/agents/xq-storytelling.md +1 -1
- package/agents/xq-traffic.md +1 -1
- package/bin/iron-edge.js +74 -0
- package/docs/2026-08-21-como-pedir-software-ao-iron.md +62 -0
- package/docs/2026-08-21-skill-gate-fonte-unica.md +70 -0
- package/installer/install-mac.sh +52 -0
- package/installer/install-windows.ps1 +65 -0
- package/installer/install.js +597 -0
- package/iron-routing-map.md +276 -0
- package/package.json +14 -7
- package/skills/anotar/SKILL.md +50 -0
- package/skills/brandkit/SKILL.md +152 -0
- package/skills/clone-distill/SKILL.md +45 -0
- package/skills/clone-distill/scripts/distill.mjs +144 -0
- package/skills/clone-inventory/SKILL.md +51 -0
- package/skills/clone-inventory/package-lock.json +307 -0
- package/skills/clone-inventory/package.json +1 -0
- package/skills/clone-inventory/scripts/inventory.mjs +336 -0
- package/skills/clone-organize/SKILL.md +107 -0
- package/skills/clone-organize/package-lock.json +307 -0
- package/skills/clone-organize/package.json +1 -0
- package/skills/clone-organize/scripts/verify-visual.mjs +79 -0
- package/skills/clone-site/SKILL.md +104 -0
- package/skills/clone-site/package-lock.json +360 -0
- package/skills/clone-site/package.json +12 -0
- package/skills/clone-site/reference/lessons.md +131 -0
- package/skills/clone-site/reference/workflow.md +211 -0
- package/skills/clone-site/scripts/capture.mjs +507 -0
- package/skills/clone-site/scripts/clone.sh +166 -0
- package/skills/clone-site/scripts/fix_paths.py +118 -0
- package/skills/clone-site/scripts/serve.py +129 -0
- package/skills/clone-site/scripts/verify.mjs +126 -0
- package/skills/clone-site/scripts/wget_fallback.sh +38 -0
- package/skills/clone-transplant/SKILL.md +50 -0
- package/skills/clone-transplant/scripts/transplant.mjs +299 -0
- package/skills/conectar-mcp/SKILL.md +38 -0
- package/skills/escada/SKILL.md +62 -0
- package/skills/faxina/SKILL.md +34 -0
- package/skills/gate/SKILL.md +318 -0
- package/skills/gate/hooks/gate-dirty.sh +40 -0
- package/skills/gate/hooks/gate-stop.sh +31 -0
- package/skills/gate/preflight.py +132 -0
- package/skills/lp-cinematico/SKILL.md +5 -0
- package/skills/roteiro-video/SKILL.md +5 -0
- package/skills/salvar/SKILL.md +87 -0
- package/squads/squad-animations/README.md +18 -6
- package/squads/squad-animations/agents/animation-interpreter.md +9 -0
- package/squads/squad-animations/agents/animation-performance-engineer.md +9 -0
- package/squads/squad-animations/agents/animations-orqx.md +11 -2
- package/squads/squad-animations/agents/css-motion-artist.md +9 -0
- package/squads/squad-animations/agents/generative-particle-engineer.md +9 -0
- package/squads/squad-animations/agents/motion-choreographer.md +9 -0
- package/squads/squad-animations/agents/scroll-narrative-engineer.md +9 -0
- package/squads/squad-animations/agents/shader-artist.md +9 -0
- package/squads/squad-animations/agents/threejs-architect.md +9 -0
- package/squads/squad-animations/knowledge-base/chrome-brain-integration.md +17 -43
- package/squads/squad-animations/squad.yaml +21 -7
- package/squads/squad-brand/README.md +9 -3
- package/squads/squad-brand/agents/al-ries.md +9 -0
- package/squads/squad-brand/agents/alina-wheeler.md +9 -0
- package/squads/squad-brand/agents/archetype-consultant.md +9 -0
- package/squads/squad-brand/agents/brand-archetype-strategist.md +9 -0
- package/squads/squad-brand/agents/brand-auditor.md +9 -0
- package/squads/squad-brand/agents/brand-collateral-designer.md +9 -0
- package/squads/squad-brand/agents/brand-compiler.md +9 -0
- package/squads/squad-brand/agents/brand-creative-engineer.md +9 -0
- package/squads/squad-brand/agents/brand-culture-architect.md +9 -0
- package/squads/squad-brand/agents/brand-growth-strategist.md +9 -0
- package/squads/squad-brand/agents/brand-identity-designer.md +9 -0
- package/squads/squad-brand/agents/brand-motion-vfx.md +9 -0
- package/squads/squad-brand/agents/brand-naming-specialist.md +9 -0
- package/squads/squad-brand/agents/brand-orqx.md +12 -3
- package/squads/squad-brand/agents/brand-positioning-strategist.md +9 -0
- package/squads/squad-brand/agents/brand-sonic-designer.md +9 -0
- package/squads/squad-brand/agents/brand-strategist.md +9 -0
- package/squads/squad-brand/agents/brand-system-architect.md +9 -0
- package/squads/squad-brand/agents/byron-sharp.md +9 -0
- package/squads/squad-brand/agents/david-aaker.md +9 -0
- package/squads/squad-brand/agents/denise-yohn.md +9 -0
- package/squads/squad-brand/agents/domain-scout.md +9 -0
- package/squads/squad-brand/agents/donald-miller.md +9 -0
- package/squads/squad-brand/agents/emily-heyward.md +9 -0
- package/squads/squad-brand/agents/jean-noel-kapferer.md +9 -0
- package/squads/squad-brand/agents/kevin-keller.md +9 -0
- package/squads/squad-brand/agents/marty-neumeier.md +9 -0
- package/squads/squad-brand/agents/miller-sticky-brand.md +9 -0
- package/squads/squad-brand/agents/naming-strategist.md +9 -0
- package/squads/squad-brand/knowledge-base/chrome-brain-integration.md +17 -35
- package/squads/squad-brand/squad.yaml +43 -10
- package/squads/squad-brand/tasks/create-components.md +1 -1
- package/squads/squad-brand/tasks/create-dark-mode.md +1 -1
- package/squads/squad-brand/tasks/create-token-system.md +1 -1
- package/squads/squad-brand/tasks/define-grid-system.md +1 -1
- package/squads/squad-brand/tasks/design-dynamic-identity-system.md +1 -1
- package/squads/squad-brand/tasks/export-tokens.md +1 -1
- package/squads/squad-brand/templates/client-delivery-template.md +1 -1
- package/squads/squad-claude/README.md +19 -7
- package/squads/squad-claude/agents/claude-orqx.md +13 -4
- package/squads/squad-claude/agents/config-engineer.md +9 -0
- package/squads/squad-claude/agents/hooks-architect.md +9 -0
- package/squads/squad-claude/agents/mcp-integrator.md +9 -0
- package/squads/squad-claude/agents/project-integrator.md +9 -0
- package/squads/squad-claude/agents/roadmap-sentinel.md +9 -0
- package/squads/squad-claude/agents/skill-craftsman.md +9 -0
- package/squads/squad-claude/agents/swarm-orqx.md +9 -0
- package/squads/squad-claude/checklists/agent-readiness-checklist.md +1 -2
- package/squads/squad-claude/checklists/claude-setup-audit-checklist.md +1 -1
- package/squads/squad-claude/checklists/prompt-quality-checklist.md +0 -5
- package/squads/squad-claude/knowledge-base/chrome-brain-integration.md +17 -42
- package/squads/squad-claude/knowledge-base/claude-code-configuration-reference.md +6 -11
- package/squads/squad-claude/knowledge-base/claude-code-hooks-reference.md +28 -19
- package/squads/squad-claude/knowledge-base/claude-code-internals-deep.md +16 -2
- package/squads/squad-claude/knowledge-base/claude-code-tools-reference.md +2 -2
- package/squads/squad-claude/knowledge-base/context-window-optimization.md +3 -3
- package/squads/squad-claude/knowledge-base/knowledge-architecture-reference.md +3 -3
- package/squads/squad-claude/knowledge-base/mcp-integration-patterns.md +1 -1
- package/squads/squad-claude/knowledge-base/memory-systems-reference.md +6 -6
- package/squads/squad-claude/knowledge-base/obsidian-claude-integration.md +5 -5
- package/squads/squad-claude/knowledge-base/retrieval-augmented-generation.md +3 -3
- package/squads/squad-claude/knowledge-base/skill-creation-patterns.md +10 -10
- package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +10 -10
- package/squads/squad-claude/squad.yaml +20 -7
- package/squads/squad-claude/templates/agent-definition-template.md +1 -1
- package/squads/squad-cloning/README.md +22 -6
- package/squads/squad-cloning/agents/agent-forger.md +36 -3
- package/squads/squad-cloning/agents/cloning-orqx.md +39 -4
- package/squads/squad-cloning/agents/cognitive-extractor.md +33 -0
- package/squads/squad-cloning/agents/content-capturer.md +33 -0
- package/squads/squad-cloning/agents/kb-architect.md +33 -0
- package/squads/squad-cloning/agents/mind-synthesizer.md +33 -0
- package/squads/squad-cloning/agents/source-hunter.md +33 -0
- package/squads/squad-cloning/agents/squad-assembler.md +35 -2
- package/squads/squad-cloning/checklists/clone-completeness-checklist.md +1 -1
- package/squads/squad-cloning/checklists/pre-deploy-checklist.md +3 -3
- package/squads/squad-cloning/knowledge-base/agent-generation-guide.md +4 -4
- package/squads/squad-cloning/knowledge-base/chrome-brain-integration.md +17 -43
- package/squads/squad-cloning/knowledge-base/clone-tier-standards.md +1 -1
- package/squads/squad-cloning/knowledge-base/cross-squad-deployment.md +2 -2
- package/squads/squad-cloning/knowledge-base/ethical-guidelines.md +2 -2
- package/squads/squad-cloning/knowledge-base/multi-agent-deployment-patterns.md +1 -1
- package/squads/squad-cloning/knowledge-base/skill-standard-for-clones.md +5 -5
- package/squads/squad-cloning/squad.yaml +32 -11
- package/squads/squad-cloning/tasks/assign-content-class.md +33 -23
- package/squads/squad-cloning/tasks/build-cognitive-profile.md +38 -23
- package/squads/squad-cloning/tasks/calculate-confidence-score.md +36 -23
- package/squads/squad-cloning/tasks/capture-article-text.md +53 -23
- package/squads/squad-cloning/tasks/capture-social-posts.md +50 -23
- package/squads/squad-cloning/tasks/compile-source-catalog.md +37 -23
- package/squads/squad-cloning/tasks/cross-reference-kbs.md +67 -23
- package/squads/squad-cloning/tasks/deploy-cross-squad-kbs.md +43 -28
- package/squads/squad-cloning/tasks/design-kb-taxonomy.md +70 -23
- package/squads/squad-cloning/tasks/determine-clone-tier.md +45 -23
- package/squads/squad-cloning/tasks/discover-articles-interviews.md +36 -23
- package/squads/squad-cloning/tasks/discover-books-publications.md +36 -23
- package/squads/squad-cloning/tasks/discover-podcasts-appearances.md +36 -23
- package/squads/squad-cloning/tasks/discover-social-media-content.md +36 -23
- package/squads/squad-cloning/tasks/discover-youtube-channels.md +37 -23
- package/squads/squad-cloning/tasks/escalate-quality-issues.md +40 -23
- package/squads/squad-cloning/tasks/estimate-content-volume.md +37 -23
- package/squads/squad-cloning/tasks/extract-book-content.md +53 -23
- package/squads/squad-cloning/tasks/extract-decision-patterns.md +33 -23
- package/squads/squad-cloning/tasks/extract-heuristics.md +33 -23
- package/squads/squad-cloning/tasks/extract-mental-models.md +33 -23
- package/squads/squad-cloning/tasks/extract-vocabulary-tone.md +29 -23
- package/squads/squad-cloning/tasks/extract-workflows-processes.md +34 -23
- package/squads/squad-cloning/tasks/finalize-clone-delivery.md +37 -23
- package/squads/squad-cloning/tasks/generate-agent-commands.md +48 -23
- package/squads/squad-cloning/tasks/generate-agent-heuristics.md +44 -23
- package/squads/squad-cloning/tasks/generate-agent-persona.md +53 -23
- package/squads/squad-cloning/tasks/generate-agent-protocols.md +45 -23
- package/squads/squad-cloning/tasks/generate-checklist-files.md +43 -28
- package/squads/squad-cloning/tasks/generate-cross-squad-handoffs.md +53 -23
- package/squads/squad-cloning/tasks/generate-extraction-report.md +30 -23
- package/squads/squad-cloning/tasks/generate-framework-kbs.md +68 -23
- package/squads/squad-cloning/tasks/generate-methodology-kbs.md +68 -23
- package/squads/squad-cloning/tasks/generate-mind-map.md +36 -23
- package/squads/squad-cloning/tasks/generate-pattern-kbs.md +66 -23
- package/squads/squad-cloning/tasks/generate-reference-kbs.md +67 -23
- package/squads/squad-cloning/tasks/generate-squad-yaml.md +39 -27
- package/squads/squad-cloning/tasks/generate-task-files.md +45 -28
- package/squads/squad-cloning/tasks/generate-template-files.md +39 -28
- package/squads/squad-cloning/tasks/generate-workflow-files.md +44 -28
- package/squads/squad-cloning/tasks/identify-contradictions.md +32 -23
- package/squads/squad-cloning/tasks/identify-meta-patterns.md +42 -23
- package/squads/squad-cloning/tasks/initiate-clone-project.md +40 -23
- package/squads/squad-cloning/tasks/monitor-pipeline-progress.md +33 -23
- package/squads/squad-cloning/tasks/normalize-raw-content.md +43 -23
- package/squads/squad-cloning/tasks/package-squad-output.md +39 -28
- package/squads/squad-cloning/tasks/resolve-contradictions.md +47 -23
- package/squads/squad-cloning/tasks/run-pre-publish-checklist.md +39 -27
- package/squads/squad-cloning/tasks/tag-confidence-levels.md +30 -23
- package/squads/squad-cloning/tasks/transcribe-podcast-episodes.md +56 -23
- package/squads/squad-cloning/tasks/transcribe-youtube-videos.md +54 -23
- package/squads/squad-cloning/tasks/validate-agent-completeness.md +47 -23
- package/squads/squad-cloning/tasks/validate-kb-citations.md +62 -23
- package/squads/squad-cloning/tasks/validate-transcription-quality.md +39 -23
- package/squads/squad-cloning/workflows/full-clone-pipeline.yaml +17 -1
- package/squads/squad-cloning/workflows/tier2-consultant.yaml +1 -1
- package/squads/squad-commercial/README.md +18 -6
- package/squads/squad-commercial/agents/commercial-orqx.md +11 -2
- package/squads/squad-commercial/agents/cs-business-auditor.md +12 -3
- package/squads/squad-commercial/agents/cs-client-success.md +12 -3
- package/squads/squad-commercial/agents/cs-crm-specialist.md +12 -3
- package/squads/squad-commercial/agents/cs-funnel-architect.md +12 -3
- package/squads/squad-commercial/agents/cs-lead-generation-strategist.md +12 -3
- package/squads/squad-commercial/agents/cs-offer-designer.md +12 -3
- package/squads/squad-commercial/agents/cs-revops-analyst.md +12 -3
- package/squads/squad-commercial/agents/cs-sales-closer.md +12 -3
- package/squads/squad-commercial/agents/cs-sales-enablement.md +12 -3
- package/squads/squad-commercial/agents/legal-chief.md +19 -189
- package/squads/squad-commercial/knowledge-base/chrome-brain-integration.md +17 -34
- package/squads/squad-commercial/knowledge-base/prospecting-pipeline-generation.md +1 -1
- package/squads/squad-commercial/knowledge-base/sales-revenue-master-reference.md +2 -2
- package/squads/squad-commercial/squad.yaml +25 -16
- package/squads/squad-commercial/tasks/build-nurture-sequences.md +1 -1
- package/squads/squad-commercial/tasks/coordinate-revenue-cycle.md +5 -5
- package/squads/squad-commercial/tasks/define-icp-profile.md +1 -1
- package/squads/squad-commercial/tasks/design-advocacy-program.md +1 -1
- package/squads/squad-commercial/tasks/design-lead-magnet.md +1 -1
- package/squads/squad-commercial/tasks/design-lead-magnets.md +2 -2
- package/squads/squad-commercial/tasks/manage-commercial-handoffs.md +5 -5
- package/squads/squad-commercial/tasks/map-content-to-funnel.md +4 -4
- package/squads/squad-commercial/tasks/run-productization-sprint.md +2 -2
- package/squads/squad-content/README.md +18 -6
- package/squads/squad-content/agents/content-analyst.md +9 -0
- package/squads/squad-content/agents/content-engineer.md +10 -1
- package/squads/squad-content/agents/content-governor.md +10 -1
- package/squads/squad-content/agents/content-orqx.md +13 -4
- package/squads/squad-content/agents/editorial-strategist.md +11 -2
- package/squads/squad-content/agents/platform-specialist.md +14 -5
- package/squads/squad-content/agents/signal-intelligence.md +9 -0
- package/squads/squad-content/checklists/onboarding-setup-checklist.md +2 -2
- package/squads/squad-content/knowledge-base/chrome-brain-integration.md +17 -38
- package/squads/squad-content/knowledge-base/content-strategy-master-reference.md +1 -1
- package/squads/squad-content/knowledge-base/cross-squad-integration-protocol.md +24 -24
- package/squads/squad-content/knowledge-base/social-algorithms-master-reference.md +1 -1
- package/squads/squad-content/squad.yaml +22 -11
- package/squads/squad-content/tasks/check-brand-consistency.md +2 -2
- package/squads/squad-content/tasks/coordinate-cross-squad.md +2 -2
- package/squads/squad-content/tasks/define-big-idea.md +2 -2
- package/squads/squad-content/tasks/define-content-standards.md +1 -1
- package/squads/squad-content/tasks/define-editorial-pillars.md +1 -1
- package/squads/squad-content/tasks/integrate-brand-visual-assets.md +3 -3
- package/squads/squad-content/tasks/update-content-preferences.md +1 -1
- package/squads/squad-content/workflows/onboarding-content-cycle.yaml +1 -1
- package/squads/squad-copy/README.md +18 -6
- package/squads/squad-copy/agents/ad-copywriter.md +13 -4
- package/squads/squad-copy/agents/andre-chaperon.md +9 -0
- package/squads/squad-copy/agents/ben-settle.md +9 -0
- package/squads/squad-copy/agents/brand-voice-writer.md +14 -5
- package/squads/squad-copy/agents/claude-hopkins.md +9 -0
- package/squads/squad-copy/agents/clayton-makepeace.md +9 -0
- package/squads/squad-copy/agents/conversion-writer.md +13 -4
- package/squads/squad-copy/agents/copy-chief.md +24 -152
- package/squads/squad-copy/agents/copy-editor.md +11 -2
- package/squads/squad-copy/agents/copy-orqx.md +10 -1
- package/squads/squad-copy/agents/copy-strategist.md +16 -7
- package/squads/squad-copy/agents/dan-kennedy.md +9 -0
- package/squads/squad-copy/agents/dan-koe.md +9 -0
- package/squads/squad-copy/agents/david-deutsch.md +9 -0
- package/squads/squad-copy/agents/david-ogilvy.md +9 -0
- package/squads/squad-copy/agents/direct-response-writer.md +13 -4
- package/squads/squad-copy/agents/email-sequence-strategist.md +13 -4
- package/squads/squad-copy/agents/eugene-schwartz.md +9 -0
- package/squads/squad-copy/agents/frank-kern.md +9 -0
- package/squads/squad-copy/agents/funnel-copywriter.md +13 -4
- package/squads/squad-copy/agents/gary-bencivenga.md +9 -0
- package/squads/squad-copy/agents/gary-halbert.md +9 -0
- package/squads/squad-copy/agents/headline-specialist.md +10 -1
- package/squads/squad-copy/agents/jim-rutz.md +9 -0
- package/squads/squad-copy/agents/joe-sugarman.md +9 -0
- package/squads/squad-copy/agents/john-carlton.md +9 -0
- package/squads/squad-copy/agents/jon-benson.md +9 -0
- package/squads/squad-copy/agents/long-form-writer.md +13 -4
- package/squads/squad-copy/agents/parris-lampropoulos.md +9 -0
- package/squads/squad-copy/agents/persuasion-psychologist.md +12 -3
- package/squads/squad-copy/agents/proof-architect.md +13 -4
- package/squads/squad-copy/agents/robert-collier.md +9 -0
- package/squads/squad-copy/agents/russell-brunson.md +9 -0
- package/squads/squad-copy/agents/ry-schwartz.md +9 -0
- package/squads/squad-copy/agents/stefan-georgi.md +9 -0
- package/squads/squad-copy/agents/todd-brown.md +9 -0
- package/squads/squad-copy/knowledge-base/chrome-brain-integration.md +17 -37
- package/squads/squad-copy/squad.yaml +49 -16
- package/squads/squad-copy/tasks/align-copy-strategy-with-brand.md +6 -6
- package/squads/squad-copy/tasks/approve-copy-for-release.md +1 -1
- package/squads/squad-copy/tasks/build-headline-swipe-file.md +1 -1
- package/squads/squad-copy/tasks/build-message-hierarchy.md +2 -2
- package/squads/squad-copy/tasks/conduct-copy-audit.md +1 -1
- package/squads/squad-copy/tasks/coordinate-multi-channel-copy.md +1 -1
- package/squads/squad-copy/tasks/craft-social-media-hooks.md +1 -1
- package/squads/squad-copy/tasks/create-brand-manifesto.md +1 -1
- package/squads/squad-copy/tasks/create-case-study-framework.md +3 -3
- package/squads/squad-copy/tasks/create-copy-brief.md +3 -3
- package/squads/squad-copy/tasks/create-ugc-script.md +3 -3
- package/squads/squad-copy/tasks/define-market-awareness-level.md +1 -1
- package/squads/squad-copy/tasks/design-headline-ab-tests.md +2 -2
- package/squads/squad-copy/tasks/develop-brand-voice.md +1 -1
- package/squads/squad-copy/tasks/map-objection-landscape.md +2 -2
- package/squads/squad-copy/tasks/optimize-email-engagement.md +2 -2
- package/squads/squad-copy/tasks/optimize-funnel-conversion-copy.md +3 -3
- package/squads/squad-copy/tasks/plan-multi-channel-copy.md +1 -1
- package/squads/squad-copy/tasks/write-ad-copy-variations.md +2 -2
- package/squads/squad-copy/tasks/write-funnel-copy-sequence.md +1 -1
- package/squads/squad-copy/tasks/write-video-podcast-titles.md +1 -1
- package/squads/squad-copy/workflows/brand-voice-development.yaml +1 -1
- package/squads/squad-council/README.md +18 -6
- package/squads/squad-council/agents/brene-brown.md +9 -0
- package/squads/squad-council/agents/charlie-munger.md +9 -0
- package/squads/squad-council/agents/council-orqx.md +12 -3
- package/squads/squad-council/agents/derek-sivers.md +9 -0
- package/squads/squad-council/agents/naval-ravikant.md +9 -0
- package/squads/squad-council/agents/patrick-lencioni.md +9 -0
- package/squads/squad-council/agents/peter-thiel.md +9 -0
- package/squads/squad-council/agents/ray-dalio.md +9 -0
- package/squads/squad-council/agents/reid-hoffman.md +9 -0
- package/squads/squad-council/agents/simon-sinek.md +9 -0
- package/squads/squad-council/agents/yvon-chouinard.md +9 -0
- package/squads/squad-council/knowledge-base/brand-strategy-models.md +2 -2
- package/squads/squad-council/knowledge-base/innovation-disruption-frameworks.md +1 -1
- package/squads/squad-council/knowledge-base/market-analysis-frameworks.md +1 -1
- package/squads/squad-council/squad.yaml +25 -20
- package/squads/squad-courses/README.md +18 -6
- package/squads/squad-courses/agents/assessment-creator.md +9 -0
- package/squads/squad-courses/agents/content-writer.md +9 -0
- package/squads/squad-courses/agents/courses-orqx.md +11 -2
- package/squads/squad-courses/agents/curriculum-designer.md +9 -0
- package/squads/squad-courses/agents/launch-strategist.md +9 -0
- package/squads/squad-courses/agents/lesson-architect.md +9 -0
- package/squads/squad-courses/agents/production-director.md +9 -0
- package/squads/squad-courses/agents/slide-designer.md +9 -0
- package/squads/squad-courses/knowledge-base/domain-advocacia-curriculum.md +1 -1
- package/squads/squad-courses/knowledge-base/domain-contabilidade-curriculum.md +1 -1
- package/squads/squad-courses/squad.yaml +21 -10
- package/squads/squad-courses/tasks/adapt-content-for-level.md +30 -22
- package/squads/squad-courses/tasks/adapt-slides-for-format.md +41 -23
- package/squads/squad-courses/tasks/create-bonus-strategy.md +34 -17
- package/squads/squad-courses/tasks/create-final-project-brief.md +48 -22
- package/squads/squad-courses/tasks/create-lesson-outline.md +34 -22
- package/squads/squad-courses/tasks/create-presentation-outline.md +40 -23
- package/squads/squad-courses/tasks/create-production-checklist.md +43 -28
- package/squads/squad-courses/tasks/create-progress-milestones.md +40 -22
- package/squads/squad-courses/tasks/create-quiz-questions.md +47 -22
- package/squads/squad-courses/tasks/create-sales-page-brief.md +36 -17
- package/squads/squad-courses/tasks/create-self-evaluation.md +41 -22
- package/squads/squad-courses/tasks/create-shot-list.md +41 -28
- package/squads/squad-courses/tasks/create-speaker-notes.md +43 -23
- package/squads/squad-courses/tasks/create-syllabus-document.md +35 -23
- package/squads/squad-courses/tasks/create-teleprompter-script.md +42 -28
- package/squads/squad-courses/tasks/create-workshop-materials.md +40 -23
- package/squads/squad-courses/tasks/define-competency-framework.md +42 -23
- package/squads/squad-courses/tasks/define-course-scope.md +36 -23
- package/squads/squad-courses/tasks/define-learning-outcomes.md +41 -23
- package/squads/squad-courses/tasks/define-lesson-objectives.md +35 -22
- package/squads/squad-courses/tasks/design-certification-criteria.md +43 -22
- package/squads/squad-courses/tasks/design-email-sequence.md +33 -17
- package/squads/squad-courses/tasks/design-interactive-elements.md +45 -23
- package/squads/squad-courses/tasks/design-intro-outro.md +38 -27
- package/squads/squad-courses/tasks/design-knowledge-checkpoints.md +36 -22
- package/squads/squad-courses/tasks/design-learning-path.md +40 -23
- package/squads/squad-courses/tasks/design-lesson-flow.md +40 -22
- package/squads/squad-courses/tasks/design-module-structure.md +37 -22
- package/squads/squad-courses/tasks/design-peer-review-rubric.md +40 -22
- package/squads/squad-courses/tasks/design-practical-assessment.md +45 -22
- package/squads/squad-courses/tasks/design-pricing-model.md +34 -17
- package/squads/squad-courses/tasks/design-screen-recording-flow.md +41 -28
- package/squads/squad-courses/tasks/design-slide-structure.md +40 -23
- package/squads/squad-courses/tasks/design-student-onboarding.md +34 -17
- package/squads/squad-courses/tasks/design-visual-hierarchy.md +42 -23
- package/squads/squad-courses/tasks/estimate-lesson-duration.md +35 -22
- package/squads/squad-courses/tasks/finalize-course-delivery.md +34 -23
- package/squads/squad-courses/tasks/initiate-course-project.md +38 -23
- package/squads/squad-courses/tasks/map-prerequisite-chain.md +41 -23
- package/squads/squad-courses/tasks/monitor-course-progress.md +34 -23
- package/squads/squad-courses/tasks/plan-b-roll-sequences.md +41 -28
- package/squads/squad-courses/tasks/plan-enrollment-funnel.md +35 -17
- package/squads/squad-courses/tasks/plan-launch-sequence.md +36 -17
- package/squads/squad-courses/tasks/plan-practical-exercises.md +36 -22
- package/squads/squad-courses/tasks/plan-recording-session.md +48 -28
- package/squads/squad-courses/tasks/proofread-course-content.md +30 -22
- package/squads/squad-courses/tasks/review-course-quality.md +34 -23
- package/squads/squad-courses/tasks/select-platform-strategy.md +35 -17
- package/squads/squad-courses/tasks/sequence-difficulty-progression.md +36 -22
- package/squads/squad-courses/tasks/structure-module-sequence.md +40 -23
- package/squads/squad-courses/tasks/validate-pedagogical-coherence.md +43 -23
- package/squads/squad-courses/tasks/write-case-studies.md +30 -22
- package/squads/squad-courses/tasks/write-ebook-chapter.md +30 -22
- package/squads/squad-courses/tasks/write-handout-material.md +30 -22
- package/squads/squad-courses/tasks/write-lesson-content.md +33 -22
- package/squads/squad-courses/tasks/write-slide-content.md +43 -23
- package/squads/squad-courses/tasks/write-summary-sheets.md +30 -22
- package/squads/squad-courses/tasks/write-video-script.md +42 -27
- package/squads/squad-courses/tasks/write-workbook-exercises.md +31 -22
- package/squads/squad-courses/workflows/course-quality-review.yaml +3 -3
- package/squads/squad-courses/workflows/full-course-creation.yaml +2 -2
- package/squads/squad-cybersecurity/README.md +18 -6
- package/squads/squad-cybersecurity/agents/cloud-security-engineer.md +9 -0
- package/squads/squad-cybersecurity/agents/compliance-officer.md +9 -0
- package/squads/squad-cybersecurity/agents/cyber-chief.md +24 -159
- package/squads/squad-cybersecurity/agents/cyber-orqx.md +11 -2
- package/squads/squad-cybersecurity/agents/incident-responder.md +9 -0
- package/squads/squad-cybersecurity/agents/network-security-engineer.md +9 -0
- package/squads/squad-cybersecurity/agents/penetration-tester.md +9 -0
- package/squads/squad-cybersecurity/agents/soc-analyst.md +9 -0
- package/squads/squad-cybersecurity/agents/threat-analyst.md +9 -0
- package/squads/squad-cybersecurity/knowledge-base/chrome-brain-integration.md +17 -35
- package/squads/squad-cybersecurity/knowledge-base/routing-catalog.md +22 -22
- package/squads/squad-cybersecurity/squad.yaml +23 -9
- package/squads/squad-design/README.md +18 -6
- package/squads/squad-design/agents/brad-frost.md +14 -29
- package/squads/squad-design/agents/dan-mall.md +13 -26
- package/squads/squad-design/agents/dave-malouf.md +13 -26
- package/squads/squad-design/agents/design-chief.md +24 -216
- package/squads/squad-design/agents/design-orqx.md +11 -2
- package/squads/squad-design/agents/dx-accessibility-specialist.md +9 -0
- package/squads/squad-design/agents/dx-design-system-architect.md +9 -0
- package/squads/squad-design/agents/dx-frontend-engineer.md +9 -0
- package/squads/squad-design/agents/dx-interaction-designer.md +9 -0
- package/squads/squad-design/agents/dx-performance-engineer.md +9 -0
- package/squads/squad-design/agents/dx-ui-designer.md +9 -0
- package/squads/squad-design/agents/dx-ux-strategist.md +9 -0
- package/squads/squad-design/agents/nano-banana-generator.md +13 -25
- package/squads/squad-design/knowledge-base/brazilian-design-context.md +1 -1
- package/squads/squad-design/knowledge-base/chrome-brain-integration.md +17 -43
- package/squads/squad-design/knowledge-base/design-system-master-reference.md +1 -1
- package/squads/squad-design/knowledge-base/design-to-code-pipeline.md +1 -1
- package/squads/squad-design/knowledge-base/designops-maturity.md +1 -1
- package/squads/squad-design/knowledge-base/famous-design-systems-study.md +1 -1
- package/squads/squad-design/squad.yaml +26 -16
- package/squads/squad-engineering/README.md +82 -0
- package/squads/squad-engineering/agents/eng-architect.md +61 -0
- package/squads/squad-engineering/agents/eng-data.md +50 -0
- package/squads/squad-engineering/agents/eng-dev.md +64 -0
- package/squads/squad-engineering/agents/eng-devops.md +51 -0
- package/squads/squad-engineering/agents/eng-orqx.md +114 -0
- package/squads/squad-engineering/agents/eng-product.md +57 -0
- package/squads/squad-engineering/agents/eng-qa.md +49 -0
- package/squads/squad-engineering/agents/eng-sprint.md +57 -0
- package/squads/squad-engineering/checklists/dod.md +18 -0
- package/squads/squad-engineering/checklists/pre-publicacao.md +14 -0
- package/squads/squad-engineering/knowledge-base/doc-first-na-medida.md +46 -0
- package/squads/squad-engineering/knowledge-base/escada-e-cargos.md +61 -0
- package/squads/squad-engineering/knowledge-base/memoria-por-cargo.md +39 -0
- package/squads/squad-engineering/knowledge-base/seguranca-minima.md +30 -0
- package/squads/squad-engineering/knowledge-base/stack-por-tipo.md +30 -0
- package/squads/squad-engineering/knowledge-base/story-como-contrato.md +30 -0
- package/squads/squad-engineering/preferences/README.md +49 -0
- package/squads/squad-engineering/squad.yaml +202 -0
- package/squads/squad-engineering/tasks/classify-track.md +43 -0
- package/squads/squad-engineering/tasks/develop-story.md +43 -0
- package/squads/squad-engineering/tasks/draft-stories.md +46 -0
- package/squads/squad-engineering/tasks/initial-state-audit.md +55 -0
- package/squads/squad-engineering/tasks/operate-gate-code.md +52 -0
- package/squads/squad-engineering/tasks/plan-orchestration.md +35 -0
- package/squads/squad-engineering/tasks/prepare-environment.md +29 -0
- package/squads/squad-engineering/tasks/publish.md +32 -0
- package/squads/squad-engineering/tasks/run-retro.md +36 -0
- package/squads/squad-engineering/tasks/verify-dod.md +27 -0
- package/squads/squad-engineering/tasks/verify-track-after-diff.md +33 -0
- package/squads/squad-engineering/tasks/write-adr.md +29 -0
- package/squads/squad-engineering/tasks/write-architecture.md +44 -0
- package/squads/squad-engineering/tasks/write-brief.md +42 -0
- package/squads/squad-engineering/tasks/write-migration.md +31 -0
- package/squads/squad-engineering/tasks/write-prd.md +44 -0
- package/squads/squad-engineering/templates/adr-template.md +13 -0
- package/squads/squad-engineering/templates/arquitetura-template.md +43 -0
- package/squads/squad-engineering/templates/brief-template.md +34 -0
- package/squads/squad-engineering/templates/checklist-pre-publicacao-template.md +29 -0
- package/squads/squad-engineering/templates/estado-inicial-template.md +26 -0
- package/squads/squad-engineering/templates/memoria-do-cargo-template.md +32 -0
- package/squads/squad-engineering/templates/plano-de-orquestracao-template.md +20 -0
- package/squads/squad-engineering/templates/prd-template.md +41 -0
- package/squads/squad-engineering/templates/story-template.md +69 -0
- package/squads/squad-engineering/workflows/ajuste-cycle.yaml +75 -0
- package/squads/squad-engineering/workflows/feature-cycle.yaml +112 -0
- package/squads/squad-engineering/workflows/projeto-cycle.yaml +137 -0
- package/squads/squad-finance/README.md +18 -6
- package/squads/squad-finance/agents/budget-controller.md +9 -0
- package/squads/squad-finance/agents/finance-orqx.md +11 -2
- package/squads/squad-finance/agents/pricing-strategist.md +9 -0
- package/squads/squad-finance/agents/profitability-analyst.md +9 -0
- package/squads/squad-finance/agents/revenue-analyst.md +9 -0
- package/squads/squad-finance/knowledge-base/contabilidade-master-reference.md +1 -1
- package/squads/squad-finance/knowledge-base/finance-master-reference.md +1 -1
- package/squads/squad-finance/squad.yaml +18 -9
- package/squads/squad-growth/README.md +18 -6
- package/squads/squad-growth/agents/ga-analytics-engineer.md +9 -0
- package/squads/squad-growth/agents/ga-campaign-analyst.md +9 -0
- package/squads/squad-growth/agents/ga-cro-specialist.md +9 -0
- package/squads/squad-growth/agents/ga-data-analyst.md +9 -0
- package/squads/squad-growth/agents/ga-growth-hacker.md +9 -0
- package/squads/squad-growth/agents/ga-seo-strategist.md +9 -0
- package/squads/squad-growth/agents/growth-orqx.md +14 -5
- package/squads/squad-growth/knowledge-base/chrome-brain-integration.md +17 -38
- package/squads/squad-growth/squad.yaml +21 -16
- package/squads/squad-paidmedia/README.md +18 -6
- package/squads/squad-paidmedia/agents/campaign-analyst.md +9 -0
- package/squads/squad-paidmedia/agents/creative-strategist.md +9 -0
- package/squads/squad-paidmedia/agents/cro-specialist.md +9 -0
- package/squads/squad-paidmedia/agents/depesh-mandalia.md +9 -0
- package/squads/squad-paidmedia/agents/google-ads-specialist.md +9 -0
- package/squads/squad-paidmedia/agents/kasim-aslam.md +9 -0
- package/squads/squad-paidmedia/agents/meta-ads-specialist.md +9 -0
- package/squads/squad-paidmedia/agents/molly-pittman.md +9 -0
- package/squads/squad-paidmedia/agents/nicholas-kusmich.md +9 -0
- package/squads/squad-paidmedia/agents/paidmedia-orqx.md +11 -2
- package/squads/squad-paidmedia/agents/pedro-sobral.md +9 -0
- package/squads/squad-paidmedia/agents/performance-engineer.md +9 -0
- package/squads/squad-paidmedia/agents/pm-creative-performance-analyst.md +13 -4
- package/squads/squad-paidmedia/agents/pm-youtube-ads-specialist.md +12 -3
- package/squads/squad-paidmedia/agents/ralph-burns.md +9 -0
- package/squads/squad-paidmedia/agents/tom-breeze.md +9 -0
- package/squads/squad-paidmedia/agents/traffic-masters-chief.md +19 -201
- package/squads/squad-paidmedia/knowledge-base/chrome-brain-integration.md +17 -40
- package/squads/squad-paidmedia/squad.yaml +29 -7
- package/squads/squad-paidmedia/tasks/design-youtube-ad-campaign.md +2 -2
- package/squads/squad-product/README.md +18 -6
- package/squads/squad-product/agents/product-orqx.md +12 -4
- package/squads/squad-product/agents/ps-client-product-manager.md +9 -1
- package/squads/squad-product/agents/ps-delivery-manager.md +9 -1
- package/squads/squad-product/agents/ps-discovery-lead.md +9 -1
- package/squads/squad-product/agents/ps-product-analyst.md +9 -1
- package/squads/squad-product/agents/ps-product-ops-specialist.md +9 -1
- package/squads/squad-product/agents/ps-product-strategist.md +9 -1
- package/squads/squad-product/knowledge-base/chrome-brain-integration.md +17 -42
- package/squads/squad-product/squad.yaml +21 -16
- package/squads/squad-product/tasks/define-product-okrs.md +1 -1
- package/squads/squad-product/tasks/define-product-vision.md +1 -1
- package/squads/squad-research/README.md +18 -6
- package/squads/squad-research/agents/audience-intelligence.md +11 -2
- package/squads/squad-research/agents/competitive-intelligence.md +11 -2
- package/squads/squad-research/agents/data-chief.md +24 -188
- package/squads/squad-research/agents/data-synthesizer.md +9 -0
- package/squads/squad-research/agents/deep-researcher.md +9 -0
- package/squads/squad-research/agents/market-analyst.md +10 -1
- package/squads/squad-research/agents/research-orqx.md +13 -4
- package/squads/squad-research/agents/trend-forecaster.md +10 -1
- package/squads/squad-research/knowledge-base/agentic-second-brain-reference.md +2 -2
- package/squads/squad-research/knowledge-base/brazilian-market-research-sources.md +1 -1
- package/squads/squad-research/knowledge-base/chrome-brain-integration.md +17 -34
- package/squads/squad-research/knowledge-base/cross-squad-integration-protocol.md +7 -7
- package/squads/squad-research/knowledge-base/multi-agent-research-methodology.md +1 -1
- package/squads/squad-research/knowledge-base/research-synthesis-frameworks.md +1 -1
- package/squads/squad-research/preferences/README.md +7 -7
- package/squads/squad-research/squad.yaml +32 -20
- package/squads/squad-research/tasks/analyze-audience-psychographics.md +1 -1
- package/squads/squad-research/tasks/analyze-competitor-positioning.md +1 -1
- package/squads/squad-research/tasks/analyze-competitor-pricing.md +2 -2
- package/squads/squad-research/tasks/analyze-industry-trends.md +1 -1
- package/squads/squad-research/tasks/analyze-pricing-landscape.md +1 -1
- package/squads/squad-research/tasks/analyze-social-listening.md +1 -1
- package/squads/squad-research/tasks/analyze-value-chain.md +1 -1
- package/squads/squad-research/tasks/benchmark-competitor-digital.md +3 -3
- package/squads/squad-research/tasks/build-audience-persona.md +6 -6
- package/squads/squad-research/tasks/build-data-narrative.md +1 -1
- package/squads/squad-research/tasks/compile-competitive-dossier.md +4 -4
- package/squads/squad-research/tasks/conduct-jobs-to-be-done.md +5 -5
- package/squads/squad-research/tasks/coordinate-cross-squad-research.md +6 -6
- package/squads/squad-research/tasks/create-battle-card.md +3 -3
- package/squads/squad-research/tasks/create-executive-briefing.md +1 -1
- package/squads/squad-research/tasks/create-future-landscape.md +4 -4
- package/squads/squad-research/tasks/create-insight-deck.md +1 -1
- package/squads/squad-research/tasks/create-swot-analysis.md +4 -4
- package/squads/squad-research/tasks/detect-weak-signals.md +3 -3
- package/squads/squad-research/tasks/evaluate-market-entry.md +1 -1
- package/squads/squad-research/tasks/forecast-industry-trends.md +4 -4
- package/squads/squad-research/tasks/forecast-market-growth.md +1 -1
- package/squads/squad-research/tasks/generate-actionable-recommendations.md +3 -3
- package/squads/squad-research/tasks/identify-competitive-gaps.md +1 -1
- package/squads/squad-research/tasks/identify-inflection-points.md +3 -3
- package/squads/squad-research/tasks/identify-market-segments.md +1 -1
- package/squads/squad-research/tasks/manage-research-sprint.md +1 -1
- package/squads/squad-research/tasks/map-audience-ecosystem.md +1 -1
- package/squads/squad-research/tasks/map-audience-journey.md +4 -4
- package/squads/squad-research/tasks/map-competitive-landscape.md +3 -3
- package/squads/squad-research/tasks/map-strategic-implications.md +4 -4
- package/squads/squad-research/tasks/map-technology-adoption.md +3 -3
- package/squads/squad-research/tasks/orchestrate-research-pipeline.md +2 -2
- package/squads/squad-research/tasks/predict-market-shifts.md +1 -1
- package/squads/squad-research/tasks/profile-ideal-customer.md +4 -4
- package/squads/squad-research/tasks/run-porter-five-forces.md +1 -1
- package/squads/squad-research/tasks/run-scenario-planning.md +3 -3
- package/squads/squad-research/tasks/segment-audience.md +1 -1
- package/squads/squad-research/tasks/size-market-tam-sam-som.md +4 -4
- package/squads/squad-research/tasks/synthesize-research-report.md +4 -4
- package/squads/squad-research/tasks/track-emerging-technologies.md +3 -3
- package/squads/squad-research/tasks/visualize-research-data.md +1 -1
- package/squads/squad-research/workflows/audience-intelligence-cycle.yaml +4 -4
- package/squads/squad-research/workflows/competitive-intelligence-cycle.yaml +3 -3
- package/squads/squad-research/workflows/deep-research-cycle.yaml +3 -3
- package/squads/squad-research/workflows/full-research-sprint.yaml +7 -7
- package/squads/squad-research/workflows/market-analysis-cycle.yaml +3 -3
- package/squads/squad-research/workflows/trend-forecasting-cycle.yaml +3 -3
- package/squads/squad-storytelling/README.md +18 -6
- package/squads/squad-storytelling/agents/blake-snyder.md +9 -0
- package/squads/squad-storytelling/agents/dan-harmon.md +9 -0
- package/squads/squad-storytelling/agents/joseph-campbell.md +9 -0
- package/squads/squad-storytelling/agents/keith-johnstone.md +9 -0
- package/squads/squad-storytelling/agents/kindra-hall.md +9 -0
- package/squads/squad-storytelling/agents/marshall-ganz.md +9 -0
- package/squads/squad-storytelling/agents/matthew-dicks.md +9 -0
- package/squads/squad-storytelling/agents/nancy-duarte.md +9 -0
- package/squads/squad-storytelling/agents/oren-klaff.md +9 -0
- package/squads/squad-storytelling/agents/park-howell.md +9 -0
- package/squads/squad-storytelling/agents/shawn-coyne.md +9 -0
- package/squads/squad-storytelling/agents/story-chief.md +24 -170
- package/squads/squad-storytelling/agents/storytelling-orqx.md +12 -3
- package/squads/squad-storytelling/knowledge-base/chrome-brain-integration.md +17 -34
- package/squads/squad-storytelling/squad.yaml +28 -10
- package/agents/iron-orqx.md +0 -211
- package/bin/cli.js +0 -261
- package/squads/squad-claude/agents/db-sage.md +0 -152
- package/squads/squad-claude/agents/tools-orqx.md +0 -219
- package/squads/squad-cloning/agents/sop-extractor.md +0 -61
- package/squads/squad-design/agents/design-system.md +0 -210
- package/squads/squad-design/agents/ux-designer.md +0 -124
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* inventory.mjs — mede as decisões visuais de uma página com o navegador.
|
|
4
|
+
*
|
|
5
|
+
* Núcleo compartilhado de TRANSPLANTAR e DESTILAR. Não lê CSS, não pergunta ao
|
|
6
|
+
* modelo: abre a página no Chromium, roda getComputedStyle sobre o DOM real,
|
|
7
|
+
* agrega por frequência e área, e classifica cor por papel. A saída é o
|
|
8
|
+
* inventory.json — o único artefato que os dois consumidores leem.
|
|
9
|
+
*
|
|
10
|
+
* Uso: node inventory.mjs <url> [--out arquivo.json] [--mobile] [--wait MS]
|
|
11
|
+
*/
|
|
12
|
+
import { chromium } from 'playwright';
|
|
13
|
+
import { writeFile } from 'node:fs/promises';
|
|
14
|
+
|
|
15
|
+
const argv = process.argv.slice(2);
|
|
16
|
+
const url = argv[0];
|
|
17
|
+
if (!url || url.startsWith('--')) {
|
|
18
|
+
console.error('uso: node inventory.mjs <url> [--out arquivo.json] [--mobile] [--wait MS]');
|
|
19
|
+
process.exit(2);
|
|
20
|
+
}
|
|
21
|
+
const opt = (n, d) => { const i = argv.indexOf(n); return i !== -1 && argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : d; };
|
|
22
|
+
const OUT = opt('--out', '');
|
|
23
|
+
const MOBILE = argv.includes('--mobile');
|
|
24
|
+
const WAIT = parseInt(opt('--wait', '1400'), 10);
|
|
25
|
+
const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36';
|
|
26
|
+
const log = (...a) => console.error('[inventory]', ...a);
|
|
27
|
+
|
|
28
|
+
// ---------------------------------------------------------------- cor: utils (Node)
|
|
29
|
+
function parseColor(str) {
|
|
30
|
+
if (!str) return null;
|
|
31
|
+
const s = str.trim().toLowerCase();
|
|
32
|
+
if (s === 'transparent' || s === 'none') return null;
|
|
33
|
+
let m = s.match(/^rgba?\(([^)]+)\)/);
|
|
34
|
+
if (m) {
|
|
35
|
+
const p = m[1].split(/[,\/\s]+/).filter(Boolean).map(x => x.trim());
|
|
36
|
+
const r = +p[0], g = +p[1], b = +p[2];
|
|
37
|
+
const a = p[3] === undefined ? 1 : (p[3].endsWith('%') ? +p[3].slice(0, -1) / 100 : +p[3]);
|
|
38
|
+
if ([r, g, b].some(Number.isNaN)) return null;
|
|
39
|
+
return { r, g, b, a };
|
|
40
|
+
}
|
|
41
|
+
m = s.match(/^#([0-9a-f]{3,8})$/);
|
|
42
|
+
if (m) {
|
|
43
|
+
let h = m[1];
|
|
44
|
+
if (h.length === 3) h = h.split('').map(c => c + c).join('');
|
|
45
|
+
if (h.length === 6 || h.length === 8) {
|
|
46
|
+
return { r: parseInt(h.slice(0, 2), 16), g: parseInt(h.slice(2, 4), 16), b: parseInt(h.slice(4, 6), 16), a: h.length === 8 ? parseInt(h.slice(6, 8), 16) / 255 : 1 };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const toHex = (c) => '#' + [c.r, c.g, c.b].map(x => Math.max(0, Math.min(255, Math.round(x))).toString(16).padStart(2, '0')).join('');
|
|
52
|
+
function toHsl({ r, g, b }) {
|
|
53
|
+
r /= 255; g /= 255; b /= 255;
|
|
54
|
+
const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn;
|
|
55
|
+
let h = 0; const l = (mx + mn) / 2;
|
|
56
|
+
const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
|
|
57
|
+
if (d !== 0) {
|
|
58
|
+
if (mx === r) h = ((g - b) / d) % 6;
|
|
59
|
+
else if (mx === g) h = (b - r) / d + 2;
|
|
60
|
+
else h = (r - g) / d + 4;
|
|
61
|
+
h *= 60; if (h < 0) h += 360;
|
|
62
|
+
}
|
|
63
|
+
return { h, s, l };
|
|
64
|
+
}
|
|
65
|
+
const relLum = ({ r, g, b }) => { const f = v => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }; return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b); };
|
|
66
|
+
const contrast = (a, b) => { const l1 = relLum(a), l2 = relLum(b); const [hi, lo] = l1 > l2 ? [l1, l2] : [l2, l1]; return (hi + 0.05) / (lo + 0.05); };
|
|
67
|
+
// neutro = cinza/quase-branco/quase-preto. Usa croma ABSOLUTO em RGB (0-255),
|
|
68
|
+
// não saturação HSL: em luminância extrema o HSL infla a saturação e faz um
|
|
69
|
+
// cinza-clarinho (#e5edf5) passar por "cor de marca". O croma absoluto não mente.
|
|
70
|
+
const isNeutral = (c) => { const mx = Math.max(c.r, c.g, c.b), mn = Math.min(c.r, c.g, c.b), l = (mx + mn) / 510; return (mx - mn) < 22 || l < 0.05 || l > 0.96; };
|
|
71
|
+
// cor de marca = saturada de verdade (croma alto E saturação HSL relevante).
|
|
72
|
+
// Separa o roxo do Stripe de um slate de texto ou de uma borda cinza.
|
|
73
|
+
const isBrand = (c) => { const mx = Math.max(c.r, c.g, c.b), mn = Math.min(c.r, c.g, c.b); return (mx - mn) >= 40 && toHsl(c).s >= 0.25; };
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------- captura no browser
|
|
76
|
+
const COLLECT = () => {
|
|
77
|
+
const px = v => parseFloat(v) || 0;
|
|
78
|
+
// normaliza QUALQUER cor CSS (oklch, color(srgb), lab, lch, hwb, named) para
|
|
79
|
+
// rgb/hex via canvas. getComputedStyle no Chromium devolve oklch as-is quando a
|
|
80
|
+
// fonte usa oklch (padrão do Tailwind v4) — sem isso, fundo/texto/marca de todo
|
|
81
|
+
// site moderno saíam nulos e o inventário retornava lixo com cara de válido.
|
|
82
|
+
const _cx = document.createElement('canvas').getContext('2d', { willReadFrequently: true });
|
|
83
|
+
const norm = (col) => {
|
|
84
|
+
if (!col) return col;
|
|
85
|
+
try {
|
|
86
|
+
_cx.clearRect(0, 0, 1, 1); _cx.fillStyle = col; _cx.fillRect(0, 0, 1, 1);
|
|
87
|
+
const d = _cx.getImageData(0, 0, 1, 1).data; // rasteriza: resolve oklch/color()/lab/named p/ rgb real
|
|
88
|
+
const a = +(d[3] / 255).toFixed(3);
|
|
89
|
+
return a >= 1 ? `rgb(${d[0]}, ${d[1]}, ${d[2]})` : `rgba(${d[0]}, ${d[1]}, ${d[2]}, ${a})`;
|
|
90
|
+
} catch { return col; }
|
|
91
|
+
};
|
|
92
|
+
const vis = (el, r, cs) => r.width > 0 && r.height > 0 && cs.display !== 'none' && cs.visibility !== 'hidden' && px(cs.opacity) > 0.05;
|
|
93
|
+
const directText = el => Array.from(el.childNodes).filter(n => n.nodeType === 3).map(n => n.textContent.trim()).join('').length;
|
|
94
|
+
|
|
95
|
+
const bg = {}, fg = {}, bd = {}, shadows = {}, radii = {}, spaces = {}, btnBg = {}, linkFg = {};
|
|
96
|
+
const fonts = {}; // "family|weight|size" -> textLen
|
|
97
|
+
const headings = []; // {tag, size}
|
|
98
|
+
const buttons = []; // {h, px, radius, weight, fontSize}
|
|
99
|
+
const sections = []; // ritmo
|
|
100
|
+
|
|
101
|
+
const add = (o, k, w) => { if (!k) return; o[k] = (o[k] || 0) + w; };
|
|
102
|
+
|
|
103
|
+
for (const el of document.querySelectorAll('*')) {
|
|
104
|
+
const tag = el.tagName.toLowerCase();
|
|
105
|
+
if (['script', 'style', 'head', 'meta', 'link', 'title', 'noscript', 'br'].includes(tag)) continue;
|
|
106
|
+
const r = el.getBoundingClientRect();
|
|
107
|
+
const cs = getComputedStyle(el);
|
|
108
|
+
if (!vis(el, r, cs)) continue;
|
|
109
|
+
const area = r.width * r.height;
|
|
110
|
+
const tlen = directText(el);
|
|
111
|
+
|
|
112
|
+
add(bg, norm(cs.backgroundColor), area);
|
|
113
|
+
if (tlen) {
|
|
114
|
+
add(fg, norm(cs.color), tlen);
|
|
115
|
+
add(fonts, `${cs.fontFamily}|${cs.fontWeight}|${Math.round(px(cs.fontSize))}`, tlen);
|
|
116
|
+
}
|
|
117
|
+
for (const side of ['Top', 'Right', 'Bottom', 'Left']) {
|
|
118
|
+
if (px(cs[`border${side}Width`]) > 0) add(bd, norm(cs[`border${side}Color`]), 1);
|
|
119
|
+
}
|
|
120
|
+
if (cs.boxShadow && cs.boxShadow !== 'none') add(shadows, cs.boxShadow, area);
|
|
121
|
+
// raio > 999px é pill/círculo (border-radius:50%/9999 computado num elemento
|
|
122
|
+
// grande vira px gigante, ex: 33554400). Normaliza pra 9999 (convenção
|
|
123
|
+
// "full", igual ao rounded-full do Tailwind) — o valor cru não serve.
|
|
124
|
+
const br = px(cs.borderTopLeftRadius);
|
|
125
|
+
if (br > 0) add(radii, br > 999 ? 9999 : Math.round(br), 1);
|
|
126
|
+
for (const p of ['paddingTop', 'paddingLeft', 'gap', 'rowGap', 'columnGap']) {
|
|
127
|
+
const v = Math.round(px(cs[p])); if (v > 0) add(spaces, v, 1);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// heading: registra a fonte mesmo sem texto DIRETO (o <h1> costuma ter o
|
|
131
|
+
// texto dentro de um <span>, então o size/family do heading não entraria em
|
|
132
|
+
// `fonts` e a razão de escala saía nula).
|
|
133
|
+
if (/^h[1-6]$/.test(tag)) { const s = Math.round(px(cs.fontSize)); if (s > 0) headings.push({ tag, size: s, family: cs.fontFamily.split(',')[0].replace(/["']/g, '').trim(), weight: +cs.fontWeight }); }
|
|
134
|
+
|
|
135
|
+
// botão de verdade: <button>/role=button, OU um <a> com preenchimento real
|
|
136
|
+
// (padding lateral E fundo não-transparente). O gate em 12px evita contar
|
|
137
|
+
// nav-links de texto (que têm padding pequeno e fundo transparente) como botão.
|
|
138
|
+
const bgSolid = cs.backgroundColor && cs.backgroundColor !== 'rgba(0, 0, 0, 0)' && !/, 0\)$/.test(cs.backgroundColor);
|
|
139
|
+
const isBtnTag = tag === 'button' || el.getAttribute('role') === 'button';
|
|
140
|
+
const isBtnLink = tag === 'a' && px(cs.paddingLeft) >= 12 && bgSolid && cs.display !== 'inline';
|
|
141
|
+
// exige tamanho de botão (>=28px) e preenchimento (bg sólido OU padding real)
|
|
142
|
+
// pra não contar ícone de nav / botão-fechar como componente de botão.
|
|
143
|
+
const looksBtn = (isBtnTag || isBtnLink) && r.height >= 28 && (bgSolid || px(cs.paddingLeft) >= 10);
|
|
144
|
+
if (looksBtn && r.height < 120) {
|
|
145
|
+
add(btnBg, cs.backgroundColor, 1);
|
|
146
|
+
buttons.push({ h: Math.round(r.height), px: Math.round(px(cs.paddingLeft)), radius: Math.round(px(cs.borderTopLeftRadius)), weight: cs.fontWeight, fontSize: Math.round(px(cs.fontSize)) });
|
|
147
|
+
}
|
|
148
|
+
if (tag === 'a' && tlen && px(cs.paddingLeft) < 6) add(linkFg, cs.color, tlen);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ritmo: filhos diretos grandes de body / main. Se a página embrulha tudo num
|
|
152
|
+
// wrapper único (SPA), desce um nível pra achar as seções de verdade.
|
|
153
|
+
let scope = document.querySelector('main') || document.body;
|
|
154
|
+
const big = c => c.getBoundingClientRect().height >= 40;
|
|
155
|
+
let kids = Array.from(scope.children).filter(big);
|
|
156
|
+
while (kids.length === 1 && kids[0].children.length > 1) { scope = kids[0]; kids = Array.from(scope.children).filter(big); }
|
|
157
|
+
let idx = 0;
|
|
158
|
+
for (const el of kids) {
|
|
159
|
+
const r = el.getBoundingClientRect();
|
|
160
|
+
if (r.height < 40) continue;
|
|
161
|
+
const kids = el.querySelectorAll('*').length;
|
|
162
|
+
const txt = el.textContent.trim().length;
|
|
163
|
+
sections.push({ i: ++idx, tag: el.tagName.toLowerCase(), height: Math.round(r.height), children: kids, textLen: txt, density: kids / Math.max(1, r.height / 100) });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return { bg, fg, bd, shadows, radii, spaces, btnBg, linkFg, fonts, headings, buttons, sections, docBg: getComputedStyle(document.body).backgroundColor };
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
async function autoScroll(page) {
|
|
170
|
+
try {
|
|
171
|
+
await page.evaluate(async () => {
|
|
172
|
+
await new Promise(res => { let t = 0; const s = Math.max(400, innerHeight * 0.8); const id = setInterval(() => { scrollBy(0, s); t += s; if (t >= document.body.scrollHeight + innerHeight) { clearInterval(id); scrollTo(0, 0); res(); } }, 90); setTimeout(() => { clearInterval(id); scrollTo(0, 0); res(); }, 8000); });
|
|
173
|
+
});
|
|
174
|
+
await page.waitForLoadState('networkidle').catch(() => {});
|
|
175
|
+
} catch {}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ---------------------------------------------------------------- agregação (Node)
|
|
179
|
+
const top = (o, n = 12) => Object.entries(o).sort((a, b) => b[1] - a[1]).slice(0, n);
|
|
180
|
+
function hexFreq(o) {
|
|
181
|
+
const acc = {};
|
|
182
|
+
for (const [k, w] of Object.entries(o)) { const c = parseColor(k); if (!c || c.a < 0.5) continue; const hx = toHex(c); acc[hx] = (acc[hx] || 0) + w; }
|
|
183
|
+
return acc;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function classifyColors(raw) {
|
|
187
|
+
const bgH = hexFreq(raw.bg), fgH = hexFreq(raw.fg), bdH = hexFreq(raw.bd), btnH = hexFreq(raw.btnBg), linkH = hexFreq(raw.linkFg);
|
|
188
|
+
const bgTop = top(bgH), fgTop = top(fgH);
|
|
189
|
+
|
|
190
|
+
// sem cor medida → null, não um chute fixo (#fff/#000). O SKILL.md promete
|
|
191
|
+
// "campo que a página não tem sai null" — o fallback fixo quebrava isso.
|
|
192
|
+
const fundo = bgTop[0] ? bgTop[0][0] : null;
|
|
193
|
+
const fundoC = fundo ? parseColor(fundo) : null;
|
|
194
|
+
const texto = fgTop[0] ? fgTop[0][0] : null;
|
|
195
|
+
|
|
196
|
+
// superfície: bg diferente do fundo, luminância próxima (é uma "camada"), e
|
|
197
|
+
// que NÃO seja cor de marca. Aceita levemente tintado (#1c2c42, card de dark
|
|
198
|
+
// UI) — exigir neutro estrito deixava esse tom órfão no transplante.
|
|
199
|
+
let superficie = null;
|
|
200
|
+
if (fundoC) for (const [hx, w] of bgTop) {
|
|
201
|
+
if (hx === fundo) continue;
|
|
202
|
+
const c = parseColor(hx);
|
|
203
|
+
if (!isBrand(c) && Math.abs(relLum(c) - relLum(fundoC)) < 0.30) { superficie = hx; break; }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// primária: cor de marca (saturada de verdade) mais forte em botão/link; senão
|
|
207
|
+
// a de maior peso geral. isBrand exclui slate de texto e borda cinza.
|
|
208
|
+
const brandPool = {};
|
|
209
|
+
for (const src of [btnH, linkH, bgH, fgH]) for (const [hx, w] of Object.entries(src)) { const c = parseColor(hx); if (isBrand(c)) brandPool[hx] = (brandPool[hx] || 0) + w; }
|
|
210
|
+
const brandTop = top(brandPool, 6).map(x => x[0]);
|
|
211
|
+
// prioriza cor que aparece em botão
|
|
212
|
+
const btnBrand = top(btnH).map(x => x[0]).find(hx => isBrand(parseColor(hx)));
|
|
213
|
+
const primaria = btnBrand || brandTop[0] || null;
|
|
214
|
+
const acento = brandTop.find(hx => hx !== primaria) || null;
|
|
215
|
+
const borda = top(bdH)[0] ? top(bdH)[0][0] : superficie || null;
|
|
216
|
+
|
|
217
|
+
const withFreq = (hx, o) => hx ? { hex: hx, freq: Math.round(o[hx] || 0) } : null;
|
|
218
|
+
return {
|
|
219
|
+
fundo: withFreq(fundo, bgH),
|
|
220
|
+
texto: withFreq(texto, fgH),
|
|
221
|
+
superficie: withFreq(superficie, bgH),
|
|
222
|
+
primaria: withFreq(primaria, brandPool),
|
|
223
|
+
acento: withFreq(acento, brandPool),
|
|
224
|
+
borda: withFreq(borda, bdH),
|
|
225
|
+
_todas_bg: bgTop.map(([hex, w]) => ({ hex, area: Math.round(w) })),
|
|
226
|
+
_todas_fg: fgTop.map(([hex, w]) => ({ hex, textLen: Math.round(w) })),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function classifyType(raw) {
|
|
231
|
+
const byUse = top(raw.fonts, 20).map(([k, w]) => { const [family, weight, size] = k.split('|'); return { family: family.split(',')[0].replace(/["']/g, '').trim(), weight: +weight, size: +size, textLen: w }; });
|
|
232
|
+
const corpo = byUse.slice().sort((a, b) => b.textLen - a.textLen)[0] || null;
|
|
233
|
+
// display sai do maior heading real (que agora carrega family/weight), com
|
|
234
|
+
// fallback pra maior fonte em uso quando a página não tem h1-h6.
|
|
235
|
+
let display = null;
|
|
236
|
+
if (raw.headings.length) { const big = raw.headings.slice().sort((a, b) => b.size - a.size)[0]; display = { family: big.family, weight: big.weight, size: big.size }; }
|
|
237
|
+
else if (byUse.length) { const ms = Math.max(...byUse.map(f => f.size)); display = byUse.filter(f => f.size === ms).sort((a, b) => b.weight - a.weight)[0]; }
|
|
238
|
+
const razao = corpo && display && corpo.size ? +(display.size / corpo.size).toFixed(2) : null;
|
|
239
|
+
return {
|
|
240
|
+
display: display ? { familia: display.family, peso: display.weight, tamanho: display.size } : null,
|
|
241
|
+
corpo: corpo ? { familia: corpo.family, peso: corpo.weight, tamanho: corpo.size } : null,
|
|
242
|
+
razao_escala: razao,
|
|
243
|
+
familias: [...new Set(byUse.map(f => f.family))].slice(0, 5),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function classifySpacing(raw) {
|
|
248
|
+
const vals = Object.entries(raw.spaces).map(([v, c]) => [+v, c]).sort((a, b) => b[1] - a[1]);
|
|
249
|
+
const totalC = vals.reduce((s, [, c]) => s + c, 0);
|
|
250
|
+
const mult8 = vals.filter(([v]) => v % 8 === 0).reduce((s, [, c]) => s + c, 0);
|
|
251
|
+
const mult4 = vals.filter(([v]) => v % 4 === 0).reduce((s, [, c]) => s + c, 0);
|
|
252
|
+
const eDefault = totalC > 0 && mult8 / totalC > 0.75;
|
|
253
|
+
// passo base = menor valor recorrente que divide a maioria
|
|
254
|
+
const commons = vals.slice(0, 8).map(([v]) => v).filter(v => v > 0);
|
|
255
|
+
const passo = commons.length ? Math.min(...commons) : null;
|
|
256
|
+
return { passo_base: passo, e_default_tailwind: eDefault, cobertura_mult8: totalC ? +(mult8 / totalC).toFixed(2) : null, cobertura_mult4: totalC ? +(mult4 / totalC).toFixed(2) : null, valores_comuns: vals.slice(0, 8).map(([v, c]) => ({ px: v, freq: c })) };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function classifyShadow(raw) {
|
|
260
|
+
const t = top(raw.shadows, 3);
|
|
261
|
+
if (!t.length) return { valor: null, colorida: false };
|
|
262
|
+
const val = t[0][0];
|
|
263
|
+
const cm = val.match(/rgba?\([^)]+\)|#[0-9a-fA-F]{3,8}/);
|
|
264
|
+
let colorida = false;
|
|
265
|
+
if (cm) { const c = parseColor(cm[0]); if (c) colorida = !isNeutral(c) && c.a > 0.02; }
|
|
266
|
+
return { valor: val, colorida, outras: t.slice(1).map(x => x[0]) };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function classifyRadius(raw) {
|
|
270
|
+
const t = top(raw.radii, 6);
|
|
271
|
+
return { principal: t[0] ? +t[0][0] : 0, distribuicao: t.map(([v, c]) => ({ px: +v, freq: c })) };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function classifyRhythm(raw) {
|
|
275
|
+
const s = raw.sections || [];
|
|
276
|
+
const label = d => d < 6 ? 'baixa' : d < 16 ? 'media' : 'alta';
|
|
277
|
+
return s.slice(0, 20).map(x => ({ secao: x.i, tag: x.tag, altura: x.height, densidade: label(x.density), elementos: x.children }));
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function classifyButton(raw) {
|
|
281
|
+
if (!raw.buttons.length) return null;
|
|
282
|
+
const mode = arr => { const m = {}; arr.forEach(v => m[v] = (m[v] || 0) + 1); return +Object.entries(m).sort((a, b) => b[1] - a[1])[0][0]; };
|
|
283
|
+
return { altura: mode(raw.buttons.map(b => b.h)), padding_x: mode(raw.buttons.map(b => b.px)), raio: mode(raw.buttons.map(b => b.radius)), peso: mode(raw.buttons.map(b => +b.weight)), tamanho_fonte: mode(raw.buttons.map(b => b.fontSize)) };
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// checagem de contraste do PRÓPRIO original (baseline pra comparar depois do transplante)
|
|
287
|
+
function contrastBaseline(cores) {
|
|
288
|
+
const bg = parseColor(cores.fundo?.hex), fg = parseColor(cores.texto?.hex);
|
|
289
|
+
if (!bg || !fg) return null;
|
|
290
|
+
const ratio = +contrast(bg, fg).toFixed(2);
|
|
291
|
+
return { texto_sobre_fundo: ratio, passa_AA_corpo: ratio >= 4.5, passa_AA_titulo: ratio >= 3 };
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// ---------------------------------------------------------------- main
|
|
295
|
+
(async () => {
|
|
296
|
+
const browser = await chromium.launch({ headless: true }); // sandbox ON (correção da auditoria)
|
|
297
|
+
try {
|
|
298
|
+
const ctx = await browser.newContext({ userAgent: UA, viewport: MOBILE ? { width: 390, height: 844 } : { width: 1440, height: 900 }, deviceScaleFactor: 1, ignoreHTTPSErrors: false, serviceWorkers: 'block' });
|
|
299
|
+
const page = await ctx.newPage();
|
|
300
|
+
log('abrindo', url);
|
|
301
|
+
const resp = await page.goto(url, { waitUntil: 'load', timeout: 45000 });
|
|
302
|
+
// 404/500/etc: não medir uma página de erro como se fosse o site. Antes,
|
|
303
|
+
// devolvia um inventory.json plausível e FALSO com exit 0 (achado do gate).
|
|
304
|
+
if (resp && resp.status() >= 400) {
|
|
305
|
+
console.error(`[inventory] FALHA: ${url} respondeu HTTP ${resp.status()}. Não vou medir uma página de erro — confira a URL.`);
|
|
306
|
+
await browser.close().catch(() => {}); process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
await page.waitForLoadState('networkidle').catch(() => {});
|
|
309
|
+
await autoScroll(page);
|
|
310
|
+
await page.waitForTimeout(WAIT);
|
|
311
|
+
await page.evaluate(() => document.fonts && document.fonts.ready).catch(() => {});
|
|
312
|
+
|
|
313
|
+
const raw = await page.evaluate(COLLECT);
|
|
314
|
+
const cores = classifyColors(raw);
|
|
315
|
+
const inventory = {
|
|
316
|
+
fonte: url,
|
|
317
|
+
medidoEm: new Date().toISOString(),
|
|
318
|
+
viewport: MOBILE ? 'mobile-390' : 'desktop-1440',
|
|
319
|
+
cores,
|
|
320
|
+
tipografia: classifyType(raw),
|
|
321
|
+
espacamento: classifySpacing(raw),
|
|
322
|
+
raio: classifyRadius(raw),
|
|
323
|
+
sombra: classifyShadow(raw),
|
|
324
|
+
ritmo: classifyRhythm(raw),
|
|
325
|
+
componentes: { botao: classifyButton(raw) },
|
|
326
|
+
contraste_original: contrastBaseline(cores),
|
|
327
|
+
_amostra: { elementos_bg: Object.keys(raw.bg).length, headings: raw.headings.length, botoes: raw.buttons.length, secoes: raw.sections.length },
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const json = JSON.stringify(inventory, null, 2);
|
|
331
|
+
if (OUT) { await writeFile(OUT, json); log('salvo em', OUT); }
|
|
332
|
+
process.stdout.write(json + '\n');
|
|
333
|
+
} finally {
|
|
334
|
+
await browser.close().catch(() => {});
|
|
335
|
+
}
|
|
336
|
+
})().catch(e => { console.error('[inventory] FALHA:', e.message); process.exit(1); });
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clone-organize
|
|
3
|
+
description: Separa um HTML monolítico (gerado por IA ou clonado) em arquivos limpos — extrai CSS e JS inline para assets/, classifica cada SVG, e devolve um HTML organizado visualmente idêntico + um STACK.md. Transforma o original de forma incremental (não reescreve de memória) e verifica com screenshot antes/depois. Use quando o usuário tiver um index.html gigante e impossível de manter e quiser organizá-lo sem mudar a aparência.
|
|
4
|
+
argument-hint: <index.html> [--lang pt-BR] [--out pasta]
|
|
5
|
+
allowed-tools: Bash(node ${CLAUDE_SKILL_DIR}/scripts/verify-visual.mjs *), Read, Write, Edit
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# clone-organize — monolito → arquivos limpos, sem mudar a aparência
|
|
9
|
+
|
|
10
|
+
> **1ª execução:** esta skill depende de Node 18+ e de pacotes npm (Playwright). Se `node_modules/` não existir na pasta da skill, rode antes: `cd ${CLAUDE_SKILL_DIR} && npm install && npx playwright install chromium`.
|
|
11
|
+
|
|
12
|
+
Pega um `index.html` que empilha `<style>`, `<script>` e SVG inline e devolve um
|
|
13
|
+
espelho organizado: CSS e JS em `assets/`, SVGs classificados, HTML legível. A
|
|
14
|
+
regra que rege tudo: **a aparência não muda.** Fidelidade é garantida por
|
|
15
|
+
transformação incremental do original, não por reescrita de memória.
|
|
16
|
+
|
|
17
|
+
## Dois modos (não se misturam)
|
|
18
|
+
- **Organizar (padrão):** separa os assets, mantém o texto como está. Fiel ao pixel.
|
|
19
|
+
- **Traduzir (`--lang pt-BR`):** passo POSTERIOR e separado. Traduzir muda o
|
|
20
|
+
comprimento do texto (PT-BR cresce ~47%, botões dobram), então este modo
|
|
21
|
+
**autoriza reajuste de layout** e exige a verificação visual do STEP 7. Nunca
|
|
22
|
+
traduza no mesmo passo em que promete fidelidade ao pixel — as duas se anulam.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## STEP 1 — ANALISAR
|
|
27
|
+
Leia o INPUT inteiro. Mapeie: cores, tipografia, animações, componentes, layout,
|
|
28
|
+
efeitos, assets referenciados, cada `<style>`/`<script>`/`<svg>`. Não escreva nada
|
|
29
|
+
antes de terminar este passo.
|
|
30
|
+
|
|
31
|
+
## STEP 2 — EXTRAIR CSS
|
|
32
|
+
Para cada `<style>`: entenda a função, salve em `assets/css/[nome-descritivo].css`
|
|
33
|
+
(nome por função: `animations.css`, `components.css`). Blocos da mesma preocupação
|
|
34
|
+
viram um arquivo só. Inclui `<style>` dentro do `<body>`, não só do `<head>`.
|
|
35
|
+
- **Antes de escrever, verifique se o arquivo já existe.** Se existir, sufixe
|
|
36
|
+
(`components-2.css`) — a promessa é não sobrescrever nada.
|
|
37
|
+
|
|
38
|
+
## STEP 3 — EXTRAIR JS
|
|
39
|
+
Para cada `<script>` com JS real: salve em `assets/js/[nome-descritivo].js`.
|
|
40
|
+
**NÃO extraia (devem permanecer inline):**
|
|
41
|
+
- `<script type="application/ld+json">` (dados estruturados).
|
|
42
|
+
- Config de framework inline: `tailwind.config = {...}`, `window.__` de runtime,
|
|
43
|
+
qualquer `<script>` que o runtime da página consome na ordem em que está. Extrair
|
|
44
|
+
isso quebra cor/fonte/espaçamento customizados (o design que você quer preservar).
|
|
45
|
+
- Handlers de evento de uma linha, definidos como **até 120 caracteres**.
|
|
46
|
+
|
|
47
|
+
## STEP 4 — CLASSIFICAR CADA SVG
|
|
48
|
+
**Categoria A — ícone Lucide** (`class="lucide..."` ou `data-lucide`): troque por
|
|
49
|
+
`<i data-lucide="[nome]" class="[classes não-lucide]"></i>`. Não salve arquivo.
|
|
50
|
+
|
|
51
|
+
**Categoria B — SVG que herda cor** (`currentColor`, `fill` via classe Tailwind,
|
|
52
|
+
ou qualquer dependência de cor do contexto): mantenha inline, minificado. Não salve.
|
|
53
|
+
|
|
54
|
+
**Categoria C — SVG só com cor fixa** (hex/rgba, sem herança em nenhum estado):
|
|
55
|
+
salve em `assets/images/svg/[nome].svg`, troque por
|
|
56
|
+
`<img src="..." class="[classes]" alt=""/>` (alt vazio para decorativo — não
|
|
57
|
+
invente descrição; se for informativo, descreva o que a imagem comunica).
|
|
58
|
+
|
|
59
|
+
**Na dúvida entre B e C, fique com B (inline).** Além de `currentColor` e hover,
|
|
60
|
+
vira `<img>` também quebra: CSS de fora mirando dentro do SVG (`.card:hover svg
|
|
61
|
+
path`), `<use>` apontando para símbolo em outro ponto, gradiente/filtro por `id`
|
|
62
|
+
externo, e animação interna dependente do documento. Qualquer um desses → B.
|
|
63
|
+
|
|
64
|
+
## STEP 5 — TRANSFORMAR (não reescrever de memória)
|
|
65
|
+
Parta do HTML original e **remova apenas** os blocos `<style>`/`<script>` extraídos,
|
|
66
|
+
pondo os `<link>`/`<script src>` no lugar, e aplicando as trocas de SVG. Todo o
|
|
67
|
+
resto do markup fica intacto. **Não reescreva a página de memória** — é onde se
|
|
68
|
+
omite seção e se inventa texto. A fidelidade vem de mexer só no que estes passos
|
|
69
|
+
mandam mexer.
|
|
70
|
+
- `<head>`: fonts, depois `<link>` de CSS, cada um com um comentário do que faz e
|
|
71
|
+
onde é usado. Scripts que precisam ficar no head (runtime) permanecem, comentados.
|
|
72
|
+
- `<body>`: seções com um comentário de rótulo cada; ao final, os `<script src>`
|
|
73
|
+
comentados. Sem outros comentários no body.
|
|
74
|
+
|
|
75
|
+
## STEP 6 — STACK.md
|
|
76
|
+
Liste cada tecnologia/lib encontrada no INPUT, uma linha cada (nome + função).
|
|
77
|
+
Só o que está de fato presente. **Não invente nem assuma** tecnologia não encontrada.
|
|
78
|
+
|
|
79
|
+
## STEP 7 — VERIFICAR (screenshot, não confiança)
|
|
80
|
+
Rode a verificação visual: ela serve o original e o organizado e tira screenshot
|
|
81
|
+
dos dois pra comparar.
|
|
82
|
+
```bash
|
|
83
|
+
node ${CLAUDE_SKILL_DIR}/scripts/verify-visual.mjs <index.html original> <design-system.html>
|
|
84
|
+
```
|
|
85
|
+
Abra os dois PNGs e confirme que são visualmente iguais. No modo traduzir, é aqui
|
|
86
|
+
que você confere se algum texto maior estourou container e reajusta.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## QUALITY BAR (corrigida)
|
|
91
|
+
- [ ] Toda seção do original presente e visualmente idêntica (conferido no STEP 7).
|
|
92
|
+
- [ ] Nenhum `<style>` ou `<script>` de estilo/comportamento sobrou inline —
|
|
93
|
+
**exceto JSON-LD, config de framework e handlers ≤120 char**, que devem ficar.
|
|
94
|
+
- [ ] Ícones Lucide usam `<i data-lucide>` — nunca `<img>` nem SVG inline.
|
|
95
|
+
- [ ] Nenhum SVG que herda cor virou `<img>`.
|
|
96
|
+
- [ ] Todos os caminhos de asset extraídos resolvem.
|
|
97
|
+
- [ ] Imports no `<head>` e antes de `</body>` têm comentário descritivo.
|
|
98
|
+
- [ ] Nenhum arquivo existente foi sobrescrito (colisões sufixadas).
|
|
99
|
+
- [ ] (Modo traduzir) todo texto visível traduzido E nenhum container estourado.
|
|
100
|
+
|
|
101
|
+
> Removido de propósito o antigo "arquivo menor que o original": separar assets já
|
|
102
|
+
> reduz o HTML; premiar tamanho menor incentiva cortar conteúdo. O que importa é
|
|
103
|
+
> fidelidade + separação, não encolher.
|
|
104
|
+
|
|
105
|
+
## Saída
|
|
106
|
+
`design-system.html` + `assets/` + `STACK.md` na pasta do INPUT (ou `--out`), mais
|
|
107
|
+
os screenshots do STEP 7. Rode o `gate` antes de entregar.
|