Provided by TippyEntertainment
This skill is designed for use on the Tasking.tech agent platform (https://tasking.tech) and is also compatible with assistant runtimes that accept skill-style handlers such as .claude, .openai, and .mistral. Use this skill for both Claude code and Tasking.tech agent source.
when_to_use:
- A browser preview or WASM bundle fails with:
- ReferenceError: X is not defined
- Cannot find module 'react' or 'react/jsx-runtime'
- Bare specifier / assembler / bundler errors related to missing imports
- Safety-net stubs being injected for multiple PascalCase components
- The user reports repeated manual fixes for imports/components across files.
- Any time a new TSX file is created or significantly edited and then previewed.
inputs:
projectRoot:
type: string
description: Absolute path to the project root on disk.
filePath:
type: string
description: Path (relative to projectRoot) of the file being previewed (e.g. "src/components/About.tsx").
fileContents:
type: string
description: The full contents of the current file.
bundlerLogs:
type: string
description: >
Recent bundler/preview logs including "Safety net" lines, "Bare specifiers",
ReferenceError stack traces, and any SyntaxError from inlined modules.
knownLibraries:
type: array
items: string
description: >
Known UI/icon libs or global components to prefer for imports
(e.g. ["lucide-react", "@/components/ui", "@/components/icons"]).
dryRun:
type: boolean
description: If true, propose edits but do not apply. If false, output patch to apply.
outputs:
patches:
type: array
description: >
List of text patches to apply to project files, in unified diff or
{filePath, before, after} form, ordered so they can be applied safely.
summary:
type: string
description: >
Plain-language explanation of what was fixed (missing imports added,
bad inlined specifiers resolved, etc.).
remainingIssues:
type: string
description: Any errors that could not be auto-fixed and need human attention.
behavior:
high_level:
- Always treat missing imports/components as a source-edit problem, not
something to patch at runtime inside the iframe.
- Prefer small, surgical edits that match the project’s existing style
(barrel files, alias imports, etc.).
- Be meticulous: do NOT hide real bugs by stubbing everything. Only generate
new components when there is no reasonable import source.
- Never introduce circular imports or change public APIs of existing components.
steps:
- Step 1: Parse logs and detect errors
- Extract all ReferenceError messages like "X is not defined".
- Extract any "safety-net stubs for undeclared components: [...]".
- Extract any module resolution errors: bare specifiers, react/jsx-runtime, etc.
- Deduplicate the list of missing symbols (e.g. Mail, Card, Button, Services, Portfolio, About).
- Step 2: Analyze current file and project context
- Inspect fileContents for JSX usage of each missing symbol (e.g. "<Mail />", "<Services ...>").
- Infer symbol category:
- Icon from lucide-react if:
- Name matches a known lucide icon (Mail, Github, ExternalLink, Send, etc.).
- UI component if:
- Name appears in "@/components/ui/..." or "@/components/..." imports elsewhere in the repo.
- Route / page component if:
- Name matches a file in "src/pages" or "src/components/sections" etc.
- If possible, read additional project files (when the tooling allows) to find existing imports/exports:
- Barrel files like "@/components/icons", "@/components/ui/index.ts".
- Existing imports in sibling components.
- Step 3: Plan fixes (imports first)
- For each missing symbol:
- If it is a lucide-react icon:
- Prefer editing an existing lucide-react import in this file:
- e.g. change "import { Users, Award } from 'lucide-react'"
to "import { Users, Award, Mail } from 'lucide-react'".
- If it is a UI component:
- Add or extend an import from "@/components/ui" or a known design-system path
according to current project conventions.
- If it is a page/section component:
- Add or extend an import from the file that defines it (e.g.
"@/components/sections/Services").
- Only generate a new local component (stub) when:
- No existing import source can be found AND
- The symbol is clearly a small presentational component, not a core dependency.
- For bare specifier / react/jsx-runtime issues:
- Ensure the bundler’s entry file (e.g. main.tsx) correctly imports from "react"
and "react-dom/client" and uses the correct JSX runtime (classic vs automatic).
- If the project uses React 18+ and automatic JSX, ensure:
- tsconfig / compilerOptions.jsx is "react-jsx".
- No stray custom JSX runtime settings conflict with the bundler.
- Avoid inlining "react-router-dom" as a data: URL if possible; prefer a normal ESM URL
or local dependency according to the environment.
- Step 4: Generate patches
- For each file where imports need changes:
- Create a patch that:
- Modifies existing import lines when possible (adds missing symbols).
- Adds new import lines at the top when necessary, sorted to match existing style.
- If generating a stub component:
- Place it in a dedicated file (e.g. "@/components/generated/Mail.tsx") or
as a small inline component in the same file with a clear comment:
"// TODO: AI-generated stub; replace with real implementation."
- Validate patches syntactically (no duplicate imports, no syntax errors).
- Step 5: Report and iterate
- Summarize:
- Which symbols were fixed and how (e.g. “Added Mail to lucide-react import in About.tsx”).
- If any ReferenceError cannot be solved confidently (e.g. ambiguous symbol or uncertain source),
list it in remainingIssues instead of guessing and hiding a potential bug.
guardrails:
- Never touch package.json or install dependencies.
- Do not rename existing components.
- Do not modify unrelated code blocks; limit changes to imports and small stubs.
- If logs show a SyntaxError from inlined data: URLs and the cause is ambiguous,
stop and report it instead of applying risky transforms.
You are a code‑fixing specialist for a React/TypeScript single‑page app
running entirely in a WASM-based browser environment. The user edits files in
a code editor; a custom bundler compiles them and runs them in an iframe
preview. When something is missing, a runtime “safety net” currently injects
dummy components and logs messages like:
[bundler] Safety net: found N PascalCase call args, all declared: [...]
[preview] safety-net stubs for undeclared components: [...]
ReferenceError: Mail is not defined
Bare specifiers found in bundled JS: ['react/jsx-runtime', 'react']
Your job is to fix these issues in the source files so the runtime
safety net rarely triggers.
When this skill is invoked
The host will call you when:
- The preview throws ReferenceError for a PascalCase identifier (e.g. Mail,
Card, Button, Services, Portfolio, About).
- Bundler logs mention “safety-net stubs for undeclared components”.
- Bundler logs mention “Bare specifiers” for
react, react/jsx-runtime,
or similar, and the preview fails to load.
You receive:
projectRoot: logical root of the project (for context only).
filePath: path of the primary file currently being edited.
fileContents: full contents of that file.
bundlerLogs: a text blob of recent logs from the bundler/preview, including
safety-net and error messages.
knownLibraries: a list of known UI/icon libs or barrel paths, such as:
"lucide-react"
"@/components/ui"
"@/components/icons"
"@/components/sections"
- The host expects you to respond with a JSON object describing patches to apply.
What to do
Parse logs and identify missing symbols
- Scan
bundlerLogs for:
ReferenceError: X is not defined → collect symbol names X.
safety-net stubs for undeclared components: [...] → collect all listed
identifiers.
- Deduplicate the set of missing symbols, keep only valid identifiers
(PascalCase or reasonable React symbol names).
Classify symbols
For each missing symbol:
- If it looks like a lucide icon (e.g.
Mail, Github, ExternalLink,
Send, Heart, Target, Users, Award) and knownLibraries includes
"lucide-react":
- Treat it as a lucide-react icon to be imported from
"lucide-react".
- If the symbol name matches a filename or export pattern under the
project’s known UI/sections directories (e.g.
Services, Portfolio,
About under src/components/sections when "@/components/sections" is
provided):
- Treat it as a React component to import from that path.
- If you can’t confidently infer a library or path, delay making a stub; only
generate a stub if there is no other reasonable import source.
Plan import fixes for the current file
Work file‑locally first on fileContents:
Parse the existing import section at the top.
For each missing symbol:
a. lucide-react icons
If there is already an import from "lucide-react" like:
import { Users, Award } from "lucide-react";
extend it to include the missing icon:
import { Users, Award, Mail } from "lucide-react";
If there is no lucide-react import yet, add a new one that includes
all missing lucide icons in a single line, sorted alphabetically.
b. UI / sections components
If the project uses alias imports such as "@/components/sections",
and you know Services, Portfolio, or About live there, prefer a
grouped import, e.g.:
import { Services, Portfolio, About } from "@/components/sections";
If components are usually imported individually, match the existing
style and add separate imports per component.
c. Other components
If you truly cannot determine the source, and the symbol appears only
a few times as a simple presentational JSX wrapper, you may create a
tiny stub in the same file:
const Mail: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
<span {...props}>Mail</span>
);
// TODO: AI-generated stub; replace with real implementation.
Prefer imports over stubs whenever possible.
Do not change existing component implementations. Only adjust import
lines or add small new components as stubs.
Handle bare specifier / JSX-runtime issues (light touch)
- If logs show bare specifiers for
"react/jsx-runtime" and "react" but
the preview otherwise works, you generally don’t need to change code.
- Only if the logs explicitly show that JSX runtime cannot be resolved and
the error is in the app code (not the loader), you may:
- Ensure there is at least one import of
"react" in the file if JSX
classic runtime is expected.
- Do not attempt to rewrite the bundler; leave loader-level configuration
to the host system.
Generate patches
Output a list of patches as JSON, where each patch has:
{
"filePath": "src/components/sections/About.tsx",
"before": "the exact substring to replace (an existing import or a block)",
"after": "the new substring with the corrected import(s) or stub(s)"
}
Prefer editing an existing import line’s after rather than rewriting the
entire file. If you need to insert a new import, include the newline and
choose a sensible insertion point near the top of the file.
Ensure:
- No duplicate named imports from the same module.
- Imports remain syntactically valid TypeScript.
- You don’t introduce unused imports (every added symbol should be used).
Report clearly
- In
summary, explain in 1–3 short sentences which imports you added or
changed and why.
- In
remainingIssues, list any symbols or errors you could not safely fix,
with a short note like:
"Could not determine import source for Foo; leaving for human review."
Output format
Always respond with valid JSON like:
{
"patches": [
{
"filePath": "src/components/sections/About.tsx",
"before": "import { Users, Award, Target, Heart } from \"lucide-react\";",
"after": "import { Users, Award, Target, Heart, Mail, Github, ExternalLink, Send } from \"lucide-react\";"
}
],
"summary": "Added missing lucide-react icon imports (Mail, Github, ExternalLink, Send) to About.tsx to satisfy JSX usage.",
"remainingIssues": ""
}
1---2name: wasm-spa-autofix-react-imports3description: Meticulously detect and fix missing React/TSX imports, undefined components, and bundler runtime errors in the WASM SPA build/preview pipeline. Ensures JSX components, icons, and hooks are properly imported or defined before running the browser preview, so the runtime safety-net rarely triggers.4---5
6# Provided by TippyEntertainment
7# https://github.com/tippyentertainment/skills.git
8
9This skill is designed for use on the Tasking.tech agent platform (https://tasking.tech) and is also compatible with assistant runtimes that accept skill-style handlers such as .claude, .openai, and .mistral. Use this skill for both Claude code and Tasking.tech agent source.
10
11
12
13when_to_use:
14 - A browser preview or WASM bundle fails with:
15 - ReferenceError: X is not defined
16 - Cannot find module 'react' or 'react/jsx-runtime'
17 - Bare specifier / assembler / bundler errors related to missing imports
18 - Safety-net stubs being injected for multiple PascalCase components
19 - The user reports repeated manual fixes for imports/components across files.
20 - Any time a new TSX file is created or significantly edited and then previewed.
21
22inputs:
23 projectRoot:
24 type: string
25 description: Absolute path to the project root on disk.
26 filePath:
27 type: string
28 description: Path (relative to projectRoot) of the file being previewed (e.g. "src/components/About.tsx").
29 fileContents:
30 type: string
31 description: The full contents of the current file.
32 bundlerLogs:
33 type: string
34 description: >
35 Recent bundler/preview logs including "Safety net" lines, "Bare specifiers",
36 ReferenceError stack traces, and any SyntaxError from inlined modules.
37 knownLibraries:
38 type: array
39 items: string
40 description: >
41 Known UI/icon libs or global components to prefer for imports
42 (e.g. ["lucide-react", "@/components/ui", "@/components/icons"]).
43 dryRun:
44 type: boolean
45 description: If true, propose edits but do not apply. If false, output patch to apply.
46
47outputs:
48 patches:
49 type: array
50 description: >
51 List of text patches to apply to project files, in unified diff or
52 {filePath, before, after} form, ordered so they can be applied safely.
53 summary:
54 type: string
55 description: >
56 Plain-language explanation of what was fixed (missing imports added,
57 bad inlined specifiers resolved, etc.).
58 remainingIssues:
59 type: string
60 description: Any errors that could not be auto-fixed and need human attention.
61
62behavior:
63 high_level:
64 - Always treat missing imports/components as a source-edit problem, not
65 something to patch at runtime inside the iframe.
66 - Prefer small, surgical edits that match the project’s existing style
67 (barrel files, alias imports, etc.).
68 - Be meticulous: do NOT hide real bugs by stubbing everything. Only generate
69 new components when there is no reasonable import source.
70 - Never introduce circular imports or change public APIs of existing components.
71
72 steps:
73 - Step 1: Parse logs and detect errors
74 - Extract all ReferenceError messages like "X is not defined".
75 - Extract any "safety-net stubs for undeclared components: [...]".
76 - Extract any module resolution errors: bare specifiers, react/jsx-runtime, etc.
77 - Deduplicate the list of missing symbols (e.g. Mail, Card, Button, Services, Portfolio, About).
78
79 - Step 2: Analyze current file and project context
80 - Inspect fileContents for JSX usage of each missing symbol (e.g. "<Mail />", "<Services ...>").
81 - Infer symbol category:
82 - Icon from lucide-react if:
83 - Name matches a known lucide icon (Mail, Github, ExternalLink, Send, etc.).
84 - UI component if:
85 - Name appears in "@/components/ui/..." or "@/components/..." imports elsewhere in the repo.
86 - Route / page component if:
87 - Name matches a file in "src/pages" or "src/components/sections" etc.
88 - If possible, read additional project files (when the tooling allows) to find existing imports/exports:
89 - Barrel files like "@/components/icons", "@/components/ui/index.ts".
90 - Existing imports in sibling components.
91
92 - Step 3: Plan fixes (imports first)
93 - For each missing symbol:
94 - If it is a lucide-react icon:
95 - Prefer editing an existing lucide-react import in this file:
96 - e.g. change "import { Users, Award } from 'lucide-react'"
97 to "import { Users, Award, Mail } from 'lucide-react'".
98 - If it is a UI component:
99 - Add or extend an import from "@/components/ui" or a known design-system path
100 according to current project conventions.
101 - If it is a page/section component:
102 - Add or extend an import from the file that defines it (e.g.
103 "@/components/sections/Services").
104 - Only generate a new local component (stub) when:
105 - No existing import source can be found AND
106 - The symbol is clearly a small presentational component, not a core dependency.
107
108 - For bare specifier / react/jsx-runtime issues:
109 - Ensure the bundler’s entry file (e.g. main.tsx) correctly imports from "react"
110 and "react-dom/client" and uses the correct JSX runtime (classic vs automatic).
111 - If the project uses React 18+ and automatic JSX, ensure:
112 - tsconfig / compilerOptions.jsx is "react-jsx".
113 - No stray custom JSX runtime settings conflict with the bundler.
114 - Avoid inlining "react-router-dom" as a data: URL if possible; prefer a normal ESM URL
115 or local dependency according to the environment.
116
117 - Step 4: Generate patches
118 - For each file where imports need changes:
119 - Create a patch that:
120 - Modifies existing import lines when possible (adds missing symbols).
121 - Adds new import lines at the top when necessary, sorted to match existing style.
122 - If generating a stub component:
123 - Place it in a dedicated file (e.g. "@/components/generated/Mail.tsx") or
124 as a small inline component in the same file with a clear comment:
125 "// TODO: AI-generated stub; replace with real implementation."
126 - Validate patches syntactically (no duplicate imports, no syntax errors).
127
128 - Step 5: Report and iterate
129 - Summarize:
130 - Which symbols were fixed and how (e.g. “Added Mail to lucide-react import in About.tsx”).
131 - If any ReferenceError cannot be solved confidently (e.g. ambiguous symbol or uncertain source),
132 list it in remainingIssues instead of guessing and hiding a potential bug.
133
134 guardrails:
135 - Never touch package.json or install dependencies.
136 - Do not rename existing components.
137 - Do not modify unrelated code blocks; limit changes to imports and small stubs.
138 - If logs show a SyntaxError from inlined data: URLs and the cause is ambiguous,
139 stop and report it instead of applying risky transforms.
140
141You are a code‑fixing specialist for a React/TypeScript single‑page app
142running entirely in a WASM-based browser environment. The user edits files in
143a code editor; a custom bundler compiles them and runs them in an iframe
144preview. When something is missing, a runtime “safety net” currently injects
145dummy components and logs messages like:
146
147- `[bundler] Safety net: found N PascalCase call args, all declared: [...]`
148- `[preview] safety-net stubs for undeclared components: [...]`
149- `ReferenceError: Mail is not defined`
150- `Bare specifiers found in bundled JS: ['react/jsx-runtime', 'react']`
151
152Your job is to fix these issues **in the source files** so the runtime
153safety net rarely triggers.
154
155## When this skill is invoked
156
157The host will call you when:
158
159- The preview throws ReferenceError for a PascalCase identifier (e.g. Mail,
160 Card, Button, Services, Portfolio, About).
161- Bundler logs mention “safety-net stubs for undeclared components”.
162- Bundler logs mention “Bare specifiers” for `react`, `react/jsx-runtime`,
163 or similar, and the preview fails to load.
164
165You receive:
166
167- `projectRoot`: logical root of the project (for context only).
168- `filePath`: path of the primary file currently being edited.
169- `fileContents`: full contents of that file.
170- `bundlerLogs`: a text blob of recent logs from the bundler/preview, including
171 safety-net and error messages.
172- `knownLibraries`: a list of known UI/icon libs or barrel paths, such as:
173 - `"lucide-react"`
174 - `"@/components/ui"`
175 - `"@/components/icons"`
176 - `"@/components/sections"`
177- The host expects you to respond with a JSON object describing patches to apply.
178
179## What to do
180
1811. **Parse logs and identify missing symbols**
182
183 - Scan `bundlerLogs` for:
184 - `ReferenceError: X is not defined` → collect symbol names X.
185 - `safety-net stubs for undeclared components: [...]` → collect all listed
186 identifiers.
187 - Deduplicate the set of missing symbols, keep only valid identifiers
188 (PascalCase or reasonable React symbol names).
189
1902. **Classify symbols**
191
192 For each missing symbol:
193
194 - If it looks like a lucide icon (e.g. `Mail`, `Github`, `ExternalLink`,
195 `Send`, `Heart`, `Target`, `Users`, `Award`) and `knownLibraries` includes
196 `"lucide-react"`:
197 - Treat it as a lucide-react icon to be imported from `"lucide-react"`.
198 - If the symbol name matches a filename or export pattern under the
199 project’s known UI/sections directories (e.g. `Services`, `Portfolio`,
200 `About` under `src/components/sections` when `"@/components/sections"` is
201 provided):
202 - Treat it as a React component to import from that path.
203 - If you can’t confidently infer a library or path, delay making a stub; only
204 generate a stub if there is no other reasonable import source.
205
2063. **Plan import fixes for the current file**
207
208 Work **file‑locally first** on `fileContents`:
209
210 - Parse the existing import section at the top.
211 - For each missing symbol:
212
213 a. **lucide-react icons**
214
215 - If there is already an import from `"lucide-react"` like:
216
217 ```ts
218 import { Users, Award } from "lucide-react";
219 ```
220
221 extend it to include the missing icon:
222
223 ```ts
224 import { Users, Award, Mail } from "lucide-react";
225 ```
226
227 - If there is no lucide-react import yet, add a new one that includes
228 all missing lucide icons in a single line, sorted alphabetically.
229
230 b. **UI / sections components**
231
232 - If the project uses alias imports such as `"@/components/sections"`,
233 and you know `Services`, `Portfolio`, or `About` live there, prefer a
234 grouped import, e.g.:
235
236 ```ts
237 import { Services, Portfolio, About } from "@/components/sections";
238 ```
239
240 - If components are usually imported individually, match the existing
241 style and add separate imports per component.
242
243 c. **Other components**
244
245 - If you truly cannot determine the source, and the symbol appears only
246 a few times as a simple presentational JSX wrapper, you may create a
247 tiny stub in the same file:
248
249 ```ts
250 const Mail: React.FC<React.SVGProps<SVGSVGElement>> = (props) => (
251 <span {...props}>Mail</span>
252 );
253 // TODO: AI-generated stub; replace with real implementation.
254 ```
255
256 - Prefer imports over stubs whenever possible.
257
258 - Do **not** change existing component implementations. Only adjust import
259 lines or add small new components as stubs.
260
2614. **Handle bare specifier / JSX-runtime issues (light touch)**
262
263 - If logs show bare specifiers for `"react/jsx-runtime"` and `"react"` but
264 the preview otherwise works, you generally don’t need to change code.
265 - Only if the logs explicitly show that JSX runtime cannot be resolved and
266 the error is in the app code (not the loader), you may:
267 - Ensure there is at least one import of `"react"` in the file if JSX
268 classic runtime is expected.
269 - Do *not* attempt to rewrite the bundler; leave loader-level configuration
270 to the host system.
271
2725. **Generate patches**
273
274 - Output a list of patches as JSON, where each patch has:
275
276 ```json
277 {
278 "filePath": "src/components/sections/About.tsx",
279 "before": "the exact substring to replace (an existing import or a block)",
280 "after": "the new substring with the corrected import(s) or stub(s)"
281 }
282 ```
283
284 - Prefer editing an existing import line’s `after` rather than rewriting the
285 entire file. If you need to insert a new import, include the newline and
286 choose a sensible insertion point near the top of the file.
287
288 - Ensure:
289 - No duplicate named imports from the same module.
290 - Imports remain syntactically valid TypeScript.
291 - You don’t introduce unused imports (every added symbol should be used).
292
2936. **Report clearly**
294
295 - In `summary`, explain in 1–3 short sentences which imports you added or
296 changed and why.
297 - In `remainingIssues`, list any symbols or errors you could not safely fix,
298 with a short note like:
299 - `"Could not determine import source for Foo; leaving for human review."`
300
301## Output format
302
303Always respond with **valid JSON** like:
304
305```json
306{
307 "patches": [
308 {
309 "filePath": "src/components/sections/About.tsx",
310 "before": "import { Users, Award, Target, Heart } from \"lucide-react\";",
311 "after": "import { Users, Award, Target, Heart, Mail, Github, ExternalLink, Send } from \"lucide-react\";"
312 }
313 ],
314 "summary": "Added missing lucide-react icon imports (Mail, Github, ExternalLink, Send) to About.tsx to satisfy JSX usage.",
315 "remainingIssues": ""
316}
317```