iron-edge 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +114 -25
- 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 +143 -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 +518 -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 +80 -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,118 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
fix_paths.py - Pos-processamento do espelho gerado por wget.
|
|
4
|
+
|
|
5
|
+
1. Converte caminhos relativos (../ ./) para root-absolutos (/...) em todos
|
|
6
|
+
os HTMLs, para que os assets carreguem em qualquer profundidade de rota
|
|
7
|
+
(o <base href=""> vazio do Next.js quebra paths relativos quando a URL muda).
|
|
8
|
+
2. Conserta o CSS do Typekit corrompido pelo wget: o bloco
|
|
9
|
+
<style data-href="https://use.typekit.net/XXXX.css">...url('')...</style>
|
|
10
|
+
vira um <link rel="stylesheet" href="https://use.typekit.net/XXXX.css"/>
|
|
11
|
+
(NOTA: kits Typekit sao travados por dominio e NAO carregam em localhost;
|
|
12
|
+
so funcionam no dominio registrado. Para fontes 100% locais use o motor
|
|
13
|
+
de navegador - veja reference/lessons.md).
|
|
14
|
+
|
|
15
|
+
Uso: python3 fix_paths.py <rootDir>
|
|
16
|
+
"""
|
|
17
|
+
import os, re, sys
|
|
18
|
+
|
|
19
|
+
ROOT = os.path.abspath(sys.argv[1]) if len(sys.argv) > 1 else os.getcwd()
|
|
20
|
+
|
|
21
|
+
SKIP = ('http://', 'https://', '//', 'data:', '#', 'mailto:', 'tel:', 'javascript:', '/')
|
|
22
|
+
|
|
23
|
+
# Runtime injetado no fim do <body> (igual ao capture.mjs):
|
|
24
|
+
# tk() ativa classes `tk-*` no <html> (kits Typekit); toast (opt-in via env) avisa
|
|
25
|
+
# que forms nao enviam offline. CLONE_FORM_TOAST=1 liga o toast.
|
|
26
|
+
FORM_TOAST = os.environ.get('CLONE_FORM_TOAST') == '1'
|
|
27
|
+
_TK = r"""function tk(){try{var c=new Set();for(var i=0;i<document.styleSheets.length;i++){var s=document.styleSheets[i],R;try{R=s.cssRules}catch(e){continue}if(!R)continue;for(var j=0;j<R.length;j++){var t=R[j].selectorText;if(!t)continue;var m=t.match(/\.tk-[\w-]+/g);if(m)for(var k=0;k<m.length;k++)c.add(m[k].slice(1))}}c.forEach(function(x){document.documentElement.classList.add(x)})}catch(e){}}if(document.readyState==='complete')tk();else window.addEventListener('load',tk);"""
|
|
28
|
+
_TOAST = r"""document.addEventListener('submit',function(e){var f=e.target,a=((f.getAttribute&&f.getAttribute('action'))||'').trim();if(!/^(https?:|mailto:)/i.test(a)){e.preventDefault();var t=document.createElement('div');t.textContent='Clone estatico — formularios nao enviam (sem backend).';t.style.cssText='position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:#111;color:#fff;padding:12px 18px;border-radius:8px;font:14px/1.4 system-ui,sans-serif;z-index:2147483647;max-width:90vw;box-shadow:0 4px 20px rgba(0,0,0,.3);opacity:0;transition:opacity .2s';document.body.appendChild(t);requestAnimationFrame(function(){t.style.opacity='1'});setTimeout(function(){t.style.opacity='0';setTimeout(function(){t.remove()},300)},3500)}},true);""" if FORM_TOAST else ""
|
|
29
|
+
INJECT = '<script data-clone-site="runtime">(function(){' + _TK + _TOAST + '})();</script>'
|
|
30
|
+
|
|
31
|
+
def to_abs(p, rel_dir):
|
|
32
|
+
if not p or p.startswith(SKIP):
|
|
33
|
+
return p
|
|
34
|
+
if p.startswith('./'):
|
|
35
|
+
p = p[2:]
|
|
36
|
+
ups = 0
|
|
37
|
+
while p.startswith('../'):
|
|
38
|
+
ups += 1; p = p[3:]
|
|
39
|
+
dirs = [d for d in rel_dir.split('/') if d]
|
|
40
|
+
base = dirs[:len(dirs) - ups] if ups <= len(dirs) else []
|
|
41
|
+
out = '/' + '/'.join(base + [p]) if base else '/' + p
|
|
42
|
+
return re.sub(r'/{2,}', '/', out)
|
|
43
|
+
|
|
44
|
+
ATTR_RE = re.compile(r'\b(href|src|poster)=(["\'])(.*?)\2', re.IGNORECASE)
|
|
45
|
+
SRCSET_RE = re.compile(r'\b(srcset|imagesrcset)=(["\'])(.*?)\2', re.IGNORECASE)
|
|
46
|
+
URLCSS_RE = re.compile(r'url\(\s*([\'"]?)([^\'")]*)\1\s*\)', re.IGNORECASE)
|
|
47
|
+
TYPEKIT_STYLE_RE = re.compile(
|
|
48
|
+
r'<style[^>]*data-href="(https://use\.typekit\.net/[^"]+\.css)"[^>]*>.*?</style>',
|
|
49
|
+
re.IGNORECASE | re.DOTALL)
|
|
50
|
+
|
|
51
|
+
def fix_html(path):
|
|
52
|
+
rel_dir = os.path.relpath(os.path.dirname(path), ROOT).replace('\\', '/')
|
|
53
|
+
if rel_dir == '.':
|
|
54
|
+
rel_dir = ''
|
|
55
|
+
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
56
|
+
html = f.read()
|
|
57
|
+
orig = html
|
|
58
|
+
|
|
59
|
+
# Typekit corrompido -> link externo (1:1 do kit)
|
|
60
|
+
html = TYPEKIT_STYLE_RE.sub(lambda m: f'<link rel="stylesheet" href="{m.group(1)}"/>', html)
|
|
61
|
+
|
|
62
|
+
def attr(m):
|
|
63
|
+
return f'{m.group(1)}={m.group(2)}{to_abs(m.group(3), rel_dir)}{m.group(2)}'
|
|
64
|
+
html = ATTR_RE.sub(attr, html)
|
|
65
|
+
|
|
66
|
+
def srcset(m):
|
|
67
|
+
parts = []
|
|
68
|
+
for chunk in m.group(3).split(','):
|
|
69
|
+
seg = chunk.strip().split()
|
|
70
|
+
if seg:
|
|
71
|
+
seg[0] = to_abs(seg[0], rel_dir)
|
|
72
|
+
parts.append(' '.join(seg))
|
|
73
|
+
return f'{m.group(1)}={m.group(2)}{", ".join(parts)}{m.group(2)}'
|
|
74
|
+
html = SRCSET_RE.sub(srcset, html)
|
|
75
|
+
|
|
76
|
+
def urlcss(m):
|
|
77
|
+
return f'url("{to_abs(m.group(2), rel_dir)}")'
|
|
78
|
+
html = URLCSS_RE.sub(urlcss, html)
|
|
79
|
+
|
|
80
|
+
# injeta runtime (tk-* / toast) uma vez por página
|
|
81
|
+
# (replacement como função: INJECT contém \. \w que quebrariam re.sub com string)
|
|
82
|
+
if 'data-clone-site="runtime"' not in html:
|
|
83
|
+
html = re.sub(r'</body>', lambda _m: INJECT + '</body>', html, count=1, flags=re.IGNORECASE)
|
|
84
|
+
|
|
85
|
+
if html != orig:
|
|
86
|
+
with open(path, 'w', encoding='utf-8') as f:
|
|
87
|
+
f.write(html)
|
|
88
|
+
return True
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
n = 0
|
|
92
|
+
for r, dirs, files in os.walk(ROOT):
|
|
93
|
+
dirs[:] = [d for d in dirs if not d.startswith('.')]
|
|
94
|
+
for fn in files:
|
|
95
|
+
if fn.endswith('.html'):
|
|
96
|
+
if fix_html(os.path.join(r, fn)):
|
|
97
|
+
n += 1
|
|
98
|
+
print(f'[fix_paths] {n} HTMLs corrigidos em {ROOT}')
|
|
99
|
+
|
|
100
|
+
# Stubs para chunks _next referenciados mas ausentes (evita 404 no console)
|
|
101
|
+
bm = None
|
|
102
|
+
for r, _, files in os.walk(ROOT):
|
|
103
|
+
for fn in files:
|
|
104
|
+
if fn == '_buildManifest.js':
|
|
105
|
+
bm = os.path.join(r, fn)
|
|
106
|
+
if bm:
|
|
107
|
+
static_root = os.path.dirname(os.path.dirname(bm)) # .../_next/static
|
|
108
|
+
with open(bm, encoding='utf-8', errors='ignore') as f:
|
|
109
|
+
content = f.read()
|
|
110
|
+
chunks = set(re.findall(r'"(static/chunks/[^"]+\.js)"', content))
|
|
111
|
+
stubbed = 0
|
|
112
|
+
for c in chunks:
|
|
113
|
+
p = os.path.join(static_root, c.replace('static/', '', 1))
|
|
114
|
+
if not os.path.exists(p):
|
|
115
|
+
os.makedirs(os.path.dirname(p), exist_ok=True)
|
|
116
|
+
open(p, 'w').close()
|
|
117
|
+
stubbed += 1
|
|
118
|
+
print(f'[fix_paths] {stubbed} chunks _next stub-ados')
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
serve.py - Servidor estatico para o espelho clonado.
|
|
4
|
+
|
|
5
|
+
Resolve o que quebrava no servidor padrao:
|
|
6
|
+
- /rota (sem barra) -> serve /rota/index.html
|
|
7
|
+
- /rota.html quando existe
|
|
8
|
+
- MIME correto p/ .js .mjs .css .woff2 .woff .ttf .webp .svg .json .wasm
|
|
9
|
+
- no-cache (dev) + CORS p/ fontes
|
|
10
|
+
- ignora BrokenPipe/ConnectionReset (cliente fechou)
|
|
11
|
+
- --spa: fallback de qualquer rota desconhecida p/ /index.html
|
|
12
|
+
|
|
13
|
+
Uso: python3 serve.py [--root DIR] [--port N] [--spa]
|
|
14
|
+
"""
|
|
15
|
+
import http.server, socketserver, os, sys, posixpath, glob
|
|
16
|
+
from urllib.parse import unquote, urlsplit
|
|
17
|
+
|
|
18
|
+
ROOT = os.getcwd()
|
|
19
|
+
PORT = 8765
|
|
20
|
+
SPA = False
|
|
21
|
+
args = sys.argv[1:]
|
|
22
|
+
i = 0
|
|
23
|
+
while i < len(args):
|
|
24
|
+
a = args[i]
|
|
25
|
+
if a == '--root': ROOT = os.path.abspath(args[i + 1]); i += 2
|
|
26
|
+
elif a == '--port': PORT = int(args[i + 1]); i += 2
|
|
27
|
+
elif a == '--spa': SPA = True; i += 1
|
|
28
|
+
else: i += 1
|
|
29
|
+
|
|
30
|
+
REAL_ROOT = os.path.realpath(ROOT)
|
|
31
|
+
|
|
32
|
+
EXTRA_MIME = {
|
|
33
|
+
'.js': 'application/javascript', '.mjs': 'application/javascript',
|
|
34
|
+
'.css': 'text/css', '.json': 'application/json', '.map': 'application/json',
|
|
35
|
+
'.woff2': 'font/woff2', '.woff': 'font/woff', '.ttf': 'font/ttf',
|
|
36
|
+
'.otf': 'font/otf', '.eot': 'application/vnd.ms-fontobject',
|
|
37
|
+
'.svg': 'image/svg+xml', '.webp': 'image/webp', '.avif': 'image/avif',
|
|
38
|
+
'.ico': 'image/x-icon', '.wasm': 'application/wasm', '.webmanifest': 'application/manifest+json',
|
|
39
|
+
'.html': 'text/html; charset=utf-8',
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class Handler(http.server.SimpleHTTPRequestHandler):
|
|
43
|
+
def __init__(self, *a, **k): super().__init__(*a, directory=ROOT, **k)
|
|
44
|
+
|
|
45
|
+
def end_headers(self):
|
|
46
|
+
self.send_header('Access-Control-Allow-Origin', '*')
|
|
47
|
+
self.send_header('Cache-Control', 'no-cache, no-store, must-revalidate')
|
|
48
|
+
super().end_headers()
|
|
49
|
+
|
|
50
|
+
def guess_type(self, path):
|
|
51
|
+
ext = posixpath.splitext(path)[1].lower()
|
|
52
|
+
if ext in EXTRA_MIME: return EXTRA_MIME[ext]
|
|
53
|
+
return super().guess_type(path)
|
|
54
|
+
|
|
55
|
+
def _within(self, p):
|
|
56
|
+
"""Retorna o realpath se estiver dentro de ROOT; senao None (anti path-traversal)."""
|
|
57
|
+
try:
|
|
58
|
+
rp = os.path.realpath(p)
|
|
59
|
+
except OSError:
|
|
60
|
+
return None
|
|
61
|
+
return rp if (rp == REAL_ROOT or rp.startswith(REAL_ROOT + os.sep)) else None
|
|
62
|
+
|
|
63
|
+
def _resolve(self, urlpath):
|
|
64
|
+
p = unquote(urlsplit(urlpath).path)
|
|
65
|
+
# descarta segmentos vazios / '.' / '..' antes de montar o caminho
|
|
66
|
+
segs = [s for s in p.split('/') if s and s not in ('.', '..')]
|
|
67
|
+
fs = os.path.join(ROOT, *segs) if segs else ROOT
|
|
68
|
+
for cand in (fs, os.path.join(fs, 'index.html'), fs + '.html'):
|
|
69
|
+
safe = self._within(cand)
|
|
70
|
+
if safe and os.path.isfile(safe):
|
|
71
|
+
return safe
|
|
72
|
+
# fallback: asset pedido pelo nome-base (ex.: runtime do webpack pede
|
|
73
|
+
# `foo.css?dpl=...`) mas salvo no disco com hash-de-query no nome
|
|
74
|
+
# (`foo.<hash>.ext`). Casa por prefixo dentro do mesmo diretorio.
|
|
75
|
+
stem, ext = posixpath.splitext(fs)
|
|
76
|
+
if ext and os.path.isdir(os.path.dirname(fs)):
|
|
77
|
+
for m in sorted(glob.glob(glob.escape(stem) + '.*' + ext)):
|
|
78
|
+
safe = self._within(m)
|
|
79
|
+
if safe and os.path.isfile(safe):
|
|
80
|
+
return safe
|
|
81
|
+
if SPA:
|
|
82
|
+
safe = self._within(os.path.join(ROOT, 'index.html'))
|
|
83
|
+
if safe and os.path.isfile(safe):
|
|
84
|
+
return safe
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
def send_head(self):
|
|
88
|
+
target = self._resolve(self.path)
|
|
89
|
+
if target is None:
|
|
90
|
+
self.send_error(404, 'Not Found')
|
|
91
|
+
return None
|
|
92
|
+
try:
|
|
93
|
+
f = open(target, 'rb')
|
|
94
|
+
except OSError:
|
|
95
|
+
self.send_error(404, 'Not Found'); return None
|
|
96
|
+
try:
|
|
97
|
+
fs = os.fstat(f.fileno())
|
|
98
|
+
self.send_response(200)
|
|
99
|
+
self.send_header('Content-Type', self.guess_type(target))
|
|
100
|
+
self.send_header('Content-Length', str(fs.st_size))
|
|
101
|
+
self.end_headers()
|
|
102
|
+
return f
|
|
103
|
+
except Exception:
|
|
104
|
+
f.close(); raise
|
|
105
|
+
|
|
106
|
+
def do_GET(self):
|
|
107
|
+
try:
|
|
108
|
+
f = self.send_head()
|
|
109
|
+
if f:
|
|
110
|
+
try: self.copyfile(f, self.wfile)
|
|
111
|
+
finally: f.close()
|
|
112
|
+
except (BrokenPipeError, ConnectionResetError): pass
|
|
113
|
+
|
|
114
|
+
def log_message(self, fmt, *a):
|
|
115
|
+
try: msg = (fmt % a)
|
|
116
|
+
except Exception: msg = ''
|
|
117
|
+
if ' 404 ' in msg or ' 500 ' in msg:
|
|
118
|
+
sys.stderr.write('[serve] %s %s\n' % (self.address_string(), msg))
|
|
119
|
+
|
|
120
|
+
class Server(socketserver.ThreadingMixIn, http.server.HTTPServer):
|
|
121
|
+
daemon_threads = True
|
|
122
|
+
allow_reuse_address = True
|
|
123
|
+
|
|
124
|
+
if __name__ == '__main__':
|
|
125
|
+
os.chdir(ROOT)
|
|
126
|
+
with Server(('127.0.0.1', PORT), Handler) as httpd:
|
|
127
|
+
print(f'[serve] http://localhost:{PORT} root={ROOT} spa={SPA}')
|
|
128
|
+
try: httpd.serve_forever()
|
|
129
|
+
except KeyboardInterrupt: pass
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* verify.mjs — Compara visualmente o ORIGINAL e o CLONE local.
|
|
4
|
+
*
|
|
5
|
+
* Para cada rota: tira screenshot full-page de ambos (desktop + opcional mobile),
|
|
6
|
+
* coleta erros de console e requests 404 do clone, e cruza a cobertura de fontes.
|
|
7
|
+
* Gera _verify/report.json + _verify/*.png para inspeção.
|
|
8
|
+
*
|
|
9
|
+
* Uso: node verify.mjs <originalUrl> <cloneBaseUrl> <outDir> [--routes "/,/sobre/"] [--mobile]
|
|
10
|
+
*/
|
|
11
|
+
import { chromium } from 'playwright';
|
|
12
|
+
import { mkdir, writeFile, readFile, readdir, stat } from 'node:fs/promises';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
|
|
15
|
+
const [originalUrl, cloneBase, outDir] = process.argv.slice(2);
|
|
16
|
+
if (!originalUrl || !cloneBase || !outDir) {
|
|
17
|
+
console.error('uso: node verify.mjs <originalUrl> <cloneBaseUrl> <outDir> [--routes "..."] [--mobile]');
|
|
18
|
+
process.exit(2);
|
|
19
|
+
}
|
|
20
|
+
const argv = process.argv.slice(2);
|
|
21
|
+
const ri = argv.indexOf('--routes');
|
|
22
|
+
const ROUTES = ri !== -1 && argv[ri + 1] ? argv[ri + 1].split(',').map(s => s.trim()) : ['/'];
|
|
23
|
+
const MOBILE = argv.includes('--mobile');
|
|
24
|
+
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';
|
|
25
|
+
const vdir = path.join(outDir, '_verify');
|
|
26
|
+
|
|
27
|
+
async function shoot(context, url, file, collect) {
|
|
28
|
+
const page = await context.newPage();
|
|
29
|
+
const errors = [], failed = [];
|
|
30
|
+
page.on('console', m => { if (m.type() === 'error') errors.push(m.text().slice(0, 200)); });
|
|
31
|
+
page.on('pageerror', e => errors.push(e.message.slice(0, 200)));
|
|
32
|
+
page.on('requestfailed', r => {
|
|
33
|
+
const u = r.url();
|
|
34
|
+
if (!/google|gtm|facebook|doubleclick|clarity|hotjar/.test(u)) failed.push(u);
|
|
35
|
+
});
|
|
36
|
+
let fonts = [];
|
|
37
|
+
try {
|
|
38
|
+
await page.goto(url, { waitUntil: 'load', timeout: 45000 });
|
|
39
|
+
await page.waitForLoadState('networkidle').catch(() => {});
|
|
40
|
+
await page.evaluate(async () => {
|
|
41
|
+
await new Promise(r => { let t = 0; const s = setInterval(() => { window.scrollBy(0, 800); t += 800; if (t > document.body.scrollHeight) { clearInterval(s); window.scrollTo(0, 0); r(); } }, 100); setTimeout(() => { clearInterval(s); r(); }, 6000); });
|
|
42
|
+
}).catch(() => {});
|
|
43
|
+
await page.evaluate(() => document.fonts && document.fonts.ready).catch(() => {});
|
|
44
|
+
await page.waitForTimeout(1200);
|
|
45
|
+
fonts = await page.evaluate(() => { try { return [...document.fonts].filter(f => f.status === 'loaded').map(f => `${f.family}/${f.weight}/${f.style}`); } catch { return []; } }).catch(() => []);
|
|
46
|
+
await page.screenshot({ path: file, fullPage: true });
|
|
47
|
+
} catch (e) {
|
|
48
|
+
if (collect) collect.note = 'goto falhou: ' + e.message;
|
|
49
|
+
} finally { await page.close().catch(() => {}); }
|
|
50
|
+
return { errors, failed, fonts: [...new Set(fonts)] };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Checagens estáticas no espelho em disco (baratas, do método manual):
|
|
54
|
+
// integridade de <style> (CSS truncado) e cobertura de chunks do _buildManifest.
|
|
55
|
+
async function walkFiles(dir) {
|
|
56
|
+
const out = [];
|
|
57
|
+
async function rec(d) {
|
|
58
|
+
let ents; try { ents = await readdir(d, { withFileTypes: true }); } catch { return; }
|
|
59
|
+
for (const e of ents) {
|
|
60
|
+
if (e.name === '_verify' || e.name === 'node_modules' || e.name.startsWith('.')) continue;
|
|
61
|
+
const p = path.join(d, e.name);
|
|
62
|
+
if (e.isDirectory()) await rec(p); else out.push(p);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await rec(dir);
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
async function staticChecks(outDir) {
|
|
69
|
+
const res = { cssTruncated: [], chunks: { ok: 0, missing: [] } };
|
|
70
|
+
const files = await walkFiles(outDir);
|
|
71
|
+
for (const f of files.filter(x => x.endsWith('.html'))) {
|
|
72
|
+
try {
|
|
73
|
+
const h = await readFile(f, 'utf8');
|
|
74
|
+
const open = (h.match(/<style[\s>]/gi) || []).length;
|
|
75
|
+
const close = (h.match(/<\/style>/gi) || []).length;
|
|
76
|
+
if (open !== close) res.cssTruncated.push({ file: path.relative(outDir, f), open, close });
|
|
77
|
+
} catch {}
|
|
78
|
+
}
|
|
79
|
+
const manifest = files.find(x => x.endsWith('_buildManifest.js'));
|
|
80
|
+
if (manifest) {
|
|
81
|
+
try {
|
|
82
|
+
const txt = await readFile(manifest, 'utf8');
|
|
83
|
+
const nextDir = path.dirname(path.dirname(path.dirname(manifest))); // .../_next
|
|
84
|
+
const refs = [...new Set((txt.match(/"(static\/chunks\/[^"]+\.js)"/g) || []).map(m => m.slice(1, -1)))];
|
|
85
|
+
for (const ref of refs) {
|
|
86
|
+
const p = path.join(nextDir, ref);
|
|
87
|
+
try { const s = await stat(p); if (s.size > 0) res.chunks.ok++; else res.chunks.missing.push({ ref, reason: 'stub vazio' }); }
|
|
88
|
+
catch { res.chunks.missing.push({ ref, reason: 'ausente' }); }
|
|
89
|
+
}
|
|
90
|
+
} catch {}
|
|
91
|
+
}
|
|
92
|
+
return res;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
(async () => {
|
|
96
|
+
await mkdir(vdir, { recursive: true });
|
|
97
|
+
const browser = await chromium.launch({ headless: true }); // sandbox ON
|
|
98
|
+
const report = { originalUrl, cloneBase, routes: [], generatedAt: new Date().toISOString() };
|
|
99
|
+
const ctx = await browser.newContext({ userAgent: UA, viewport: { width: 1440, height: 900 }, deviceScaleFactor: 1, ignoreHTTPSErrors: true, serviceWorkers: 'block' });
|
|
100
|
+
try {
|
|
101
|
+
for (const route of ROUTES) {
|
|
102
|
+
const slug = route.replace(/[^a-z0-9]+/gi, '_').replace(/^_|_$/g, '') || 'home';
|
|
103
|
+
const o = await shoot(ctx, originalUrl.replace(/\/$/, '') + route, path.join(vdir, `${slug}_original.png`));
|
|
104
|
+
const c = await shoot(ctx, cloneBase.replace(/\/$/, '') + route, path.join(vdir, `${slug}_clone.png`));
|
|
105
|
+
const missingFonts = o.fonts.filter(f => !c.fonts.includes(f));
|
|
106
|
+
report.routes.push({
|
|
107
|
+
route,
|
|
108
|
+
cloneConsoleErrors: c.errors,
|
|
109
|
+
cloneFailedRequests: c.failed,
|
|
110
|
+
fontsOriginal: o.fonts, fontsClone: c.fonts, fontsMissingInClone: missingFonts,
|
|
111
|
+
screenshots: { original: `_verify/${slug}_original.png`, clone: `_verify/${slug}_clone.png` },
|
|
112
|
+
});
|
|
113
|
+
const ok = c.failed.length === 0 && missingFonts.length === 0 && c.errors.length === 0;
|
|
114
|
+
console.log(`[verify] ${route} ${ok ? 'OK' : 'ATENÇÃO'} | 404s:${c.failed.length} erros:${c.errors.length} fontesFaltando:${missingFonts.length}`);
|
|
115
|
+
if (missingFonts.length) console.log(' fontes faltando no clone:', missingFonts.join(', '));
|
|
116
|
+
c.failed.slice(0, 5).forEach(f => console.log(' 404:', f));
|
|
117
|
+
}
|
|
118
|
+
} finally { await ctx.close().catch(() => {}); await browser.close().catch(() => {}); }
|
|
119
|
+
report.staticChecks = await staticChecks(outDir);
|
|
120
|
+
const sc = report.staticChecks;
|
|
121
|
+
console.log(`[verify] estático | CSS truncado: ${sc.cssTruncated.length} | chunks ok: ${sc.chunks.ok} faltando: ${sc.chunks.missing.length}`);
|
|
122
|
+
sc.cssTruncated.slice(0, 5).forEach(c => console.log(` <style> desbalanceado: ${c.file} (${c.open}/${c.close})`));
|
|
123
|
+
sc.chunks.missing.slice(0, 5).forEach(c => console.log(` chunk ${c.reason}: ${c.ref}`));
|
|
124
|
+
await writeFile(path.join(vdir, 'report.json'), JSON.stringify(report, null, 2));
|
|
125
|
+
console.log(`[verify] relatório: ${path.join(vdir, 'report.json')}`);
|
|
126
|
+
})().catch(e => { console.error('[verify] FALHA:', e); process.exit(1); });
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# wget_fallback.sh - Caminho rapido (sem navegador) para sites estaticos/SSG.
|
|
3
|
+
# NAO captura conteudo client-side de SPAs nem fontes de CDN travadas por dominio
|
|
4
|
+
# (ex: Adobe Typekit). Use o motor de navegador (capture.mjs) para fidelidade 1:1.
|
|
5
|
+
#
|
|
6
|
+
# Uso: wget_fallback.sh <url> <outDir>
|
|
7
|
+
set -uo pipefail
|
|
8
|
+
|
|
9
|
+
URL="${1:?url}"; OUT="${2:?outDir}"
|
|
10
|
+
HOST="$(printf '%s' "$URL" | sed -E 's#^https?://([^/]+).*#\1#')"
|
|
11
|
+
BARE="$(printf '%s' "$HOST" | sed -E 's/^www\.//')"
|
|
12
|
+
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
13
|
+
|
|
14
|
+
mkdir -p "$OUT"
|
|
15
|
+
echo "[wget] espelhando $URL (dominios: $HOST,$BARE,www.$BARE)"
|
|
16
|
+
|
|
17
|
+
wget \
|
|
18
|
+
--mirror --convert-links --adjust-extension --page-requisites --no-parent \
|
|
19
|
+
--domains="$HOST,$BARE,www.$BARE" \
|
|
20
|
+
--tries=3 --timeout=30 --waitretry=2 --no-check-certificate -e robots=off \
|
|
21
|
+
--reject-regex '(gtm\.js|gtag|google-analytics|doubleclick|facebook\.com/tr|clarity\.ms)' \
|
|
22
|
+
--user-agent="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" \
|
|
23
|
+
-P "$OUT" "$URL" 2>&1 | tail -20
|
|
24
|
+
|
|
25
|
+
# wget cria OUT/<host>/... -> achata para a raiz de OUT
|
|
26
|
+
SRC=""
|
|
27
|
+
for h in "$HOST" "www.$BARE" "$BARE"; do
|
|
28
|
+
[ -d "$OUT/$h" ] && SRC="$OUT/$h" && break
|
|
29
|
+
done
|
|
30
|
+
if [ -n "$SRC" ]; then
|
|
31
|
+
echo "[wget] achatando $SRC -> $OUT"
|
|
32
|
+
( shopt -s dotglob nullglob; mv "$SRC"/* "$OUT"/ 2>/dev/null; rmdir "$SRC" 2>/dev/null )
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
echo "[wget] corrigindo caminhos + Typekit + chunks"
|
|
36
|
+
python3 "$SKILL_DIR/scripts/fix_paths.py" "$OUT"
|
|
37
|
+
|
|
38
|
+
echo "[wget] concluido. (Aviso: fontes Typekit nao carregam em localhost neste modo.)"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clone-transplant
|
|
3
|
+
description: Veste a estrutura de um site clonado com a marca de um cliente. Lê o inventory.json da origem (cores por papel) e um brand.css de destino, troca cor por PAPEL (fundo→fundo, texto→texto), troca as fontes, e checa contraste no fim. Escreve numa pasta nova, nunca sobrescreve a origem. Use quando o usuário quiser o site do outro com a marca dele ("aquele site, com a minha cara").
|
|
4
|
+
argument-hint: <origem> <inventory.json> <brand.css> --out <pasta> [--nivel raso|fundo]
|
|
5
|
+
allowed-tools: Bash(node ${CLAUDE_SKILL_DIR}/scripts/transplant.mjs *), Read, Write
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# clone-transplant — a estrutura do outro, a marca do cliente
|
|
9
|
+
|
|
10
|
+
Troca as decisões de cor e fonte de um site clonado pelas da marca do cliente,
|
|
11
|
+
**por papel**. A estrutura e o layout continuam sendo do original; a alma passa a
|
|
12
|
+
ser da marca. Nunca inventa cor e nunca toca na origem.
|
|
13
|
+
|
|
14
|
+
## Fluxo (caso A)
|
|
15
|
+
1. `clone-site <url>` → pasta com o site do outro.
|
|
16
|
+
2. `clone-inventory <url>` → `inventory.json` (cores da origem por papel).
|
|
17
|
+
3. `clone-transplant <pasta> <inventory.json> <brand.css> --out <nova-pasta>`.
|
|
18
|
+
|
|
19
|
+
## Como rodar
|
|
20
|
+
```bash
|
|
21
|
+
node ${CLAUDE_SKILL_DIR}/scripts/transplant.mjs \
|
|
22
|
+
<origem: arquivo.html|pasta> <inventory.json> <brand.css> --out <pasta-nova> \
|
|
23
|
+
[--nivel raso|fundo] [--so paleta,tipografia] [--roles fundo=--crema,texto=--tartufo]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Profundidade (fundo é o padrão, escolhível)
|
|
27
|
+
| Nível | Troca |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `raso` | só a cor primária + as fontes |
|
|
30
|
+
| `fundo` (padrão) | paleta inteira por papel + tipografia (cor e fonte) |
|
|
31
|
+
| `--so a,b,c` | item a item (ex: `--so paleta` mantém as fontes do original) |
|
|
32
|
+
| `--roles ...` | força o mapa de papéis (ex: `texto=--tartufo`) |
|
|
33
|
+
|
|
34
|
+
> Troca **cor e fonte**. Raio e sombra ainda NÃO são trocados (ficam os do
|
|
35
|
+
> original) — não são prometidos aqui de propósito.
|
|
36
|
+
|
|
37
|
+
## Regras (as travas que protegem a marca)
|
|
38
|
+
- **Mapa por papel, mostrado antes de aplicar.** O papel de cada cor do brand é
|
|
39
|
+
inferido do comentário da variável + luminância. Confira o mapa impresso.
|
|
40
|
+
- **Respeita negação no comentário.** `--oro: NUNCA texto` não vira cor de texto.
|
|
41
|
+
- **Texto = maior contraste sobre o fundo** quando há vários candidatos (o
|
|
42
|
+
`--tartufo` real vence o dourado de texto).
|
|
43
|
+
- **Contraste é check obrigatório.** Se o par texto/fundo da marca reprova AA, o
|
|
44
|
+
relatório marca BLOQUEADOR — não entregue assim.
|
|
45
|
+
- **Cores órfãs são reportadas** (apareceram no site, sem papel no inventário).
|
|
46
|
+
- **A origem nunca é tocada.** Sempre escreve em `--out` (pasta nova).
|
|
47
|
+
|
|
48
|
+
## Saída
|
|
49
|
+
Pasta nova com o site transplantado + `_transplante.md` (mapa de cores aplicado,
|
|
50
|
+
tipografia, contraste do resultado, cores órfãs). Rode o `gate` antes do cliente.
|