From d75b3b85d3896d388bb44cd14f7caed3260903e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 14 May 2026 09:22:45 +0300 Subject: [PATCH] =?UTF-8?q?feat(graph):=20radial-sector=20layout=20?= =?UTF-8?q?=E2=80=94=206=20=D0=BA=D0=BE=D0=BB=D0=B5=D1=86=20=C3=97=204=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B0=20(workflow/UI/infra?= =?UTF-8?q?/data)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/automation-graph.html | 174 ++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 82 deletions(-) diff --git a/docs/automation-graph.html b/docs/automation-graph.html index a52b542d..741ac147 100644 --- a/docs/automation-graph.html +++ b/docs/automation-graph.html @@ -97,97 +97,107 @@ // ════════════════════════════════════════════════════ // SECTION 1: NODES // ════════════════════════════════════════════════════ + +// Радиально-секторная компоновка. +// Сектора (по 90°): N=workflow (0–90), E=UI (90–180), S=infra (180–270), W=data/RLS (270–360). +const RADII = [0, 220, 400, 600, 800, 1000, 1180]; +function pos(ring, angleDeg) { + const r = RADII[ring]; + const a = angleDeg * Math.PI / 180; + return { x: Math.round(r * Math.cos(a)), y: Math.round(r * Math.sin(a)) }; +} + const NODES = [ - // ── ПРАВИЛА (4) ────────────────────────────────── - { id: 'pravila', label: 'Pravila v1.13', group: 'rules', size: 38 }, - { id: 'claude_md', label: 'CLAUDE.md v1.92', group: 'rules', size: 34 }, - { id: 'psr_v1', label: 'PSR_v1 v2.1', group: 'rules', size: 32 }, - { id: 'tooling', label: 'Tooling v1.17', group: 'rules', size: 30 }, + // ── ПРАВИЛА (4) ── центр + первое кольцо ─────── + { id: 'pravila', label: 'Pravila v1.13', group: 'rules', size: 38, ring: 0, ...pos(0, 0) }, + { id: 'claude_md', label: 'CLAUDE.md v1.92', group: 'rules', size: 34, ring: 1, ...pos(1, 30) }, + { id: 'psr_v1', label: 'PSR_v1 v2.1', group: 'rules', size: 32, ring: 1, ...pos(1, 150) }, + { id: 'tooling', label: 'Tooling v1.17', group: 'rules', size: 30, ring: 1, ...pos(1, 270) }, - // ── ПЛАГИНЫ (5) ────────────────────────────────── - { id: 'superpowers', label: 'Superpowers v5.1', group: 'plugins', size: 30 }, - { id: 'fd_plugin', label: 'Frontend Design', group: 'plugins', size: 26 }, - { id: 'upm', label: 'UI UX Pro Max', group: 'plugins', size: 22 }, - { id: 'claude_md_mgmt', label: 'claude-md-mgmt', group: 'plugins', size: 22 }, - { id: 'hookify_plugin', label: 'hookify (плагин)', group: 'plugins', size: 22 }, + // ── ПЛАГИНЫ (5) ── второе кольцо ─────────────── + { id: 'superpowers', label: 'Superpowers v5.1', group: 'plugins', size: 30, ring: 2, ...pos(2, 45) }, + { id: 'fd_plugin', label: 'Frontend Design', group: 'plugins', size: 26, ring: 2, ...pos(2, 135) }, + { id: 'upm', label: 'UI UX Pro Max', group: 'plugins', size: 22, ring: 2, ...pos(2, 165) }, + { id: 'claude_md_mgmt', label: 'claude-md-mgmt', group: 'plugins', size: 22, ring: 2, ...pos(2, 225) }, + { id: 'hookify_plugin', label: 'hookify (плагин)', group: 'plugins', size: 22, ring: 2, ...pos(2, 200) }, - // ── СКИЛЫ SUPERPOWERS (14) ──────────────────────── - { id: 'sk_brainstorm', label: 'brainstorming', group: 'skills_sp', size: 18 }, - { id: 'sk_tdd', label: 'TDD', group: 'skills_sp', size: 18 }, - { id: 'sk_debug', label: 'systematic-debugging', group: 'skills_sp', size: 18 }, - { id: 'sk_wplans', label: 'writing-plans', group: 'skills_sp', size: 20 }, - { id: 'sk_eplans', label: 'executing-plans', group: 'skills_sp', size: 18 }, - { id: 'sk_verify', label: 'verification-before-completion', group: 'skills_sp', size: 18 }, - { id: 'sk_parallel', label: 'parallel-work', group: 'skills_sp', size: 18 }, - { id: 'sk_worktree', label: 'worktree', group: 'skills_sp', size: 18 }, - { id: 'sk_pr', label: 'finishing-pr', group: 'skills_sp', size: 18 }, - { id: 'sk_subagent', label: 'subagent-driven', group: 'skills_sp', size: 20 }, - { id: 'sk_wskills', label: 'writing-skills', group: 'skills_sp', size: 16 }, - { id: 'sk_spreview', label: 'spec-review', group: 'skills_sp', size: 16 }, - { id: 'sk_coderev', label: 'code-review', group: 'skills_sp', size: 16 }, - { id: 'sk_elements', label: 'elements-of-style', group: 'skills_sp', size: 16 }, + // ── СКИЛЫ SUPERPOWERS (14) — N sector (0–90) ──── + { id: 'sk_brainstorm', label: 'brainstorming', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 5) }, + { id: 'sk_wplans', label: 'writing-plans', group: 'skills_sp', size: 20, ring: 3, ...pos(3, 11) }, + { id: 'sk_eplans', label: 'executing-plans', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 17) }, + { id: 'sk_subagent', label: 'subagent-driven', group: 'skills_sp', size: 20, ring: 3, ...pos(3, 23) }, + { id: 'sk_tdd', label: 'TDD', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 29) }, + { id: 'sk_verify', label: 'verification-before-completion', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 36) }, + { id: 'sk_debug', label: 'systematic-debugging', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 43) }, + { id: 'sk_parallel', label: 'parallel-work', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 50) }, + { id: 'sk_worktree', label: 'worktree', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 57) }, + { id: 'sk_pr', label: 'finishing-pr', group: 'skills_sp', size: 18, ring: 3, ...pos(3, 64) }, + { id: 'sk_coderev', label: 'code-review', group: 'skills_sp', size: 16, ring: 3, ...pos(3, 71) }, + { id: 'sk_spreview', label: 'spec-review', group: 'skills_sp', size: 16, ring: 3, ...pos(3, 78) }, + { id: 'sk_wskills', label: 'writing-skills', group: 'skills_sp', size: 16, ring: 3, ...pos(3, 85) }, + { id: 'sk_elements', label: 'elements-of-style', group: 'skills_sp', size: 16, ring: 3, ...pos(3, 92) }, - // ── СКИЛЫ ПРОЕКТА (2) ──────────────────────────── - { id: 'sk_rls', label: 'rls-check', group: 'skills_proj', size: 20 }, - { id: 'sk_qitem', label: 'q-item-add', group: 'skills_proj', size: 20 }, + // ── СКИЛЫ ПРОЕКТА (2) — W sector (RLS) ───────── + { id: 'sk_rls', label: 'rls-check', group: 'skills_proj', size: 20, ring: 3, ...pos(3, 305) }, + { id: 'sk_qitem', label: 'q-item-add', group: 'skills_proj', size: 20, ring: 3, ...pos(3, 220) }, - // ── ХУКИ .claude (5) ──────────────────────────── - { id: 'hk_pre_claude', label: 'PreToolUse:\nCLAUDE.md-warn', group: 'hooks', size: 22 }, - { id: 'hk_post_md', label: 'PostToolUse:\nmarkdownlint', group: 'hooks', size: 20 }, - { id: 'hk_post_schema', label: 'PostToolUse:\nschema-changelog',group: 'hooks', size: 20 }, - { id: 'hk_session', label: 'SessionStart:\ncontext-inject', group: 'hooks', size: 24 }, - { id: 'hk_economy', label: 'UserPromptSubmit:\neconomy-mode', group: 'hooks', size: 22 }, + // ── ХУКИ (5) — S+infra ──────────────────────── + { id: 'hk_session', label: 'SessionStart:\ncontext-inject', group: 'hooks', size: 24, ring: 4, ...pos(4, 100) }, + { id: 'hk_economy', label: 'UserPromptSubmit:\neconomy-mode', group: 'hooks', size: 22, ring: 4, ...pos(4, 95) }, + { id: 'hk_pre_claude', label: 'PreToolUse:\nCLAUDE.md-warn', group: 'hooks', size: 22, ring: 4, ...pos(4, 215) }, + { id: 'hk_post_md', label: 'PostToolUse:\nmarkdownlint', group: 'hooks', size: 20, ring: 4, ...pos(4, 195) }, + { id: 'hk_post_schema', label: 'PostToolUse:\nschema-changelog',group: 'hooks', size: 20, ring: 4, ...pos(4, 300) }, - // ── АГЕНТЫ (11) ────────────────────────────────── - { id: 'ag_pest', label: 'pest-parallel-debugger', group: 'agents', size: 24 }, - { id: 'ag_rls', label: 'rls-reviewer', group: 'agents', size: 22 }, - { id: 'ag_statusline', label: 'statusline-setup', group: 'agents', size: 18 }, - { id: 'ag_guide', label: 'claude-code-guide', group: 'agents', size: 18 }, - { id: 'ag_explore', label: 'Explore', group: 'agents', size: 20 }, - { id: 'ag_general', label: 'general-purpose', group: 'agents', size: 20 }, - { id: 'ag_plan', label: 'Plan', group: 'agents', size: 20 }, - { id: 'ag_hookify', label: 'hookify:\nconversation-analyzer', group: 'agents', size: 18 }, - { id: 'ag_pcreator', label: 'plugin-dev:\nagent-creator', group: 'agents', size: 16 }, - { id: 'ag_pvalid', label: 'plugin-dev:\nplugin-validator',group: 'agents', size: 16 }, - { id: 'ag_skreview', label: 'plugin-dev:\nskill-reviewer', group: 'agents', size: 16 }, + // ── АГЕНТЫ (11) — N (workflow) + W (RLS) ────── + { id: 'ag_explore', label: 'Explore', group: 'agents', size: 20, ring: 4, ...pos(4, 10) }, + { id: 'ag_general', label: 'general-purpose', group: 'agents', size: 20, ring: 4, ...pos(4, 25) }, + { id: 'ag_plan', label: 'Plan', group: 'agents', size: 20, ring: 4, ...pos(4, 40) }, + { id: 'ag_pest', label: 'pest-parallel-debugger', group: 'agents', size: 24, ring: 4, ...pos(4, 55) }, + { id: 'ag_guide', label: 'claude-code-guide', group: 'agents', size: 18, ring: 4, ...pos(4, 70) }, + { id: 'ag_statusline', label: 'statusline-setup', group: 'agents', size: 18, ring: 4, ...pos(4, 85) }, + { id: 'ag_hookify', label: 'hookify:\nconversation-analyzer', group: 'agents', size: 18, ring: 4, ...pos(4, 230) }, + { id: 'ag_pcreator', label: 'plugin-dev:\nagent-creator', group: 'agents', size: 16, ring: 4, ...pos(4, 245) }, + { id: 'ag_pvalid', label: 'plugin-dev:\nplugin-validator',group: 'agents', size: 16, ring: 4, ...pos(4, 260) }, + { id: 'ag_skreview', label: 'plugin-dev:\nskill-reviewer', group: 'agents', size: 16, ring: 4, ...pos(4, 275) }, + { id: 'ag_rls', label: 'rls-reviewer', group: 'agents', size: 22, ring: 4, ...pos(4, 315) }, - // ── MCP-СЕРВЕРЫ (7) ────────────────────────────── - { id: 'mcp_pw', label: 'MCP: playwright', group: 'mcp', size: 22 }, - { id: 'mcp_gh', label: 'MCP: github', group: 'mcp', size: 22 }, - { id: 'mcp_boost', label: 'MCP: laravel-boost', group: 'mcp', size: 24 }, - { id: 'mcp_semgrep', label: 'MCP: semgrep', group: 'mcp', size: 20 }, - { id: 'mcp_sentry', label: 'MCP: sentry', group: 'mcp', size: 22 }, - { id: 'mcp_redis', label: 'MCP: redis', group: 'mcp', size: 22 }, - { id: 'mcp_21st', label: 'MCP: 21st.dev Magic', group: 'mcp', size: 20 }, + // ── MCP-СЕРВЕРЫ (7) — E (UI) + W (data) ─────── + { id: 'mcp_21st', label: 'MCP: 21st.dev Magic', group: 'mcp', size: 20, ring: 5, ...pos(5, 130) }, + { id: 'mcp_pw', label: 'MCP: playwright', group: 'mcp', size: 22, ring: 5, ...pos(5, 110) }, + { id: 'mcp_gh', label: 'MCP: github', group: 'mcp', size: 22, ring: 5, ...pos(5, 75) }, + { id: 'mcp_boost', label: 'MCP: laravel-boost', group: 'mcp', size: 24, ring: 5, ...pos(5, 290) }, + { id: 'mcp_redis', label: 'MCP: redis', group: 'mcp', size: 22, ring: 5, ...pos(5, 310) }, + { id: 'mcp_sentry', label: 'MCP: sentry', group: 'mcp', size: 22, ring: 5, ...pos(5, 330) }, + { id: 'mcp_semgrep', label: 'MCP: semgrep', group: 'mcp', size: 20, ring: 5, ...pos(5, 350) }, - // ── LEFTHOOK JOBS (10) ─────────────────────────── - { id: 'lh_gitleaks', label: 'lefthook:\ngitleaks', group: 'lefthook', size: 18 }, - { id: 'lh_mdlint', label: 'lefthook:\nmarkdownlint', group: 'lefthook', size: 18 }, - { id: 'lh_cspell', label: 'lefthook:\ncspell', group: 'lefthook', size: 18 }, - { id: 'lh_stylelint', label: 'lefthook:\nstylelint', group: 'lefthook', size: 16 }, - { id: 'lh_pint', label: 'lefthook:\npint', group: 'lefthook', size: 18 }, - { id: 'lh_larastan', label: 'lefthook:\nlarastan', group: 'lefthook', size: 18 }, - { id: 'lh_squawk', label: 'lefthook:\nsquawk', group: 'lefthook', size: 18 }, - { id: 'lh_eslint', label: 'lefthook:\neslint-vue', group: 'lefthook', size: 18 }, - { id: 'lh_gitleaks2', label: 'lefthook:\ngitleaks pre-push', group: 'lefthook', size: 18 }, - { id: 'lh_lychee', label: 'lefthook:\nlychee-links', group: 'lefthook', size: 18 }, + // ── LEFTHOOK JOBS (10) — S+W (infra/data) ───── + { id: 'lh_mdlint', label: 'lefthook:\nmarkdownlint', group: 'lefthook', size: 18, ring: 5, ...pos(5, 185) }, + { id: 'lh_cspell', label: 'lefthook:\ncspell', group: 'lefthook', size: 18, ring: 5, ...pos(5, 200) }, + { id: 'lh_stylelint', label: 'lefthook:\nstylelint', group: 'lefthook', size: 16, ring: 5, ...pos(5, 215) }, + { id: 'lh_eslint', label: 'lefthook:\neslint-vue', group: 'lefthook', size: 18, ring: 5, ...pos(5, 230) }, + { id: 'lh_lychee', label: 'lefthook:\nlychee-links', group: 'lefthook', size: 18, ring: 5, ...pos(5, 245) }, + { id: 'lh_gitleaks', label: 'lefthook:\ngitleaks', group: 'lefthook', size: 18, ring: 5, ...pos(5, 260) }, + { id: 'lh_gitleaks2', label: 'lefthook:\ngitleaks pre-push', group: 'lefthook', size: 18, ring: 5, ...pos(5, 275) }, + { id: 'lh_pint', label: 'lefthook:\npint', group: 'lefthook', size: 18, ring: 5, ...pos(5, 25) }, + { id: 'lh_larastan', label: 'lefthook:\nlarastan', group: 'lefthook', size: 18, ring: 5, ...pos(5, 50) }, + { id: 'lh_squawk', label: 'lefthook:\nsquawk', group: 'lefthook', size: 18, ring: 5, ...pos(5, 320) }, - // ── MEMORY FILES (15) ──────────────────────────── - { id: 'mem_user', label: 'memory:\nuser_profile', group: 'memory', size: 16 }, - { id: 'mem_comm', label: 'memory:\nfeedback_comm', group: 'memory', size: 14 }, - { id: 'mem_env', label: 'memory:\nfeedback_env', group: 'memory', size: 16 }, - { id: 'mem_sp', label: 'memory:\nfeedback_superpowers',group: 'memory', size: 16 }, - { id: 'mem_plugins', label: 'memory:\nfeedback_plugins', group: 'memory', size: 16 }, - { id: 'mem_state', label: 'memory:\nproject_state', group: 'memory', size: 16 }, - { id: 'mem_phase1', label: 'memory:\nphase1_strategy', group: 'memory', size: 14 }, - { id: 'mem_archive', label: 'memory:\nreference_archive', group: 'memory', size: 14 }, - { id: 'mem_github', label: 'memory:\nreference_github', group: 'memory', size: 14 }, - { id: 'mem_handoff', label: 'memory:\nreference_handoff', group: 'memory', size: 14 }, - { id: 'mem_audit', label: 'memory:\naudit_2026-05-13', group: 'memory', size: 14 }, - { id: 'mem_supplier', label: 'memory:\nsupplier_integration',group: 'memory', size: 14 }, - { id: 'mem_brain', label: 'memory:\nclaude_brain', group: 'memory', size: 14 }, - { id: 'mem_redesign', label: 'memory:\nportal_redesign', group: 'memory', size: 14 }, - { id: 'mem_devindices', label: 'memory:\ndev_indices', group: 'memory', size: 12 }, + // ── MEMORY FILES (15) — внешнее кольцо ────────── + { id: 'mem_user', label: 'memory:\nuser_profile', group: 'memory', size: 16, ring: 6, ...pos(6, 0) }, + { id: 'mem_comm', label: 'memory:\nfeedback_comm', group: 'memory', size: 14, ring: 6, ...pos(6, 24) }, + { id: 'mem_env', label: 'memory:\nfeedback_env', group: 'memory', size: 16, ring: 6, ...pos(6, 48) }, + { id: 'mem_sp', label: 'memory:\nfeedback_superpowers',group: 'memory', size: 16, ring: 6, ...pos(6, 72) }, + { id: 'mem_plugins', label: 'memory:\nfeedback_plugins', group: 'memory', size: 16, ring: 6, ...pos(6, 96) }, + { id: 'mem_handoff', label: 'memory:\nreference_handoff', group: 'memory', size: 14, ring: 6, ...pos(6, 120) }, + { id: 'mem_redesign', label: 'memory:\nportal_redesign', group: 'memory', size: 14, ring: 6, ...pos(6, 144) }, + { id: 'mem_devindices', label: 'memory:\ndev_indices', group: 'memory', size: 12, ring: 6, ...pos(6, 168) }, + { id: 'mem_phase1', label: 'memory:\nphase1_strategy', group: 'memory', size: 14, ring: 6, ...pos(6, 192) }, + { id: 'mem_state', label: 'memory:\nproject_state', group: 'memory', size: 16, ring: 6, ...pos(6, 216) }, + { id: 'mem_brain', label: 'memory:\nclaude_brain', group: 'memory', size: 14, ring: 6, ...pos(6, 240) }, + { id: 'mem_supplier', label: 'memory:\nsupplier_integration',group: 'memory', size: 14, ring: 6, ...pos(6, 264) }, + { id: 'mem_audit', label: 'memory:\naudit_2026-05-13', group: 'memory', size: 14, ring: 6, ...pos(6, 288) }, + { id: 'mem_archive', label: 'memory:\nreference_archive', group: 'memory', size: 14, ring: 6, ...pos(6, 312) }, + { id: 'mem_github', label: 'memory:\nreference_github', group: 'memory', size: 14, ring: 6, ...pos(6, 336) }, ]; // ════════════════════════════════════════════════════