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,299 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* transplant.mjs — veste a estrutura de um site (clonado) com a marca do cliente.
|
|
4
|
+
*
|
|
5
|
+
* Lê o inventory.json da ORIGEM (cores por papel, medidas) e um brand.css de
|
|
6
|
+
* DESTINO (a marca do cliente). Mapeia cor por PAPEL (fundo→fundo, texto→texto),
|
|
7
|
+
* troca no HTML/CSS, e checa contraste no fim. Nunca inventa matiz: papel que
|
|
8
|
+
* falta no destino é derivado por luminosidade de uma cor que existe.
|
|
9
|
+
*
|
|
10
|
+
* Escreve numa pasta NOVA — nunca sobrescreve a origem.
|
|
11
|
+
*
|
|
12
|
+
* Uso:
|
|
13
|
+
* node transplant.mjs <origem: arquivo.html|pasta> <inventory.json> <brand.css> --out <pasta>
|
|
14
|
+
* [--nivel raso|fundo] [--so paleta,tipografia] [--roles fundo=--crema,texto=--tartufo,...]
|
|
15
|
+
*/
|
|
16
|
+
import { readFile, writeFile, mkdir, readdir, stat, copyFile } from 'node:fs/promises';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
|
|
19
|
+
const argv = process.argv.slice(2);
|
|
20
|
+
const [srcPath, invPath, brandPath] = argv;
|
|
21
|
+
if (!srcPath || !invPath || !brandPath) { console.error('uso: node transplant.mjs <origem> <inventory.json> <brand.css> --out <pasta> [--nivel fundo] [--so ...] [--roles ...]'); process.exit(2); }
|
|
22
|
+
const val = (n, d) => { const i = argv.indexOf(n); return i !== -1 && argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[i + 1] : d; };
|
|
23
|
+
const OUT = val('--out', '');
|
|
24
|
+
const NIVEL = val('--nivel', 'fundo');
|
|
25
|
+
const SO = val('--so', '');
|
|
26
|
+
const ROLES_OVERRIDE = val('--roles', '');
|
|
27
|
+
const FORCE = argv.includes('--force');
|
|
28
|
+
if (!OUT) { console.error('erro: --out <pasta> obrigatório (nunca sobrescreve a origem)'); process.exit(2); }
|
|
29
|
+
const log = (...a) => console.error('[transplant]', ...a);
|
|
30
|
+
|
|
31
|
+
// o que aplicar. raso = só primária+fonte. fundo = paleta+tipografia (cor + fonte).
|
|
32
|
+
// raio/sombra NÃO entram: o transplante ainda não os troca; prometer na doc era
|
|
33
|
+
// mentira (achado do gate). Cor e fonte é o que ele faz de verdade.
|
|
34
|
+
const DIMS = SO ? SO.split(',').map(s => s.trim()) : (NIVEL === 'raso' ? ['primaria', 'tipografia'] : ['paleta', 'tipografia']);
|
|
35
|
+
const wantPalette = DIMS.includes('paleta');
|
|
36
|
+
const wantPrimariaOnly = DIMS.includes('primaria') && !wantPalette;
|
|
37
|
+
const wantType = DIMS.includes('tipografia');
|
|
38
|
+
|
|
39
|
+
// ---------------------------------------------------------------- cor utils
|
|
40
|
+
function parseColor(str) {
|
|
41
|
+
if (!str) return null; const s = String(str).trim().toLowerCase();
|
|
42
|
+
let m = s.match(/^#([0-9a-f]{3,8})$/);
|
|
43
|
+
if (m) { let h = m[1]; if (h.length === 3) h = h.split('').map(c => c + c).join(''); if (h.length >= 6) 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 }; }
|
|
44
|
+
m = s.match(/^rgba?\(([^)]+)\)/); if (m) { const p = m[1].split(/[,\/\s]+/).filter(Boolean); const r = +p[0], g = +p[1], b = +p[2]; const a = p[3] === undefined ? 1 : (p[3].endsWith('%') ? +p[3].slice(0, -1) / 100 : +p[3]); if (![r, g, b].some(Number.isNaN)) return { r, g, b, a }; }
|
|
45
|
+
m = s.match(/^hsla?\(([^)]+)\)/); if (m) { const p = m[1].split(/[,\/\s]+/).filter(Boolean); const h = parseFloat(p[0]), S = parseFloat(p[1]) / 100, L = parseFloat(p[2]) / 100; const a = (mx => mx * S / 100)(0), q = 0; const c2 = (1 - Math.abs(2 * L - 1)) * S; const x = c2 * (1 - Math.abs((h / 60) % 2 - 1)); const mm = L - c2 / 2; let rr = 0, gg = 0, bb = 0; const hh = h % 360; if (hh < 60) [rr, gg, bb] = [c2, x, 0]; else if (hh < 120) [rr, gg, bb] = [x, c2, 0]; else if (hh < 180) [rr, gg, bb] = [0, c2, x]; else if (hh < 240) [rr, gg, bb] = [0, x, c2]; else if (hh < 300) [rr, gg, bb] = [x, 0, c2]; else [rr, gg, bb] = [c2, 0, x]; return { r: Math.round((rr + mm) * 255), g: Math.round((gg + mm) * 255), b: Math.round((bb + mm) * 255), a: p[3] === undefined ? 1 : +p[3] }; }
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
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('');
|
|
49
|
+
const key = c => `${Math.round(c.r)},${Math.round(c.g)},${Math.round(c.b)}`; // casa hex e rgb do mesmo valor
|
|
50
|
+
function toHsl({ r, g, b }) { r /= 255; g /= 255; b /= 255; const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn; let h = 0; const l = (mx + mn) / 2; const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1)); if (d) { if (mx === r) h = ((g - b) / d) % 6; else if (mx === g) h = (b - r) / d + 2; else h = (r - g) / d + 4; h *= 60; if (h < 0) h += 360; } return { h, s, l }; }
|
|
51
|
+
const lum = c => { const f = v => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }; return 0.2126 * f(c.r) + 0.7152 * f(c.g) + 0.0722 * f(c.b); };
|
|
52
|
+
const contrast = (a, b) => { const l1 = lum(a), l2 = lum(b); const [hi, lo] = l1 > l2 ? [l1, l2] : [l2, l1]; return +((hi + 0.05) / (lo + 0.05)).toFixed(2); };
|
|
53
|
+
function lighten(c, dl) { let { h, s, l } = toHsl(c); l = Math.min(0.94, l + dl); const a = s * Math.min(l, 1 - l); const f = n => { const k = (n + h / 30) % 12; return Math.round(255 * (l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)))); }; return { r: f(0), g: f(8), b: f(4), a: 1 }; }
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------- brand.css → papéis
|
|
56
|
+
const ROLE_WORDS = [
|
|
57
|
+
['fundo', /fundo\s+(principal|dominante|geral)|background\s+principal/],
|
|
58
|
+
['superficie', /cart(ã|a)o|cartões|bloco|superf|card|painel/],
|
|
59
|
+
['primaria', /destaque|romântic|prim(á|a)ri|marca|bot(ã|a)o|call|cta/],
|
|
60
|
+
['texto', /texto|tinta|corpo|leitura/],
|
|
61
|
+
['acento', /acento|realce|detalhe|natural|brilho/],
|
|
62
|
+
['borda', /borda|linha|r(é|e)gua|moldura|divis/],
|
|
63
|
+
];
|
|
64
|
+
function inferRole(comment) {
|
|
65
|
+
const c = (comment || '').toLowerCase();
|
|
66
|
+
for (const [role, re] of ROLE_WORDS) {
|
|
67
|
+
const m = re.exec(c); if (!m) continue;
|
|
68
|
+
// negação antes da palavra ("NUNCA texto", "não é fundo") → papel negado,
|
|
69
|
+
// tenta o próximo. Sem isso, "--oro: NUNCA texto" virava a cor de texto.
|
|
70
|
+
const pre = c.slice(Math.max(0, m.index - 12), m.index);
|
|
71
|
+
if (/nunca|jamais|n(ã|a)o\b|never|evitar/.test(pre)) continue;
|
|
72
|
+
return role;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function parseBrand(css) {
|
|
78
|
+
const vars = [];
|
|
79
|
+
// varre linha a linha pra pegar o comentário na MESMA linha OU na de cima
|
|
80
|
+
// (achado do gate: comentário acima da variável era ignorado).
|
|
81
|
+
let pending = '';
|
|
82
|
+
for (const line of css.split('\n')) {
|
|
83
|
+
const cm = line.match(/\/\*([^*]*)\*\//);
|
|
84
|
+
const vm = line.match(/--([a-z0-9-]+)\s*:\s*(#[0-9a-fA-F]{3,8}|rgba?\([^)]+\)|hsla?\([^)]+\))/);
|
|
85
|
+
if (vm) {
|
|
86
|
+
const c = parseColor(vm[2]);
|
|
87
|
+
if (c) { const comment = (cm ? cm[1] : pending).trim(); vars.push({ name: '--' + vm[1], hex: toHex(c), rgb: c, comment, role: inferRole(comment) }); }
|
|
88
|
+
pending = '';
|
|
89
|
+
} else if (cm) { pending = cm[1]; }
|
|
90
|
+
else if (line.trim()) pending = '';
|
|
91
|
+
}
|
|
92
|
+
// fontes: --f-... : 'Familia'
|
|
93
|
+
const fonts = {};
|
|
94
|
+
const fr = /--(f-[a-z0-9-]+|font-[a-z0-9-]+)\s*:\s*['"]?([^,'";]+)/g;
|
|
95
|
+
let fm; while ((fm = fr.exec(css))) { const name = fm[1], fam = fm[2].trim(); if (/tit|disp|head/.test(name)) fonts.display = fam; else if (/text|body|corpo/.test(name)) fonts.body = fam; }
|
|
96
|
+
return { vars, fonts };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// escolhe a cor destino de cada papel (comentário; senão luminância/croma)
|
|
100
|
+
function buildDestRoles(brand) {
|
|
101
|
+
// coleta TODOS os candidatos por papel (não só o primeiro do arquivo)
|
|
102
|
+
const cands = {};
|
|
103
|
+
for (const v of brand.vars) if (v.role) (cands[v.role] || (cands[v.role] = [])).push(v);
|
|
104
|
+
const chroma = v => Math.max(v.rgb.r, v.rgb.g, v.rgb.b) - Math.min(v.rgb.r, v.rgb.g, v.rgb.b);
|
|
105
|
+
const neutras = brand.vars.filter(v => chroma(v) < 40);
|
|
106
|
+
const marcas = brand.vars.filter(v => chroma(v) >= 40);
|
|
107
|
+
const byLumAsc = a => a.slice().sort((x, y) => lum(x.rgb) - lum(y.rgb));
|
|
108
|
+
const byRole = {};
|
|
109
|
+
// fundo primeiro (o texto se decide em função dele)
|
|
110
|
+
byRole.fundo = (cands.fundo || [])[0] || byLumAsc(neutras.length ? neutras : brand.vars).slice(-1)[0];
|
|
111
|
+
// texto: entre os candidatos, o de MAIOR contraste sobre o fundo. Faz o
|
|
112
|
+
// --tartufo (12:1) vencer o --oro-texto (5:1) pro corpo — legibilidade real.
|
|
113
|
+
if (cands.texto) byRole.texto = cands.texto.slice().sort((a, b) => contrast(b.rgb, byRole.fundo.rgb) - contrast(a.rgb, byRole.fundo.rgb))[0];
|
|
114
|
+
else byRole.texto = byLumAsc(neutras.length ? neutras : brand.vars)[0];
|
|
115
|
+
byRole.superficie = (cands.superficie || [])[0] || (neutras.length ? byLumAsc(neutras).slice(-2)[0] : byRole.fundo);
|
|
116
|
+
byRole.primaria = (cands.primaria || [])[0] || byLumAsc(marcas)[0] || byRole.texto;
|
|
117
|
+
byRole.acento = (cands.acento || [])[0] || marcas.find(v => v !== byRole.primaria) || byRole.primaria;
|
|
118
|
+
byRole.borda = (cands.borda || [])[0] || byRole.superficie || byRole.acento;
|
|
119
|
+
return byRole;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// aplica overrides "fundo=--crema,texto=--tartufo"
|
|
123
|
+
function applyRoleOverride(destRoles, brand, str) {
|
|
124
|
+
if (!str) return destRoles;
|
|
125
|
+
for (const pair of str.split(',')) { const [role, varname] = pair.split('='); const v = brand.vars.find(x => x.name === varname.trim()); if (v) destRoles[role.trim()] = v; }
|
|
126
|
+
return destRoles;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ---------------------------------------------------------------- substituição
|
|
130
|
+
function buildColorMap(inv, destRoles, deriveNote) {
|
|
131
|
+
const c = inv.cores || {};
|
|
132
|
+
const rolesWanted = wantPrimariaOnly ? ['primaria'] : ['fundo', 'texto', 'superficie', 'primaria', 'acento', 'borda'];
|
|
133
|
+
const map = new Map(); // "r,g,b" origem -> {toHex, role, fromHex}
|
|
134
|
+
const table = [];
|
|
135
|
+
const colisoes = [];
|
|
136
|
+
for (const role of rolesWanted) {
|
|
137
|
+
const from = c[role]?.hex; const destVar = destRoles[role];
|
|
138
|
+
if (!from || !destVar) continue;
|
|
139
|
+
const fc = parseColor(from); if (!fc) continue;
|
|
140
|
+
const k = key(fc);
|
|
141
|
+
// dois papéis com a MESMA cor de origem: o primeiro (ordem: fundo→texto→…)
|
|
142
|
+
// ganha, não sobrescreve. Sem isso o Map trocava silenciosamente o papel.
|
|
143
|
+
if (map.has(k)) { colisoes.push({ role, fromHex: from, jaMapeado: map.get(k).role }); continue; }
|
|
144
|
+
map.set(k, { toHex: destVar.hex, role, fromHex: from, destName: destVar.name });
|
|
145
|
+
table.push({ role, fromHex: from, toHex: destVar.hex, destName: destVar.name });
|
|
146
|
+
}
|
|
147
|
+
return { map, table, colisoes };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const HEX_RE = /#[0-9a-fA-F]{3,8}\b/g;
|
|
151
|
+
const FUNC_RE = /rgba?\([^)]+\)|hsla?\([^)]+\)/g;
|
|
152
|
+
function rewriteColors(text, map, counts, orphans, destSet) {
|
|
153
|
+
const swap = (raw) => {
|
|
154
|
+
const c = parseColor(raw); if (!c) return raw;
|
|
155
|
+
const hit = map.get(key(c));
|
|
156
|
+
if (!hit) {
|
|
157
|
+
// cor real que não tinha papel no inventário e não é do brand: fica órfã.
|
|
158
|
+
// Registra pra revisão (ex: um card tintado que o inventário não mapeou).
|
|
159
|
+
if (c.a > 0.05 && !destSet.has(key(c))) orphans.set(key(c), (orphans.get(key(c)) || 0) + 1);
|
|
160
|
+
return raw;
|
|
161
|
+
}
|
|
162
|
+
counts[hit.role] = (counts[hit.role] || 0) + 1;
|
|
163
|
+
return c.a < 1 ? `rgba(${parseColor(hit.toHex).r}, ${parseColor(hit.toHex).g}, ${parseColor(hit.toHex).b}, ${c.a})` : hit.toHex;
|
|
164
|
+
};
|
|
165
|
+
return text.replace(FUNC_RE, swap).replace(HEX_RE, swap);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// no HTML, troca cor SÓ onde cor mora: blocos <style> e atributos style="".
|
|
169
|
+
// NUNCA em href/id/JS — um #hex ali é âncora/rota/dado, não cor. (Auditoria pegou
|
|
170
|
+
// href="#e8eef5" e strings JS sendo corrompidos pela troca cega.)
|
|
171
|
+
function rewriteHtmlColors(html, map, counts, orphans, destSet) {
|
|
172
|
+
html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/gi, (_m, o, css, cl) => o + rewriteColors(css, map, counts, orphans, destSet) + cl);
|
|
173
|
+
html = html.replace(/style="([^"]*)"/gi, (m, s) => s.includes('#') || /rgb|hsl/i.test(s) ? `style="${rewriteColors(s, map, counts, orphans, destSet)}"` : m);
|
|
174
|
+
html = html.replace(/style='([^']*)'/gi, (m, s) => s.includes('#') || /rgb|hsl/i.test(s) ? `style='${rewriteColors(s, map, counts, orphans, destSet)}'` : m);
|
|
175
|
+
return html;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const fnorm = s => String(s || '').toLowerCase().replace(/\s+(variable|var)$/, '').trim();
|
|
179
|
+
function rewriteFonts(text, invFonts, destFonts, counts, note) {
|
|
180
|
+
let out = text;
|
|
181
|
+
const dispFrom = invFonts?.display?.familia, corpoFrom = invFonts?.corpo?.familia;
|
|
182
|
+
const pairs = [];
|
|
183
|
+
// origem usa 1 família só (display==corpo): fazer UMA troca, senão o 1º replace
|
|
184
|
+
// consome tudo e o 2º não acha nada — saía tudo com a fonte de título e o
|
|
185
|
+
// relatório mentia "trocas:1" (achado do gate). Aplica a de CORPO (texto manda).
|
|
186
|
+
if (dispFrom && corpoFrom && fnorm(dispFrom) === fnorm(corpoFrom)) {
|
|
187
|
+
if (destFonts.body || destFonts.display) { pairs.push([dispFrom, destFonts.body || destFonts.display]); if (note) note.single = `origem usa 1 fonte só ("${dispFrom}"); apliquei a de corpo do destino em tudo — títulos não foram diferenciados`; }
|
|
188
|
+
} else {
|
|
189
|
+
if (dispFrom && destFonts.display) pairs.push([dispFrom, destFonts.display]);
|
|
190
|
+
if (corpoFrom && destFonts.body) pairs.push([corpoFrom, destFonts.body]);
|
|
191
|
+
}
|
|
192
|
+
for (const [from, to] of pairs) {
|
|
193
|
+
const bare = from.replace(/\s+(Variable|Var)$/i, '').trim();
|
|
194
|
+
for (const name of new Set([from, bare])) {
|
|
195
|
+
const re = new RegExp(name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
|
|
196
|
+
const n = (out.match(re) || []).length;
|
|
197
|
+
if (n) { out = out.replace(re, to); counts.tipografia = (counts.tipografia || 0) + n; }
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function listFiles(p) {
|
|
204
|
+
const s = await stat(p);
|
|
205
|
+
if (s.isFile()) return [{ abs: p, rel: path.basename(p) }];
|
|
206
|
+
const out = [];
|
|
207
|
+
const rec = async (d, base) => { for (const e of await readdir(d, { withFileTypes: true })) { if (e.name.startsWith('.') || e.name === 'node_modules' || e.name === '_verify') continue; const abs = path.join(d, e.name), rel = path.join(base, e.name); if (e.isDirectory()) await rec(abs, rel); else out.push({ abs, rel }); } };
|
|
208
|
+
await rec(p, ''); return out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ---------------------------------------------------------------- main
|
|
212
|
+
(async () => {
|
|
213
|
+
// NUNCA sobrescrever dado do usuário: se --out já tem conteúdo, aborta (a menos
|
|
214
|
+
// de --force). Sem isso, apontar --out pra pasta de origem comia o original —
|
|
215
|
+
// e o relatório ainda afirmava "origem não foi tocada" (achado do gate).
|
|
216
|
+
const outResolved = path.resolve(OUT), srcResolved = path.resolve(srcPath);
|
|
217
|
+
if (outResolved === srcResolved || outResolved === path.dirname(srcResolved)) {
|
|
218
|
+
console.error(`erro: --out não pode ser a origem nem a pasta dela (sobrescreveria o original). Use uma pasta nova.`); process.exit(2);
|
|
219
|
+
}
|
|
220
|
+
try { const existing = await readdir(OUT); if (existing.length && !FORCE) { console.error(`erro: --out "${OUT}" já tem ${existing.length} arquivo(s). Use uma pasta vazia/nova, ou --force pra escrever por cima.`); process.exit(2); } } catch { /* não existe ainda: ok */ }
|
|
221
|
+
|
|
222
|
+
const inv = JSON.parse(await readFile(invPath, 'utf8'));
|
|
223
|
+
const brand = parseBrand(await readFile(brandPath, 'utf8'));
|
|
224
|
+
let destRoles = buildDestRoles(brand);
|
|
225
|
+
destRoles = applyRoleOverride(destRoles, brand, ROLES_OVERRIDE);
|
|
226
|
+
|
|
227
|
+
// MAPA DE PAPÉIS — mostrado pro usuário confirmar (não aplica cego)
|
|
228
|
+
log('mapa de papéis do destino (' + path.basename(brandPath) + '):');
|
|
229
|
+
for (const role of ['fundo', 'texto', 'superficie', 'primaria', 'acento', 'borda']) { const v = destRoles[role]; if (v) log(` ${role.padEnd(11)} → ${v.name.padEnd(14)} ${v.hex} ${v.comment ? '(' + v.comment + ')' : ''}`); }
|
|
230
|
+
|
|
231
|
+
const { map, table, colisoes } = buildColorMap(inv, destRoles, []);
|
|
232
|
+
const counts = {};
|
|
233
|
+
const fontNote = {};
|
|
234
|
+
const orphans = new Map();
|
|
235
|
+
const destSet = new Set(brand.vars.map(v => key(v.rgb))); // cores do brand não são órfãs
|
|
236
|
+
const files = await listFiles(srcPath);
|
|
237
|
+
await mkdir(OUT, { recursive: true });
|
|
238
|
+
|
|
239
|
+
// cor só entra onde cor mora: .css (tudo) e .html (só <style> e style=""). JS,
|
|
240
|
+
// JSON e SVG são copiados sem troca de cor — evita corromper href/rota/dado.
|
|
241
|
+
let nText = 0, nCopy = 0;
|
|
242
|
+
for (const f of files) {
|
|
243
|
+
const dest = path.join(OUT, f.rel);
|
|
244
|
+
await mkdir(path.dirname(dest), { recursive: true });
|
|
245
|
+
const isCss = /\.css$/i.test(f.rel), isHtml = /\.html?$/i.test(f.rel);
|
|
246
|
+
if (isCss || isHtml) {
|
|
247
|
+
let t = await readFile(f.abs, 'utf8');
|
|
248
|
+
if (wantPalette || wantPrimariaOnly) t = isCss ? rewriteColors(t, map, counts, orphans, destSet) : rewriteHtmlColors(t, map, counts, orphans, destSet);
|
|
249
|
+
if (wantType) t = rewriteFonts(t, inv.tipografia, brand.fonts, counts, fontNote);
|
|
250
|
+
await writeFile(dest, t); nText++;
|
|
251
|
+
} else { await copyFile(f.abs, dest); nCopy++; }
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// CONTRASTE final (obrigatório): texto destino sobre fundo destino
|
|
255
|
+
const tCol = destRoles.texto?.rgb, bCol = destRoles.fundo?.rgb;
|
|
256
|
+
const cr = tCol && bCol ? contrast(tCol, bCol) : null;
|
|
257
|
+
const contrasteOk = cr == null ? null : { texto_sobre_fundo: cr, passa_AA_corpo: cr >= 4.5, passa_AA_titulo: cr >= 3 };
|
|
258
|
+
|
|
259
|
+
// relatório
|
|
260
|
+
const R = [];
|
|
261
|
+
R.push(`# Transplante — ${path.basename(brandPath)} sobre ${inv.fonte}`);
|
|
262
|
+
R.push(`> nível: ${NIVEL} · dimensões: ${DIMS.join(', ')} · saída: ${OUT}\n`);
|
|
263
|
+
R.push(`## Mapa de cores aplicado`);
|
|
264
|
+
R.push('| Papel | Origem | → | Destino | Var | Trocas |');
|
|
265
|
+
R.push('|---|---|---|---|---|---|');
|
|
266
|
+
for (const r of table) R.push(`| ${r.role} | ${r.fromHex} | → | ${r.toHex} | \`${r.destName}\` | ${counts[r.role] || 0} |`);
|
|
267
|
+
R.push(`\n## Tipografia`);
|
|
268
|
+
R.push(`- display: ${inv.tipografia?.display?.familia || '—'} → ${brand.fonts.display || '—'}`);
|
|
269
|
+
R.push(`- corpo: ${inv.tipografia?.corpo?.familia || '—'} → ${brand.fonts.body || '—'} (trocas: ${counts.tipografia || 0})`);
|
|
270
|
+
if (fontNote.single) R.push(`- ⚠️ ${fontNote.single}`);
|
|
271
|
+
// borda que virou igual à superfície fica invisível (achado do gate)
|
|
272
|
+
if (destRoles.borda && destRoles.superficie && destRoles.borda.hex === destRoles.superficie.hex) {
|
|
273
|
+
R.push(`\n## ⚠️ Borda = superfície (pode ficar invisível)`);
|
|
274
|
+
R.push(`- o brand.css não tem cor com papel "borda" claro; caiu na mesma cor de superfície (${destRoles.borda.hex}). Se o site usa borda de card, ela some. Marque uma cor de borda no brand.css ou use \`--roles borda=--alguma\`.`);
|
|
275
|
+
}
|
|
276
|
+
R.push(`\n## ✅ Contraste do resultado (check obrigatório)`);
|
|
277
|
+
if (contrasteOk) { R.push(`- texto sobre fundo: **${contrasteOk.texto_sobre_fundo}:1** — AA corpo: ${contrasteOk.passa_AA_corpo ? '✓' : '✗ REPROVA'} · AA título: ${contrasteOk.passa_AA_titulo ? '✓' : '✗ REPROVA'}`); if (!contrasteOk.passa_AA_corpo) R.push(` - ⚠️ **BLOQUEADOR:** o par texto/fundo da marca não passa AA. Ajuste o mapa (--roles) ou a cor de texto antes de entregar.`); }
|
|
278
|
+
else R.push(`- não pôde medir (faltou papel fundo ou texto no destino)`);
|
|
279
|
+
if (colisoes.length) {
|
|
280
|
+
R.push(`\n## ⚠️ Colisão de papel (mesma cor de origem em papéis diferentes)`);
|
|
281
|
+
colisoes.forEach(c => R.push(`- ${c.fromHex}: papel "${c.role}" ignorado, já mapeado como "${c.jaMapeado}". Se ambos importam, separe as cores no original.`));
|
|
282
|
+
}
|
|
283
|
+
if (orphans.size) {
|
|
284
|
+
R.push(`\n## ⚠️ Cores órfãs (apareceram no site, sem papel no inventário — revise)`);
|
|
285
|
+
const rgbHex = k => { const [r, g, b] = k.split(',').map(Number); return toHex({ r, g, b }); };
|
|
286
|
+
[...orphans.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10).forEach(([k, n]) => R.push(`- ${rgbHex(k)} (${n}x) — não trocada. Se for superfície/detalhe, adicione ao mapa ou rode o inventário de novo.`));
|
|
287
|
+
}
|
|
288
|
+
const totalTrocas = Object.entries(counts).filter(([k]) => k !== 'tipografia').reduce((s, [, n]) => s + n, 0);
|
|
289
|
+
if ((wantPalette || wantPrimariaOnly) && table.length && totalTrocas === 0) {
|
|
290
|
+
R.push(`\n## ⚠️ ZERO trocas de cor — provável incompatibilidade de formato`);
|
|
291
|
+
R.push(`- O mapa tinha ${table.length} cor(es) mas nenhuma casou no CSS. Causa provável: o site usa \`oklch()\`/\`color()\` (Tailwind v4) no CSS, que não casa por valor rgb. O inventário normaliza, o transplante ainda não. Trate como limitação conhecida deste caso.`);
|
|
292
|
+
}
|
|
293
|
+
R.push(`\n## Origem preservada`);
|
|
294
|
+
R.push(`- ${nText} arquivo(s) reescrito(s), ${nCopy} copiado(s). A origem NÃO foi tocada — resultado em pasta separada.`);
|
|
295
|
+
const rep = R.join('\n');
|
|
296
|
+
await writeFile(path.join(OUT, '_transplante.md'), rep);
|
|
297
|
+
process.stdout.write(rep + '\n');
|
|
298
|
+
log(`pronto: ${nText} reescritos, ${nCopy} copiados em ${OUT}`);
|
|
299
|
+
})().catch(e => { console.error('[transplant] FALHA:', e.message); process.exit(1); });
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conectar-mcp
|
|
3
|
+
description: Ensina a conectar um MCP (servidor de ferramentas externas) ao Claude Code, passo a passo e com segurança — Shopify, Supabase, Higgsfield, ElevenLabs, Meta Ads ou qualquer outro serviço. Use quando o usuário pedir pra conectar/instalar um MCP, quando um agente precisar de ferramentas mcp__* que não existem na sessão, ou quando o usuário perguntar o que é MCP e como ligar o Iron a um serviço externo.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# conectar-mcp — ligar o Iron a um serviço externo
|
|
7
|
+
|
|
8
|
+
MCP é a ponte entre o Claude Code e um serviço de fora (a sua loja Shopify, o seu banco Supabase, um gerador de imagem). Conectar um MCP dá ao Iron ferramentas novas — e dá ao serviço acesso ao que o seu token permitir. Por isso o processo tem regras.
|
|
9
|
+
|
|
10
|
+
## As 4 regras antes de qualquer comando
|
|
11
|
+
|
|
12
|
+
1. **A conta é SEMPRE do usuário.** Conectar MCP é decisão dele, com conta dele, token dele. Nunca sugira usar credencial de outra pessoa, e nunca guarde token em arquivo de projeto.
|
|
13
|
+
2. **Menor permissão possível.** Se o serviço oferecer token read-only ou escopado, comece por ele. Dá pra subir depois; vazamento não desfaz.
|
|
14
|
+
3. **Medir antes de decidir.** Diga ao usuário o que o MCP vai poder fazer ANTES de conectar ("este MCP lê e escreve produtos da loja"). Se ele só precisa ler, procure o modo read-only.
|
|
15
|
+
4. ⚠️ **O token fica gravado em texto puro** em `~/.claude/.credentials.json` (ou no config de MCP). Numa máquina compartilhada ou corporativa, o usuário precisa saber disso antes de dizer sim. Desinstalar o MCP não apaga o token gravado — mostre onde fica e como revogar no painel do serviço.
|
|
16
|
+
|
|
17
|
+
## O passo a passo (vale pra qualquer MCP)
|
|
18
|
+
|
|
19
|
+
1. **Descobrir o comando de conexão na documentação OFICIAL do serviço** — busque na web na hora ("<serviço> MCP Claude Code"). Nunca invente endpoint nem nome de pacote: comando errado falha em silêncio ou conecta no lugar errado. Os dois formatos comuns:
|
|
20
|
+
- servidor local via npm: `claude mcp add <nome> -- npx -y <pacote-oficial>`
|
|
21
|
+
- servidor remoto: `claude mcp add --transport http <nome> <url-oficial>`
|
|
22
|
+
2. **Rodar o comando** e, se o serviço pedir login/token, conduzir o usuário pelo fluxo dele (criar conta se não tiver, gerar o token no painel, colar quando o comando pedir).
|
|
23
|
+
3. **Conferir que gravou:** `claude mcp get <nome>` tem que listar o servidor. Se não listar, não gravou — não finja que conectou.
|
|
24
|
+
4. **Sessão NOVA.** MCP conectado só monta as ferramentas em sessão nova: feche e abra o Claude Code. Este é o passo que todo mundo pula e que faz parecer que "não funcionou".
|
|
25
|
+
5. **Provar com uso real, não com "conectado".** Na sessão nova, rode UMA operação de leitura inofensiva (listar produtos, listar tabelas, checar saldo) e mostre a saída. "Connected" não prova que as ferramentas carregaram; a operação prova.
|
|
26
|
+
|
|
27
|
+
## Exemplos do ecossistema Iron
|
|
28
|
+
|
|
29
|
+
- **iron-shopify** (nas edições que o incluem — confira no seu routing map) → precisa do MCP de desenvolvimento da Shopify (pacote npm oficial `@shopify/dev-mcp`): `claude mcp add shopify-dev-mcp -- npx -y @shopify/dev-mcp@latest`. A autenticação da LOJA em si é separada (Shopify CLI, o agente conduz).
|
|
30
|
+
- **iron-spy** → não usa MCP: usa a API da Apify direto por script; o próprio agente conduz a criação da conta e da chave.
|
|
31
|
+
- **Supabase, Higgsfield, ElevenLabs, Meta Ads** e outros → cada um publica seu comando oficial; siga o passo 1 (buscar a doc atual) em vez de confiar em comando decorado, porque endpoints mudam.
|
|
32
|
+
|
|
33
|
+
## Se der errado
|
|
34
|
+
|
|
35
|
+
- Comando rodou mas `claude mcp get` não lista → o add falhou; leia a mensagem de erro de verdade em vez de repetir o comando.
|
|
36
|
+
- Listou mas as ferramentas `mcp__<nome>__*` não aparecem → quase sempre é sessão velha (passo 4). Feche e abra antes de qualquer outra hipótese.
|
|
37
|
+
- Máquina corporativa com proxy/política: o bloqueio pode ser de rede, não do comando. Painel do serviço abrir no navegador não prova que a API passa pelo proxy — teste a operação real (passo 5) antes de concluir qualquer coisa.
|
|
38
|
+
- Pra remover: `claude mcp remove <nome>` — e lembre o usuário de revogar o token no painel do serviço, porque remover o MCP não revoga nada.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: escada
|
|
3
|
+
description: Escada de Modelos do Iron Edge — a regra de qual modelo de IA usar em cada momento do trabalho, pra cota render mais. Use quando o usuário disser "escada", "escada de modelos", "configura a escada", perguntar qual modelo usar, reclamar de cota/limite estourando, ou perguntar por que a conta gasta tão rápido. Na primeira vez, MEDE a conta do usuário e grava a regra no CLAUDE.md dele pra valer em toda sessão.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# escada — a regra de custo dos modelos
|
|
7
|
+
|
|
8
|
+
A lógica cabe numa frase: **custo = peso do modelo × volume de tokens da fase.**
|
|
9
|
+
|
|
10
|
+
PLANEJAR e DAR VEREDITO são fases curtas de julgamento — modelo caro ali custa pouco e rende muito. EXECUTAR é a fase longa (dezenas de comandos, ler e escrever arquivo) — modelo caro ali é onde a cota morre. BRAÇAL (buscar, varrer, formatar) nem julgamento precisa. Então: **caro nas pontas, médio no meio, barato no braçal.**
|
|
11
|
+
|
|
12
|
+
## Primeira vez: MEDIR a conta antes de qualquer regra
|
|
13
|
+
|
|
14
|
+
Nunca assuma quais modelos a conta do usuário tem — contas diferem. Conduza, pausando entre os passos:
|
|
15
|
+
|
|
16
|
+
1. **O padrão atual.** Descubra o SO e leia a linha `"model"` do `~/.claude/settings.json` (Mac/Linux: `grep '"model"' ~/.claude/settings.json`; Windows: `Get-Content "$HOME\.claude\settings.json" | Select-String '"model"'`). Três resultados válidos: a linha, nada, ou arquivo inexistente. Anote qual foi — é o modelo em que toda sessão nasce hoje.
|
|
17
|
+
2. **Peça pro usuário digitar `/model`** e anotar as opções da lista SEM escolher nenhuma (Esc pra sair — a vacina abaixo explica por quê).
|
|
18
|
+
3. **Peça `/usage`**: qual plano aparece, e SE existe uma barra separada só do sonnet ("Sonnet only"/"Apenas Sonnet"). Se existir, é dado de ouro: execução no sonnet gasta saldo próprio e preserva o saldo dos modelos caros.
|
|
19
|
+
4. **Defina os degraus com o que foi medido, e mostre antes de gravar:**
|
|
20
|
+
- JULGADOR (planeja e dá veredito) = o modelo mais capaz da lista (fable se apareceu; senão opus; senão sonnet).
|
|
21
|
+
- EXECUTOR (implementa e corrige) = sonnet.
|
|
22
|
+
- BRAÇAL (busca, varre, formata) = haiku; sem haiku na lista, o braçal usa o EXECUTOR com esforço baixo.
|
|
23
|
+
- Conta só com sonnet e haiku: a escada vale com um degrau a menos — o julgamento fica no sonnet e o que muda entre fases é o esforço (alto pra julgar, médio pra executar). Registre e siga; nada abaixo quebra.
|
|
24
|
+
|
|
25
|
+
## A regra nas três situações do dia
|
|
26
|
+
|
|
27
|
+
**DIA A DIA** (feature, ajuste, bug): planejar no plan mode → executar no EXECUTOR → revisar no JULGADOR se a coisa for séria. Se `opusplan` apareceu na lista, `/model opusplan` automatiza exatamente isso — é o único caso em que `/model` é bem-vindo, porque aí mudar o padrão É a intenção.
|
|
28
|
+
|
|
29
|
+
**DEMANDA ESTRUTURAL** (desenhar um sistema, arquitetura, decisão cara de errar) — o fluxo das TRÊS ABAS do terminal:
|
|
30
|
+
- aba 1: JULGADOR planeja e **salva o plano num ARQUIVO**;
|
|
31
|
+
- aba 2: EXECUTOR executa lendo o arquivo. Sobe um degrau em DOIS casos apenas: implementação pesada em si, ou o EXECUTOR travou 2 vezes no mesmo ponto. Regra de bolso: **sonnet até travar, degrau acima pra destravar** — e subir é FECHAR a aba e abrir outra com `claude --model "opus"`, nunca `/model` na aba aberta;
|
|
32
|
+
- aba 3: JULGADOR dá o veredito comparando entrega × plano.
|
|
33
|
+
- O canal entre as abas é sempre um arquivo, nunca copiar e colar conversa.
|
|
34
|
+
|
|
35
|
+
**BRAÇAL** (achar arquivos, varrer pastas, renomear em massa): delega pro degrau BRAÇAL, ou pede na sessão com esforço baixo. Não se usa cérebro caro pra segurar lanterna.
|
|
36
|
+
|
|
37
|
+
## ⛔ A vacina do /model
|
|
38
|
+
|
|
39
|
+
Caso real: uma conta estourou a cota TRÊS vezes pela mesma causa invisível.
|
|
40
|
+
|
|
41
|
+
- **`/model` dentro da sessão GRAVA A ESCOLHA COMO PADRÃO PERMANENTE.** Não é "só desta vez". É assim que uma conta amanhece presa no modelo mais caro sem avisar.
|
|
42
|
+
- **Troca pontual é SEMPRE aba nova do terminal**, com o modelo no comando de abrir: `claude --model "opus"`. Vale só pra aquela aba e morre com ela.
|
|
43
|
+
- `/model` só quando o usuário QUER mudar o padrão de propósito (como o opusplan) — e nesse caso, conferir depois com o comando do passo 1 que gravou o que ele queria.
|
|
44
|
+
|
|
45
|
+
## Cada agente com o modelo do cargo
|
|
46
|
+
|
|
47
|
+
Subagente sem modelo próprio herda o modelo da sessão que o chamou — o agente de busca mais simples roda no cérebro mais caro da conta, por acidente. Caso real: um único fluxo multi-agente consumiu o equivalente a um dia inteiro de uso.
|
|
48
|
+
|
|
49
|
+
Os agentes do Iron Edge já vêm com `model:` por cargo (opus = estrategista, sonnet = executor, haiku = mecânico). **Agente que o usuário criar segue a mesma tabela**, sempre com apelido (opus/sonnet/haiku), NUNCA nome de versão — apelido acompanha os lançamentos sozinho, versão fixa vira fóssil. E degrau que a medição rebaixou vale aqui também: apelido que a conta não tem não entra em arquivo.
|
|
50
|
+
|
|
51
|
+
## Gravar a regra pra valer (o Iron passa a sugerir sozinho)
|
|
52
|
+
|
|
53
|
+
Depois da medição, grave no `~/.claude/CLAUDE.md` do usuário (backup antes se existir; se a seção `## ESCADA DE MODELOS` já existir, ATUALIZE inteira no lugar, nunca duplique) a seção com:
|
|
54
|
+
- a regra de ouro;
|
|
55
|
+
- os três degraus MEDIDOS desta conta;
|
|
56
|
+
- o fluxo das 3 abas, com a instrução de salvar o plano em arquivo;
|
|
57
|
+
- a vacina do /model;
|
|
58
|
+
- e a ordem de SUGERIR SOZINHO: quando o usuário pedir pra desenhar sistema/arquitetura/decisão grande, avisar em 1 linha que é demanda estrutural e dar o comando da aba do JULGADOR pronto pra copiar; quando um planejamento desses terminar, salvar o plano em arquivo sem pedir e dizer o caminho; quando a execução terminar, lembrar do veredito.
|
|
59
|
+
|
|
60
|
+
Mostre a seção pronta ANTES de salvar. Lembre o usuário: CLAUDE.md novo só vale em sessão nova (fechar e abrir).
|
|
61
|
+
|
|
62
|
+
**Teste de que pegou** (sessão nova): o usuário pede algo estrutural sem citar modelo nenhum. Critério duplo: (a) o Iron reconheceu sozinho e sugeriu a escada; (b) a sugestão veio com o comando pronto pra copiar. Se respondeu direto sem sugerir, a seção não carregou — conferir arquivo e sessão nova antes de qualquer outra coisa.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: faxina
|
|
3
|
+
description: Higiene dos arquivos efêmeros da sessão — PDFs e relatórios que o Iron gerou pra leitura, prints e capturas de tela. Dispara quando o usuário disser "faxina", "limpa os pdfs", "limpa os prints", "limpa a bagunça" — e SEMPRE como pergunta única antes do "salvar"/"encerrar". Lista o que acumulou, propõe destino (apagar / arquivar / virar nota leve) e só apaga com aprovação.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# faxina — o par do salvar
|
|
7
|
+
|
|
8
|
+
O **salvar** registra o que fica; a **faxina** decide o que sai. Sem ela, o computador acumula prints e PDFs que já cumpriram o papel — dezenas por dia em quem trabalha com o Iron o dia inteiro.
|
|
9
|
+
|
|
10
|
+
## Quando rodar
|
|
11
|
+
|
|
12
|
+
1. **Sempre antes do "salvar"/"encerrar"**: UMA pergunta curta, com o resumo ("Faxina: 2 PDFs desta sessão e 31 prints (40 MB). Limpo?").
|
|
13
|
+
2. Por gatilho: "faxina", "limpa os prints", "limpa os pdfs", "limpa a bagunça".
|
|
14
|
+
|
|
15
|
+
## O que varrer
|
|
16
|
+
|
|
17
|
+
- **Arquivos de leitura que o Iron gerou nesta sessão** (PDF, HTML de relatório) — o Iron sabe os caminhos do que criou. Documento gerado só pra LER é efêmero por padrão.
|
|
18
|
+
- **Prints/capturas**: descubra o local real da máquina antes de varrer — no Mac, `defaults read com.apple.screencapture location` (vazio = Desktop); no Windows, `Pictures/Screenshots` e a Área de Trabalho. Padrões: `Captura de Tela*`, `Screenshot*`, `CleanShot*`, `Screen Shot*`.
|
|
19
|
+
- Mostrar SEMPRE: quantidade, tamanho total e os 3 mais recentes.
|
|
20
|
+
|
|
21
|
+
## Os três destinos (perguntar, nunca decidir sozinho)
|
|
22
|
+
|
|
23
|
+
| destino | quando | como |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| **Apagar** | cumpriu o papel | mover pro Lixo do sistema, nunca deletar direto — arrependimento tem volta |
|
|
26
|
+
| **Arquivar** | vale guardar como está | PDF → pasta do projeto; print → subpasta datada (`prints-arquivo/AAAA-MM/`) |
|
|
27
|
+
| **Virar nota leve** | o CONTEÚDO importa, o formato não | o essencial vira nota .md no cofre; o arquivo pesado sai |
|
|
28
|
+
|
|
29
|
+
## Regras
|
|
30
|
+
|
|
31
|
+
- **Print com menos de 24h só sai com confirmação individual** ou "pode limpar tudo de hoje" explícito — pode estar em uso em outra aba.
|
|
32
|
+
- Nunca tocar em arquivo que não seja print/captura ou documento gerado pelo Iron — a faxina não é limpeza geral de pastas.
|
|
33
|
+
- Fechar em 1 linha: `Faxina: 12 prints e 2 PDFs pro Lixo, 1 arquivado. (liberou 18 MB)`
|
|
34
|
+
- Recusou? Não insistir. Zero registro, segue pro salvar.
|