@etus/seven-skill 0.1.0-beta.3 → 0.1.0-beta.5
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/.agents/skills/seven/SKILL.md +172 -0
- package/.agents/skills/seven/agents/seven_asset_producer.toml +37 -0
- package/.agents/skills/seven/agents/seven_finish_reviewer.toml +33 -0
- package/.agents/skills/seven/agents/seven_manual_edit_applier.toml +43 -0
- package/.agents/skills/seven/reference/adapt.md +34 -0
- package/.agents/skills/seven/reference/animate.md +31 -0
- package/.agents/skills/seven/reference/app-shell.md +152 -0
- package/.agents/skills/seven/reference/audit.md +122 -0
- package/.agents/skills/seven/reference/bolder.md +34 -0
- package/.agents/skills/seven/reference/brand.md +31 -0
- package/.agents/skills/seven/reference/clarify.md +76 -0
- package/.agents/skills/seven/reference/color-and-contrast.md +84 -0
- package/.agents/skills/seven/reference/colorize.md +31 -0
- package/.agents/skills/seven/reference/critique.md +53 -0
- package/.agents/skills/seven/reference/delight.md +30 -0
- package/.agents/skills/seven/reference/distill.md +30 -0
- package/.agents/skills/seven/reference/doctor.md +9 -0
- package/.agents/skills/seven/reference/document.md +36 -0
- package/.agents/skills/seven/reference/evaluations.md +44 -0
- package/.agents/skills/seven/reference/exceptions.md +7 -0
- package/.agents/skills/seven/reference/extract.md +42 -0
- package/.agents/skills/seven/reference/harden.md +36 -0
- package/.agents/skills/seven/reference/hooks.md +11 -0
- package/.agents/skills/seven/reference/init.md +5 -0
- package/.agents/skills/seven/reference/layout.md +33 -0
- package/.agents/skills/seven/reference/live.md +106 -0
- package/.agents/skills/seven/reference/motion-design.md +71 -0
- package/.agents/skills/seven/reference/onboard.md +35 -0
- package/.agents/skills/seven/reference/optimize.md +34 -0
- package/.agents/skills/seven/reference/overdrive.md +32 -0
- package/.agents/skills/seven/reference/polish.md +55 -0
- package/.agents/skills/seven/reference/product.md +43 -0
- package/.agents/skills/seven/reference/quieter.md +31 -0
- package/.agents/skills/seven/reference/routing.md +28 -0
- package/.agents/skills/seven/reference/setup.md +38 -0
- package/.agents/skills/seven/reference/shape.md +85 -0
- package/.agents/skills/seven/reference/spatial-design.md +60 -0
- package/.agents/skills/seven/reference/typeset.md +28 -0
- package/.agents/skills/seven/reference/typography.md +43 -0
- package/.agents/skills/seven/reference/ux-writing.md +47 -0
- package/.agents/skills/seven/reference/visual-probes.md +36 -0
- package/.agents/skills/seven/scripts/context-signals.mjs +95 -0
- package/.agents/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.agents/skills/seven/scripts/load-context.mjs +111 -0
- package/.agents/skills/seven/scripts/run-seven.mjs +47 -0
- package/.agents/skills/seven/scripts/update-check.mjs +120 -0
- package/.claude/agents/seven-asset-producer.md +40 -0
- package/.claude/agents/seven-finish-reviewer.md +36 -0
- package/.claude/agents/seven-manual-edit-applier.md +46 -0
- package/.claude/skills/seven/SKILL.md +134 -123
- package/.claude/skills/seven/reference/adapt.md +34 -0
- package/.claude/skills/seven/reference/animate.md +31 -0
- package/.claude/skills/seven/reference/app-shell.md +100 -18
- package/.claude/skills/seven/reference/audit.md +6 -4
- package/.claude/skills/seven/reference/bolder.md +34 -0
- package/.claude/skills/seven/reference/brand.md +21 -14
- package/.claude/skills/seven/reference/clarify.md +2 -2
- package/.claude/skills/seven/reference/colorize.md +31 -0
- package/.claude/skills/seven/reference/critique.md +53 -0
- package/.claude/skills/seven/reference/delight.md +30 -0
- package/.claude/skills/seven/reference/distill.md +30 -0
- package/.claude/skills/seven/reference/doctor.md +9 -0
- package/.claude/skills/seven/reference/document.md +36 -0
- package/.claude/skills/seven/reference/evaluations.md +44 -0
- package/.claude/skills/seven/reference/exceptions.md +7 -0
- package/.claude/skills/seven/reference/extract.md +42 -0
- package/.claude/skills/seven/reference/harden.md +36 -0
- package/.claude/skills/seven/reference/hooks.md +11 -0
- package/.claude/skills/seven/reference/init.md +5 -0
- package/.claude/skills/seven/reference/layout.md +33 -0
- package/.claude/skills/seven/reference/live.md +106 -0
- package/.claude/skills/seven/reference/motion-design.md +1 -1
- package/.claude/skills/seven/reference/onboard.md +35 -0
- package/.claude/skills/seven/reference/optimize.md +34 -0
- package/.claude/skills/seven/reference/overdrive.md +32 -0
- package/.claude/skills/seven/reference/polish.md +5 -5
- package/.claude/skills/seven/reference/product.md +2 -4
- package/.claude/skills/seven/reference/quieter.md +31 -0
- package/.claude/skills/seven/reference/routing.md +28 -0
- package/.claude/skills/seven/reference/setup.md +38 -0
- package/.claude/skills/seven/reference/shape.md +5 -5
- package/.claude/skills/seven/reference/spatial-design.md +3 -3
- package/.claude/skills/seven/reference/typeset.md +28 -0
- package/.claude/skills/seven/reference/typography.md +1 -1
- package/.claude/skills/seven/reference/visual-probes.md +36 -0
- package/.claude/skills/seven/scripts/context-signals.mjs +95 -0
- package/.claude/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.claude/skills/seven/scripts/load-context.mjs +85 -58
- package/.claude/skills/seven/scripts/run-seven.mjs +47 -0
- package/.claude/skills/seven/scripts/update-check.mjs +120 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +8 -3
- package/.cursor/skills/seven/SKILL.md +172 -0
- package/.cursor/skills/seven/reference/adapt.md +34 -0
- package/.cursor/skills/seven/reference/animate.md +31 -0
- package/.cursor/skills/seven/reference/app-shell.md +152 -0
- package/.cursor/skills/seven/reference/audit.md +122 -0
- package/.cursor/skills/seven/reference/bolder.md +34 -0
- package/.cursor/skills/seven/reference/brand.md +31 -0
- package/.cursor/skills/seven/reference/clarify.md +76 -0
- package/.cursor/skills/seven/reference/color-and-contrast.md +84 -0
- package/.cursor/skills/seven/reference/colorize.md +31 -0
- package/.cursor/skills/seven/reference/critique.md +53 -0
- package/.cursor/skills/seven/reference/delight.md +30 -0
- package/.cursor/skills/seven/reference/distill.md +30 -0
- package/.cursor/skills/seven/reference/doctor.md +9 -0
- package/.cursor/skills/seven/reference/document.md +36 -0
- package/.cursor/skills/seven/reference/evaluations.md +44 -0
- package/.cursor/skills/seven/reference/exceptions.md +7 -0
- package/.cursor/skills/seven/reference/extract.md +42 -0
- package/.cursor/skills/seven/reference/harden.md +36 -0
- package/.cursor/skills/seven/reference/hooks.md +11 -0
- package/.cursor/skills/seven/reference/init.md +5 -0
- package/.cursor/skills/seven/reference/layout.md +33 -0
- package/.cursor/skills/seven/reference/live.md +106 -0
- package/.cursor/skills/seven/reference/motion-design.md +71 -0
- package/.cursor/skills/seven/reference/onboard.md +35 -0
- package/.cursor/skills/seven/reference/optimize.md +34 -0
- package/.cursor/skills/seven/reference/overdrive.md +32 -0
- package/.cursor/skills/seven/reference/polish.md +55 -0
- package/.cursor/skills/seven/reference/product.md +43 -0
- package/.cursor/skills/seven/reference/quieter.md +31 -0
- package/.cursor/skills/seven/reference/routing.md +28 -0
- package/.cursor/skills/seven/reference/setup.md +38 -0
- package/.cursor/skills/seven/reference/shape.md +85 -0
- package/.cursor/skills/seven/reference/spatial-design.md +60 -0
- package/.cursor/skills/seven/reference/typeset.md +28 -0
- package/.cursor/skills/seven/reference/typography.md +43 -0
- package/.cursor/skills/seven/reference/ux-writing.md +47 -0
- package/.cursor/skills/seven/reference/visual-probes.md +36 -0
- package/.cursor/skills/seven/scripts/context-signals.mjs +95 -0
- package/.cursor/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.cursor/skills/seven/scripts/load-context.mjs +111 -0
- package/.cursor/skills/seven/scripts/run-seven.mjs +47 -0
- package/.cursor/skills/seven/scripts/update-check.mjs +120 -0
- package/.gemini/skills/seven/SKILL.md +171 -0
- package/.gemini/skills/seven/reference/adapt.md +34 -0
- package/.gemini/skills/seven/reference/animate.md +31 -0
- package/.gemini/skills/seven/reference/app-shell.md +152 -0
- package/.gemini/skills/seven/reference/audit.md +122 -0
- package/.gemini/skills/seven/reference/bolder.md +34 -0
- package/.gemini/skills/seven/reference/brand.md +31 -0
- package/.gemini/skills/seven/reference/clarify.md +76 -0
- package/.gemini/skills/seven/reference/color-and-contrast.md +84 -0
- package/.gemini/skills/seven/reference/colorize.md +31 -0
- package/.gemini/skills/seven/reference/critique.md +53 -0
- package/.gemini/skills/seven/reference/delight.md +30 -0
- package/.gemini/skills/seven/reference/distill.md +30 -0
- package/.gemini/skills/seven/reference/doctor.md +9 -0
- package/.gemini/skills/seven/reference/document.md +36 -0
- package/.gemini/skills/seven/reference/evaluations.md +44 -0
- package/.gemini/skills/seven/reference/exceptions.md +7 -0
- package/.gemini/skills/seven/reference/extract.md +42 -0
- package/.gemini/skills/seven/reference/harden.md +36 -0
- package/.gemini/skills/seven/reference/hooks.md +11 -0
- package/.gemini/skills/seven/reference/init.md +5 -0
- package/.gemini/skills/seven/reference/layout.md +33 -0
- package/.gemini/skills/seven/reference/live.md +106 -0
- package/.gemini/skills/seven/reference/motion-design.md +71 -0
- package/.gemini/skills/seven/reference/onboard.md +35 -0
- package/.gemini/skills/seven/reference/optimize.md +34 -0
- package/.gemini/skills/seven/reference/overdrive.md +32 -0
- package/.gemini/skills/seven/reference/polish.md +55 -0
- package/.gemini/skills/seven/reference/product.md +43 -0
- package/.gemini/skills/seven/reference/quieter.md +31 -0
- package/.gemini/skills/seven/reference/routing.md +28 -0
- package/.gemini/skills/seven/reference/setup.md +38 -0
- package/.gemini/skills/seven/reference/shape.md +85 -0
- package/.gemini/skills/seven/reference/spatial-design.md +60 -0
- package/.gemini/skills/seven/reference/typeset.md +28 -0
- package/.gemini/skills/seven/reference/typography.md +43 -0
- package/.gemini/skills/seven/reference/ux-writing.md +47 -0
- package/.gemini/skills/seven/reference/visual-probes.md +36 -0
- package/.gemini/skills/seven/scripts/context-signals.mjs +95 -0
- package/.gemini/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.gemini/skills/seven/scripts/load-context.mjs +111 -0
- package/.gemini/skills/seven/scripts/run-seven.mjs +47 -0
- package/.gemini/skills/seven/scripts/update-check.mjs +120 -0
- package/.grok/agents/seven-asset-producer.md +40 -0
- package/.grok/agents/seven-finish-reviewer.md +36 -0
- package/.grok/agents/seven-manual-edit-applier.md +46 -0
- package/.grok/skills/seven/SKILL.md +176 -0
- package/.grok/skills/seven/reference/adapt.md +34 -0
- package/.grok/skills/seven/reference/animate.md +31 -0
- package/.grok/skills/seven/reference/app-shell.md +152 -0
- package/.grok/skills/seven/reference/audit.md +122 -0
- package/.grok/skills/seven/reference/bolder.md +34 -0
- package/.grok/skills/seven/reference/brand.md +31 -0
- package/.grok/skills/seven/reference/clarify.md +76 -0
- package/.grok/skills/seven/reference/color-and-contrast.md +84 -0
- package/.grok/skills/seven/reference/colorize.md +31 -0
- package/.grok/skills/seven/reference/critique.md +53 -0
- package/.grok/skills/seven/reference/delight.md +30 -0
- package/.grok/skills/seven/reference/distill.md +30 -0
- package/.grok/skills/seven/reference/doctor.md +9 -0
- package/.grok/skills/seven/reference/document.md +36 -0
- package/.grok/skills/seven/reference/evaluations.md +44 -0
- package/.grok/skills/seven/reference/exceptions.md +7 -0
- package/.grok/skills/seven/reference/extract.md +42 -0
- package/.grok/skills/seven/reference/harden.md +36 -0
- package/.grok/skills/seven/reference/hooks.md +11 -0
- package/.grok/skills/seven/reference/init.md +5 -0
- package/.grok/skills/seven/reference/layout.md +33 -0
- package/.grok/skills/seven/reference/live.md +106 -0
- package/.grok/skills/seven/reference/motion-design.md +71 -0
- package/.grok/skills/seven/reference/onboard.md +35 -0
- package/.grok/skills/seven/reference/optimize.md +34 -0
- package/.grok/skills/seven/reference/overdrive.md +32 -0
- package/.grok/skills/seven/reference/polish.md +55 -0
- package/.grok/skills/seven/reference/product.md +43 -0
- package/.grok/skills/seven/reference/quieter.md +31 -0
- package/.grok/skills/seven/reference/routing.md +28 -0
- package/.grok/skills/seven/reference/setup.md +38 -0
- package/.grok/skills/seven/reference/shape.md +85 -0
- package/.grok/skills/seven/reference/spatial-design.md +60 -0
- package/.grok/skills/seven/reference/typeset.md +28 -0
- package/.grok/skills/seven/reference/typography.md +43 -0
- package/.grok/skills/seven/reference/ux-writing.md +47 -0
- package/.grok/skills/seven/reference/visual-probes.md +36 -0
- package/.grok/skills/seven/scripts/context-signals.mjs +95 -0
- package/.grok/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.grok/skills/seven/scripts/load-context.mjs +111 -0
- package/.grok/skills/seven/scripts/run-seven.mjs +47 -0
- package/.grok/skills/seven/scripts/update-check.mjs +120 -0
- package/.kiro/skills/seven/SKILL.md +172 -0
- package/.kiro/skills/seven/reference/adapt.md +34 -0
- package/.kiro/skills/seven/reference/animate.md +31 -0
- package/.kiro/skills/seven/reference/app-shell.md +152 -0
- package/.kiro/skills/seven/reference/audit.md +122 -0
- package/.kiro/skills/seven/reference/bolder.md +34 -0
- package/.kiro/skills/seven/reference/brand.md +31 -0
- package/.kiro/skills/seven/reference/clarify.md +76 -0
- package/.kiro/skills/seven/reference/color-and-contrast.md +84 -0
- package/.kiro/skills/seven/reference/colorize.md +31 -0
- package/.kiro/skills/seven/reference/critique.md +53 -0
- package/.kiro/skills/seven/reference/delight.md +30 -0
- package/.kiro/skills/seven/reference/distill.md +30 -0
- package/.kiro/skills/seven/reference/doctor.md +9 -0
- package/.kiro/skills/seven/reference/document.md +36 -0
- package/.kiro/skills/seven/reference/evaluations.md +44 -0
- package/.kiro/skills/seven/reference/exceptions.md +7 -0
- package/.kiro/skills/seven/reference/extract.md +42 -0
- package/.kiro/skills/seven/reference/harden.md +36 -0
- package/.kiro/skills/seven/reference/hooks.md +11 -0
- package/.kiro/skills/seven/reference/init.md +5 -0
- package/.kiro/skills/seven/reference/layout.md +33 -0
- package/.kiro/skills/seven/reference/live.md +106 -0
- package/.kiro/skills/seven/reference/motion-design.md +71 -0
- package/.kiro/skills/seven/reference/onboard.md +35 -0
- package/.kiro/skills/seven/reference/optimize.md +34 -0
- package/.kiro/skills/seven/reference/overdrive.md +32 -0
- package/.kiro/skills/seven/reference/polish.md +55 -0
- package/.kiro/skills/seven/reference/product.md +43 -0
- package/.kiro/skills/seven/reference/quieter.md +31 -0
- package/.kiro/skills/seven/reference/routing.md +28 -0
- package/.kiro/skills/seven/reference/setup.md +38 -0
- package/.kiro/skills/seven/reference/shape.md +85 -0
- package/.kiro/skills/seven/reference/spatial-design.md +60 -0
- package/.kiro/skills/seven/reference/typeset.md +28 -0
- package/.kiro/skills/seven/reference/typography.md +43 -0
- package/.kiro/skills/seven/reference/ux-writing.md +47 -0
- package/.kiro/skills/seven/reference/visual-probes.md +36 -0
- package/.kiro/skills/seven/scripts/context-signals.mjs +95 -0
- package/.kiro/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.kiro/skills/seven/scripts/load-context.mjs +111 -0
- package/.kiro/skills/seven/scripts/run-seven.mjs +47 -0
- package/.kiro/skills/seven/scripts/update-check.mjs +120 -0
- package/.opencode/skills/seven/SKILL.md +176 -0
- package/.opencode/skills/seven/reference/adapt.md +34 -0
- package/.opencode/skills/seven/reference/animate.md +31 -0
- package/.opencode/skills/seven/reference/app-shell.md +152 -0
- package/.opencode/skills/seven/reference/audit.md +122 -0
- package/.opencode/skills/seven/reference/bolder.md +34 -0
- package/.opencode/skills/seven/reference/brand.md +31 -0
- package/.opencode/skills/seven/reference/clarify.md +76 -0
- package/.opencode/skills/seven/reference/color-and-contrast.md +84 -0
- package/.opencode/skills/seven/reference/colorize.md +31 -0
- package/.opencode/skills/seven/reference/critique.md +53 -0
- package/.opencode/skills/seven/reference/delight.md +30 -0
- package/.opencode/skills/seven/reference/distill.md +30 -0
- package/.opencode/skills/seven/reference/doctor.md +9 -0
- package/.opencode/skills/seven/reference/document.md +36 -0
- package/.opencode/skills/seven/reference/evaluations.md +44 -0
- package/.opencode/skills/seven/reference/exceptions.md +7 -0
- package/.opencode/skills/seven/reference/extract.md +42 -0
- package/.opencode/skills/seven/reference/harden.md +36 -0
- package/.opencode/skills/seven/reference/hooks.md +11 -0
- package/.opencode/skills/seven/reference/init.md +5 -0
- package/.opencode/skills/seven/reference/layout.md +33 -0
- package/.opencode/skills/seven/reference/live.md +106 -0
- package/.opencode/skills/seven/reference/motion-design.md +71 -0
- package/.opencode/skills/seven/reference/onboard.md +35 -0
- package/.opencode/skills/seven/reference/optimize.md +34 -0
- package/.opencode/skills/seven/reference/overdrive.md +32 -0
- package/.opencode/skills/seven/reference/polish.md +55 -0
- package/.opencode/skills/seven/reference/product.md +43 -0
- package/.opencode/skills/seven/reference/quieter.md +31 -0
- package/.opencode/skills/seven/reference/routing.md +28 -0
- package/.opencode/skills/seven/reference/setup.md +38 -0
- package/.opencode/skills/seven/reference/shape.md +85 -0
- package/.opencode/skills/seven/reference/spatial-design.md +60 -0
- package/.opencode/skills/seven/reference/typeset.md +28 -0
- package/.opencode/skills/seven/reference/typography.md +43 -0
- package/.opencode/skills/seven/reference/ux-writing.md +47 -0
- package/.opencode/skills/seven/reference/visual-probes.md +36 -0
- package/.opencode/skills/seven/scripts/context-signals.mjs +95 -0
- package/.opencode/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.opencode/skills/seven/scripts/load-context.mjs +111 -0
- package/.opencode/skills/seven/scripts/run-seven.mjs +47 -0
- package/.opencode/skills/seven/scripts/update-check.mjs +120 -0
- package/.pi/skills/seven/SKILL.md +174 -0
- package/.pi/skills/seven/reference/adapt.md +34 -0
- package/.pi/skills/seven/reference/animate.md +31 -0
- package/.pi/skills/seven/reference/app-shell.md +152 -0
- package/.pi/skills/seven/reference/audit.md +122 -0
- package/.pi/skills/seven/reference/bolder.md +34 -0
- package/.pi/skills/seven/reference/brand.md +31 -0
- package/.pi/skills/seven/reference/clarify.md +76 -0
- package/.pi/skills/seven/reference/color-and-contrast.md +84 -0
- package/.pi/skills/seven/reference/colorize.md +31 -0
- package/.pi/skills/seven/reference/critique.md +53 -0
- package/.pi/skills/seven/reference/delight.md +30 -0
- package/.pi/skills/seven/reference/distill.md +30 -0
- package/.pi/skills/seven/reference/doctor.md +9 -0
- package/.pi/skills/seven/reference/document.md +36 -0
- package/.pi/skills/seven/reference/evaluations.md +44 -0
- package/.pi/skills/seven/reference/exceptions.md +7 -0
- package/.pi/skills/seven/reference/extract.md +42 -0
- package/.pi/skills/seven/reference/harden.md +36 -0
- package/.pi/skills/seven/reference/hooks.md +11 -0
- package/.pi/skills/seven/reference/init.md +5 -0
- package/.pi/skills/seven/reference/layout.md +33 -0
- package/.pi/skills/seven/reference/live.md +106 -0
- package/.pi/skills/seven/reference/motion-design.md +71 -0
- package/.pi/skills/seven/reference/onboard.md +35 -0
- package/.pi/skills/seven/reference/optimize.md +34 -0
- package/.pi/skills/seven/reference/overdrive.md +32 -0
- package/.pi/skills/seven/reference/polish.md +55 -0
- package/.pi/skills/seven/reference/product.md +43 -0
- package/.pi/skills/seven/reference/quieter.md +31 -0
- package/.pi/skills/seven/reference/routing.md +28 -0
- package/.pi/skills/seven/reference/setup.md +38 -0
- package/.pi/skills/seven/reference/shape.md +85 -0
- package/.pi/skills/seven/reference/spatial-design.md +60 -0
- package/.pi/skills/seven/reference/typeset.md +28 -0
- package/.pi/skills/seven/reference/typography.md +43 -0
- package/.pi/skills/seven/reference/ux-writing.md +47 -0
- package/.pi/skills/seven/reference/visual-probes.md +36 -0
- package/.pi/skills/seven/scripts/context-signals.mjs +95 -0
- package/.pi/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.pi/skills/seven/scripts/load-context.mjs +111 -0
- package/.pi/skills/seven/scripts/run-seven.mjs +47 -0
- package/.pi/skills/seven/scripts/update-check.mjs +120 -0
- package/.qoder/skills/seven/SKILL.md +176 -0
- package/.qoder/skills/seven/reference/adapt.md +34 -0
- package/.qoder/skills/seven/reference/animate.md +31 -0
- package/.qoder/skills/seven/reference/app-shell.md +152 -0
- package/.qoder/skills/seven/reference/audit.md +122 -0
- package/.qoder/skills/seven/reference/bolder.md +34 -0
- package/.qoder/skills/seven/reference/brand.md +31 -0
- package/.qoder/skills/seven/reference/clarify.md +76 -0
- package/.qoder/skills/seven/reference/color-and-contrast.md +84 -0
- package/.qoder/skills/seven/reference/colorize.md +31 -0
- package/.qoder/skills/seven/reference/critique.md +53 -0
- package/.qoder/skills/seven/reference/delight.md +30 -0
- package/.qoder/skills/seven/reference/distill.md +30 -0
- package/.qoder/skills/seven/reference/doctor.md +9 -0
- package/.qoder/skills/seven/reference/document.md +36 -0
- package/.qoder/skills/seven/reference/evaluations.md +44 -0
- package/.qoder/skills/seven/reference/exceptions.md +7 -0
- package/.qoder/skills/seven/reference/extract.md +42 -0
- package/.qoder/skills/seven/reference/harden.md +36 -0
- package/.qoder/skills/seven/reference/hooks.md +11 -0
- package/.qoder/skills/seven/reference/init.md +5 -0
- package/.qoder/skills/seven/reference/layout.md +33 -0
- package/.qoder/skills/seven/reference/live.md +106 -0
- package/.qoder/skills/seven/reference/motion-design.md +71 -0
- package/.qoder/skills/seven/reference/onboard.md +35 -0
- package/.qoder/skills/seven/reference/optimize.md +34 -0
- package/.qoder/skills/seven/reference/overdrive.md +32 -0
- package/.qoder/skills/seven/reference/polish.md +55 -0
- package/.qoder/skills/seven/reference/product.md +43 -0
- package/.qoder/skills/seven/reference/quieter.md +31 -0
- package/.qoder/skills/seven/reference/routing.md +28 -0
- package/.qoder/skills/seven/reference/setup.md +38 -0
- package/.qoder/skills/seven/reference/shape.md +85 -0
- package/.qoder/skills/seven/reference/spatial-design.md +60 -0
- package/.qoder/skills/seven/reference/typeset.md +28 -0
- package/.qoder/skills/seven/reference/typography.md +43 -0
- package/.qoder/skills/seven/reference/ux-writing.md +47 -0
- package/.qoder/skills/seven/reference/visual-probes.md +36 -0
- package/.qoder/skills/seven/scripts/context-signals.mjs +95 -0
- package/.qoder/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.qoder/skills/seven/scripts/load-context.mjs +111 -0
- package/.qoder/skills/seven/scripts/run-seven.mjs +47 -0
- package/.qoder/skills/seven/scripts/update-check.mjs +120 -0
- package/.rovodev/skills/seven/SKILL.md +176 -0
- package/.rovodev/skills/seven/reference/adapt.md +34 -0
- package/.rovodev/skills/seven/reference/animate.md +31 -0
- package/.rovodev/skills/seven/reference/app-shell.md +152 -0
- package/.rovodev/skills/seven/reference/audit.md +122 -0
- package/.rovodev/skills/seven/reference/bolder.md +34 -0
- package/.rovodev/skills/seven/reference/brand.md +31 -0
- package/.rovodev/skills/seven/reference/clarify.md +76 -0
- package/.rovodev/skills/seven/reference/color-and-contrast.md +84 -0
- package/.rovodev/skills/seven/reference/colorize.md +31 -0
- package/.rovodev/skills/seven/reference/critique.md +53 -0
- package/.rovodev/skills/seven/reference/delight.md +30 -0
- package/.rovodev/skills/seven/reference/distill.md +30 -0
- package/.rovodev/skills/seven/reference/doctor.md +9 -0
- package/.rovodev/skills/seven/reference/document.md +36 -0
- package/.rovodev/skills/seven/reference/evaluations.md +44 -0
- package/.rovodev/skills/seven/reference/exceptions.md +7 -0
- package/.rovodev/skills/seven/reference/extract.md +42 -0
- package/.rovodev/skills/seven/reference/harden.md +36 -0
- package/.rovodev/skills/seven/reference/hooks.md +11 -0
- package/.rovodev/skills/seven/reference/init.md +5 -0
- package/.rovodev/skills/seven/reference/layout.md +33 -0
- package/.rovodev/skills/seven/reference/live.md +106 -0
- package/.rovodev/skills/seven/reference/motion-design.md +71 -0
- package/.rovodev/skills/seven/reference/onboard.md +35 -0
- package/.rovodev/skills/seven/reference/optimize.md +34 -0
- package/.rovodev/skills/seven/reference/overdrive.md +32 -0
- package/.rovodev/skills/seven/reference/polish.md +55 -0
- package/.rovodev/skills/seven/reference/product.md +43 -0
- package/.rovodev/skills/seven/reference/quieter.md +31 -0
- package/.rovodev/skills/seven/reference/routing.md +28 -0
- package/.rovodev/skills/seven/reference/setup.md +38 -0
- package/.rovodev/skills/seven/reference/shape.md +85 -0
- package/.rovodev/skills/seven/reference/spatial-design.md +60 -0
- package/.rovodev/skills/seven/reference/typeset.md +28 -0
- package/.rovodev/skills/seven/reference/typography.md +43 -0
- package/.rovodev/skills/seven/reference/ux-writing.md +47 -0
- package/.rovodev/skills/seven/reference/visual-probes.md +36 -0
- package/.rovodev/skills/seven/scripts/context-signals.mjs +95 -0
- package/.rovodev/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.rovodev/skills/seven/scripts/load-context.mjs +111 -0
- package/.rovodev/skills/seven/scripts/run-seven.mjs +47 -0
- package/.rovodev/skills/seven/scripts/update-check.mjs +120 -0
- package/.trae/skills/seven/SKILL.md +174 -0
- package/.trae/skills/seven/reference/adapt.md +34 -0
- package/.trae/skills/seven/reference/animate.md +31 -0
- package/.trae/skills/seven/reference/app-shell.md +152 -0
- package/.trae/skills/seven/reference/audit.md +122 -0
- package/.trae/skills/seven/reference/bolder.md +34 -0
- package/.trae/skills/seven/reference/brand.md +31 -0
- package/.trae/skills/seven/reference/clarify.md +76 -0
- package/.trae/skills/seven/reference/color-and-contrast.md +84 -0
- package/.trae/skills/seven/reference/colorize.md +31 -0
- package/.trae/skills/seven/reference/critique.md +53 -0
- package/.trae/skills/seven/reference/delight.md +30 -0
- package/.trae/skills/seven/reference/distill.md +30 -0
- package/.trae/skills/seven/reference/doctor.md +9 -0
- package/.trae/skills/seven/reference/document.md +36 -0
- package/.trae/skills/seven/reference/evaluations.md +44 -0
- package/.trae/skills/seven/reference/exceptions.md +7 -0
- package/.trae/skills/seven/reference/extract.md +42 -0
- package/.trae/skills/seven/reference/harden.md +36 -0
- package/.trae/skills/seven/reference/hooks.md +11 -0
- package/.trae/skills/seven/reference/init.md +5 -0
- package/.trae/skills/seven/reference/layout.md +33 -0
- package/.trae/skills/seven/reference/live.md +106 -0
- package/.trae/skills/seven/reference/motion-design.md +71 -0
- package/.trae/skills/seven/reference/onboard.md +35 -0
- package/.trae/skills/seven/reference/optimize.md +34 -0
- package/.trae/skills/seven/reference/overdrive.md +32 -0
- package/.trae/skills/seven/reference/polish.md +55 -0
- package/.trae/skills/seven/reference/product.md +43 -0
- package/.trae/skills/seven/reference/quieter.md +31 -0
- package/.trae/skills/seven/reference/routing.md +28 -0
- package/.trae/skills/seven/reference/setup.md +38 -0
- package/.trae/skills/seven/reference/shape.md +85 -0
- package/.trae/skills/seven/reference/spatial-design.md +60 -0
- package/.trae/skills/seven/reference/typeset.md +28 -0
- package/.trae/skills/seven/reference/typography.md +43 -0
- package/.trae/skills/seven/reference/ux-writing.md +47 -0
- package/.trae/skills/seven/reference/visual-probes.md +36 -0
- package/.trae/skills/seven/scripts/context-signals.mjs +95 -0
- package/.trae/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.trae/skills/seven/scripts/load-context.mjs +111 -0
- package/.trae/skills/seven/scripts/run-seven.mjs +47 -0
- package/.trae/skills/seven/scripts/update-check.mjs +120 -0
- package/.trae-cn/skills/seven/SKILL.md +174 -0
- package/.trae-cn/skills/seven/reference/adapt.md +34 -0
- package/.trae-cn/skills/seven/reference/animate.md +31 -0
- package/.trae-cn/skills/seven/reference/app-shell.md +152 -0
- package/.trae-cn/skills/seven/reference/audit.md +122 -0
- package/.trae-cn/skills/seven/reference/bolder.md +34 -0
- package/.trae-cn/skills/seven/reference/brand.md +31 -0
- package/.trae-cn/skills/seven/reference/clarify.md +76 -0
- package/.trae-cn/skills/seven/reference/color-and-contrast.md +84 -0
- package/.trae-cn/skills/seven/reference/colorize.md +31 -0
- package/.trae-cn/skills/seven/reference/critique.md +53 -0
- package/.trae-cn/skills/seven/reference/delight.md +30 -0
- package/.trae-cn/skills/seven/reference/distill.md +30 -0
- package/.trae-cn/skills/seven/reference/doctor.md +9 -0
- package/.trae-cn/skills/seven/reference/document.md +36 -0
- package/.trae-cn/skills/seven/reference/evaluations.md +44 -0
- package/.trae-cn/skills/seven/reference/exceptions.md +7 -0
- package/.trae-cn/skills/seven/reference/extract.md +42 -0
- package/.trae-cn/skills/seven/reference/harden.md +36 -0
- package/.trae-cn/skills/seven/reference/hooks.md +11 -0
- package/.trae-cn/skills/seven/reference/init.md +5 -0
- package/.trae-cn/skills/seven/reference/layout.md +33 -0
- package/.trae-cn/skills/seven/reference/live.md +106 -0
- package/.trae-cn/skills/seven/reference/motion-design.md +71 -0
- package/.trae-cn/skills/seven/reference/onboard.md +35 -0
- package/.trae-cn/skills/seven/reference/optimize.md +34 -0
- package/.trae-cn/skills/seven/reference/overdrive.md +32 -0
- package/.trae-cn/skills/seven/reference/polish.md +55 -0
- package/.trae-cn/skills/seven/reference/product.md +43 -0
- package/.trae-cn/skills/seven/reference/quieter.md +31 -0
- package/.trae-cn/skills/seven/reference/routing.md +28 -0
- package/.trae-cn/skills/seven/reference/setup.md +38 -0
- package/.trae-cn/skills/seven/reference/shape.md +85 -0
- package/.trae-cn/skills/seven/reference/spatial-design.md +60 -0
- package/.trae-cn/skills/seven/reference/typeset.md +28 -0
- package/.trae-cn/skills/seven/reference/typography.md +43 -0
- package/.trae-cn/skills/seven/reference/ux-writing.md +47 -0
- package/.trae-cn/skills/seven/reference/visual-probes.md +36 -0
- package/.trae-cn/skills/seven/scripts/context-signals.mjs +95 -0
- package/.trae-cn/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.trae-cn/skills/seven/scripts/load-context.mjs +111 -0
- package/.trae-cn/skills/seven/scripts/run-seven.mjs +47 -0
- package/.trae-cn/skills/seven/scripts/update-check.mjs +120 -0
- package/.vibe/skills/seven/SKILL.md +175 -0
- package/.vibe/skills/seven/reference/adapt.md +34 -0
- package/.vibe/skills/seven/reference/animate.md +31 -0
- package/.vibe/skills/seven/reference/app-shell.md +152 -0
- package/.vibe/skills/seven/reference/audit.md +122 -0
- package/.vibe/skills/seven/reference/bolder.md +34 -0
- package/.vibe/skills/seven/reference/brand.md +31 -0
- package/.vibe/skills/seven/reference/clarify.md +76 -0
- package/.vibe/skills/seven/reference/color-and-contrast.md +84 -0
- package/.vibe/skills/seven/reference/colorize.md +31 -0
- package/.vibe/skills/seven/reference/critique.md +53 -0
- package/.vibe/skills/seven/reference/delight.md +30 -0
- package/.vibe/skills/seven/reference/distill.md +30 -0
- package/.vibe/skills/seven/reference/doctor.md +9 -0
- package/.vibe/skills/seven/reference/document.md +36 -0
- package/.vibe/skills/seven/reference/evaluations.md +44 -0
- package/.vibe/skills/seven/reference/exceptions.md +7 -0
- package/.vibe/skills/seven/reference/extract.md +42 -0
- package/.vibe/skills/seven/reference/harden.md +36 -0
- package/.vibe/skills/seven/reference/hooks.md +11 -0
- package/.vibe/skills/seven/reference/init.md +5 -0
- package/.vibe/skills/seven/reference/layout.md +33 -0
- package/.vibe/skills/seven/reference/live.md +106 -0
- package/.vibe/skills/seven/reference/motion-design.md +71 -0
- package/.vibe/skills/seven/reference/onboard.md +35 -0
- package/.vibe/skills/seven/reference/optimize.md +34 -0
- package/.vibe/skills/seven/reference/overdrive.md +32 -0
- package/.vibe/skills/seven/reference/polish.md +55 -0
- package/.vibe/skills/seven/reference/product.md +43 -0
- package/.vibe/skills/seven/reference/quieter.md +31 -0
- package/.vibe/skills/seven/reference/routing.md +28 -0
- package/.vibe/skills/seven/reference/setup.md +38 -0
- package/.vibe/skills/seven/reference/shape.md +85 -0
- package/.vibe/skills/seven/reference/spatial-design.md +60 -0
- package/.vibe/skills/seven/reference/typeset.md +28 -0
- package/.vibe/skills/seven/reference/typography.md +43 -0
- package/.vibe/skills/seven/reference/ux-writing.md +47 -0
- package/.vibe/skills/seven/reference/visual-probes.md +36 -0
- package/.vibe/skills/seven/scripts/context-signals.mjs +95 -0
- package/.vibe/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.vibe/skills/seven/scripts/load-context.mjs +111 -0
- package/.vibe/skills/seven/scripts/run-seven.mjs +47 -0
- package/.vibe/skills/seven/scripts/update-check.mjs +120 -0
- package/README.md +53 -88
- package/cli/bin/seven.mjs +0 -0
- package/cli/engine/browser/injected/index.mjs +62 -13
- package/cli/engine/detect-antipatterns-browser.js +4739 -19
- package/cli/engine/detect-antipatterns.mjs +1 -0
- package/cli/engine/engines/browser/detect-url.mjs +366 -3
- package/cli/engine/engines/regex/detect-text.mjs +469 -1
- package/cli/engine/engines/static-html/detect-html.mjs +131 -0
- package/cli/engine/registry/seven-antipatterns.mjs +379 -4
- package/cli/engine/rules/checks.mjs +360 -1
- package/cli/engine/shared/tokens.mjs +19 -0
- package/cli/engine/token-data.generated.mjs +4025 -0
- package/docs/detector-rules.md +277 -38
- package/docs/upstream-parity.json +242 -0
- package/extension/README.md +5 -0
- package/extension/background/service-worker.js +134 -0
- package/extension/content/content-script.js +340 -0
- package/extension/detector/detect.js +7816 -0
- package/extension/devtools/devtools.html +1 -0
- package/extension/devtools/devtools.js +3 -0
- package/extension/devtools/panel.css +66 -0
- package/extension/devtools/panel.html +3 -0
- package/extension/devtools/panel.js +37 -0
- package/extension/manifest.json +22 -0
- package/extension/popup/popup.css +106 -0
- package/extension/popup/popup.html +27 -0
- package/extension/popup/popup.js +74 -0
- package/package.json +19 -8
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Typeset — Seven typography under stress
|
|
2
|
+
|
|
3
|
+
Refine hierarchy, readability, and delivery using the installed Seven Text component roles, Inter, and JetBrains Mono. Read [typography.md](typography.md) first.
|
|
4
|
+
|
|
5
|
+
## Two-pass assessment
|
|
6
|
+
|
|
7
|
+
Keep these passes separate before synthesizing:
|
|
8
|
+
|
|
9
|
+
1. Rendered typography: identify roles, hierarchy, reading measure, density, line breaks, numeric alignment, long pt-BR copy, zoom, and fallback behavior.
|
|
10
|
+
2. Mechanical scan: run `node .gemini/skills/seven/scripts/run-seven.mjs check --file <target>` and inspect arbitrary/dynamic styles the detector cannot resolve.
|
|
11
|
+
|
|
12
|
+
For every claim, cite a component, selector, computed value, or screenshot state.
|
|
13
|
+
|
|
14
|
+
## Apply
|
|
15
|
+
|
|
16
|
+
- Use the fewest Text variants that make heading, body, label, metadata, and numeric roles unmistakable.
|
|
17
|
+
- Reuse declared Text variants instead of rebuilding a type ramp with utilities.
|
|
18
|
+
- Keep product body text at the Seven base role; dense captions must remain readable and cannot become body copy by volume.
|
|
19
|
+
- Keep prose near 45–75 characters per line and adjust layout before inventing a font size.
|
|
20
|
+
- Use tabular figures for tables, KPIs, timestamps, and aligned numbers.
|
|
21
|
+
- Preserve browser zoom and user font scaling. Test long words, names, values, and localization expansion.
|
|
22
|
+
- Load only used Inter/JetBrains Mono assets and weights; avoid invisible text and disruptive metric changes.
|
|
23
|
+
|
|
24
|
+
Never introduce another font family, letter spacing for generic labels, extreme negative tracking, all-caps body copy, oversized H1s, or arbitrary scale values. A missing role is a Seven contract gap.
|
|
25
|
+
|
|
26
|
+
## Verify
|
|
27
|
+
|
|
28
|
+
Confirm hierarchy without reading the words, long-content wrapping, 200% zoom, narrow containers, dark mode, and final detector output. Report each Text variant used and any unresolved contract gap.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Typography
|
|
2
|
+
|
|
3
|
+
Inter is the only sans face in Seven. JetBrains Mono is the only mono face. Every other typeface decision routes back to one of these two.
|
|
4
|
+
|
|
5
|
+
## Hard rules
|
|
6
|
+
|
|
7
|
+
- **Inter for everything sans-serif.** UI chrome, body, headings, display, numeric tabular figures. Use Inter's variable axes for weight (400 / 500 / 600 / 700) and width (`wdth` axis only if Figma uses it; Seven currently does not).
|
|
8
|
+
- **JetBrains Mono for code and keyboard glyphs.** Never DM Mono, never IBM Plex Mono, never the system mono fallback as a primary choice.
|
|
9
|
+
- **Reflex-reject in Seven**: Space Grotesk, Geist, DM Mono, Inter Tight, Inter Display. They appear in legacy Figma exploration on `Text/Display`, `Text/Heading`, `Dashboard/Dash-01-W`, `Timeline/StatusTitle`, `Feature-item`. They never shipped. Substitute Inter at the same size and surface the swap so the user knows.
|
|
10
|
+
- **Sentence case across every chrome surface.** Headings, labels, button text, menu items, table column headers, breadcrumbs, tabs. Acronyms (KPI, OTP, OIDC, OAuth) stay uppercase.
|
|
11
|
+
- **No trailing periods** on buttons, labels, breadcrumbs, captions, badge text, or short status messages. Periods belong in body prose, not in chrome.
|
|
12
|
+
|
|
13
|
+
## Scale
|
|
14
|
+
|
|
15
|
+
Seven's scale lives in `@etus/tokens`:
|
|
16
|
+
|
|
17
|
+
- Body / `--text-base`: 16 px, line-height 1.5, Inter 400.
|
|
18
|
+
- Caption / `--text-sm`: 14 px, line-height 1.4.
|
|
19
|
+
- Label / `--text-xs`: 12 px, line-height 1.3 (uppercase only for monospaced data-table column headers).
|
|
20
|
+
- Headings / `--text-lg` through `--text-4xl`: walk the Figma `Text/Heading` ramp. Hierarchy via scale plus weight contrast, not via color.
|
|
21
|
+
|
|
22
|
+
Use the `<Text>` component variant API in `@etus/ui` rather than ad-hoc arbitrary classes. `<Text variant="h2">` is correct; `<h2 className="text-2xl font-semibold">` is drift.
|
|
23
|
+
|
|
24
|
+
## Line-height and the Tailwind v4 trap
|
|
25
|
+
|
|
26
|
+
The combination `leading-none` plus `text-[length:var(--something)]` zeroes line-height in Tailwind v4 (Lightning CSS interprets the arbitrary value before applying `leading-none`'s `1`). Two safe paths:
|
|
27
|
+
|
|
28
|
+
- Use `leading-tight`, `leading-snug`, or a literal `leading-[1.1]`. They survive the Lightning CSS pass.
|
|
29
|
+
- Inline `style={{ fontSize, lineHeight }}` for any case where the variable approach falters.
|
|
30
|
+
|
|
31
|
+
## Numeric figures
|
|
32
|
+
|
|
33
|
+
Inter ships tabular figures via the `tnum` feature. Apply `font-feature-settings: 'tnum' 1` to tables, data grids, KPI cards, and any column where digits need to line up vertically. The `<DataTable>` component does this for cells by default; manual KPI displays still need it.
|
|
34
|
+
|
|
35
|
+
## Display surfaces
|
|
36
|
+
|
|
37
|
+
Display typography (hero headings and marketing pages) follows the brand register in [brand.md](brand.md), not product chrome. Do not import display treatment into application UI.
|
|
38
|
+
|
|
39
|
+
## Refusals
|
|
40
|
+
|
|
41
|
+
- "Use Space Grotesk for the H1" — Inter is the only sans face. Substitute Inter Bold at the same size and surface the swap.
|
|
42
|
+
- "Add letter spacing to the labels" — Seven labels use Inter at default tracking. Letter-spacing belongs to Display only, defined by the brand layer.
|
|
43
|
+
- "Use the system font as a fallback" — Inter is loaded via `next/font` or equivalent. The system fallback is for SSR flash mitigation, never the primary stack.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# UX writing
|
|
2
|
+
|
|
3
|
+
Seven's product chrome speaks Brazilian Portuguese. Developer-facing docs and code identifiers stay in English. The voice is direct, decisive, and concrete.
|
|
4
|
+
|
|
5
|
+
## Hard rules
|
|
6
|
+
|
|
7
|
+
- **Pt-BR for chrome.** Buttons, labels, menu items, navigation, table headers, breadcrumbs, tabs, status messages, empty states, toast text, error messages.
|
|
8
|
+
- **No European Portuguese vocabulary.** The detector ships a `pt-pt-vocab` rule that catches `ficheiro`, `telemóvel`, `ecrã`, `tu` (as a pronoun, not in code), and other catalogued pairs. Use the pt-BR equivalents.
|
|
9
|
+
- **Sentence case** across every chrome surface. Capitalize the first word and proper nouns; everything else lowercase. Acronyms stay uppercase.
|
|
10
|
+
- **No trailing periods** on buttons, labels, captions, badges, breadcrumbs, table column headers, menu items, tabs. Periods belong in body prose, never in chrome.
|
|
11
|
+
- **Imperative leads** for action buttons and menu items: `Procurar`, `Adicionar conta`, `Exportar relatório`, `Excluir item`. Avoid `Clique para`, `Você pode`, `Aqui você`.
|
|
12
|
+
|
|
13
|
+
## Voice
|
|
14
|
+
|
|
15
|
+
Direct, decisive, brazilian. Three qualities to hold:
|
|
16
|
+
|
|
17
|
+
- **Direct.** No `clique aqui`, no `aprenda mais sobre`. The label says what the action does.
|
|
18
|
+
- **Decisive.** No `talvez`, `poderia`, `seria possível`. If the system is suggesting an action, it commits to the suggestion. If it does not know, it asks.
|
|
19
|
+
- **Concrete.** A token name beats an adjective. `Salvo às 14:32` beats `Alterações salvas com sucesso`. The user already knows it was successful, the timestamp tells them when.
|
|
20
|
+
|
|
21
|
+
## Microcopy patterns
|
|
22
|
+
|
|
23
|
+
| Surface | Pattern | Example |
|
|
24
|
+
| ------------------- | -------------------------------------- | -------------------------------------------------- |
|
|
25
|
+
| Primary button | Verb + object, imperative | `Adicionar conta`, `Salvar alterações` |
|
|
26
|
+
| Secondary button | Verb only when context obvious | `Cancelar`, `Voltar` |
|
|
27
|
+
| Destructive button | Verb + object, no hedging | `Excluir conta` |
|
|
28
|
+
| Toast (success) | Past tense, short | `Conta criada` |
|
|
29
|
+
| Toast (error) | What broke + what to do | `Não foi possível salvar. Tente novamente.` |
|
|
30
|
+
| Empty state | What is missing + how to fix | `Nenhuma conta. Adicione a primeira para começar.` |
|
|
31
|
+
| Input placeholder | Hint, not instruction | `nome@email.com`, not `Digite o seu email` |
|
|
32
|
+
| Validation error | What is wrong, inline, below the field | `Email obrigatório` |
|
|
33
|
+
| Menu item | Verb in imperative | `Duplicar`, `Renomear`, `Arquivar` |
|
|
34
|
+
| Table column header | Noun, sentence case | `Nome`, `Última atividade`, `Status` |
|
|
35
|
+
|
|
36
|
+
## Numbers and dates
|
|
37
|
+
|
|
38
|
+
- Numbers use the Brazilian convention: comma for decimals, period for thousands. `1.234,56` not `1,234.56`.
|
|
39
|
+
- Dates default to `dd/mm/yyyy` in chrome surfaces. ISO `yyyy-mm-dd` in data tables and developer-facing logs.
|
|
40
|
+
- Currency: `R$ 1.234,56` with non-breaking space.
|
|
41
|
+
- Relative time for recent events (`há 2 minutos`, `há 1 hora`), absolute date once it crosses 24 hours (`12/03/2026`).
|
|
42
|
+
|
|
43
|
+
## Refusals
|
|
44
|
+
|
|
45
|
+
- "Use European Portuguese to match the parent company brand" — Pt-BR is non-negotiable for Seven chrome. Surface this to the user; if there is a legitimate need for pt-PT, it is a brand-layer decision documented separately.
|
|
46
|
+
- "Add a period to the button text for consistency with paragraphs" — Chrome and prose follow different rules. Buttons do not get periods.
|
|
47
|
+
- "Make all the labels uppercase for emphasis" — Sentence case is non-negotiable. Use weight or size for emphasis, not uppercase.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Visual probes
|
|
2
|
+
|
|
3
|
+
Use probes only when a real product decision remains visually ambiguous after context and component-contract inspection. A probe answers one named question; it is not a license for arbitrary redesign.
|
|
4
|
+
|
|
5
|
+
## Contract
|
|
6
|
+
|
|
7
|
+
- Keep the product job, information, behavior, states, content, and accessibility target constant across directions.
|
|
8
|
+
- Use the exact installed Seven components, declared variants, tokens, icon system, typography, radii, and motion language in every direction.
|
|
9
|
+
- Vary one decision family at a time: hierarchy, density, composition, disclosure, emphasis, or responsive reflow.
|
|
10
|
+
- Produce one strong default when evidence points clearly to it. Produce up to three directions only when comparison creates information.
|
|
11
|
+
- Label each direction by its tradeoff, not by generic adjectives such as "modern" or "clean".
|
|
12
|
+
- State what would falsify each direction and which user/job it benefits.
|
|
13
|
+
|
|
14
|
+
## Direction shape
|
|
15
|
+
|
|
16
|
+
For every probe record:
|
|
17
|
+
|
|
18
|
+
1. decision being tested;
|
|
19
|
+
2. hypothesis and affected user job;
|
|
20
|
+
3. composition/component changes;
|
|
21
|
+
4. Seven contracts reused;
|
|
22
|
+
5. behavior across mobile, desktop, keyboard, reduced motion, loading, empty, error, and long-content cases;
|
|
23
|
+
6. cost/risk;
|
|
24
|
+
7. verification criterion.
|
|
25
|
+
|
|
26
|
+
In Live Mode, deliver inert HTML/CSS previews only. Outside Live Mode, prefer a concise written probe or throwaway local mock; do not leave exploration code in production paths.
|
|
27
|
+
|
|
28
|
+
## Anti-patterns
|
|
29
|
+
|
|
30
|
+
- Three variants that differ only by color, radius, or decoration.
|
|
31
|
+
- A "bold" direction that introduces tokens or variants absent from Seven.
|
|
32
|
+
- Comparing different content/data while claiming to compare layout.
|
|
33
|
+
- Selecting the most visually novel direction without product evidence.
|
|
34
|
+
- Treating accepted browser DOM as source code.
|
|
35
|
+
|
|
36
|
+
Finish with one recommendation and the evidence that selects it. If no direction is defensible, return to `shape` rather than averaging them.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { spawnSync } from 'node:child_process'
|
|
5
|
+
import fs from 'node:fs'
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import { fileURLToPath } from 'node:url'
|
|
8
|
+
|
|
9
|
+
import { argValue, loadContext } from './load-context.mjs'
|
|
10
|
+
|
|
11
|
+
const UI_EXTENSIONS = new Set(['.css', '.html', '.js', '.jsx', '.less', '.mdx', '.scss', '.ts', '.tsx'])
|
|
12
|
+
const scriptsDirectory = path.dirname(fileURLToPath(import.meta.url))
|
|
13
|
+
|
|
14
|
+
function gitNames(root, args) {
|
|
15
|
+
const result = spawnSync('git', args, { cwd: root, encoding: 'utf8' })
|
|
16
|
+
if (result.status !== 0) return []
|
|
17
|
+
return result.stdout.split('\n').map((item) => item.trim()).filter(Boolean)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function changedUiFiles(root) {
|
|
21
|
+
const names = new Set([
|
|
22
|
+
...gitNames(root, ['diff', '--name-only', '--diff-filter=ACMR']),
|
|
23
|
+
...gitNames(root, ['diff', '--cached', '--name-only', '--diff-filter=ACMR']),
|
|
24
|
+
...gitNames(root, ['ls-files', '--others', '--exclude-standard']),
|
|
25
|
+
])
|
|
26
|
+
return [...names].filter((name) => UI_EXTENSIONS.has(path.extname(name).toLowerCase())).sort()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function latestReview(root) {
|
|
30
|
+
const directory = path.join(root, '.seven', 'reviews')
|
|
31
|
+
let names = []
|
|
32
|
+
try {
|
|
33
|
+
names = fs.readdirSync(directory).filter((name) => name.endsWith('.json'))
|
|
34
|
+
} catch {
|
|
35
|
+
return null
|
|
36
|
+
}
|
|
37
|
+
const candidates = names.map((name) => {
|
|
38
|
+
const filePath = path.join(directory, name)
|
|
39
|
+
try {
|
|
40
|
+
return { filePath, mtime: fs.statSync(filePath).mtimeMs, payload: JSON.parse(fs.readFileSync(filePath, 'utf8')) }
|
|
41
|
+
} catch {
|
|
42
|
+
return null
|
|
43
|
+
}
|
|
44
|
+
}).filter(Boolean).sort((left, right) => right.mtime - left.mtime)
|
|
45
|
+
if (!candidates[0]) return null
|
|
46
|
+
return {
|
|
47
|
+
path: path.relative(root, candidates[0].filePath).split(path.sep).join('/'),
|
|
48
|
+
createdAt: candidates[0].payload.createdAt || null,
|
|
49
|
+
score: candidates[0].payload.score ?? null,
|
|
50
|
+
p0: candidates[0].payload.summary?.p0 ?? 0,
|
|
51
|
+
p1: candidates[0].payload.summary?.p1 ?? 0,
|
|
52
|
+
target: candidates[0].payload.target || null,
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function scanTargets(context, changed) {
|
|
57
|
+
if (changed.length > 0) return { via: 'git-changes', targets: changed.slice(0, 40) }
|
|
58
|
+
const roots = Array.isArray(context.project?.sourceRoots) ? context.project.sourceRoots : ['src']
|
|
59
|
+
const existing = roots.filter((entry) => fs.existsSync(path.join(context.projectRoot, entry)))
|
|
60
|
+
return { via: 'source-roots', targets: existing.slice(0, 8) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function collectContextSignals(start = process.cwd(), { target = start } = {}) {
|
|
64
|
+
const context = await loadContext(start, { target })
|
|
65
|
+
const changed = changedUiFiles(context.projectRoot)
|
|
66
|
+
return {
|
|
67
|
+
schemaVersion: 1,
|
|
68
|
+
projectRoot: context.projectRoot,
|
|
69
|
+
target: path.resolve(target),
|
|
70
|
+
setup: {
|
|
71
|
+
hasProduct: context.hasProduct,
|
|
72
|
+
productPlaceholder: context.productPlaceholder,
|
|
73
|
+
hasRelease: Boolean(context.release),
|
|
74
|
+
register: context.register,
|
|
75
|
+
app: context.app?.id || null,
|
|
76
|
+
surface: context.surface?.id || null,
|
|
77
|
+
},
|
|
78
|
+
git: { changedFiles: changed },
|
|
79
|
+
critique: { latest: latestReview(context.projectRoot) },
|
|
80
|
+
scan: scanTargets(context, changed),
|
|
81
|
+
live: {
|
|
82
|
+
session: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'session.json')),
|
|
83
|
+
journal: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'journal.ndjson')),
|
|
84
|
+
extensionPathCommand: `node ${JSON.stringify(path.join(scriptsDirectory, 'run-seven.mjs'))} extension path`,
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function main(argv = process.argv) {
|
|
90
|
+
const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
|
|
91
|
+
const signals = await collectContextSignals(target, { target })
|
|
92
|
+
process.stdout.write(`${JSON.stringify(signals, null, 2)}\n`)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url))) await main()
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import fs from 'node:fs'
|
|
5
|
+
import path from 'node:path'
|
|
6
|
+
import { fileURLToPath } from 'node:url'
|
|
7
|
+
|
|
8
|
+
import { argValue, findRoot, loadContext } from './load-context.mjs'
|
|
9
|
+
|
|
10
|
+
const PRIORITIES = new Set(['P0', 'P1', 'P2', 'P3'])
|
|
11
|
+
const SENSITIVE_KEY = /(?:authorization|cookie|password|secret|token|api[-_]?key|session[-_]?id)/i
|
|
12
|
+
|
|
13
|
+
function slug(value) {
|
|
14
|
+
return String(value || 'review')
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.normalize('NFD')
|
|
17
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
18
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
19
|
+
.replace(/^-|-$/g, '')
|
|
20
|
+
.slice(0, 60) || 'review'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function assertNoSensitiveKeys(value, trail = []) {
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
value.forEach((entry, index) => assertNoSensitiveKeys(entry, [...trail, String(index)]))
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
if (!value || typeof value !== 'object') return
|
|
29
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
30
|
+
if (SENSITIVE_KEY.test(key)) throw new Error(`critique input contains a forbidden sensitive field: ${[...trail, key].join('.')}`)
|
|
31
|
+
assertNoSensitiveKeys(entry, [...trail, key])
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function validateReview(input) {
|
|
36
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('critique input must be a JSON object')
|
|
37
|
+
if (!Number.isFinite(input.score) || input.score < 0 || input.score > 100) throw new Error('critique score must be between 0 and 100')
|
|
38
|
+
if (!Array.isArray(input.findings)) throw new Error('critique findings must be an array')
|
|
39
|
+
for (const [index, finding] of input.findings.entries()) {
|
|
40
|
+
if (!finding || typeof finding !== 'object') throw new Error(`finding ${index + 1} must be an object`)
|
|
41
|
+
if (!PRIORITIES.has(finding.priority)) throw new Error(`finding ${index + 1} has invalid priority`)
|
|
42
|
+
for (const field of ['title', 'evidence', 'recommendation']) {
|
|
43
|
+
if (typeof finding[field] !== 'string' || !finding[field].trim()) throw new Error(`finding ${index + 1} requires ${field}`)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
assertNoSensitiveKeys(input)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readInput(inputPath) {
|
|
50
|
+
const text = inputPath === '-' ? fs.readFileSync(0, 'utf8') : fs.readFileSync(path.resolve(inputPath), 'utf8')
|
|
51
|
+
if (Buffer.byteLength(text) > 1_000_000) throw new Error('critique input exceeds 1 MB')
|
|
52
|
+
return JSON.parse(text)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function counts(findings) {
|
|
56
|
+
const summary = { p0: 0, p1: 0, p2: 0, p3: 0 }
|
|
57
|
+
for (const finding of findings) summary[finding.priority.toLowerCase()]++
|
|
58
|
+
return summary
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function markdown(review) {
|
|
62
|
+
const lines = [
|
|
63
|
+
`# Seven critique — ${review.target}`,
|
|
64
|
+
'',
|
|
65
|
+
`- Created: ${review.createdAt}`,
|
|
66
|
+
`- Seven release: ${review.release?.sevenVersion || 'unknown'}`,
|
|
67
|
+
`- Surface: ${review.surface || 'unresolved'}`,
|
|
68
|
+
`- Score: ${review.score}/100`,
|
|
69
|
+
`- Priorities: P0 ${review.summary.p0}, P1 ${review.summary.p1}, P2 ${review.summary.p2}, P3 ${review.summary.p3}`,
|
|
70
|
+
'',
|
|
71
|
+
]
|
|
72
|
+
if (review.strengths?.length) {
|
|
73
|
+
lines.push('## Strengths to preserve', '')
|
|
74
|
+
for (const strength of review.strengths) lines.push(`- ${strength}`)
|
|
75
|
+
lines.push('')
|
|
76
|
+
}
|
|
77
|
+
lines.push('## Findings', '')
|
|
78
|
+
if (review.findings.length === 0) lines.push('No active findings.', '')
|
|
79
|
+
for (const finding of review.findings) {
|
|
80
|
+
lines.push(`### ${finding.priority} — ${finding.title}`, '')
|
|
81
|
+
lines.push(`**Evidence:** ${finding.evidence}`, '')
|
|
82
|
+
if (finding.impact) lines.push(`**Impact:** ${finding.impact}`, '')
|
|
83
|
+
if (finding.rootCause) lines.push(`**Root cause:** ${finding.rootCause}`, '')
|
|
84
|
+
lines.push(`**Direction:** ${finding.recommendation}`, '')
|
|
85
|
+
if (finding.verification) lines.push(`**Verify:** ${finding.verification}`, '')
|
|
86
|
+
}
|
|
87
|
+
if (review.verification) lines.push('## Verification evidence', '', review.verification, '')
|
|
88
|
+
lines.push('This review is evidence, not a visual authority. The installed Seven release remains canonical.', '')
|
|
89
|
+
return lines.join('\n')
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function atomicWrite(filePath, content) {
|
|
93
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true })
|
|
94
|
+
const temporary = `${filePath}.tmp-${process.pid}-${Date.now()}`
|
|
95
|
+
fs.writeFileSync(temporary, content)
|
|
96
|
+
fs.renameSync(temporary, filePath)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export async function writeReview(start, target, input) {
|
|
100
|
+
validateReview(input)
|
|
101
|
+
const root = findRoot(start)
|
|
102
|
+
const context = await loadContext(root, { target })
|
|
103
|
+
let resolvedTarget = target
|
|
104
|
+
if (!/^https?:\/\//i.test(target)) {
|
|
105
|
+
const absolute = path.resolve(root, target)
|
|
106
|
+
const relative = path.relative(root, absolute)
|
|
107
|
+
if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('critique target escapes the Seven project root')
|
|
108
|
+
resolvedTarget = relative.split(path.sep).join('/') || '.'
|
|
109
|
+
}
|
|
110
|
+
const createdAt = new Date().toISOString()
|
|
111
|
+
const review = {
|
|
112
|
+
schemaVersion: 1,
|
|
113
|
+
createdAt,
|
|
114
|
+
target: resolvedTarget,
|
|
115
|
+
surface: context.surface?.id || null,
|
|
116
|
+
release: context.release ? {
|
|
117
|
+
sevenVersion: context.release.sevenVersion,
|
|
118
|
+
skillVersion: context.release.skillVersion,
|
|
119
|
+
registrySha256: context.release.registrySha256,
|
|
120
|
+
} : null,
|
|
121
|
+
score: input.score,
|
|
122
|
+
summary: counts(input.findings),
|
|
123
|
+
renderedEvidence: input.renderedEvidence || null,
|
|
124
|
+
mechanicalEvidence: input.mechanicalEvidence || null,
|
|
125
|
+
strengths: Array.isArray(input.strengths) ? input.strengths : [],
|
|
126
|
+
findings: input.findings,
|
|
127
|
+
verification: input.verification || null,
|
|
128
|
+
}
|
|
129
|
+
const stamp = createdAt.replace(/[:.]/g, '-').replace(/-000Z$/, 'Z')
|
|
130
|
+
const base = path.join(root, '.seven', 'reviews', `${stamp}-${slug(context.surface?.id || resolvedTarget)}`)
|
|
131
|
+
atomicWrite(`${base}.json`, `${JSON.stringify(review, null, 2)}\n`)
|
|
132
|
+
atomicWrite(`${base}.md`, markdown(review))
|
|
133
|
+
return {
|
|
134
|
+
review,
|
|
135
|
+
json: path.relative(root, `${base}.json`).split(path.sep).join('/'),
|
|
136
|
+
markdown: path.relative(root, `${base}.md`).split(path.sep).join('/'),
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export async function main(argv = process.argv) {
|
|
141
|
+
const action = argv[2]
|
|
142
|
+
if (action !== 'write') throw new Error('usage: critique-storage.mjs write --target <target> --input <review.json|->')
|
|
143
|
+
const target = argValue('--target', argv)
|
|
144
|
+
const inputPath = argValue('--input', argv)
|
|
145
|
+
if (!target || !inputPath) throw new Error('write requires --target and --input')
|
|
146
|
+
const result = await writeReview(process.cwd(), target, readInput(inputPath))
|
|
147
|
+
process.stdout.write(`${JSON.stringify({ json: result.json, markdown: result.markdown, summary: result.review.summary }, null, 2)}\n`)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url))) {
|
|
151
|
+
main().catch((error) => {
|
|
152
|
+
process.stderr.write(`${error.message}\n`)
|
|
153
|
+
process.exitCode = 1
|
|
154
|
+
})
|
|
155
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// ETUS Digital — Seven consumer context adapter.
|
|
4
|
+
|
|
5
|
+
import fs from 'node:fs'
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import { createRequire } from 'node:module'
|
|
8
|
+
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
9
|
+
|
|
10
|
+
import { checkForUpdate } from './update-check.mjs'
|
|
11
|
+
|
|
12
|
+
export function argValue(name, argv = process.argv) {
|
|
13
|
+
const direct = argv.find((arg) => arg.startsWith(`${name}=`))
|
|
14
|
+
if (direct) return direct.slice(name.length + 1)
|
|
15
|
+
const index = argv.indexOf(name)
|
|
16
|
+
return index >= 0 ? argv[index + 1] : null
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function findRoot(start) {
|
|
20
|
+
let current = path.resolve(start)
|
|
21
|
+
try {
|
|
22
|
+
if (fs.statSync(current).isFile()) current = path.dirname(current)
|
|
23
|
+
} catch {}
|
|
24
|
+
const fallbackRoot = current
|
|
25
|
+
while (true) {
|
|
26
|
+
if (fs.existsSync(path.join(current, '.seven', 'project.yml'))) return current
|
|
27
|
+
if (fs.existsSync(path.join(current, 'seven.json'))) return current
|
|
28
|
+
const parent = path.dirname(current)
|
|
29
|
+
if (parent === current) break
|
|
30
|
+
current = parent
|
|
31
|
+
}
|
|
32
|
+
return fallbackRoot
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function loadFromInstalledRuntime(root, target) {
|
|
36
|
+
try {
|
|
37
|
+
const require = createRequire(path.join(root, 'package.json'))
|
|
38
|
+
const manifest = require.resolve('@etus/seven/package.json')
|
|
39
|
+
const moduleUrl = pathToFileURL(path.join(path.dirname(manifest), 'lib', 'context.mjs')).href
|
|
40
|
+
const runtime = await import(moduleUrl)
|
|
41
|
+
return runtime.loadConsumerContext(root, { target })
|
|
42
|
+
} catch (error) {
|
|
43
|
+
return { runtimeError: error instanceof Error ? error.message : String(error) }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function fallback(root, target, runtimeError) {
|
|
48
|
+
const productPath = path.join(root, 'PRODUCT.md')
|
|
49
|
+
const product = fs.existsSync(productPath) ? fs.readFileSync(productPath, 'utf8') : null
|
|
50
|
+
let release = null
|
|
51
|
+
try {
|
|
52
|
+
release = JSON.parse(fs.readFileSync(path.join(root, '.seven', 'release.lock.json'), 'utf8'))
|
|
53
|
+
} catch {}
|
|
54
|
+
return {
|
|
55
|
+
schemaVersion: 1,
|
|
56
|
+
projectRoot: root,
|
|
57
|
+
target: path.resolve(target),
|
|
58
|
+
hasProduct: Boolean(product),
|
|
59
|
+
product,
|
|
60
|
+
productPath: product ? 'PRODUCT.md' : null,
|
|
61
|
+
productPlaceholder: !product || product.trim().length < 200 || /\b(?:TODO|TBD|placeholder)\b/i.test(product),
|
|
62
|
+
register: null,
|
|
63
|
+
project: null,
|
|
64
|
+
release,
|
|
65
|
+
surface: null,
|
|
66
|
+
runtimeAvailable: false,
|
|
67
|
+
runtimeError,
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function loadContext(start = process.cwd(), { target = start } = {}) {
|
|
72
|
+
const root = findRoot(start)
|
|
73
|
+
const loaded = await loadFromInstalledRuntime(root, target)
|
|
74
|
+
return loaded.runtimeError ? fallback(root, target, loaded.runtimeError) : loaded
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function contextForAgent(context) {
|
|
78
|
+
const artifacts = context.release?.artifacts
|
|
79
|
+
if (!artifacts || typeof artifacts !== 'object') return context
|
|
80
|
+
const { artifacts: _artifacts, ...release } = context.release
|
|
81
|
+
const entries = Object.values(artifacts)
|
|
82
|
+
return {
|
|
83
|
+
...context,
|
|
84
|
+
release: {
|
|
85
|
+
...release,
|
|
86
|
+
artifactSummary: {
|
|
87
|
+
total: entries.length,
|
|
88
|
+
managed: entries.filter((entry) => entry?.kind === 'managed').length,
|
|
89
|
+
scaffold: entries.filter((entry) => entry?.kind === 'scaffold').length,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function main(argv = process.argv) {
|
|
96
|
+
const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
|
|
97
|
+
const context = await loadContext(target, { target })
|
|
98
|
+
const update = await checkForUpdate(context.release?.sevenVersion || null)
|
|
99
|
+
process.stdout.write(`${JSON.stringify({ ...contextForAgent(context), update }, null, 2)}\n`)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function isCliEntry() {
|
|
103
|
+
if (!process.argv[1]) return false
|
|
104
|
+
try {
|
|
105
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
|
|
106
|
+
} catch {
|
|
107
|
+
return false
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (isCliEntry()) await main()
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
// ETUS Digital — package-manager-independent Seven CLI runner.
|
|
4
|
+
|
|
5
|
+
import fs from 'node:fs'
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import { spawnSync } from 'node:child_process'
|
|
8
|
+
import { createRequire } from 'node:module'
|
|
9
|
+
import { fileURLToPath } from 'node:url'
|
|
10
|
+
|
|
11
|
+
import { findRoot } from './load-context.mjs'
|
|
12
|
+
|
|
13
|
+
export function resolveSevenCli(start = process.cwd()) {
|
|
14
|
+
const root = findRoot(start)
|
|
15
|
+
const require = createRequire(path.join(root, 'package.json'))
|
|
16
|
+
const manifestPath = require.resolve('@etus/seven/package.json')
|
|
17
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
|
|
18
|
+
const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.seven
|
|
19
|
+
if (!bin) throw new Error(`@etus/seven at ${manifestPath} does not declare the seven binary`)
|
|
20
|
+
return {
|
|
21
|
+
binPath: path.resolve(path.dirname(manifestPath), bin),
|
|
22
|
+
root,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function runSeven(argv = process.argv.slice(2), start = process.cwd()) {
|
|
27
|
+
if (argv.length === 0) throw new Error('usage: run-seven.mjs <seven-command> [arguments]')
|
|
28
|
+
const { binPath, root } = resolveSevenCli(start)
|
|
29
|
+
const result = spawnSync(process.execPath, [binPath, ...argv], {
|
|
30
|
+
cwd: root,
|
|
31
|
+
env: process.env,
|
|
32
|
+
stdio: 'inherit',
|
|
33
|
+
})
|
|
34
|
+
if (result.error) throw result.error
|
|
35
|
+
return result.status ?? 1
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function isCliEntry() {
|
|
39
|
+
if (!process.argv[1]) return false
|
|
40
|
+
try {
|
|
41
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
|
|
42
|
+
} catch {
|
|
43
|
+
return false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (isCliEntry()) process.exitCode = runSeven()
|