From df808b6f33c7d35de9baf34a1a96e44f036787fb Mon Sep 17 00:00:00 2001 From: Kailas Mahavarkar <66670953+KailasMahavarkar@users.noreply.github.com> Date: Wed, 15 Apr 2026 03:13:59 +0530 Subject: [PATCH 1/2] feat: expand platform support to 12 IDEs/CLIs with format-aware patching - Add Cline, Zed, Continue.dev, Codex CLI as first-class supported platforms - Introduce PlatformFormat type (json-mcpServers | json-contextServers | toml-mcp_servers) - generateMcpPatch is now format-aware: outputs TOML for Codex, context_servers for Zed, mcpServers for all others - setup.ts renders correct output format per platform (TOML block vs JSON merge) - Replace all em dashes with hyphens across all files - Fix mermaid architecture diagram: add linkStyle 0-7 with gray arrows, fix invisible edges - Expand README platform table from 9 to 12 entries with Schema column - Verified all config paths from official docs (April 2026) --- .gitignore | 2 +- README.md | 314 +++++++++++++++---------------- assets/banner.jpeg | Bin 0 -> 102462 bytes install.md | 42 ++++- package.json | 2 +- scripts/setup.ts | 58 ++++-- skills/designer/SKILL.md | 80 ++++---- src/internal/setup-hyperstack.ts | 214 +++++++++++++++++---- 8 files changed, 439 insertions(+), 273 deletions(-) create mode 100644 assets/banner.jpeg diff --git a/.gitignore b/.gitignore index d4a1c53..13d3f48 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ node_modules/ dist/ *.js.map -# Research archive β€” lives at ../knowledgebase/ outside this repo. +# Research archive - lives at ../knowledgebase/ outside this repo. # Ignored here as a safety net in case it gets re-introduced by mistake. knowledgebase/ diff --git a/README.md b/README.md index 1f69957..f134b50 100755 --- a/README.md +++ b/README.md @@ -1,80 +1,132 @@
-# hyperstack +![Hyperstack Banner](assets/banner.jpeg) -**A disciplined MCP server and AI skill system that forces your agent to use real docs, real designs, and real verification before shipping.** +**A disciplined engineering harness that forces AI agents to use ground-truth docs, precise designs, and programmatic verification.**

MIT TypeScript - MCP - Node Docker + MCP

- Plugins + Plugins Skills Hook

-

- React Flow - Motion - Lenis - Tailwind - shadcn - Echo - Rust -

-
--- -## ⚑ What is this? +## πŸš€ What is Hyperstack? + +**Hyperstack is a disciplined engineering harness for AI coding agents.** + +It provides the necessary **Ground Truth** (via 79 specialized MCP tools) and **Adversarial Enforcement** (via 21 rigorous skills) to transform a generic LLM into a high-precision Senior Engineer. + +Unlike standard "polite" instructions, Hyperstack uses **Iron Laws** and a **SessionStart hook** to force agents to check real documentation, follow precise design specs, and provide binary verification before shipping. + +## πŸš€ Installation + +### 1. Recommended: Agentic (autopilot) + +The fastest way to install Hyperstack is to let your AI agent do it for you. This works with **Cursor, Windsurf, Roo Code, Claude Code, or Gemini**. Simply paste this command: + +> **Fetch and follow the instructions at https://raw.githubusercontent.com/orkait/hyperstack/main/install.md** + +The autopilot will autonomously detect your environment, install the MCP server (Docker or Local), and **automatically link the Skills repository**. This is the only step required. + +--- + +### 2. Manual Configuration (Advanced) -Hyperstack is a coding-agent harness made of three tightly-coupled layers: +If you aren't using the Autopilot, follow the **Unified Bootstrap** to set up both the MCP server and the Skills: -1. **An internal harness** that bootstraps the agent, enforces global invariants, and routes internal roles like `hyper` and `website-builder`. -2. **A TypeScript MCP server** with 11 plugins and 79 tools. Your AI calls these for ground-truth API signatures, component specs, design decisions, and architectural patterns. No hallucinated imports. -3. **A skill system with enforcement teeth.** 21 skills with Iron Laws, rationalization tables, and a SessionStart hook that force-injects discipline on every session. Your AI cannot "just try one thing" without the gate firing. +1. **Clone & Initialize**: + ```bash + git clone https://github.com/orkait/hyperstack.git ~/.hyperstack + cd ~/.hyperstack && bun install + ``` -The combination turns a generic coding assistant into a disciplined agent system that: +2. **Run the Setup Script**: + ```bash + bun scripts/setup.ts + ``` -- checks docs before writing code -- writes a DESIGN.md before visual work -- routes website-heavy work to a specialist role -- refuses to claim completion without verification evidence +3. **Follow the CLI**: The script auto-detects your IDE, generates the JSON patch, and outputs the symlink command for your skill directory. -**You should use this if** you are tired of AI agents inventing API shapes, shipping AI-slop UIs, or claiming "tests pass" without running them. +**Supported platforms** (verified April 2026, from official docs): -**Skip this if** you want a frictionless autocomplete. Hyperstack is the opposite of frictionless - it is intentional friction that catches bugs before they ship. +| IDE / CLI | MCP Config Path | Skill Path | Schema | +|---|---|---|---| +| **Claude Code** | `~/.claude.json` | `~/.claude/skills/hyperstack` | JSON `mcpServers` | +| **Gemini CLI** | `~/.gemini/settings.json` | - | JSON `mcpServers` | +| **Qwen Code** | `~/.qwen/settings.json` | `~/.qwen/skills/hyperstack` | JSON `mcpServers` | +| **Codex CLI** | `~/.codex/config.toml` | - | TOML `mcp_servers` | +| **Cursor** | `~/.cursor/mcp.json` | `.cursor/rules/` (project) | JSON `mcpServers` | +| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` | - | JSON `mcpServers` | +| **Kiro** | `~/.kiro/settings/mcp.json` | - | JSON `mcpServers` | +| **Zed** | `~/.config/zed/settings.json` | - | JSON `context_servers` | +| **VS Code + Copilot** | `~/.config/Code/User/mcp.json` | `.vscode/` (project) | JSON `mcpServers` | +| **Roo Code** | `.roo/mcp.json` (project) | `.roo/rules/` (project) | JSON `mcpServers` | +| **Cline** | `~/.config/Code/User/globalStorage/.../cline_mcp_settings.json` | - | JSON `mcpServers` | +| **Continue.dev** | `.continue/mcpServers/mcp.json` (project) | - | JSON `mcpServers` | -## πŸ€– Agent View +> [!TIP] +> Run `bun scripts/setup.ts` and it will auto-detect your platform and output the exact patch - in the right format for your IDE. Codex users get TOML, everyone else gets JSON. -If you are an agent reading this README, the shortest correct mental model is: +## ⚑ The Manifesto -- Hyperstack is not just an MCP server -- Hyperstack is not just a skills pack -- Hyperstack is a harness that combines internal role routing, MCP grounding, and workflow gates +It is not just a library; it is a **disciplined harness** made of three tightly-coupled layers: -Current internal role model: +1. **The Harness**: Bootstraps the agent, routes internal specialist roles (`hyper`, `website-builder`), and enforces global development invariants. +2. **The MCP Ground Truth**: 12 TypeScript plugins (80 tools) that provide deterministic data. No hallucinated imports or invented component specs. +3. **The Adversarial Gates**: 21 skills with **"Enforcement Teeth"**. These aren't suggestions; they are Iron Laws supported by rationalization tables that counter every excuse an agent uses to skip quality gates. -- `hyper` - conductor, gatekeeper, verifier, delivery owner -- `website-builder` - specialist for website-facing design and implementation work +> [!IMPORTANT] +> **Use Hyperstack if** you want to force your agent to check docs, write designs first, and prove its work. +> **Skip Hyperstack if** you want frictionless autocomplete. We prioritize intentional friction that catches bugs before they ship. -Public surface: +## πŸ—οΈ Architecture + +```mermaid +graph TD + User([User Request]) --> Harness[Internal Harness] + Harness --> Gates{Adversarial Gates} + + subgraph "The Enforcement Layer" + Gates -->|Iron Laws| Skills[21 Skills with Enforcement Teeth] + Skills -->|SessionStart| Injection[Auto-Context Injection] + end + + subgraph "The Knowledge Layer" + Skills -->|Ground Truth| MCP[12 MCP Plugins / 80 Tools] + MCP -->|Designer| Design[DESIGN.md Pipeline] + MCP -->|Verified| Code[Programmatic Compliance Check] + end + + Code -->|Verification Evidence| User + + linkStyle 0 stroke:#9ca3af,stroke-width:2px + linkStyle 1 stroke:#9ca3af,stroke-width:2px + linkStyle 2 stroke:#9ca3af,stroke-width:2px + linkStyle 3 stroke:#9ca3af,stroke-width:2px + linkStyle 4 stroke:#9ca3af,stroke-width:2px + linkStyle 5 stroke:#9ca3af,stroke-width:2px + linkStyle 6 stroke:#9ca3af,stroke-width:2px + linkStyle 7 stroke:#9ca3af,stroke-width:2px +``` -- MCP plugins for deterministic knowledge -- skills for process enforcement -- SessionStart hook for bootstrap context injection +## πŸ€– Agent Model -Internal surface: +If you are an agent reading this, your mental model must be: **Process is Priority.** You are operating within a system that requires deterministic grounding and formal design before implementation. -- role contracts in `agents/` -- orchestration contracts in `harness/` -- generated runtime bootstrap artifacts in `generated/runtime-context/` +- **Conductance**: `hyper` owners classification and gate verification. +- **Specialization**: `website-builder` handles visual and frontend implementation. +- **Persistence**: You run in a stable Docker container with a persistent lifecycle. --- @@ -117,11 +169,13 @@ docker run -d --name hyperstack-mcp --restart unless-stopped \ If you are using Claude Code, Cursor, Windsurf, Roo Code, or Gemini, you can use the autopilot to self-configure. Paste this at your agent: -> Fetch and follow the instructions at https://raw.githubusercontent.com/orkait/hyperstack/main/install.md - +```text +Fetch and follow the instructions at https://raw.githubusercontent.com/orkait/hyperstack/main/install.md +``` The autopilot will detect your environment and propose the correct Docker-based configuration block. + ### πŸ”§ Install the skills The MCP server gives you tools. The skills give you discipline. Install both: @@ -148,36 +202,37 @@ Node 18+ required. --- -## 🧠 The two-layer system +## 🧠 The Two-Layer System + +Hyperstack's strength comes from the friction between **Ground Truth** (MCP) and **Enforcement** (Skills). -The public product still has two user-facing layers, but they now sit inside an -internal harness. +### Layer 1: MCP Plugins (Ground Truth) -### Layer 1: MCP Plugins (deterministic knowledge) +Your AI calls these for deterministic data. Memory is not acceptable. Every plugin serves curated TypeScript data and architectural patterns. -Your AI calls these for exact API data. Memory is not acceptable. Every plugin serves typed TypeScript data + `.txt` snippets bundled with the plugin. +| Category | Plugins | Domain Coverage | +|---|---|---| +| πŸ› οΈ **System** | `hyperstack` | Autonomous Environment Detection, MCP Configuration Patching, Lifecycle | +| 🎨 **UI Engine** | `designer`, `design-tokens`, `ui-ux`, `shadcn` | Design Systems, OKLCH, Typography, Accessibility, Component Specs | +| βš›οΈ **Frontend** | `react`, `reactflow`, `motion`, `lenis` | Next.js 15, RSC, Animation Curves, Smooth Scroll, DAG Layouts | +| 🐹 **Backend** | `echo`, `golang`, `rust` | Professional Go Recipes, Rust Borrow Checker patterns, Clean Architecture | -| Plugin | Tools | Domain | -|---|:---:|---| -| 🎨 **designer** | 19 | Design decision engine - 6 personality clusters, 15 industry rules, 11 cognitive laws, 13 page templates, 9 presets (Linear, Stripe, Vercel, Apple, Carbon, shadcn, Notion, Supabase, Figma), 21 font pairings, DESIGN.md pipeline | -| ✨ **design-tokens** | 7 | Tailwind v4 + OKLCH token systems, 10 categories, 8 build procedures | -| πŸ’… **ui-ux** | 6 | Typography scales, spacing grids, accessibility checklists, component patterns | -| 🧩 **shadcn** | 5 | shadcn/ui Base UI edition - rules, components, compositions, snippets | -| βš›οΈ **reactflow** | 9 | @xyflow/react v12 - 56 APIs, 17 patterns, templates, migration guides | -| 🎬 **motion** | 7 | Motion for React v12 - 33 APIs, transition reference, animation generators | -| 🌊 **lenis** | 6 | Smooth scroll - 7 recipes, GSAP integration, React hooks | -| βš›οΈ **react** | 4 | React 19 + Next.js - RSC patterns, Zustand hierarchy, data fetching rules | -| 🐹 **echo** | 6 | Echo Go framework - 19 recipes, 13 middleware, decision matrices | -| 🐹 **golang** | 6 | Go - 18 practices, 10 design patterns, anti-patterns | -| πŸ¦€ **rust** | 4 | Rust - 18 practices, ownership guide, performance tips | +> [!TIP] +> **80 Tools Total**. Every tool is designed to provide the "Senior Engineer" answer, bypassing the "AI Slop" default. -**79 tools total.** +### Layer 2: Skills (Enforcement Teeth) -### Layer 2: Skills (process enforcement) +Markdown with adversarial enforcement. Each skill contains an **Iron Law** that the agent is bound to follow. -Markdown with adversarial enforcement. Each gate skill has an Iron Law, a 1% Rule, and a rationalization table that names the exact excuses your AI will use to skip the gate and counters each one. +> [!CAUTION] +> ### βš–οΈ The Iron Laws of Hyperstack +> - **NO CODE** without MCP grounding. +> - **NO VISUAL CODE** without an approved `DESIGN.md`. +> - **NO COMPLETION CLAIMS** without programmatic verification evidence. +> - **NO REFACTOR** without a failing test first. +> - **NO PATTERN** without a named Force. -The `using-hyperstack` skill is injected into every session by `hooks/session-start.mjs`. You do not have to invoke it manually. +These laws are backed by **Rationalization Tables**-pre-written counters to every excuse an AI agent uses to skip quality gates. ### Internal Harness (role routing + bootstrap) @@ -237,47 +292,35 @@ Full index at `skills/INDEX.md`. Regenerate with `bash scripts/generate-skills-i --- -## πŸ”’ Why adversarial enforcement? +## πŸ”’ Adversarial Enforcement -Ordinary skill markdown is polite suggestion. Polite suggestion fails when the model is under pressure to "be helpful fast." Hyperstack gate skills are written adversarially, inspired by [obra/superpowers](https://github.com/obra/superpowers): +Ordinary skill markdown is a polite suggestion. Polite suggestion fails when an AI model is under pressure to "be helpful fast." Hyperstack skills are written adversarially: -- **Iron Laws** in all-caps that spell out the non-negotiable rule -- **1% Rule** - if there is even a 1% chance a skill applies, invoke it -- **Rationalization tables** listing the exact excuses your AI will use to skip the gate, with counters -- **"Spirit of the rule is the letter of the rule"** clause to close loophole-hunting -- **SessionStart hook** that injects `using-hyperstack` into every new session so the AI cannot forget the system exists +- **1% Rule**: If there is even a 1% chance a skill applies, the agent **must** invoke it. +- **Rationalization Tables**: We have already written down every excuse your AI will use to skip a gate, with a firm technical counter for each. +- **Loophole Closure**: The "Spirit of the Law" is explicitly defined as the "Letter of the Law" to prevent shortcut-hunting. -Examples of Iron Laws enforced today: - -``` -NO CODE WITHOUT MCP GROUND-TRUTH DATA -NO VISUAL CODE WITHOUT AN APPROVED DESIGN.md -NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE -NO REFACTOR WITHOUT A FAILING TEST FIRST -NO PATTERN WITHOUT A NAMED FORCE -``` --- -## 🎨 The designer workflow (flagship example) +## 🎨 The designer agent -The designer plugin + skill is the clearest illustration of how hyperstack composes all three layers. +When you say, **β€œbuild me a SaaS dashboard”**: -When you say *"build me a SaaS dashboard"*: +1. **SessionStart** already puts in `using-hyperstack`, so AI know system is there. +2. **Blueprint skill** sees visual job and sends it to `hyperstack:designer`. +3. **Designer skill** runs `designer_resolve_intent(product)` to guess industry, personality, style, density, and mode. +4. Designer asks **3 questions** in base mode, or **12 questions** in advanced mode. +5. Like **Q11b** will ask what component library to use: shadcn, raw Tailwind, MUI, Mantine, Chakra, Ant Design, or custom. +6. Designer makes a **DESIGN.md** contract with 10 parts: theme, colors, type, spacing, components, motion, elevation, do/don’ts, responsive rules, and anti-patterns. +7. User approves the **DESIGN.md**. +8. **Forge-plan** reads it and makes one task for each section. If user picked shadcn, it calls `shadcn_get_component`. If not, it builds from the DESIGN.md spec. +9. Build tasks run with MCP tools as ground truth. +10. **designer_verify_implementation** checks build against **DESIGN.md**. +11. **Ship-gate** blocks final completion unless build passes the **DESIGN.md** rules. -1. **SessionStart hook** has already injected `using-hyperstack` - the AI knows the system exists -2. **Blueprint skill** detects visual work and routes to `hyperstack:designer` -3. **Designer skill** calls `designer_resolve_intent(product)` to auto-detect industry, personality, style, density, mode -4. **Designer asks 3 questions** (base mode) or 12 questions (advanced mode) -5. **Q11b** asks which component library - shadcn, raw Tailwind, MUI, Mantine, Chakra, Ant Design, or custom -6. **Designer produces a DESIGN.md contract** with 10 sections (theme, colors, typography, spacing, components, motion, elevation, do/don'ts, responsive, anti-patterns) -7. **User approves** the DESIGN.md -8. **Forge-plan skill** reads the DESIGN.md and generates one task per section. For Section 5 (components), it calls `shadcn_get_component` for each component (only if Q11b chose shadcn - otherwise hand-builds from DESIGN.md spec) -9. **Implementation tasks** execute with the ground truth from MCP tools -10. **designer_verify_implementation** runs a programmatic compliance check against DESIGN.md before ship-gate -11. **Ship-gate** enforces the DESIGN.md compliance table (10 sections x specific rules) before allowing any completion claim +AI cannot jump ahead. Every step has hard gate. Excuses already blocked by rationalization tables. -At every step, the AI cannot skip ahead. The hard gates are enforced by rationalization tables that have already written down every excuse your AI will try. --- @@ -415,85 +458,22 @@ Only invoked when the user explicitly chose shadcn in designer Q11b. --- -## πŸ—οΈ Architecture - -Everything runs from source. The published `hyperstack` bin is a small Node wrapper that boots `src/index.ts` through `tsx`, and Docker uses the same source-first runtime. No `dist/` output, no build step for deployment - just type checking. - -```text -bin/ -└── hyperstack.mjs # Published CLI wrapper - boots src/index.ts via tsx - -src/ -β”œβ”€β”€ index.ts # Entry - creates McpServer, loads all 11 plugins -β”œβ”€β”€ registry.ts # Plugin interface + loadPlugins() -β”œβ”€β”€ shared/ -β”‚ └── loader-factory.ts # createSnippetLoader() reads .txt at module init -└── plugins/ - β”œβ”€β”€ designer/ # 19 tools, data.ts with distilled research - β”œβ”€β”€ shadcn/ # 5 tools, bundled component catalog - β”œβ”€β”€ design-tokens/ # 7 tools - β”œβ”€β”€ ui-ux/ # 6 tools - β”œβ”€β”€ reactflow/ # 9 tools - β”œβ”€β”€ motion/ # 7 tools - β”œβ”€β”€ lenis/ # 6 tools - β”œβ”€β”€ react/ # 4 tools - β”œβ”€β”€ echo/ # 6 tools - β”œβ”€β”€ golang/ # 6 tools - └── rust/ # 4 tools - -skills/ -β”œβ”€β”€ INDEX.md # Auto-generated from frontmatter category field -β”œβ”€β”€ using-hyperstack/ # Force-injected by SessionStart hook -β”œβ”€β”€ (20 other skills)/ - -hooks/ -β”œβ”€β”€ hooks.json # Registers the SessionStart hook -β”œβ”€β”€ session-start.mjs # Cross-platform hook entrypoint for auto-injecting using-hyperstack -β”œβ”€β”€ session-start # Legacy shell helper -└── run-hook.cmd # Windows dispatcher - -scripts/ -└── generate-skills-index.sh # Regenerates skills/INDEX.md from frontmatter -``` - -Each plugin follows the same structure: `index.ts` registers tools from `tools/`, data lives in `data.ts`, code snippets live in `snippets/*.txt` and are loaded at module init time via `loader.ts`. - ---- - -## 🚧 Boundaries and current status - -- **Platform:** Claude Code, Cursor, Gemini CLI, Copilot CLI, OpenCode, Codex, and any MCP-compatible client. Tested primarily on Claude Code. -- **Node:** 18 or newer. -- **No build step:** runs via `tsx`. Do not add a `dist/` folder. -- **Knowledgebase:** The original 25 research files that seeded the designer plugin are NOT in this repo anymore. They live at `../knowledgebase/` outside the repo, gitignored for safety. All actionable content is distilled into `src/plugins/designer/data.ts`. -- **shadcn plugin:** Ships with 4 curated components (Button, Dialog, Field, Select) as reference. For a full catalog, you still need your project's own shadcn files. -- **Enforcement vs suggestion:** Hyperstack skills are markdown-based prose gates. They depend on the AI reading them. The SessionStart hook makes this harder to skip, but it is not a hard runtime block. True enforcement would require tool-level hooks. -- **Branch Protection:** The `main` branch is protected by a strict ruleset. Direct pushes are blocked, and all changes must go through a Pull Request that passes 100% of the CI verification suite. -- **Testing skills:** `testing-skills` defines a RED-GREEN-REFACTOR methodology for pressure-testing skills with subagents. Scenario files exist for 3 skills (ship-gate, designer, blueprint). Other gate skills need their own scenarios. - ---- - ## 🀝 Contributing -Fork, branch, open a PR. All new plugins must follow the existing file structure (`index.ts` + `data.ts` + `tools/` + `snippets/`). All new skills must include a `category:` frontmatter field (core, domain, or meta) so they appear in `skills/INDEX.md`. +We welcome contributions that follow the **Disciplined Engineering** standard. -After adding or editing any skill: +1. **Plugins**: Must follow the `index.ts` + `data.ts` + `tools/` + `snippets/` pattern. +2. **Skills**: Must include `category` frontmatter and adhere to the Adversarial Enforcement style. +3. **Verification**: All PRs must pass the full `npm run build` (Type-check) and CI suite. ```bash +# Regenerate the skills index after editing bash scripts/generate-skills-index.sh ``` -Run type checking before opening a PR: - -```bash -npm run build # tsc --noEmit -``` - ---- - ## πŸ“„ License -MIT Β© [Orkait](https://github.com/orkait) +MIT Β© [Orkait](https://github.com/orkait) | Adversarial philosophy inspired by [Jesse Vincent's Superpowers](https://github.com/obra/superpowers). --- diff --git a/assets/banner.jpeg b/assets/banner.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e1bc6061ec670fb1cea30299bd1183acdf1c2fe2 GIT binary patch literal 102462 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 L|ELY2pMC!U "System Synchronized. Hyperstack is now active. +> +> I have installed the **Disciplined Engineering Harness** with 12 plugins and 80 tools. I have also established your **Iron Laws** (~/.hyperstack/skills). +> +> From now on: +> - I will not refactor code without a failing test. +> - I will not propose designs without a DESIGN.md contract. +> - I will use the ground-truth primitives provided by the Hyperstack vault. +> +> We are now operating under a professional engineering discipline. How should we begin our first high-integrity task?" diff --git a/package.json b/package.json index e83d217..bdacc35 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@orkait-ai/hyperstack", "version": "1.0.5", - "description": "Disciplined MCP server + skill system. 11 plugins, 79 tools, 21 skills with adversarial enforcement. Designer/DESIGN.md pipeline, shadcn/ui, React Flow, Motion, Lenis, React 19, Echo, Go, Rust, design tokens, UI/UX.", + "description": "Disciplined MCP server + skill system. 12 plugins, 80 tools, 21 skills with adversarial enforcement. Designer/DESIGN.md pipeline, shadcn/ui, React Flow, Motion, Lenis, React 19, Echo, Go, Rust, design tokens, UI/UX.", "bin": { "hyperstack": "bin/hyperstack.mjs" }, diff --git a/scripts/setup.ts b/scripts/setup.ts index 441b67d..648390d 100644 --- a/scripts/setup.ts +++ b/scripts/setup.ts @@ -6,33 +6,55 @@ async function main() { console.log("\nπŸš€ Hyperstack Autonomous Setup (CLI)"); console.log("=====================================\n"); - const platform = setup.detectEnvironment(); - console.log(`πŸ“‘ Detected platform: ${platform}`); + const hintedPlatform = setup.detectEnvironment(); + console.log(`πŸ“‘ Hinted platform: ${hintedPlatform}`); + + const configPath = setup.findConfigFile(hintedPlatform); - const configPath = setup.findConfigFile(platform); - if (!configPath) { - console.warn("⚠️ Could not automatically find an MCP configuration file."); - console.log(`Check ${platform} documentation for the correct 'mcp.json' or settings path.`); + console.warn("⚠️ Could not find an MCP configuration file in any known location."); + console.log("Tried: .claude.json, .cursor/mcp.json, .codeium/windsurf/mcp_config.json, .roo/mcp.json, .gemini/settings.json, .kiro/settings/mcp.json, .qwen/settings.json"); + console.log("\nπŸ’‘ OpenAI Codex CLI? Run: codex mcp add hyperstack -- bun ~/.hyperstack/bin/hyperstack.mjs"); + console.log(" For any unknown IDE, use the Agentic Autopilot instead."); process.exit(1); } - console.log(`βœ… Found config: ${configPath}`); + // Resolve the actual platform from the found config path + const platform = setup.detectPlatformFromConfigPath(configPath); + console.log(`βœ… Found config: ${configPath} (${platform})`); + + const skillPath = setup.findSkillPath(platform); + if (skillPath) { + const hyperstackSkills = path.join(process.cwd(), "skills"); + const skillTarget = path.join(skillPath, "hyperstack"); + console.log(`\nπŸ“š Skill target: ${skillTarget}`); + console.log(`Run this to activate adversarial gates:`); + console.log(` ln -s "${hyperstackSkills}" "${skillTarget}"`); + } const pluginRoot = process.cwd(); - const patch = setup.generateMcpPatch(configPath, pluginRoot); + const patch = setup.generateMcpPatch(configPath, pluginRoot, platform); - console.log("\nProposed MCP Configuration Patch:"); + console.log("\nπŸ“‹ Proposed Configuration Patch:"); console.log("---------------------------------"); - console.log(JSON.stringify(patch, null, 2)); - console.log("---------------------------------\n"); - - console.log("To apply this patch:"); - console.log(`1. Open ${configPath}`); - console.log("2. Merged the 'hyperstack' entry into your 'mcpServers' or 'extensions' block."); - console.log("3. Restart your AI client."); - - console.log("\nFor an automated autopilot installation, call the 'hyperstack_setup' tool from within your AI assistant.\n"); + + if (patch.format === "toml-mcp_servers") { + console.log("# Append this to:", configPath); + console.log(patch.content as string); + console.log("---------------------------------\n"); + console.log("To finish manual setup:"); + console.log(`1. Run the symlink command above (if applicable).`); + console.log(`2. Append the TOML block above to ${configPath}`); + console.log("3. Run 'codex /mcp' to verify the connection."); + } else { + console.log(JSON.stringify(patch.content, null, 2)); + console.log("---------------------------------\n"); + console.log("To finish manual setup:"); + console.log(`1. Run the symlink command above (if applicable).`); + console.log(`2. Open ${configPath}`); + console.log("3. Merge the patch above into your config (deep-merge, don't replace)."); + console.log("4. Restart your AI client."); + } } main().catch(console.error); diff --git a/skills/designer/SKILL.md b/skills/designer/SKILL.md index 92f78ed..caf30c8 100644 --- a/skills/designer/SKILL.md +++ b/skills/designer/SKILL.md @@ -36,7 +36,7 @@ references: - examples/ecommerce-checkout.md --- -# Designer Skill β€” Intention Gate +# Designer Skill - Intention Gate > AI UIs all look same because AI skip decision process, jump to code. > Skill force every design decision through evidence before code generation. @@ -68,7 +68,7 @@ DO NOT GENERATE VISUAL CODE UNTIL: **Apply when:** task changes how something **looks, feels, moves, or is interacted with.** **Skip when:** pure backend, single CSS bug fix (same colors/spacing), adding to existing design system with established tokens, perf optimization no visual change, infrastructure. -## RED FLAGS β€” STOP +## RED FLAGS - STOP | Thought | Reality | |---|---| @@ -115,13 +115,13 @@ Reverse escalation: forge-plan β†’ designer (gap), behaviour-analysis β†’ design Every DESIGN.md must resolve these 7: -1. **Primary path** β€” user's main JTBD + single primary action -2. **Information scent** β€” "Where am I, what can I do, what happens next?" -3. **State coverage** β€” loading, empty, error, success, disabled, destructive -4. **Form/auth friction** β€” labels persistent, validation humane, paste allowed, password managers supported -5. **Performance budget** β€” LCP, INP, CLS, payload-sensitive media targets -6. **Accessibility floor** β€” focus visibility, focus not obscured, target size, reduced motion, keyboard usage -7. **Responsive content priority** β€” what survives first on mobile, what deferred +1. **Primary path** - user's main JTBD + single primary action +2. **Information scent** - "Where am I, what can I do, what happens next?" +3. **State coverage** - loading, empty, error, success, disabled, destructive +4. **Form/auth friction** - labels persistent, validation humane, paste allowed, password managers supported +5. **Performance budget** - LCP, INP, CLS, payload-sensitive media targets +6. **Accessibility floor** - focus visibility, focus not obscured, target size, reduced motion, keyboard usage +7. **Responsive content priority** - what survives first on mobile, what deferred Use [website-experience-cheatsheet](references/website-experience-cheatsheet.md). @@ -271,7 +271,7 @@ Routing: `shadcn/ui` β†’ `hyperstack:shadcn-expert` | `Raw Tailwind` β†’ forge-p Every MCP call fills specific DESIGN.md section. No call without purpose. -## Core Calls (Every Design Task β€” 4 calls, run in parallel) +## Core Calls (Every Design Task - 4 calls, run in parallel) ### Call 1: `designer_resolve_intent(product_description)` **FILLS:** All sections (defaults) @@ -280,7 +280,7 @@ Every MCP call fills specific DESIGN.md section. No call without purpose. ### Call 2: `designer_get_personality(resolved_cluster)` **FILLS:** Sections 1, 2, 3, 4, 6, 7 -**PURPOSE:** Concrete visual vocabulary β€” tracking, radius range, shadow style, motion timing, density, CSS example. Single most important data source. +**PURPOSE:** Concrete visual vocabulary - tracking, radius range, shadow style, motion timing, density, CSS example. Single most important data source. **USE:** Set every visual property. Personality vocabulary IS design system skeleton. ### Call 3: `designer_get_page_template(page_type)` @@ -313,7 +313,7 @@ NOT routine. Call ONLY when product has these specific features: | Premium feel | `designer_get_design_system("stripe")` or `("vercel-geist")` | S1 | Stripe weight 300/500, Vercel -0.04em tracking | | Enterprise | `designer_get_design_system("ibm-carbon")` | S1 | Carbon 12px spacing-04, IBM Plex, a11y-first | -## Token Calls (Phase 5 only β€” when generating code) +## Token Calls (Phase 5 only - when generating code) Do NOT call during design resolution: ``` @@ -538,7 +538,7 @@ Layer 3: Rules β†’ what constraints enforce it consistently? |---|---|---| | Colors | Warm-tinted: oklch(0.98 0.012 78) not oklch(0.98 0 0) | 0.012 chroma at hue 78 = "premium notebook" not "cold SaaS". Highest-leverage single decision. | | Typography | Serif or humanist sans, 18px body, 1.6-1.75 lh | Serif = trust. Larger body + generous leading = comfort. | -| Radius | 12-20px | Rounded = friendly (Gestalt). Cap 20px β€” beyond = childish. | +| Radius | 12-20px | Rounded = friendly (Gestalt). Cap 20px - beyond = childish. | | Shadows | Warm-tinted (oklch(0.22 0.006 56 / 0.06)) | Cold rgba shadows disconnected on warm surfaces. | | Motion | 200-300ms, ease-in-out, gentle | Spring/bounce = tonally wrong. | | Density | Comfortable (96px sections, 40px cards, 18px body) | Reading requires breathing room. | @@ -635,16 +635,16 @@ For full detail: `designer_get_industry_rules(industry)` # COGNITIVE LAWS (11) -> Source: Laws of UX, NNG, Smashing Magazine. Not opinions β€” empirically documented. +> Source: Laws of UX, NNG, Smashing Magazine. Not opinions - empirically documented. ## Fitts' Law -`T = a + b * log2(2D/W)` β€” Halving distance > doubling size. +`T = a + b * log2(2D/W)` - Halving distance > doubling size. - Touch targets β‰₯ 44px (WCAG) / 48px (Material). Screen edges = infinite mouse targets, hardest for touch. - Submit CTA at bottom of form (pointer already near last field). Destructive actions β‰₯ 8px from safe. - **Violations:** Icon-only buttons (16px visual β‰  44px target), Delete beside Save < 8px gap. ## Hick's Law -`RT = a + b * log2(n + 1)` β€” 2β†’4 choices costs more than 20β†’22. First added choices most expensive. +`RT = a + b * log2(n + 1)` - 2β†’4 choices costs more than 20β†’22. First added choices most expensive. - Minimize choices at irreversible points. Wizard pattern for multi-step. Surface recommended option. - Applies to decisions, not recognition. 15-item nav with clear categories = fine. 15-option modal = not. - **Violations:** All features on first login, pricing with no highlighted plan, 50+ unsorted dropdowns. @@ -703,14 +703,14 @@ Remembered = avg(peak intensity + final moment). Duration neglect. > Source: NNG (1.5M fixations, 57,453 fold fixations), A List Apart, Smashing Magazine -## Visual Hierarchy β€” 6 Levers (priority order) +## Visual Hierarchy - 6 Levers (priority order) -1. **Size** β€” Bigger = more important. Max 3 size variations. Never equal size for different priorities. -2. **Contrast** β€” Squint test: blur 5-10px, primary action must be first visible. -3. **Color** β€” Warm/saturated advances, cool/muted recedes. Red = destructive only. -4. **Typography** β€” Weight is primary signal. Everything emphasized = nothing emphasized. -5. **Spacing** β€” More surrounding space = more attention. Use before borders/fills. -6. **Position** β€” Top-left = most attention. Optical center above mathematical center. +1. **Size** - Bigger = more important. Max 3 size variations. Never equal size for different priorities. +2. **Contrast** - Squint test: blur 5-10px, primary action must be first visible. +3. **Color** - Warm/saturated advances, cool/muted recedes. Red = destructive only. +4. **Typography** - Weight is primary signal. Everything emphasized = nothing emphasized. +5. **Spacing** - More surrounding space = more attention. Use before borders/fills. +6. **Position** - Top-left = most attention. Optical center above mathematical center. ## CRAP Principles - **Contrast:** If different, make VERY different. Same-same = no hierarchy. @@ -723,7 +723,7 @@ Remembered = avg(peak intensity + final moment). Duration neglect. ## The Fold (NNG: 57,453 fixations) - Above fold: **102% more views**. 57% viewing time above fold. -- **Never fill exact viewport height** β€” bleed 40-80px of next section. False floor = users think page done. +- **Never fill exact viewport height** - bleed 40-80px of next section. False floor = users think page done. - First 100px must be relevant or users leave. ## Reading Patterns @@ -777,7 +777,7 @@ Every empty state = onboarding moment. Headline + copy + CTA. First-use: encoura --- -# DESIGN MASTERS β€” 5 CONVERGENCE POINTS +# DESIGN MASTERS - 5 CONVERGENCE POINTS > 7 masters (Rams, Norman, Vignelli, Spiekermann, Ive, Tufte, Kare) converged independently. @@ -797,7 +797,7 @@ Custom typeface = purchased differentiation. Open apertures for screen legibilit Maximize toward 1.0. "Can this be erased without info loss?" Lie Factor = effect shown / effect in data (1.0 = honest). Small multiples. Sparklines. ## Ive/Apple: Simplicity = Purpose -"Simplicity not absence of clutter β€” that's a consequence." Clarity (transparent carrier), Deference (UI steps back), Depth (spring physics = signifiers). +"Simplicity not absence of clutter - that's a consequence." Clarity (transparent carrier), Deference (UI steps back), Depth (spring physics = signifiers). ## Kare: Icons as Universal Language Meaningful (real metaphors), Memorable (one-trial learning), Clear (traffic sign test). @@ -843,16 +843,16 @@ ANY present β†’ go back to Phase 3: Assemble all decisions into 10-section DESIGN.md. See [template](references/design-md-template.md). See [examples](examples/) for worked outputs. ``` -1. Visual Theme & Atmosphere β€” emotional target, personality, system inspiration, identity -2. Color Palette β€” brand ramp (OKLCH 11 stops), semantic tokens, dark mode strategy -3. Typography β€” scale table, font pairing + rationale, fluid vs fixed -4. Spacing β€” semantic tokens, density, grid (12-col), content max-width -5. Component Specs β€” button/input/card/nav with ALL variants + ALL states -6. Motion β€” duration scale, easing rules, prefers-reduced-motion strategy -7. Elevation β€” shadow system (light), bg-color elevation (dark), z-index scale -8. Do's and Don'ts β€” 10 rules for THIS product, each traced to evidence -9. Responsive β€” behavior at 375/768/1024/1280/1440px -10. Anti-Patterns β€” industry violations, AI slop checks this design passes +1. Visual Theme & Atmosphere - emotional target, personality, system inspiration, identity +2. Color Palette - brand ramp (OKLCH 11 stops), semantic tokens, dark mode strategy +3. Typography - scale table, font pairing + rationale, fluid vs fixed +4. Spacing - semantic tokens, density, grid (12-col), content max-width +5. Component Specs - button/input/card/nav with ALL variants + ALL states +6. Motion - duration scale, easing rules, prefers-reduced-motion strategy +7. Elevation - shadow system (light), bg-color elevation (dark), z-index scale +8. Do's and Don'ts - 10 rules for THIS product, each traced to evidence +9. Responsive - behavior at 375/768/1024/1280/1440px +10. Anti-Patterns - industry violations, AI slop checks this design passes ``` **Present to user. Wait for approval. No code until approved.** @@ -965,7 +965,7 @@ forge-plan reads 10 sections β†’ generates tasks: Invocation: *"DESIGN.md approved and saved at ``. Invoking `hyperstack:forge-plan` with this as input spec."* -**To `shadcn` MCP plugin β€” ONLY if Q11b=shadcn:** +**To `shadcn` MCP plugin - ONLY if Q11b=shadcn:** ``` shadcn_get_rules β†’ architectural constraints (ALWAYS first) shadcn_get_composition(page_type) β†’ which components compose for this page @@ -976,7 +976,7 @@ for each component in DESIGN.md S5: ``` No shadcn component matching DESIGN.md spec β†’ escalate to `hyperstack:designer`, don't invent hybrid. -**To raw Tailwind β€” ONLY if Q11b=raw Tailwind:** +**To raw Tailwind - ONLY if Q11b=raw Tailwind:** ``` design_tokens_get_category("component-sizing") ui_ux_get_component_pattern(name) @@ -1028,6 +1028,6 @@ Before completion claim. Verifies: ## Announcement Protocol -When invoked: *"Using hyperstack:designer β€” producing DESIGN.md contract for [task type]."* +When invoked: *"Using hyperstack:designer - producing DESIGN.md contract for [task type]."* When handing off: *"DESIGN.md complete at [path]. Invoking hyperstack:forge-plan with this as input spec."* -When escalating back: *"[from-skill] escalating to designer β€” [reason]."* \ No newline at end of file +When escalating back: *"[from-skill] escalating to designer - [reason]."* \ No newline at end of file diff --git a/src/internal/setup-hyperstack.ts b/src/internal/setup-hyperstack.ts index ad516e1..81aec3f 100644 --- a/src/internal/setup-hyperstack.ts +++ b/src/internal/setup-hyperstack.ts @@ -5,58 +5,162 @@ import * as os from "node:os"; export interface SetupResult { detectedPlatform: string; configPath: string | null; + skillPath: string | null; status: "success" | "pending_research" | "error"; proposedPatch?: any; message: string; } -const KNOWN_PLATFORMS: Record = { +export type PlatformFormat = "json-mcpServers" | "json-contextServers" | "toml-mcp_servers" | "json-mcpServers-nested"; + +const KNOWN_PLATFORMS: Record = { + // ─── AI CLIs ──────────────────────────────────────────────── + + // Claude Code (CLI) - global user config + // Source: docs.anthropic.com, inventivehq.com (April 2025, multiple) "claude-code": { env: ["CLAUDE_PLUGIN_ROOT"], configFiles: [".claude.json"], + skillPath: ".claude/skills", + format: "json-mcpServers", + }, + // Gemini CLI - global user config + // Source: geminicli.com, augmentcode.com (April 2025, multiple) + "gemini-cli": { + configFiles: [".gemini/settings.json"], + format: "json-mcpServers", + notes: "Run '/mcp' inside Gemini CLI to verify connection", + }, + // Qwen Code (Alibaba) - global user config + // Source: github.io/qwen-code official docs (April 2025) + "qwen-code": { + configFiles: [".qwen/settings.json"], + skillPath: ".qwen/skills", + format: "json-mcpServers", + notes: "CLI alternative: qwen mcp add ", }, + // OpenAI Codex CLI - global user config (TOML format) + // Source: openai.com official docs (April 2025) + "codex": { + configFiles: [".codex/config.toml"], + format: "toml-mcp_servers", + notes: "CLI alternative: codex mcp add hyperstack -- bun ~/.hyperstack/bin/hyperstack.mjs", + }, + + // ─── AI IDEs ──────────────────────────────────────────────── + + // Cursor IDE - global user config + // Source: cursor.com docs, confirmed via 10+ tutorials (April 2025) "cursor": { env: ["CURSOR_PLUGIN_ROOT"], configFiles: [".cursor/mcp.json"], + skillPath: ".cursor/rules", + format: "json-mcpServers", + notes: "Project-level: .cursor/mcp.json in project root", }, + // Windsurf IDE (Codeium) - global user config + // Source: windsurf.com official docs, bito.ai, zapier (April 2025) "windsurf": { configFiles: [".codeium/windsurf/mcp_config.json"], + format: "json-mcpServers", + notes: "Click 'Refresh' in Cascade panel after editing", }, + // Kiro (Amazon AI IDE) - global user config + // Source: kiro.dev official docs, aws.com (April 2025) + "kiro": { + configFiles: [".kiro/settings/mcp.json"], + format: "json-mcpServers", + notes: "Workspace-level: .kiro/settings/mcp.json in project root", + }, + // Zed editor - global user config (uses 'context_servers' key, not 'mcpServers') + // Source: zed.dev official docs, skeet.build (April 2025) + "zed": { + configFiles: [".config/zed/settings.json"], + format: "json-contextServers", + notes: "Uses 'context_servers' key instead of 'mcpServers'", + }, + + // ─── VS Code Extensions ───────────────────────────────────── + + // VS Code + GitHub Copilot - platform-specific global config + // Source: code.visualstudio.com official docs (April 2025) + "vscode": { + env: ["VSCODE_PID"], + configFiles: [ + ".config/Code/User/mcp.json", // Linux + "Library/Application Support/Code/User/mcp.json", // macOS + ], + format: "json-mcpServers", + notes: "Project-level: .vscode/mcp.json in project root", + }, + // Roo Code (VS Code extension) + // Global config has no fixed home path (stored in VS Code extension storage). + // Source: roocode.com official docs (April 2025) "roo-code": { - configFiles: [".roo/mcp.json", "mcp_settings.json"], + configFiles: [".roo/mcp.json"], + skillPath: ".roo/rules", + format: "json-mcpServers", + notes: "Global config: open via Roo Code UI > Edit Global MCP", }, - "gemini-cli": { - configFiles: [".gemini/settings.json"], + // Cline (VS Code extension) - Linux global path + // Source: cline.bot official docs, reddit (April 2025) + "cline": { + configFiles: [ + ".config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json", // Linux + ".cline/data/settings/cline_mcp_settings.json", // Cline CLI fallback + ], + format: "json-mcpServers", + notes: "Access via Cline panel > MCP Servers > Configure", + }, + // Continue.dev (VS Code extension) - project-level only + // Source: continue.dev official docs (April 2025) + "continue-dev": { + configFiles: [".continue/mcpServers/mcp.json"], + format: "json-mcpServers", + notes: "Requires Agent Mode. Place config in .continue/mcpServers/ directory", }, }; + export function detectEnvironment(): string { - // Check environment variables first + // Env-var hints (fast path, but unreliable in nested terminals) if (process.env.CLAUDE_PLUGIN_ROOT) return "claude-code"; if (process.env.CURSOR_PLUGIN_ROOT) return "cursor"; - if (process.env.VSCODE_PID) return "vscode-derivative"; // Likely Roo Code or Windsurf or VS Code - + // VSCODE_PID fires inside any VS Code-hosted terminal (Gemini, Roo Code, etc.) + // Do NOT short-circuit here - fall through to config-file probing below. return "unknown"; } export function findConfigFile(platform: string): string | null { const home = os.homedir(); - - if (platform === "unknown") { - // Probe common locations - for (const [p, info] of Object.entries(KNOWN_PLATFORMS)) { + + // Always probe all known config files - this is the authoritative source of truth. + // Even if `platform` was resolved from env vars, the config file must exist. + const candidates: Array<{ platform: string; file: string }> = []; + + if (platform !== "unknown" && KNOWN_PLATFORMS[platform]) { + // Try hinted platform first + for (const file of KNOWN_PLATFORMS[platform].configFiles) { + candidates.push({ platform, file }); + } + } + + // Always append all other platforms as fallback probes + for (const [p, info] of Object.entries(KNOWN_PLATFORMS)) { + if (p !== platform) { for (const file of info.configFiles) { - const fullPath = path.join(home, file); - if (fs.existsSync(fullPath)) return fullPath; + candidates.push({ platform: p, file }); } } - return null; } - const info = KNOWN_PLATFORMS[platform]; - if (!info) return null; - - for (const file of info.configFiles) { + for (const { file } of candidates) { const fullPath = path.join(home, file); if (fs.existsSync(fullPath)) return fullPath; } @@ -64,49 +168,77 @@ export function findConfigFile(platform: string): string | null { return null; } +export function detectPlatformFromConfigPath(configPath: string): string { + for (const [p, info] of Object.entries(KNOWN_PLATFORMS)) { + for (const file of info.configFiles) { + if (configPath.endsWith(file)) return p; + } + } + return "unknown"; +} + +export function findSkillPath(platform: string): string | null { + const info = KNOWN_PLATFORMS[platform]; + if (!info || !info.skillPath) return null; + + return path.join(os.homedir(), info.skillPath); +} + + +export function getPlatformFormat(platform: string): PlatformFormat { + return KNOWN_PLATFORMS[platform]?.format ?? "json-mcpServers"; +} export function generateMcpPatch( configPath: string, pluginRoot: string, + platform: string, method: "docker" | "local" = "docker" -) { - const isClaude = configPath.endsWith(".claude.json"); - const isGemini = configPath.includes("settings.json") && configPath.includes(".gemini"); - +): { format: PlatformFormat; content: string | object } { const binaryPath = path.join(pluginRoot, "bin", "hyperstack.mjs"); - const localConfig = { + const localServerConfig = { command: "node", args: [binaryPath], - env: { - HYPERSTACK_ROOT: pluginRoot, - }, + env: { HYPERSTACK_ROOT: pluginRoot }, }; - - const dockerConfig = { + const dockerServerConfig = { command: "docker", args: ["exec", "-i", "hyperstack-mcp", "bun", "/app/src/index.ts"], - env: { - HYPERSTACK_ROOT: pluginRoot, // Still helpful for skills indexing - }, + env: { HYPERSTACK_ROOT: pluginRoot }, }; + const serverConfig = method === "docker" ? dockerServerConfig : localServerConfig; + const format = getPlatformFormat(platform); - const serverConfig = method === "docker" ? dockerConfig : localConfig; - - if (isGemini) { + // Zed uses 'context_servers' key instead of 'mcpServers' + // Source: zed.dev official docs (April 2025) + if (format === "json-contextServers") { return { - extensions: { - hyperstack: { - ...serverConfig, - type: "stdio", + format, + content: { + context_servers: { + hyperstack: serverConfig, }, }, }; } - // Default MCP schema (Claude, Cursor, Windsurf, Roo Code) + // Codex CLI uses TOML format: [mcp_servers.] + // Source: openai.com official docs (April 2025) + if (format === "toml-mcp_servers") { + const tomlBlock = method === "docker" + ? `[mcp_servers.hyperstack]\ncommand = "docker"\nargs = ["exec", "-i", "hyperstack-mcp", "bun", "/app/src/index.ts"]\n[mcp_servers.hyperstack.env]\nHYPERSTACK_ROOT = "${pluginRoot}"` + : `[mcp_servers.hyperstack]\ncommand = "node"\nargs = ["${binaryPath}"]\n[mcp_servers.hyperstack.env]\nHYPERSTACK_ROOT = "${pluginRoot}"`; + return { format, content: tomlBlock }; + } + + // Default: standard mcpServers JSON schema + // Covers: Claude Code, Cursor, Windsurf, Roo Code, VS Code, Kiro, Qwen, Gemini, Cline, Continue.dev return { - mcpServers: { - hyperstack: serverConfig, + format, + content: { + mcpServers: { + hyperstack: serverConfig, + }, }, }; } From b084188aae3653b6b4b4fd4e2ec7ff0e5b8de1a1 Mon Sep 17 00:00:00 2001 From: Kailas Mahavarkar <66670953+KailasMahavarkar@users.noreply.github.com> Date: Wed, 15 Apr 2026 03:20:15 +0530 Subject: [PATCH 2/2] docs: restore clean agent steering doc in docs/ hierarchy --- docs/AGENTS.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 docs/AGENTS.md diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000..439eb06 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,73 @@ +# final steering doc + +## 1. core law + +* facts first. +* no bluff. +* no fake results. +* no puppy talk. +* less talk. more work. +* evidence beats guess. +* fast isolated test beats hypothesis. +* suggestion is not truth. treat research hits as maybe true until verified. +* if unsure, say so. +* if change gives no gain, stop, alert user, suggest better path. + +## 2. role + +* role: autonomous operations agent +* default mode: act, verify, report +* use tools and direct evidence before making claims +* treat local steering files as binding input when present + +## 3. source priority + +use this order: + +1. explicit user instruction in current task +2. system and platform hard limits +3. local steering docs and skill docs +4. repository code and config +5. tests, command output, logs, api responses +6. docs and research notes +7. prior belief or intuition + +rules: + +* do not impose beliefs as facts. +* do not claim cause and effect without proof. +* do not present hypothesis as result. +* one verified fact beats ten plausible guesses. + +## 4. local steering files + +load and obey when present: + +* `~/.claude/CLAUDE.md` +* `./skills/using-hyperstack/SKILL.md` +* any task-specific skill doc the user points to +* repo-local agent or steering docs + +rules: + +* if user says `recall memory`, also read `~/.claude/CLAUDE.md`. +* if using codemode or exploring codebase, follow codemode fully. no shortcuts. +* read files before semantic linking. no context = no real linking. + +## 5. tool-first execution + +always prefer tools over guess. + +## 6. deployment & project context + +| key | value | +|---|---| +| pages project | `nitrogen-orkait` | +| production url | `nitrogen-orkait.pages.dev` | +| mcp server | user scope in `~/.claude.json` | +| wrangler | auth via oauth, use `npx wrangler` | + +```bash +# deployment command +wrangler pages deploy --project-name nitrogen-orkait --branch main +```