{"slug": "i-stopped-prompting-and-started-building-a-harness", "title": "I stopped prompting and started building a harness", "summary": "A developer has built an alpha-stage Claude Code plugin harness that encodes React Native development workflows into reusable skills and agents, replacing repeated ad-hoc prompting. Running the harness's refactoring agent on a personal headache-tracker app split a ~330-line Home() component into named hooks and components, cutting it to roughly 150 lines with static checks passing. The developer plans to open the harness to other React Native engineers.", "body_md": "For the last few months I've been using AI agents in almost every part of my React Native work. At some point I noticed I was writing the same instructions over and over: how I want projects set up, what a good refactoring looks like, what to check before shipping. Every new session started from zero.\n\nSo I started turning those instructions into a harness: a set of skills and agents that encode how I actually work. It's still in alpha, I use it daily on my own projects, and here's how it's built and what I've learned so far.\n\nMy first version was just files copied into `~/.claude`. Now the harness is a proper Claude Code plugin in its own git repo. Every skill and agent is called with an `rnmh:` prefix, so it's clear what comes from the harness and what doesn't.\n\nThe biggest change wasn't organizational, though. Once each task had its own dedicated skill, the agent's answers became noticeably more structured, and the results got better with them.\n\nI ran the refactoring agent on my own side project, a headache tracker that's currently in alpha. The home screen had grown into a classic *Long Function*: one `Home()` component of ~330 lines with 5 `useState`, 5 `useEffect`, 3 async handlers and a three-way JSX branch, all inline.\n\nBefore:\n\n```\nfunction Home() {\n  const [openAttack, setOpenAttack] = useState<Attack | null>(null);\n  const [recent, setRecent] = useState<Attack[]>([]);\n  const [now, setNow] = useState(() => systemClock.now());\n  const [loadError, setLoadError] = useState(false);\n  const [reduceMotion, setReduceMotion] = useState(false);\n\n  useEffect(() => {\n    AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);\n    const sub = AccessibilityInfo.addEventListener(\n      'reduceMotionChanged',\n      setReduceMotion,\n    );\n    return () => sub.remove();\n  }, []);\n  // ...4 more effects, 3 async handlers, ~150 lines of inline JSX\n}\n```\n\nAfter:\n\n``` js\nfunction Home() {\n  const reduceMotion = useReduceMotion();\n  // ...same effects and handlers, unchanged\n\n  return (\n    <View style={styles.middle}>\n      {openAttack ? (\n        <OngoingAttackCard\n          openAttack={openAttack}\n          now={now}\n          pulseStyle={pulseStyle}\n          onSetIntensity={handleSetIntensity}\n        />\n      ) : recent.length > 0 ? (\n        <RecentAttacksList recent={recent} now={now} />\n      ) : (\n        <Text style={styles.emptyText}>{t('home.noAttacksYet')}</Text>\n      )}\n    </View>\n  );\n}\n```\n\nEvery change mapped to a named refactoring from the catalog:\n\n`IntensityPicker`, `OngoingAttackCard`, `RecentAttacksList`, `HomeActions`\n`useReduceMotion`, plus `useDictation` and a generic `useKeyboardVisible` on the log-input screen`formatTime()` went to the shared formatting module, so it wouldn't be duplicated in two new components\n`Home()` went from ~330 to ~150 lines. The total line count actually grew a bit because of new files and imports, and that's fine: the point is that each piece now has one job. Behavior didn't change, since the agent kept refactoring strictly separate from feature work, and `tsc` and `eslint` came back clean.\n\nOne honest caveat: the agent only ran static checks, not the app, so checking the screens on a simulator was still on me.\n\nI'm planning to open the harness to other React Native developers. If you're building something similar, or would want a toolkit like this, I'd love to hear what you'd expect from it in the comments.", "url": "https://wpnews.pro/news/i-stopped-prompting-and-started-building-a-harness", "canonical_source": "https://dev.to/zemant91/i-stopped-prompting-and-started-building-a-harness-2hg2", "published_at": "2026-09-23 11:37:27+00:00", "updated_at": "2026-09-23 11:59:02.303916+00:00", "lang": "en", "topics": ["ai-agents", "developer-tools", "ai-tools"], "entities": ["Claude Code", "React Native"], "alternates": {"html": "https://wpnews.pro/news/i-stopped-prompting-and-started-building-a-harness", "markdown": "https://wpnews.pro/news/i-stopped-prompting-and-started-building-a-harness.md", "text": "https://wpnews.pro/news/i-stopped-prompting-and-started-building-a-harness.txt", "jsonld": "https://wpnews.pro/news/i-stopped-prompting-and-started-building-a-harness.jsonld"}}