feat(graph): radial-sector layout — 6 колец × 4 сектора (workflow/UI/infra/data)
This commit is contained in:
+92
-82
@@ -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) },
|
||||
];
|
||||
|
||||
// ════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user