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,518 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Iron Edge - Instalador assistido (install.js)
|
|
4
|
+
* Cross-platform (Mac + Windows via Node).
|
|
5
|
+
* v3 - com os 7 patches obrigatorios da auditoria operacional do Codex.
|
|
6
|
+
*
|
|
7
|
+
* Principios:
|
|
8
|
+
* - NUNCA sobrescreve. Aborta se qualquer destino-alvo ja existe.
|
|
9
|
+
* - Aborta em symlink/junction/reparse no destino (defesa dupla: lstat + realpath).
|
|
10
|
+
* - Aborta se ancestral existe e NAO e diretorio.
|
|
11
|
+
* - Anti-escape: cada destino tem que ficar dentro de ~/.iron ou ~/.claude.
|
|
12
|
+
* - Payload E arquivos gerados passam pelas MESMAS validacoes (unificado).
|
|
13
|
+
* - Bloqueia --source perigoso (HOME, ~/.iron, ~/.claude).
|
|
14
|
+
* - Rejeita backslash em nomes do payload (compat Windows).
|
|
15
|
+
* - Preflight completo ANTES de qualquer escrita. Sem update/uninstall.
|
|
16
|
+
* - Manifesto com SHA-256 (gerados marcados generated:true).
|
|
17
|
+
* - shopify.yaml nasce desativado. config em branco (sem PII).
|
|
18
|
+
*
|
|
19
|
+
* Uso: node install.js [--dry-run] [--source <dir>]
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
'use strict';
|
|
23
|
+
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
const os = require('os');
|
|
27
|
+
const crypto = require('crypto');
|
|
28
|
+
|
|
29
|
+
// identidade da edicao: vem do edition.json do payload (gerado pelo build);
|
|
30
|
+
// os valores abaixo sao so fallback pra payload antigo sem o arquivo
|
|
31
|
+
let IRON_VERSION = 'iron-edge-2.x';
|
|
32
|
+
let IRON_VERSION_HUMAN = 'Iron Edge';
|
|
33
|
+
|
|
34
|
+
function log(msg) { process.stdout.write(msg + '\n'); }
|
|
35
|
+
function abort(msg) {
|
|
36
|
+
process.stderr.write('\n[ABORTADO] ' + msg + '\n');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const args = process.argv.slice(2);
|
|
41
|
+
const DRY_RUN = args.includes('--dry-run');
|
|
42
|
+
const srcIdx = args.indexOf('--source');
|
|
43
|
+
let SOURCE = srcIdx >= 0 && args[srcIdx + 1] ? path.resolve(args[srcIdx + 1]) : __dirname;
|
|
44
|
+
// Opera sobre o caminho FISICO: ancestral symlink herdado da maquina (perfil
|
|
45
|
+
// corporativo redirecionado, /tmp do macOS) nao e ataque - e o chao em que o
|
|
46
|
+
// aluno pisa. A defesa que importa (link DENTRO do payload ou dos destinos,
|
|
47
|
+
// redirecionando escrita) continua nas checagens abaixo, agora fisico x fisico.
|
|
48
|
+
try { SOURCE = fs.realpathSync.native(SOURCE); } catch (_) { /* preflight decide */ }
|
|
49
|
+
try {
|
|
50
|
+
const ed = JSON.parse(fs.readFileSync(path.join(SOURCE, 'edition.json'), 'utf8'));
|
|
51
|
+
if (ed.label) IRON_VERSION_HUMAN = ed.label + ' v' + (ed.version || '');
|
|
52
|
+
if (ed.name) IRON_VERSION = ed.name + '-' + (ed.version || '');
|
|
53
|
+
} catch (_) { /* payload sem edition.json: fica o fallback */ }
|
|
54
|
+
|
|
55
|
+
let HOME = os.homedir();
|
|
56
|
+
try { HOME = fs.realpathSync.native(HOME); } catch (_) {}
|
|
57
|
+
const IRON_DIR = path.join(HOME, '.iron');
|
|
58
|
+
const CLAUDE_DIR = path.join(HOME, '.claude');
|
|
59
|
+
const AGENTS_DEST = path.join(CLAUDE_DIR, 'agents');
|
|
60
|
+
const SKILLS_DEST = path.join(CLAUDE_DIR, 'skills');
|
|
61
|
+
|
|
62
|
+
const ALLOWED_ROOTS = [IRON_DIR, AGENTS_DEST, SKILLS_DEST];
|
|
63
|
+
|
|
64
|
+
const WIN_RESERVED = new Set([
|
|
65
|
+
'CON','PRN','AUX','NUL',
|
|
66
|
+
'COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9',
|
|
67
|
+
'LPT1','LPT2','LPT3','LPT4','LPT5','LPT6','LPT7','LPT8','LPT9'
|
|
68
|
+
]);
|
|
69
|
+
const WIN_INVALID_CHARS = /[<>:"|?*\x00-\x1f]/;
|
|
70
|
+
|
|
71
|
+
function hasInvalidWindowsName(relPath) {
|
|
72
|
+
const parts = relPath.split(/[\\/]/).filter(Boolean);
|
|
73
|
+
for (const p of parts) {
|
|
74
|
+
if (WIN_INVALID_CHARS.test(p)) return `caractere invalido em "${p}"`;
|
|
75
|
+
if (p.endsWith('.') || p.endsWith(' ')) return `termina em ponto/espaco: "${p}"`;
|
|
76
|
+
const base = p.split('.')[0].toUpperCase();
|
|
77
|
+
if (WIN_RESERVED.has(base)) return `nome reservado do Windows: "${p}"`;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function isInsideAllowedRoot(dest) {
|
|
83
|
+
for (const root of ALLOWED_ROOTS) {
|
|
84
|
+
const rel = path.relative(root, dest);
|
|
85
|
+
if (rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel))) return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// PATCH 1+3: defesa dupla contra symlink/junction/reparse + ancestral nao-diretorio
|
|
91
|
+
// retorna string de motivo se o caminho for "indireto", senao null
|
|
92
|
+
function indirectPathReason(p) {
|
|
93
|
+
let st = null;
|
|
94
|
+
try { st = fs.lstatSync(p); } catch (e) { return null; } // nao existe = ok
|
|
95
|
+
if (st.isSymbolicLink()) return 'symlink';
|
|
96
|
+
try {
|
|
97
|
+
const real = fs.realpathSync.native(p);
|
|
98
|
+
const expected = path.resolve(p);
|
|
99
|
+
if (path.normalize(real).toLowerCase() !== path.normalize(expected).toLowerCase()) {
|
|
100
|
+
return 'caminho indireto (junction/reparse) real=' + real;
|
|
101
|
+
}
|
|
102
|
+
} catch (e) { /* deixa o resto do preflight decidir */ }
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function walk(dir, baseDir, out) {
|
|
107
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
108
|
+
for (const e of entries) {
|
|
109
|
+
const full = path.join(dir, e.name);
|
|
110
|
+
if (e.isSymbolicLink()) abort(`o payload contem um symlink (nao permitido): ${path.relative(baseDir, full)}`);
|
|
111
|
+
if (e.isDirectory()) walk(full, baseDir, out);
|
|
112
|
+
else if (e.isFile()) out.push(path.relative(baseDir, full));
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function sha256(file) {
|
|
118
|
+
return crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function destFor(rel) {
|
|
122
|
+
const norm = rel.split(path.sep).join('/');
|
|
123
|
+
if (norm === 'iron-routing-map.md') return path.join(IRON_DIR, 'iron-routing-map.md');
|
|
124
|
+
if (norm === 'BUILD-REPORT.md') return path.join(IRON_DIR, 'BUILD-REPORT.md');
|
|
125
|
+
if (norm === 'edition.json') return path.join(IRON_DIR, 'edition.json');
|
|
126
|
+
if (norm.startsWith('agents/')) return path.join(AGENTS_DEST, norm.slice('agents/'.length));
|
|
127
|
+
if (norm.startsWith('skills/')) return path.join(SKILLS_DEST, norm.slice('skills/'.length));
|
|
128
|
+
if (norm.startsWith('squads/')) return path.join(IRON_DIR, norm.slice('squads/'.length));
|
|
129
|
+
// docs/ vai pra maquina DENTRO do manifesto, com hash como todo o resto: sem
|
|
130
|
+
// isso o `verify` passaria a mentir. Ate 22/08 o destFor devolvia null aqui e o
|
|
131
|
+
// instalador descartava a documentacao em silencio — quem instalava recebia os
|
|
132
|
+
// agentes e nunca o runbook que ensina a usa-los.
|
|
133
|
+
if (norm.startsWith('docs/')) {
|
|
134
|
+
// ⛔ interno/ e historico/ NUNCA vao pra maquina de ninguem: carregam nome de
|
|
135
|
+
// pessoa, de cliente e nota de processo da casa. O `files` do package.json ja
|
|
136
|
+
// os exclui do tarball npm, mas o instalador tambem roda a partir do repo e de
|
|
137
|
+
// zip de edicao — a guarda tem que estar NOS DOIS, senao depende de qual
|
|
138
|
+
// caminho a pessoa usou. (Defeito criado pela propria correcao de 22/08 que
|
|
139
|
+
// fez o instalador copiar docs/, e pego antes da reauditoria.)
|
|
140
|
+
if (/^docs\/(interno|historico)\//.test(norm)) return null;
|
|
141
|
+
return path.join(IRON_DIR, norm);
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
log('================================');
|
|
147
|
+
log(' Iron Edge - Instalador');
|
|
148
|
+
log('================================');
|
|
149
|
+
log('Versao : ' + IRON_VERSION_HUMAN);
|
|
150
|
+
log('Origem : ' + SOURCE);
|
|
151
|
+
log('HOME : ' + HOME);
|
|
152
|
+
log('Destino ~/.iron : ' + IRON_DIR);
|
|
153
|
+
log('Destino ~/.claude : ' + CLAUDE_DIR);
|
|
154
|
+
if (DRY_RUN) log('\nMODO: DRY-RUN (nada sera copiado)\n');
|
|
155
|
+
|
|
156
|
+
// PATCH 5: bloquear SOURCE perigoso (HOME, dentro de ~/.iron ou ~/.claude)
|
|
157
|
+
function isInsideOrEqual(child, parent) {
|
|
158
|
+
const rel = path.relative(parent, child);
|
|
159
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
160
|
+
}
|
|
161
|
+
if (isInsideOrEqual(SOURCE, HOME) && (SOURCE === HOME || isInsideOrEqual(SOURCE, IRON_DIR) || isInsideOrEqual(SOURCE, CLAUDE_DIR))) {
|
|
162
|
+
abort(`--source perigoso: "${SOURCE}" esta dentro de HOME/.iron/.claude. Use o payload fora dessas pastas.`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// AJUSTE 1 (Codex): o proprio SOURCE nao pode ser symlink/junction/reparse, e tem que ser diretorio real
|
|
166
|
+
{
|
|
167
|
+
const srcReason = indirectPathReason(SOURCE);
|
|
168
|
+
if (srcReason) abort(`a pasta de origem (--source) e um caminho indireto (${srcReason}): ${SOURCE}`);
|
|
169
|
+
let srcStat = null;
|
|
170
|
+
try { srcStat = fs.lstatSync(SOURCE); } catch (e) { abort(`pasta de origem nao existe: ${SOURCE}`); }
|
|
171
|
+
if (!srcStat.isDirectory()) abort(`a origem (--source) nao e um diretorio: ${SOURCE}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for (const must of ['agents', 'iron-routing-map.md']) {
|
|
175
|
+
if (!fs.existsSync(path.join(SOURCE, must))) abort(`origem invalida: faltou "${must}" em ${SOURCE}`);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const allFiles = walk(SOURCE, SOURCE, []);
|
|
179
|
+
|
|
180
|
+
// monta o plano do payload
|
|
181
|
+
const payloadPlan = [];
|
|
182
|
+
for (const rel of allFiles) {
|
|
183
|
+
// PATCH 6 (corrigido p/ Windows): rejeitar backslash REAL no nome, sem confundir com o separador do Windows
|
|
184
|
+
const relPosix = rel.split(path.sep).join('/');
|
|
185
|
+
if (relPosix.includes('\\')) abort(`nome de arquivo do payload contem backslash real no nome (invalido): ${relPosix}`);
|
|
186
|
+
const dest = destFor(rel);
|
|
187
|
+
if (!dest) continue;
|
|
188
|
+
payloadPlan.push({ rel, src: path.join(SOURCE, rel), dest, generated: false });
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// PATCH 2+4+7: arquivos GERADOS entram como destinos de primeira classe, com as MESMAS validacoes
|
|
192
|
+
const GENERATED = [
|
|
193
|
+
{ rel: '(gerado) config.yaml', dest: path.join(IRON_DIR, 'config.yaml'), generated: true },
|
|
194
|
+
{ rel: '(gerado) metadata.json', dest: path.join(IRON_DIR, 'metadata.json'), generated: true },
|
|
195
|
+
{ rel: '(gerado) install-manifest.json', dest: path.join(IRON_DIR, 'install-manifest.json'), generated: true },
|
|
196
|
+
{ rel: '(gerado) integrations/shopify.yaml', dest: path.join(IRON_DIR, 'integrations', 'shopify.yaml'), generated: true }
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
// LISTA UNIFICADA de todos os destinos (payload + gerados) - PATCH 1
|
|
200
|
+
const allItems = payloadPlan.concat(GENERATED);
|
|
201
|
+
|
|
202
|
+
// validacao unificada: anti-escape, nome Windows, colisao (payload x gerados juntos) - PATCH 2+4
|
|
203
|
+
const lowerSeen = new Map();
|
|
204
|
+
let totalBytes = 0;
|
|
205
|
+
for (const item of allItems) {
|
|
206
|
+
if (!isInsideAllowedRoot(item.dest)) abort(`destino escaparia do root permitido (${item.rel}) -> ${item.dest}`);
|
|
207
|
+
const bad = hasInvalidWindowsName(path.relative(HOME, item.dest));
|
|
208
|
+
if (bad) abort(`nome invalido para Windows (${item.rel}): ${bad}`);
|
|
209
|
+
const lk = item.dest.toLowerCase();
|
|
210
|
+
if (lowerSeen.has(lk)) abort(`colisao case-insensitive: "${item.rel}" e "${lowerSeen.get(lk)}" -> mesmo destino`);
|
|
211
|
+
lowerSeen.set(lk, item.rel);
|
|
212
|
+
if (!item.generated) {
|
|
213
|
+
try { totalBytes += fs.statSync(item.src).size; } catch (e) {}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (payloadPlan.length === 0) abort('nada para instalar (plano vazio).');
|
|
218
|
+
|
|
219
|
+
log(`Arquivos a instalar: ${payloadPlan.length} (+ ${GENERATED.length} gerados)`);
|
|
220
|
+
log(`Tamanho total do payload: ${(totalBytes / 1024).toFixed(1)} KB`);
|
|
221
|
+
|
|
222
|
+
// PREFLIGHT unificado - todos os destinos (payload + gerados)
|
|
223
|
+
log('\n--- PREFLIGHT (verificando destinos) ---');
|
|
224
|
+
const conflicts = [];
|
|
225
|
+
const checkedAncestors = new Map(); // AJUSTE 2 (Codex): cache por diretorio
|
|
226
|
+
|
|
227
|
+
for (const item of allItems) {
|
|
228
|
+
const dest = item.dest;
|
|
229
|
+
// existe?
|
|
230
|
+
let st = null;
|
|
231
|
+
try { st = fs.lstatSync(dest); } catch (e) {}
|
|
232
|
+
if (st) conflicts.push((st.isSymbolicLink() ? 'SYMLINK' : 'JA EXISTE') + ': ' + dest);
|
|
233
|
+
|
|
234
|
+
// ancestrais: indireto (symlink/junction) OU existe e nao e diretorio - PATCH 3 + cache
|
|
235
|
+
// (usa isInsideOrEqual em vez de startsWith textual, p/ evitar falso positivo entre homes com prefixo comum)
|
|
236
|
+
let dir = path.dirname(dest);
|
|
237
|
+
while (isInsideOrEqual(dir, HOME) && dir !== HOME) {
|
|
238
|
+
if (checkedAncestors.has(dir)) {
|
|
239
|
+
const cached = checkedAncestors.get(dir);
|
|
240
|
+
if (cached) { conflicts.push(cached); break; }
|
|
241
|
+
dir = path.dirname(dir);
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
const reason = indirectPathReason(dir);
|
|
245
|
+
if (reason) {
|
|
246
|
+
const msg = `ANCESTRAL INDIRETO (${reason}): ${dir}`;
|
|
247
|
+
checkedAncestors.set(dir, msg);
|
|
248
|
+
conflicts.push(msg); break;
|
|
249
|
+
}
|
|
250
|
+
// ancestral existe mas nao e diretorio?
|
|
251
|
+
let notDir = null;
|
|
252
|
+
try {
|
|
253
|
+
const dst = fs.lstatSync(dir);
|
|
254
|
+
if (!dst.isDirectory() && !dst.isSymbolicLink()) {
|
|
255
|
+
notDir = `ANCESTRAL NAO E DIRETORIO: ${dir}`;
|
|
256
|
+
}
|
|
257
|
+
} catch (e) { /* nao existe = ok */ }
|
|
258
|
+
if (notDir) {
|
|
259
|
+
checkedAncestors.set(dir, notDir);
|
|
260
|
+
conflicts.push(notDir); break;
|
|
261
|
+
}
|
|
262
|
+
checkedAncestors.set(dir, null); // checado e limpo
|
|
263
|
+
dir = path.dirname(dir);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (conflicts.length > 0) {
|
|
268
|
+
// dedup (ancestrais repetidos entre muitos arquivos)
|
|
269
|
+
const uniq = [...new Set(conflicts)];
|
|
270
|
+
log(` Encontrados ${uniq.length} conflito(s) unico(s); mostrando primeiros 20:`);
|
|
271
|
+
for (const c of uniq.slice(0, 20)) log(' ' + c);
|
|
272
|
+
if (uniq.length > 20) log(` ... e mais ${uniq.length - 20}`);
|
|
273
|
+
abort(`${uniq.length} conflito(s) no preflight. O instalador NUNCA sobrescreve.
|
|
274
|
+
|
|
275
|
+
Se esta maquina JA TEM uma instalacao do Iron Edge, isso e esperado: esta versao
|
|
276
|
+
nao instala por cima, para nada seu ser perdido.
|
|
277
|
+
|
|
278
|
+
Como resolver sozinho, sem depender de ninguem:
|
|
279
|
+
1. COPIE o manifesto para fora ANTES de apagar qualquer coisa (a lista do que
|
|
280
|
+
remover mora dentro da pasta que vai sumir):
|
|
281
|
+
cp ~/.iron/install-manifest.json ./iron-manifest.json
|
|
282
|
+
2. Nessa copia, o campo "files" e a lista exata do que veio no pacote.
|
|
283
|
+
O que NAO estiver la foi voce que criou.
|
|
284
|
+
3. Guarde o que for seu (agente proprio, skill propria, o que voce editou).
|
|
285
|
+
"npx iron-edge verify" mostra o que voce alterou em relacao ao manifesto.
|
|
286
|
+
4. Apague em ~/.claude/agents e ~/.claude/skills SO os arquivos que estao na
|
|
287
|
+
lista. Depois, POR ULTIMO, apague a pasta ~/.iron inteira.
|
|
288
|
+
5. Rode a instalacao de novo.
|
|
289
|
+
|
|
290
|
+
Se os conflitos acima NAO batem com uma instalacao que voce reconhece, pode ser
|
|
291
|
+
sobra de uma instalacao que falhou no meio. Nesse caso os arquivos listados sao
|
|
292
|
+
lixo e podem ser removidos.`);
|
|
293
|
+
}
|
|
294
|
+
log(' OK - nenhum destino existe, nenhum caminho indireto, nenhum ancestral invalido.');
|
|
295
|
+
|
|
296
|
+
if (DRY_RUN) {
|
|
297
|
+
log('\n--- PLANO (dry-run) ---');
|
|
298
|
+
for (const item of payloadPlan.slice(0, 10)) log(` ${item.rel} -> ${item.dest}`);
|
|
299
|
+
if (payloadPlan.length > 10) log(` ... e mais ${payloadPlan.length - 10} arquivos`);
|
|
300
|
+
log('\n--- arquivos que SERAO gerados ---');
|
|
301
|
+
for (const g of GENERATED) log(' ' + g.dest);
|
|
302
|
+
log('\nDRY-RUN concluido. Nada foi copiado.');
|
|
303
|
+
process.exit(0);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// COPIAR (so chega aqui se TUDO passou)
|
|
307
|
+
//
|
|
308
|
+
// ATOMICO por rollback: se a copia falhar no meio (disco cheio, permissao,
|
|
309
|
+
// arquivo travado por sync), desfazer o que ESTA execucao criou e abortar com
|
|
310
|
+
// mensagem padronizada. Sem isso, um crash aqui deixava arquivos orfaos no HOME
|
|
311
|
+
// e a tentativa seguinte os lia como "ja existe uma instalacao", mandando a
|
|
312
|
+
// pessoa pedir um runbook de migracao que nao se aplica (gate de 22/08/2026).
|
|
313
|
+
//
|
|
314
|
+
// ⛔ O rollback so remove o que esta execucao criou, item por item, pela lista
|
|
315
|
+
// que ele mesmo montou — NUNCA por pasta e NUNCA por padrao. O preflight ja
|
|
316
|
+
// garantiu que nenhum desses destinos existia antes, entao nada do usuario pode
|
|
317
|
+
// estar ali. Rollback que apaga demais e pior que o defeito que ele conserta.
|
|
318
|
+
log('\n--- INSTALANDO ---');
|
|
319
|
+
const manifest = [];
|
|
320
|
+
const criados = [];
|
|
321
|
+
const pastasCriadas = [];
|
|
322
|
+
// registra so as pastas que ESTA execucao criou de fato — mkdirSync recursive nao
|
|
323
|
+
// diz quais niveis eram novos, entao subimos a arvore ate achar uma que ja existia.
|
|
324
|
+
const marcarPastas = (dir) => {
|
|
325
|
+
const novas = [];
|
|
326
|
+
let d = dir;
|
|
327
|
+
while (d && d !== path.dirname(d) && !fs.existsSync(d)) { novas.unshift(d); d = path.dirname(d); }
|
|
328
|
+
for (const n of novas) if (!pastasCriadas.includes(n)) pastasCriadas.push(n);
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
const rollback = (motivo) => {
|
|
332
|
+
log('\n[ABORTADO] ' + motivo);
|
|
333
|
+
log(`Desfazendo: ${criados.length} arquivo(s) e ${pastasCriadas.length} pasta(s) criados nesta execucao.`);
|
|
334
|
+
let removidos = 0, nuncaExistiu = 0, falhas = 0;
|
|
335
|
+
for (const f of criados.reverse()) {
|
|
336
|
+
try { fs.unlinkSync(f); removidos++; }
|
|
337
|
+
catch (e) {
|
|
338
|
+
// ENOENT = o destino entrou na lista antes da escrita e a escrita nunca chegou
|
|
339
|
+
// a criar o arquivo. Nao e' falha de remocao, e contar como tal fazia o
|
|
340
|
+
// instalador pedir "confira os que sobraram" por um arquivo que nunca existiu.
|
|
341
|
+
if (e.code === 'ENOENT') nuncaExistiu++; else falhas++;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// pastas por ultimo, da mais funda pra mais rasa, e so se vazias.
|
|
345
|
+
// rmdir NAO e' recursivo de proposito: se sobrou algo dentro, e' porque nao era
|
|
346
|
+
// desta execucao, e o rollback nao toca no que nao criou.
|
|
347
|
+
let pastasRemovidas = 0, pastasMantidas = 0;
|
|
348
|
+
for (const d of pastasCriadas.slice().reverse()) {
|
|
349
|
+
try { fs.rmdirSync(d); pastasRemovidas++; }
|
|
350
|
+
catch (e) { if (e.code !== 'ENOENT') pastasMantidas++; }
|
|
351
|
+
}
|
|
352
|
+
log(` arquivos removidos: ${removidos}${falhas ? ' | nao removidos: ' + falhas : ''}`);
|
|
353
|
+
log(` pastas removidas: ${pastasRemovidas}${pastasMantidas ? ' | mantidas (nao vazias): ' + pastasMantidas : ''}`);
|
|
354
|
+
// ⚠️ So diz que voltou ao estado anterior se voltou MESMO. Ate 24/08 dizia sempre,
|
|
355
|
+
// e deixava 165 pastas vazias no disco — falha em silencio na propria alegacao.
|
|
356
|
+
if (falhas || pastasMantidas) log(' A maquina NAO voltou inteira ao estado anterior. Confira o que sobrou antes de instalar de novo.');
|
|
357
|
+
else log(' A maquina voltou ao estado anterior. Pode tentar de novo.');
|
|
358
|
+
process.exit(1);
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
// ─── UM PORTAO SO PARA TODA ESCRITA ──────────────────────────────────────────
|
|
362
|
+
//
|
|
363
|
+
// Historico, porque explica a forma deste bloco: a atomicidade foi remendada
|
|
364
|
+
// TRES vezes e o buraco reapareceu tres vezes, sempre alguns metros adiante —
|
|
365
|
+
// primeiro o laco de copia ficou protegido e as pastas de estado nao; depois as
|
|
366
|
+
// pastas entraram e a config ficou fora; depois a config entrou e as duas ultimas
|
|
367
|
+
// escritas (metadata.json e install-manifest.json) ficaram descobertas. Com
|
|
368
|
+
// `ulimit -f`, o manifesto final estourava, o rollback nunca rodava, e 2126
|
|
369
|
+
// arquivos ficavam orfaos com uma mensagem dizendo que a maquina "ja tinha uma
|
|
370
|
+
// instalacao".
|
|
371
|
+
//
|
|
372
|
+
// A causa nao era o ponto: era a FORMA. Try/catch por trecho protege o trecho que
|
|
373
|
+
// alguem lembrou de embrulhar, e a proxima escrita que entrar no meio nasce
|
|
374
|
+
// desprotegida. Entao agora existe UMA porta: nada e' escrito no disco fora de
|
|
375
|
+
// `escrever()` e `criarPasta()`. Qualquer escrita nova, de qualquer autor, ja
|
|
376
|
+
// nasce dentro do rollback — nao por disciplina de quem edita, por construcao.
|
|
377
|
+
//
|
|
378
|
+
// ⛔ O rollback so remove o que ESTA execucao criou, item por item, pela lista que
|
|
379
|
+
// ele mesmo montou — nunca por pasta, nunca por padrao. O preflight ja garantiu
|
|
380
|
+
// que nenhum destino existia antes, entao nada do usuario pode estar ali. Pasta
|
|
381
|
+
// pre-existente nao entra na lista e nao e' tocada.
|
|
382
|
+
//
|
|
383
|
+
// ⚠️ O destino entra na lista ANTES da escrita, nao depois. Parece detalhe e nao e':
|
|
384
|
+
// `writeFileSync` que estoura no meio (disco cheio, quota) ja CRIOU o arquivo, com
|
|
385
|
+
// conteudo truncado. Se o registro so acontecesse no sucesso, esse arquivo ficava
|
|
386
|
+
// fora da lista e sobrevivia ao rollback — medido: 200KB de manifesto pela metade
|
|
387
|
+
// sobrando num HOME que devia ter voltado ao estado anterior. Registrar antes cobre
|
|
388
|
+
// o caso; registrar um destino que nunca chegou a existir e' inofensivo, porque o
|
|
389
|
+
// rollback ignora o que nao consegue remover.
|
|
390
|
+
const escrever = (destino, conteudo, oQueE) => {
|
|
391
|
+
try {
|
|
392
|
+
marcarPastas(path.dirname(destino));
|
|
393
|
+
fs.mkdirSync(path.dirname(destino), { recursive: true });
|
|
394
|
+
criados.push(destino);
|
|
395
|
+
fs.writeFileSync(destino, conteudo);
|
|
396
|
+
} catch (e) { rollback(`falhou ao escrever ${oQueE}: ${e.code || e.message}`); }
|
|
397
|
+
};
|
|
398
|
+
const copiar = (origem, destino, oQueE) => {
|
|
399
|
+
try {
|
|
400
|
+
marcarPastas(path.dirname(destino));
|
|
401
|
+
fs.mkdirSync(path.dirname(destino), { recursive: true });
|
|
402
|
+
criados.push(destino);
|
|
403
|
+
fs.copyFileSync(origem, destino);
|
|
404
|
+
} catch (e) { rollback(`falhou ao escrever ${oQueE}: ${e.code || e.message}`); }
|
|
405
|
+
};
|
|
406
|
+
const criarPasta = (dir, oQueE) => {
|
|
407
|
+
try { marcarPastas(dir); fs.mkdirSync(dir, { recursive: true }); }
|
|
408
|
+
catch (e) { rollback(`falhou ao preparar ${oQueE}: ${e.code || e.message}`); }
|
|
409
|
+
};
|
|
410
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
411
|
+
|
|
412
|
+
for (const item of payloadPlan) {
|
|
413
|
+
copiar(item.src, item.dest, item.rel);
|
|
414
|
+
manifest.push({ rel: item.rel.split(path.sep).join('/'), dest: item.dest, sha256: sha256(item.dest), generated: false });
|
|
415
|
+
}
|
|
416
|
+
log(` ${manifest.length} arquivos copiados.`);
|
|
417
|
+
|
|
418
|
+
for (const d of [path.join(IRON_DIR, 'integrations'), path.join(IRON_DIR, 'secrets')]) {
|
|
419
|
+
criarPasta(d, 'as pastas de estado');
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// memoria por cargo do squad-engineering: pasta vazia, FORA do manifesto de propósito.
|
|
423
|
+
// O que a maquina aprendeu nao e gerenciado pelo instalador — update de pacote nunca apaga.
|
|
424
|
+
// Cada arquivo <cargo>.md nasce do template na primeira vez que o cargo roda.
|
|
425
|
+
criarPasta(path.join(IRON_DIR, 'memory', 'squad-engineering'), 'a pasta de memoria');
|
|
426
|
+
|
|
427
|
+
const shopifyYaml = path.join(IRON_DIR, 'integrations', 'shopify.yaml');
|
|
428
|
+
escrever(shopifyYaml, 'enabled: false\nendpoint: ""\napi_key_file: ""\n', 'a config da integracao');
|
|
429
|
+
|
|
430
|
+
const configYaml = path.join(IRON_DIR, 'config.yaml');
|
|
431
|
+
escrever(configYaml, [
|
|
432
|
+
'# Iron Edge config (gerado na instalacao, em branco)',
|
|
433
|
+
'owner: ""',
|
|
434
|
+
'businesses: []',
|
|
435
|
+
'# focus: dev # prioriza o iron-eng (engenharia de software) no roteamento.',
|
|
436
|
+
'# # a skill recorte preenche este campo; deixe comentado ate escolher.',
|
|
437
|
+
''
|
|
438
|
+
].join('\n'), 'a config inicial');
|
|
439
|
+
|
|
440
|
+
const installedAt = new Date().toISOString();
|
|
441
|
+
|
|
442
|
+
// PATCH 7: gerados entram no manifesto com generated:true
|
|
443
|
+
function addGenerated(p) {
|
|
444
|
+
if (fs.existsSync(p)) manifest.push({ rel: path.relative(IRON_DIR, p), dest: p, sha256: sha256(p), generated: true });
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
const installManifest = {
|
|
448
|
+
product: 'iron-edge',
|
|
449
|
+
version: IRON_VERSION,
|
|
450
|
+
label: IRON_VERSION_HUMAN,
|
|
451
|
+
installed_at: installedAt,
|
|
452
|
+
platform: process.platform,
|
|
453
|
+
node: process.version,
|
|
454
|
+
home: HOME,
|
|
455
|
+
scopes: { iron_root: IRON_DIR, claude_agents: AGENTS_DEST, claude_skills: SKILLS_DEST },
|
|
456
|
+
files: manifest // sera reescrito abaixo ja com os gerados
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
// adiciona shopify + config no manifesto antes de gravar o manifesto em si
|
|
460
|
+
addGenerated(shopifyYaml);
|
|
461
|
+
addGenerated(configYaml);
|
|
462
|
+
|
|
463
|
+
const metadataPath = path.join(IRON_DIR, 'metadata.json');
|
|
464
|
+
escrever(metadataPath,
|
|
465
|
+
JSON.stringify({ version: IRON_VERSION, label: IRON_VERSION_HUMAN, installed_at: installedAt, platform: process.platform }, null, 2),
|
|
466
|
+
'o metadata');
|
|
467
|
+
addGenerated(metadataPath);
|
|
468
|
+
|
|
469
|
+
// grava o manifesto por ultimo (inclui tudo, menos o proprio manifesto que e auto-referente)
|
|
470
|
+
const manifestPath = path.join(IRON_DIR, 'install-manifest.json');
|
|
471
|
+
installManifest.files = manifest;
|
|
472
|
+
escrever(manifestPath, JSON.stringify(installManifest, null, 2), 'o manifesto da instalacao');
|
|
473
|
+
|
|
474
|
+
// VALIDACAO POS-INSTALL
|
|
475
|
+
log('\n--- VALIDACAO POS-INSTALL ---');
|
|
476
|
+
let errs = 0;
|
|
477
|
+
|
|
478
|
+
const routingDest = path.join(IRON_DIR, 'iron-routing-map.md');
|
|
479
|
+
if (!fs.existsSync(routingDest)) { log(' ERRO: routing-map nao chegou em ~/.iron/'); errs++; }
|
|
480
|
+
else log(' OK: iron-routing-map.md em ~/.iron/');
|
|
481
|
+
|
|
482
|
+
// hashes dos arquivos do payload
|
|
483
|
+
let hashOk = 0;
|
|
484
|
+
const payloadManifest = manifest.filter(f => !f.generated);
|
|
485
|
+
for (const f of payloadManifest) {
|
|
486
|
+
if (fs.existsSync(f.dest) && sha256(f.dest) === f.sha256) hashOk++;
|
|
487
|
+
else { log(` ERRO de hash: ${f.dest}`); errs++; }
|
|
488
|
+
}
|
|
489
|
+
log(` OK: ${hashOk}/${payloadManifest.length} hashes de payload conferidos`);
|
|
490
|
+
|
|
491
|
+
// PATCH 7: validar os arquivos GERADOS no pos-install
|
|
492
|
+
for (const gp of [shopifyYaml, configYaml, metadataPath, manifestPath]) {
|
|
493
|
+
if (!fs.existsSync(gp)) { log(` ERRO: gerado ausente: ${gp}`); errs++; }
|
|
494
|
+
}
|
|
495
|
+
if (/enabled:\s*false/.test(fs.readFileSync(shopifyYaml, 'utf8'))) log(' OK: shopify.yaml com enabled: false');
|
|
496
|
+
else { log(' ERRO: shopify.yaml nao esta desativado'); errs++; }
|
|
497
|
+
try { JSON.parse(fs.readFileSync(manifestPath, 'utf8')); log(' OK: install-manifest.json e JSON valido'); }
|
|
498
|
+
catch (e) { log(' ERRO: install-manifest.json invalido'); errs++; }
|
|
499
|
+
try { JSON.parse(fs.readFileSync(metadataPath, 'utf8')); log(' OK: metadata.json e JSON valido'); }
|
|
500
|
+
catch (e) { log(' ERRO: metadata.json invalido'); errs++; }
|
|
501
|
+
|
|
502
|
+
if (errs > 0) abort(`instalacao com ${errs} erro(s) de validacao.`);
|
|
503
|
+
|
|
504
|
+
log('\n================================');
|
|
505
|
+
log(' Iron Edge instalado com sucesso');
|
|
506
|
+
log('================================');
|
|
507
|
+
log(`Agentes : ${AGENTS_DEST}`);
|
|
508
|
+
log(`Skills : ${SKILLS_DEST}`);
|
|
509
|
+
log(`Nucleo : ${IRON_DIR}`);
|
|
510
|
+
log(`Manifesto: ${manifestPath}`);
|
|
511
|
+
log('\n--------------------------------');
|
|
512
|
+
log(' PROXIMO PASSO');
|
|
513
|
+
log('--------------------------------');
|
|
514
|
+
log('1. Reabra o Claude Code (pra ele carregar os novos agentes).');
|
|
515
|
+
log('2. Comece pelo iron-ceo: peca algo como');
|
|
516
|
+
log(' "ative o iron-ceo" ou "chame o iron-ceo".');
|
|
517
|
+
log('3. Se o iron-ceo responder com a saudacao, esta funcionando.');
|
|
518
|
+
log('');
|