@etus/seven-skill 0.1.0-beta.2 → 0.1.0-beta.4
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 +161 -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 +7 -0
- package/.agents/skills/seven/reference/document.md +36 -0
- package/.agents/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.agents/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.agents/skills/seven/scripts/load-context.mjs +93 -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 +128 -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 +152 -0
- 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 +7 -0
- package/.claude/skills/seven/reference/document.md +36 -0
- package/.claude/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.claude/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.claude/skills/seven/scripts/load-context.mjs +68 -59
- 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 +161 -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 +7 -0
- package/.cursor/skills/seven/reference/document.md +36 -0
- package/.cursor/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.cursor/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.cursor/skills/seven/scripts/load-context.mjs +93 -0
- package/.cursor/skills/seven/scripts/update-check.mjs +120 -0
- package/.gemini/skills/seven/SKILL.md +160 -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 +7 -0
- package/.gemini/skills/seven/reference/document.md +36 -0
- package/.gemini/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.gemini/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.gemini/skills/seven/scripts/load-context.mjs +93 -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 +167 -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 +7 -0
- package/.grok/skills/seven/reference/document.md +36 -0
- package/.grok/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.grok/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.grok/skills/seven/scripts/load-context.mjs +93 -0
- package/.grok/skills/seven/scripts/update-check.mjs +120 -0
- package/.kiro/skills/seven/SKILL.md +161 -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 +7 -0
- package/.kiro/skills/seven/reference/document.md +36 -0
- package/.kiro/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.kiro/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.kiro/skills/seven/scripts/load-context.mjs +93 -0
- package/.kiro/skills/seven/scripts/update-check.mjs +120 -0
- package/.opencode/skills/seven/SKILL.md +167 -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 +7 -0
- package/.opencode/skills/seven/reference/document.md +36 -0
- package/.opencode/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.opencode/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.opencode/skills/seven/scripts/load-context.mjs +93 -0
- package/.opencode/skills/seven/scripts/update-check.mjs +120 -0
- package/.pi/skills/seven/SKILL.md +165 -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 +7 -0
- package/.pi/skills/seven/reference/document.md +36 -0
- package/.pi/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.pi/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.pi/skills/seven/scripts/load-context.mjs +93 -0
- package/.pi/skills/seven/scripts/update-check.mjs +120 -0
- package/.qoder/skills/seven/SKILL.md +167 -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 +7 -0
- package/.qoder/skills/seven/reference/document.md +36 -0
- package/.qoder/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.qoder/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.qoder/skills/seven/scripts/load-context.mjs +93 -0
- package/.qoder/skills/seven/scripts/update-check.mjs +120 -0
- package/.rovodev/skills/seven/SKILL.md +167 -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 +7 -0
- package/.rovodev/skills/seven/reference/document.md +36 -0
- package/.rovodev/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.rovodev/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.rovodev/skills/seven/scripts/load-context.mjs +93 -0
- package/.rovodev/skills/seven/scripts/update-check.mjs +120 -0
- package/.trae/skills/seven/SKILL.md +163 -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 +7 -0
- package/.trae/skills/seven/reference/document.md +36 -0
- package/.trae/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.trae/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.trae/skills/seven/scripts/load-context.mjs +93 -0
- package/.trae/skills/seven/scripts/update-check.mjs +120 -0
- package/.trae-cn/skills/seven/SKILL.md +163 -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 +7 -0
- package/.trae-cn/skills/seven/reference/document.md +36 -0
- package/.trae-cn/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.trae-cn/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.trae-cn/skills/seven/scripts/load-context.mjs +93 -0
- package/.trae-cn/skills/seven/scripts/update-check.mjs +120 -0
- package/.vibe/skills/seven/SKILL.md +166 -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 +7 -0
- package/.vibe/skills/seven/reference/document.md +36 -0
- package/.vibe/skills/seven/reference/evaluations.md +38 -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 +38 -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/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 +94 -0
- package/.vibe/skills/seven/scripts/critique-storage.mjs +155 -0
- package/.vibe/skills/seven/scripts/load-context.mjs +93 -0
- package/.vibe/skills/seven/scripts/update-check.mjs +120 -0
- package/README.md +51 -90
- package/cli/bin/seven.mjs +0 -0
- package/cli/engine/browser/injected/index.mjs +62 -13
- package/cli/engine/detect-antipatterns-browser.js +4743 -23
- 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 +4029 -4
- 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 +18 -7
|
@@ -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,94 @@
|
|
|
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
|
+
|
|
13
|
+
function gitNames(root, args) {
|
|
14
|
+
const result = spawnSync('git', args, { cwd: root, encoding: 'utf8' })
|
|
15
|
+
if (result.status !== 0) return []
|
|
16
|
+
return result.stdout.split('\n').map((item) => item.trim()).filter(Boolean)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function changedUiFiles(root) {
|
|
20
|
+
const names = new Set([
|
|
21
|
+
...gitNames(root, ['diff', '--name-only', '--diff-filter=ACMR']),
|
|
22
|
+
...gitNames(root, ['diff', '--cached', '--name-only', '--diff-filter=ACMR']),
|
|
23
|
+
...gitNames(root, ['ls-files', '--others', '--exclude-standard']),
|
|
24
|
+
])
|
|
25
|
+
return [...names].filter((name) => UI_EXTENSIONS.has(path.extname(name).toLowerCase())).sort()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function latestReview(root) {
|
|
29
|
+
const directory = path.join(root, '.seven', 'reviews')
|
|
30
|
+
let names = []
|
|
31
|
+
try {
|
|
32
|
+
names = fs.readdirSync(directory).filter((name) => name.endsWith('.json'))
|
|
33
|
+
} catch {
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
const candidates = names.map((name) => {
|
|
37
|
+
const filePath = path.join(directory, name)
|
|
38
|
+
try {
|
|
39
|
+
return { filePath, mtime: fs.statSync(filePath).mtimeMs, payload: JSON.parse(fs.readFileSync(filePath, 'utf8')) }
|
|
40
|
+
} catch {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
}).filter(Boolean).sort((left, right) => right.mtime - left.mtime)
|
|
44
|
+
if (!candidates[0]) return null
|
|
45
|
+
return {
|
|
46
|
+
path: path.relative(root, candidates[0].filePath).split(path.sep).join('/'),
|
|
47
|
+
createdAt: candidates[0].payload.createdAt || null,
|
|
48
|
+
score: candidates[0].payload.score ?? null,
|
|
49
|
+
p0: candidates[0].payload.summary?.p0 ?? 0,
|
|
50
|
+
p1: candidates[0].payload.summary?.p1 ?? 0,
|
|
51
|
+
target: candidates[0].payload.target || null,
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function scanTargets(context, changed) {
|
|
56
|
+
if (changed.length > 0) return { via: 'git-changes', targets: changed.slice(0, 40) }
|
|
57
|
+
const roots = Array.isArray(context.project?.sourceRoots) ? context.project.sourceRoots : ['src']
|
|
58
|
+
const existing = roots.filter((entry) => fs.existsSync(path.join(context.projectRoot, entry)))
|
|
59
|
+
return { via: 'source-roots', targets: existing.slice(0, 8) }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function collectContextSignals(start = process.cwd(), { target = start } = {}) {
|
|
63
|
+
const context = await loadContext(start, { target })
|
|
64
|
+
const changed = changedUiFiles(context.projectRoot)
|
|
65
|
+
return {
|
|
66
|
+
schemaVersion: 1,
|
|
67
|
+
projectRoot: context.projectRoot,
|
|
68
|
+
target: path.resolve(target),
|
|
69
|
+
setup: {
|
|
70
|
+
hasProduct: context.hasProduct,
|
|
71
|
+
productPlaceholder: context.productPlaceholder,
|
|
72
|
+
hasRelease: Boolean(context.release),
|
|
73
|
+
register: context.register,
|
|
74
|
+
app: context.app?.id || null,
|
|
75
|
+
surface: context.surface?.id || null,
|
|
76
|
+
},
|
|
77
|
+
git: { changedFiles: changed },
|
|
78
|
+
critique: { latest: latestReview(context.projectRoot) },
|
|
79
|
+
scan: scanTargets(context, changed),
|
|
80
|
+
live: {
|
|
81
|
+
session: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'session.json')),
|
|
82
|
+
journal: fs.existsSync(path.join(context.projectRoot, '.seven', 'live', 'journal.ndjson')),
|
|
83
|
+
extensionPathCommand: 'seven extension path',
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export async function main(argv = process.argv) {
|
|
89
|
+
const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
|
|
90
|
+
const signals = await collectContextSignals(target, { target })
|
|
91
|
+
process.stdout.write(`${JSON.stringify(signals, null, 2)}\n`)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
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,93 @@
|
|
|
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 async function main(argv = process.argv) {
|
|
78
|
+
const target = argValue('--target', argv) || process.env.SEVEN_TARGET || process.cwd()
|
|
79
|
+
const context = await loadContext(target, { target })
|
|
80
|
+
const update = await checkForUpdate(context.release?.sevenVersion || null)
|
|
81
|
+
process.stdout.write(`${JSON.stringify({ ...context, update }, null, 2)}\n`)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function isCliEntry() {
|
|
85
|
+
if (!process.argv[1]) return false
|
|
86
|
+
try {
|
|
87
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(process.argv[1])
|
|
88
|
+
} catch {
|
|
89
|
+
return false
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (isCliEntry()) await main()
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import fs from 'node:fs'
|
|
5
|
+
import os from 'node:os'
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
|
|
8
|
+
const DAY_MS = 24 * 60 * 60 * 1000
|
|
9
|
+
const WEEK_MS = 7 * DAY_MS
|
|
10
|
+
|
|
11
|
+
function cachePath(env = process.env) {
|
|
12
|
+
return env.SEVEN_UPDATE_CACHE || path.join(os.homedir(), '.seven', 'update-check.json')
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function readCache(env) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(fs.readFileSync(cachePath(env), 'utf8'))
|
|
18
|
+
return parsed && typeof parsed === 'object' ? parsed : {}
|
|
19
|
+
} catch {
|
|
20
|
+
return {}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function writeCache(cache, env) {
|
|
25
|
+
try {
|
|
26
|
+
const destination = cachePath(env)
|
|
27
|
+
fs.mkdirSync(path.dirname(destination), { recursive: true })
|
|
28
|
+
fs.writeFileSync(destination, `${JSON.stringify(cache, null, 2)}\n`)
|
|
29
|
+
} catch {
|
|
30
|
+
// Update discovery is best-effort and must never block the UI workflow.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function semverParts(value) {
|
|
35
|
+
const match = String(value || '').trim().match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/)
|
|
36
|
+
if (!match) return null
|
|
37
|
+
return {
|
|
38
|
+
core: [Number(match[1]), Number(match[2]), Number(match[3])],
|
|
39
|
+
prerelease: match[4] ? match[4].split('.') : [],
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function compareIdentifier(left, right) {
|
|
44
|
+
const leftNumber = /^\d+$/.test(left) ? Number(left) : null
|
|
45
|
+
const rightNumber = /^\d+$/.test(right) ? Number(right) : null
|
|
46
|
+
if (leftNumber != null && rightNumber != null) return Math.sign(leftNumber - rightNumber)
|
|
47
|
+
if (leftNumber != null) return -1
|
|
48
|
+
if (rightNumber != null) return 1
|
|
49
|
+
return left.localeCompare(right)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function compareSemver(left, right) {
|
|
53
|
+
const a = semverParts(left)
|
|
54
|
+
const b = semverParts(right)
|
|
55
|
+
if (!a || !b) return 0
|
|
56
|
+
for (let index = 0; index < 3; index++) {
|
|
57
|
+
if (a.core[index] !== b.core[index]) return Math.sign(a.core[index] - b.core[index])
|
|
58
|
+
}
|
|
59
|
+
if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1
|
|
60
|
+
if (b.prerelease.length === 0 && a.prerelease.length > 0) return -1
|
|
61
|
+
for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index++) {
|
|
62
|
+
if (a.prerelease[index] == null) return -1
|
|
63
|
+
if (b.prerelease[index] == null) return 1
|
|
64
|
+
const compared = compareIdentifier(a.prerelease[index], b.prerelease[index])
|
|
65
|
+
if (compared !== 0) return compared
|
|
66
|
+
}
|
|
67
|
+
return 0
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function fetchLatest(env) {
|
|
71
|
+
const registry = (env.SEVEN_UPDATE_REGISTRY || 'https://registry.npmjs.org').replace(/\/$/, '')
|
|
72
|
+
const controller = new AbortController()
|
|
73
|
+
const timeout = setTimeout(() => controller.abort(), 1500)
|
|
74
|
+
try {
|
|
75
|
+
const response = await fetch(`${registry}/%40etus%2Fseven/latest`, {
|
|
76
|
+
headers: { accept: 'application/json' },
|
|
77
|
+
signal: controller.signal,
|
|
78
|
+
})
|
|
79
|
+
if (!response.ok) return null
|
|
80
|
+
const payload = await response.json()
|
|
81
|
+
return typeof payload?.version === 'string' ? payload.version : null
|
|
82
|
+
} catch {
|
|
83
|
+
return null
|
|
84
|
+
} finally {
|
|
85
|
+
clearTimeout(timeout)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function checkForUpdate(currentVersion, { env = process.env, now = Date.now() } = {}) {
|
|
90
|
+
if (!currentVersion || env.SEVEN_NO_UPDATE_CHECK) return null
|
|
91
|
+
const cache = readCache(env)
|
|
92
|
+
const fresh = typeof cache.checkedAt === 'number' && now - cache.checkedAt < DAY_MS
|
|
93
|
+
let latestVersion = fresh ? cache.latestVersion : await fetchLatest(env)
|
|
94
|
+
if (!latestVersion) latestVersion = cache.latestVersion || null
|
|
95
|
+
if (!fresh && latestVersion) {
|
|
96
|
+
cache.checkedAt = now
|
|
97
|
+
cache.latestVersion = latestVersion
|
|
98
|
+
}
|
|
99
|
+
if (!latestVersion) return null
|
|
100
|
+
|
|
101
|
+
const available = compareSemver(latestVersion, currentVersion) > 0
|
|
102
|
+
const notify = available && (
|
|
103
|
+
cache.notifiedVersion !== latestVersion ||
|
|
104
|
+
typeof cache.notifiedAt !== 'number' ||
|
|
105
|
+
now - cache.notifiedAt >= WEEK_MS
|
|
106
|
+
)
|
|
107
|
+
if (notify) {
|
|
108
|
+
cache.notifiedVersion = latestVersion
|
|
109
|
+
cache.notifiedAt = now
|
|
110
|
+
}
|
|
111
|
+
writeCache(cache, env)
|
|
112
|
+
return {
|
|
113
|
+
package: '@etus/seven',
|
|
114
|
+
currentVersion,
|
|
115
|
+
latestVersion,
|
|
116
|
+
available,
|
|
117
|
+
notify,
|
|
118
|
+
command: `pnpm add -D @etus/seven@${latestVersion} && pnpm exec seven update`,
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seven-asset-producer
|
|
3
|
+
description: Produces or prepares approved UI imagery and reusable visual assets without redesigning the direction or baking Seven chrome into raster files.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
+
model: inherit
|
|
6
|
+
effort: medium
|
|
7
|
+
maxTurns: 12
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Seven Asset Producer
|
|
11
|
+
|
|
12
|
+
You prepare production assets from an approved brief or reference. You do not choose a new visual direction and you do not edit application implementation code.
|
|
13
|
+
|
|
14
|
+
## Input contract
|
|
15
|
+
|
|
16
|
+
Require the reference or brief, output directory, visual role, target dimensions/aspect ratio, transparency needs, allowed generation/editing tool, provenance/license constraints, and an avoid list. Missing source or output directory blocks work; choose conservative format/compression defaults for other omissions and report them.
|
|
17
|
+
|
|
18
|
+
## Classify every requested visual
|
|
19
|
+
|
|
20
|
+
- `produce`: requires approved image generation, editing, cleanup, cutout, or reconstruction.
|
|
21
|
+
- `direct`: an existing licensed, sufficiently large source needs only crop, naming, or compression.
|
|
22
|
+
- `semantic`: must remain HTML, Seven components, CSS, Lucide/SVG, canvas, or chart code.
|
|
23
|
+
|
|
24
|
+
Controls, UI copy, navigation, charts, data widgets, cards, app frames, logos/wordmarks with vector sources, icons available in Lucide, and full interface screenshots are semantic by default. Do not rasterize them to imitate a mock.
|
|
25
|
+
|
|
26
|
+
## Production rules
|
|
27
|
+
|
|
28
|
+
1. Preserve the approved subject, composition, camera, silhouette, material, palette role, and lighting. Do not add objects or “improve” the concept.
|
|
29
|
+
2. Keep radius, border, shadow, perspective, captions, responsive crop, and layout in code when the implementation can own them.
|
|
30
|
+
3. Remove baked UI text, buttons, labels, mock chrome, watermarks, letterboxing, and empty padding unless explicitly intrinsic to the asset.
|
|
31
|
+
4. Prefer WebP for opaque photographic/texture assets, PNG for true-alpha cutouts, and SVG only for authored vector work. Produce at target density, normally 2× display size.
|
|
32
|
+
5. Use a harness-native image generation/editing capability when available and explicitly authorized. Never request, read, log, or store a consumer API key. If no approved capability exists, return `blocked`; do not invent an HTTP fallback.
|
|
33
|
+
6. Keep sources/references in a sibling review directory and shipping outputs alone in the production directory.
|
|
34
|
+
7. Record provenance, license, generation/edit history, prompt when applicable, dimensions, format, alt-text recommendation, and QA result.
|
|
35
|
+
|
|
36
|
+
## QA and output
|
|
37
|
+
|
|
38
|
+
Compare every output to the approved reference at actual display crop. Reject unwanted text/chrome, low resolution, wrong perspective, haloed transparency, visual drift, or missing provenance. Return a manifest grouped by `produce`, `direct`, and `semantic`, followed by `execution_order`, `blockers`, and `assumptions`. `qa_status` is `accepted`, `needs_parent_review`, or `blocked`.
|
|
39
|
+
|
|
40
|
+
Do not modify application code, the approved reference, Seven tokens, or component contracts.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seven-finish-reviewer
|
|
3
|
+
description: Reviews a supposedly finished Seven UI with fresh attention against product context, the exact release contract, rendered evidence, and completion criteria; never edits.
|
|
4
|
+
tools: Read, Bash, Glob, Grep
|
|
5
|
+
model: inherit
|
|
6
|
+
effort: high
|
|
7
|
+
maxTurns: 12
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Seven Finish Reviewer
|
|
11
|
+
|
|
12
|
+
You are an independent final reviewer. You do not edit files. The parent agent owns fixes.
|
|
13
|
+
|
|
14
|
+
## Input contract
|
|
15
|
+
|
|
16
|
+
Expect the original request and confirmed decisions, target/source paths, `PRODUCT.md`, matched surface brief, release lock, component/variant inventory, changed-file list, latest Seven check output, tests, and rendered screenshots or a running URL at relevant viewports. If a material input is absent, name it rather than guessing.
|
|
17
|
+
|
|
18
|
+
## Review order
|
|
19
|
+
|
|
20
|
+
1. **Context and scope:** the implementation satisfies the stated product job without unrelated redesign; required context exists and no consumer `DESIGN.md` overrides Seven.
|
|
21
|
+
2. **Release contract:** every primitive, variant, token, icon, and motion value belongs to the exact installed Seven release. Missing contracts are surfaced, not locally invented.
|
|
22
|
+
3. **Rendered task:** primary action, reading order, density, alignment, responsive behavior, content extremes, and product specificity hold at the required viewports/themes.
|
|
23
|
+
4. **States and access:** loading, empty, error, success, disabled, permissions, keyboard, focus, accessible names, contrast, zoom, and reduced motion are complete.
|
|
24
|
+
5. **Truth and persistence:** no invented claims or fake production data; generated assets are labeled/provenanced; the latest critique and documentation reflect the actual target where required.
|
|
25
|
+
6. **Evidence:** focused tests and `seven check` cover every changed UI file. Do not rerun a redundant detector pass unless the supplied result is stale or missing.
|
|
26
|
+
|
|
27
|
+
## Output contract
|
|
28
|
+
|
|
29
|
+
Return exactly four sections:
|
|
30
|
+
|
|
31
|
+
- `contract`: pass/fail with exact release/component/context discrepancies;
|
|
32
|
+
- `rendered`: the strongest unresolved rendered/state issue, or `reached`;
|
|
33
|
+
- `material_fixes`: at most eight ordered one-line fixes, each tied to evidence and a verification criterion;
|
|
34
|
+
- `keep`: one line naming what must not be diluted while fixing.
|
|
35
|
+
|
|
36
|
+
No praise, no vague score, no edits, and no summary prose outside those sections.
|