Conversation
Updated dependencies to fix Next.js and React CVE vulnerabilities. The fix-react2shell-next tool automatically updated the following packages to their secure versions: - next - react-server-dom-webpack - react-server-dom-parcel - react-server-dom-turbopack All package.json files have been scanned and vulnerable versions have been patched to the correct fixed versions based on the official React advisory. Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
…ve-vu-gnqu41 Fix React Server Components CVE vulnerabilities
WalkthroughThis pull request introduces a comprehensive "Resume Fit" agentic workflow kit alongside dependency updates across multiple existing kits. The new Changes
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 63
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (6)
kits/agentic/generation/package.json (1)
53-61: 🧹 Nitpick | 🔵 TrivialTwo operatives still using "latest" cover.
Agent,
lamatic(line 53) andreact-markdown(line 61) remain unpinned. Lock these down for full mission compliance.As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/agentic/generation/package.json` around lines 53 - 61, The package.json currently leaves two dependencies unpinned ("lamatic" and "react-markdown") which violates the pinned-dependencies rule; update the kits/agentic/generation package.json by replacing the "latest" ranges for the lamatic and react-markdown entries with exact version strings (no caret or tilde) representing the tested/stable versions you want to lock to—obtain the appropriate exact versions via npm/yarn (e.g., npm view <pkg> version or from your lockfile) and commit the updated entries so both "lamatic" and "react-markdown" are fully pinned.kits/agentic/deep-search/package.json (1)
46-63: 🧹 Nitpick | 🔵 TrivialSurveillance sweep: Minor "latest" targets identified.
Agent, the majority of this package manifest is secure with pinned versions. However, three assets remain unpinned:
@vercel/analytics(line 46),geist(line 53), andreact-markdown(line 63). Consider locking these down for mission-critical reproducibility.As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/agentic/deep-search/package.json` around lines 46 - 63, Replace the three unpinned dependencies in package.json—"@vercel/analytics", "geist", and "react-markdown"—with exact, pinned version strings (not "latest"); update the dependency entries for those package names, run your package manager to regenerate the lockfile (npm/yarn/pnpm) and commit the updated package.json and lockfile to ensure reproducible installs.kits/automation/hiring/package.json (1)
45-55: 🧹 Nitpick | 🔵 TrivialIntel report: A few rogue "latest" versions remain in the field.
Agent, you've done excellent work pinning most dependencies, but our surveillance has identified four operatives still using
"latest":@vercel/analytics,@vercel/blob,geist, andlamatic. These unpinned assets pose a risk to mission reproducibility.As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/automation/hiring/package.json` around lines 45 - 55, The package.json still has unpinned dependencies "@vercel/analytics", "@vercel/blob", "geist", and "lamatic" listed as "latest"; update package.json to pin each of these four dependencies to explicit version strings (choose the currently tested/approved versions), run npm/yarn install to update lockfile, and commit the updated package.json and package-lock.json/yarn.lock so the kit no longer relies on floating "latest" versions.kits/embed/sheets/package.json (1)
22-71: 🛠️ Refactor suggestion | 🟠 MajorMission complication: Inconsistent version pinning detected.
Agent, we have a situation. This manifest shows inconsistent tradecraft - some
@radix-ui/*packages are pinned (e.g.,@radix-ui/react-accordion: "1.2.2"), while others use"latest"(e.g.,@radix-ui/react-checkbox,@radix-ui/react-dialog). Additional "latest" operatives include:@vercel/analytics,geist,immer,lamatic,use-sync-external-store, andzustand.This inconsistency creates unpredictable deployments and violates protocol. As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/embed/sheets/package.json` around lines 22 - 71, The package.json uses inconsistent "latest" tags causing unpredictable installs; replace all "latest" entries with pinned semantic versions—e.g., set explicit versions for `@radix-ui/react-checkbox`, `@radix-ui/react-dialog`, `@radix-ui/react-dropdown-menu`, `@radix-ui/react-popover`, `@radix-ui/react-select`, `@radix-ui/react-toast` and other "latest" entries such as `@vercel/analytics`, geist, immer, lamatic, use-sync-external-store, and zustand to exact versions; determine the appropriate version numbers by aligning with the project's currently tested lockfile or by choosing the same major/minor used elsewhere (e.g., match nearby `@radix-ui/`* pins like `@radix-ui/react-accordion`@1.2.2), update the package.json entries to those exact versions, and regenerate the lockfile (npm/yarn pnpm install) to ensure deterministic installs.kits/embed/chat/package.json (1)
18-68: 🛠️ Refactor suggestion | 🟠 MajorMission Brief: Unpinned dependency versions detected, Agent.
Your mission, should you choose to accept it, involves addressing the numerous
"latest"version specifiers scattered throughout this manifest. The coding guidelines are clear: each kit must have pinned dependency versions. Using"latest"creates non-reproducible builds and can introduce breaking changes without warning.Offending dependencies include:
@radix-ui/*packages (lines 18-44),@vercel/*(lines 45-46),cmdk,embla-carousel-react,geist,input-otp,lamatic,next-themes,react-day-picker,react-hook-form,react-resizable-panels,recharts,sonner, andvaul.As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/embed/chat/package.json` around lines 18 - 68, The package.json contains many unpinned dependencies using "latest" (e.g., `@radix-ui/react-accordion`, `@radix-ui/react-dialog`, `@vercel/analytics`, `@vercel/blob`, cmdk, embla-carousel-react, geist, input-otp, lamatic, next-themes, react-day-picker, react-hook-form, react-resizable-panels, recharts, sonner, vaul); replace each "latest" specifier with a pinned exact version (e.g., "1.2.3" or a specific semver like "1.2.3" without ranges) in kits/embed/chat/package.json so builds are reproducible, then run your package manager (npm install or yarn install) to update the lockfile and verify the app builds and tests pass; ensure all modified keys (the listed package names) are updated consistently and commit the updated package.json and lockfile.kits/embed/search/package.json (1)
18-68: 🛠️ Refactor suggestion | 🟠 MajorCritical mission alert: Widespread "latest" exposure detected.
Agent, this manifest is compromised. Nearly every dependency is using
"latest"- all@radix-ui/*packages (lines 18-44),@vercel/*(lines 45-46),cmdk,embla-carousel-react,geist,input-otp,lamatic,next-themes,react-day-picker,react-hook-form,react-resizable-panels,recharts,sonner, andvaul.This creates maximum exposure to breaking changes and non-reproducible builds. Immediate remediation required.
As per coding guidelines: "Each kit must have its own
package.jsonwith pinned dependency versions."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@kits/embed/search/package.json` around lines 18 - 68, Summary: package.json uses "latest" for many deps which risks non-reproducible builds; pin them to specific versions. Fix: replace every "latest" entry (notably the `@radix-ui/`* packages, `@vercel/`* packages, cmdk, embla-carousel-react, geist, input-otp, lamatic, next-themes, react-day-picker, react-hook-form, react-resizable-panels, recharts, sonner, vaul, etc.) with explicit semver versions—prefer matching versions from the repo root lockfile or the tested release (or use exact versions like 1.2.3) and update package.json accordingly; run npm/yarn/pnpm install to regenerate the lockfile and verify builds; add a short comment in the kit's package.json header or CI policy to enforce pinned versions for all kits going forward.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@kits/agentic/resumeFit/.env.example`:
- Around line 1-4: The env var name is inconsistent: .env.example defines
RESUME_FIT_FLOW but actions/config.ts reads
process.env.AGENTIC_GENERATE_CONTENT; update the code so both use the same name
(prefer changing actions/config.ts to read process.env.RESUME_FIT_FLOW) and
ensure any references to AGENTIC_GENERATE_CONTENT are replaced with
RESUME_FIT_FLOW so the flow ID is loaded correctly at runtime.
In `@kits/agentic/resumeFit/actions/config.ts`:
- Around line 1-12: The config object (config.flows.resumeFit) uses a poorly
named env var and an invalid inputSchema format: rename the workflowId env var
from AGENTIC_GENERATE_CONTENT to a descriptive name like RESUME_FIT_FLOW or
RESUME_FIT_WORKFLOW_ID and update .env/.env.example accordingly, and replace the
string-literal inputSchema with a proper schema object consumed by your
validation layer (e.g., a Zod schema or a JSON Schema) so
flows.resumeFit.inputSchema is a real schema the SDK/validation logic can use;
ensure the code that calls the Lamatic flow reads process.env.RESUME_FIT_FLOW
(or chosen name) and that the new schema shape matches the downstream validator.
In `@kits/agentic/resumeFit/actions/orchestrate.ts`:
- Around line 77-81: Remove the three debug console.log statements that print
res.status, res.headers.get("content-type"), and the entire JSON payload in
orchestrate.ts; instead either delete them or replace with calls to the
project's structured logger at an appropriate debug level (e.g., logger.debug)
and ensure any logged response body is redacted or limited (avoid JSON.stringify
of full resData) so no sensitive operational data is emitted in production;
update the code paths that reference res.status/res.headers/get/res.json to use
the logger (or no-op) accordingly.
- Line 3: The file imports lamaticClient but still uses raw fetch to start
flows; replace the fetch call in the orchestrate function with a call to the
Lamatic SDK using lamaticClient (e.g., lamaticClient.runFlow / invokeFlow or the
SDK method your project exposes), read the target flow ID from an environment
variable (e.g., process.env.RESUME_FIT_FLOW_ID) and pass the same
payload/inputs, then handle the SDK response and errors the same way you
previously handled fetch results; update any tests or callers to expect the SDK
response shape.
- Around line 80-81: The code calls res.json() unconditionally and logs the
parsed body, which will fail or hide errors for non-2xx responses; update the
fetch handling in orchestrate.ts to check res.ok (or res.status) before calling
res.json(), and on non-ok responses log the status, statusText and response text
(or throw an error) instead of proceeding to use resData — specifically adjust
the block that references res, res.json() and resData to validate the response
and either return/throw early or handle the error path cleanly.
- Around line 51-57: The fetch call in orchestrate.ts uses non-null assertions
on process.env.LAMATIC_API_URL!, LAMATIC_API_KEY and LAMATIC_PROJECT_ID without
validation; replace those inline assertions by first reading and validating each
env var into constants (e.g., lamaticUrl, lamaticKey, lamaticProjectId) and if
any is missing throw or return a clear, descriptive error before calling fetch
(or use a helper like ensureEnvVar). Update the block around the fetch call (the
res = await fetch(...) usage) to use the validated constants so runtime crashes
are avoided and error messages explicitly name which env var is absent.
In `@kits/agentic/resumeFit/app/globals.css`:
- Around line 120-127: Replace the hardcoded light-theme utilities in the `@layer`
base body rule—specifically change the body selector's "bg-white text-black"
usage to the theme-aware tokens (e.g., "bg-background text-foreground" or the
corresponding CSS variable utilities) so the body respects dark mode tokens;
update the body rule inside `@layer` base to use those theme variables/classes
instead of bg-white and text-black.
In `@kits/agentic/resumeFit/app/layout.tsx`:
- Around line 6-7: The Geist font imports _geist and _geistMono are configured
but not applied; update the root layout (layout.tsx) to add their font
class/variable values to the body element's className (e.g., include
_geist.variable and _geistMono.variable or _geist.className/_geistMono.className
depending on how Geist exports them) so the fonts are actually used, or remove
the unused _geist and _geistMono imports if you choose to drop the fonts; ensure
you reference the exact symbols _geist and _geistMono when making the change.
- Around line 9-12: Replace the placeholder scaffolding values inside the
exported metadata constant (export const metadata: Metadata) so title,
description and generator reflect the Resume Fit product; update the title from
"v0 App" to a descriptive brand/title (e.g., "Resume Fit — AI Resume
Tailoring"), change the description from "Created with v0" to a concise product
description that mentions resume optimization and AI personalization, and set
generator to your actual app identifier (not "v0.app") so SEO and branding are
accurate; make these edits in the metadata object in layout.tsx.
In `@kits/agentic/resumeFit/app/page.tsx`:
- Line 15: Replace the loose any types used with a concrete interface: define an
interface (e.g., ResumeFitResult or ResultType) that models the shape returned
by your logic (fields used elsewhere in this component), then change the
useState call from useState<any>(null) to useState<ResumeFitResult | null>(null)
and update other occurrences (like the other any at line 19) to use this
interface; ensure functions that setResult (and any props or helpers returning
this value) return/accept this typed shape so the component and its setters
(result, setResult) are fully typed.
- Around line 91-95: The handleCopy function currently calls
navigator.clipboard.writeText without error handling; wrap the clipboard write
in a try/catch inside handleCopy to handle exceptions (permissions, insecure
context) and on success call setCopied(true)/setTimeout as before, while in the
catch implement a fallback copy strategy (e.g., create a temporary textarea,
select its contents and use document.execCommand('copy') or prompt the user) and
surface an error state or message so failures don't silently fail; ensure
temporary DOM cleanup and that setCopied is only set on actual success.
In `@kits/agentic/resumeFit/components/header.tsx`:
- Around line 1-56: The file defines the React component Header in header.tsx
which violates the PascalCase filename rule; rename the file to Header.tsx and
update any imports that reference "header" to "Header" so the exported function
Header continues to resolve correctly; additionally replace the external logo
URL used in the Image src with a local public asset (e.g., move the remote image
into /public and change the Image src to the local path) to avoid runtime
external dependency.
In `@kits/agentic/resumeFit/components/theme-provider.tsx`:
- Around line 1-11: The file name uses kebab-case but React component files in
components/ must be PascalCase; rename the file from theme-provider.tsx to
ThemeProvider.tsx and ensure any imports referencing this file are updated
accordingly; keep the exported component ThemeProvider and its signature
(function ThemeProvider({ children, ...props }: ThemeProviderProps)) unchanged
so the implementation continues to wrap NextThemesProvider as-is.
In `@kits/agentic/resumeFit/components/ui/alert-dialog.tsx`:
- Around line 121-143: Add the missing data-slot attributes to the
AlertDialogAction and AlertDialogCancel components so they match the rest of the
module's styling hooks: update the JSX for AlertDialogPrimitive.Action in
function AlertDialogAction to include data-slot="action" and update the JSX for
AlertDialogPrimitive.Cancel in function AlertDialogCancel to include
data-slot="cancel", preserving the existing className and props spreading.
In `@kits/agentic/resumeFit/components/ui/aspect-ratio.tsx`:
- Around line 1-11: Rename the file from aspect-ratio.tsx to AspectRatio.tsx and
update any imports referencing the old filename so they import { AspectRatio }
from './AspectRatio' (or the correct relative path); ensure the exported
component name AspectRatio and the default/client directive remain unchanged and
run TypeScript/IDE checks to catch any remaining references to the old lowercase
filename.
In `@kits/agentic/resumeFit/components/ui/button.tsx`:
- Line 5: The import in button.tsx uses a relative path ('../../lib/utils')
instead of the project alias used elsewhere; update the import to use the alias
('@/lib/utils') so it matches other UI components (change the import statement
referencing cn in the component to import from '@/lib/utils'); ensure any other
imports in this file follow the same alias convention for consistency.
In `@kits/agentic/resumeFit/components/ui/card.tsx`:
- Line 3: The import in card.tsx uses a relative path for the utility function
(importing cn from '../../lib/utils') which is inconsistent with other
components; update the import to use the project alias (import cn from
'@/lib/utils') so components like pagination.tsx and accordion.tsx share the
same '@/lib/utils' pattern, ensuring consistency across the kit.
In `@kits/agentic/resumeFit/components/ui/carousel.tsx`:
- Around line 96-105: The effect in React.useEffect registers two listeners
(api.on('reInit', onSelect) and api.on('select', onSelect)) but the cleanup only
removes the 'select' listener; update the cleanup to remove both listeners by
calling api.off('reInit', onSelect) and api.off('select', onSelect) (or a single
off call for both if supported) to prevent the reInit handler from leaking after
unmount; adjust the cleanup return inside the same React.useEffect block where
api and onSelect are used.
In `@kits/agentic/resumeFit/components/ui/chart.tsx`:
- Around line 235-239: The current conditional `{item.value && (...)}`
suppresses legitimate zero values; update the render guard to check for
null/undefined instead (e.g., `item.value != null` or `item.value !== null &&
item.value !== undefined`) so `0` will render, and keep the inner span using
`item.value.toLocaleString()` unchanged; locate the conditional around
`item.value` in the `chart.tsx` component and replace it with a nullish check.
- Around line 72-103: ChartStyle currently injects unsanitized config keys into
a CSS custom property via dangerouslySetInnerHTML (see ChartStyle, config,
colorConfig, THEMES, dangerouslySetInnerHTML). Fix by normalizing/sanitizing the
keys before interpolation: add a small helper (e.g., normalizeCssVarName or
sanitizeKey) that converts a key to a safe CSS custom property token (allow only
[a-zA-Z0-9_-], map/replace any other chars to '-' and trim/ensure it doesn’t
start with a digit), use that sanitized name when generating `--color-<name>`
and when iterating colorConfig; also validate/whitelist color values (simple
regex or a known list) before injecting. Ensure all references in the template
use the sanitized names so no raw keys are emitted into the injected HTML.
In `@kits/agentic/resumeFit/components/ui/collapsible.tsx`:
- Around line 1-33: The file name is not PascalCase: rename collapsible.tsx to
Collapsible.tsx and update all imports to the new filename; ensure exported
symbols (Collapsible, CollapsibleTrigger, CollapsibleContent) remain unchanged
and all modules that import this component use the updated import path/filename
so bundlers and tooling pick up the PascalCase component file name per project
convention.
- Around line 5-7: The Collapsible component currently uses React.ComponentProps
without importing React which breaks strict TypeScript; update the top of the
file to import React and/or the named type (e.g., import React, { ComponentProps
} from "react") and change the prop type usage to ComponentProps<typeof
CollapsiblePrimitive.Root> (or React.ComponentProps if you import React
default), and also rename the file from collapsible.tsx to Collapsible.tsx to
follow PascalCase for the component; apply the same import/type fix to other UI
wrappers (accordion, alert-dialog, avatar, etc.) that reference
React.ComponentProps.
In `@kits/agentic/resumeFit/components/ui/command.tsx`:
- Around line 45-60: DialogHeader is currently rendered outside DialogContent
which breaks Radix/shadcn dialog semantics and can harm screen reader
association; move the DialogHeader (including DialogTitle and DialogDescription)
so it is a child of DialogContent (preserving existing props like
className="sr-only" and any surrounding wrappers), keeping DialogContent's
className, showCloseButton prop and the Command child intact, so the structure
becomes Dialog > DialogContent > DialogHeader + Command; update any JSX
accordingly around the DialogHeader, DialogTitle, DialogDescription,
DialogContent and Command components.
In `@kits/agentic/resumeFit/components/ui/context-menu.tsx`:
- Around line 1-252: The file name uses kebab-case but should be
PascalCase—rename the file to ContextMenu.tsx and move/commit it accordingly;
update all imports that reference "./context-menu" to "./ContextMenu" (including
places importing symbols like ContextMenu, ContextMenuTrigger,
ContextMenuContent, ContextMenuItem, ContextMenuCheckboxItem,
ContextMenuRadioItem, ContextMenuLabel, ContextMenuSeparator,
ContextMenuShortcut, ContextMenuGroup, ContextMenuPortal, ContextMenuSub,
ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuRadioGroup) and update
any barrel/index exports that re-export this module so paths match the new
filename; run a quick project-wide search for "context-menu" imports and fix
their casing to prevent module resolution errors.
- Line 129: The CSS string in context-menu.tsx contains an invalid Tailwind
selector `data-[variant=destructive]:*:[svg]:!text-destructive`; find
occurrences of this pattern (e.g., in the class string on the menu item in the
ContextMenu component) and replace them with a valid descendant SVG target such
as `data-[variant=destructive]:[&_svg]:!text-destructive` or simply remove the
invalid fragment if the adjacent selector
`[&_svg:not([class*='text-'])]:text-muted-foreground` already covers the intent;
audit other UI component files (agentic, automation, embed, sample kits) for the
same `data-[variant=destructive]:*:[svg]:!text-destructive` token and apply the
same fix consistently.
In `@kits/agentic/resumeFit/components/ui/empty.tsx`:
- Around line 71-81: EmptyDescription currently types its props as
React.ComponentProps<'p'> but returns a <div>, causing a props/element mismatch;
either change the rendered element to <p> in the EmptyDescription component or
update the prop typing to React.ComponentProps<'div'> so the declared props
match the actual element (adjust any className/prop usage accordingly); locate
the EmptyDescription function and make the type and rendered element consistent.
In `@kits/agentic/resumeFit/components/ui/field.tsx`:
- Around line 128-139: FieldTitle currently reuses the same data-slot value as
FieldLabel ("field-label"), causing selector collisions; update FieldTitle's
data-slot to a distinct identifier (e.g., "field-title" or similar) and then
update any related CSS/JS selectors that target the old slot to the new name so
styles/behaviors remain correct; search for the data-slot="field-label" usage
and adjust references tied to the FieldTitle component and its consumers to the
new unique slot.
- Around line 1-9: The file uses React types like React.ComponentProps but only
imports useMemo; replace the named import with a namespace import (e.g., import
* as React from 'react') and update the hook usage in the file to React.useMemo
(replace the existing useMemo call). Ensure any other React members/types remain
referenced via the React namespace (e.g., React.ComponentProps) so all type
references resolve correctly (update occurrences around the previous useMemo and
the referenced component prop types such as those in the Field component/type
declarations).
In `@kits/agentic/resumeFit/components/ui/form.tsx`:
- Around line 45-66: The guard in useFormField is ineffective because
FormFieldContext and FormItemContext default to {} (truthy) so the function
should explicitly validate required properties instead of just the context
objects: first check that fieldContext?.name exists and throw a clear error
referencing useFormField / FormFieldContext if missing, then check that
itemContext?.id exists and throw a clear error referencing FormItemContext if
missing; only after validating fieldContext.name call
useFormContext()/getFieldState/useFormState to build fieldState and construct
IDs (avoid calling getFieldState with an undefined name), and return the same
shape ({ id, name, formItemId, formDescriptionId, formMessageId, ...fieldState
}).
In `@kits/agentic/resumeFit/components/ui/hover-card.tsx`:
- Around line 28-40: Remove the redundant data-slot="hover-card-portal" from
HoverCardPrimitive.Portal because Portal does not render an actual DOM node;
instead, if you need that data-slot for styling or testing, move it to the
rendered element HoverCardPrimitive.Content (or another real DOM element) so the
attribute is present in the DOM; update the JSX around HoverCardPrimitive.Portal
and HoverCardPrimitive.Content accordingly (refer to the
HoverCardPrimitive.Portal and HoverCardPrimitive.Content usages in
hover-card.tsx).
In `@kits/agentic/resumeFit/components/ui/input-group.tsx`:
- Around line 1-9: The file is using React types (React.ComponentProps) but
never imports React; add an import for React at the top of the file (e.g.,
import React from 'react') so the references to React.ComponentProps used in
components like the InputGroup variants and props typing (look for usages around
the Input, Textarea, Button prop types and places referencing
React.ComponentProps) resolve in strict environments; ensure the import is
placed above the existing imports (before cva import) to match other files'
style.
- Around line 70-75: The onClick handler in InputGroup (the arrow function that
currently does (e) => { if ((e.target as HTMLElement).closest('button')) {
return } e.currentTarget.parentElement?.querySelector('input')?.focus() }) is
fragile and ignores textarea addons; update it to safely detect the clicked
element using a runtime check (e.g., if (e.target instanceof HTMLElement)) and
then skip focusing when the click is inside interactive elements like button or
textarea (use closest('button, textarea') or check tagName), and when focusing,
query for either an input or textarea (querySelector('input, textarea')) so
InputGroupTextarea is handled too.
In `@kits/agentic/resumeFit/components/ui/kbd.tsx`:
- Around line 18-26: KbdGroup is typed as React.ComponentProps<'div'> but
renders a <kbd>, causing a props/type mismatch; update the component props to
use React.ComponentProps<'kbd'> (keep existing name KbdGroup, preserve className
and props spread, and continue using cn('inline-flex items-center gap-1',
className)) so TypeScript reflects the actual element and prevents div-only
props from being allowed.
In `@kits/agentic/resumeFit/components/ui/label.tsx`:
- Around line 1-24: Rename the file from label.tsx to Label.tsx to follow
PascalCase convention for components; ensure the exported component (Label)
remains unchanged, update all imports across the codebase that reference
'./label' or '.../label' to './Label' (or the correct path with PascalCase), and
commit the file rename so case-sensitive filesystems correctly reflect the
change (verify build/CI after updating imports).
In `@kits/agentic/resumeFit/components/ui/menubar.tsx`:
- Around line 148-150: The MenubarRadioItem's className string contains the
invalid Tailwind class "rounded-xs"; locate the component (MenubarRadioItem in
menubar.tsx) where cn(...) builds the classes and replace "rounded-xs" with a
valid utility such as "rounded-sm" (or remove it if no border-radius is
desired), ensuring the change is applied inside the cn(...) call alongside the
existing className prop.
- Around line 123-125: Replace the invalid Tailwind class `rounded-xs` with the
smallest valid utility `rounded-sm` where used (e.g., in the menubar component's
className string in kits/agentic/resumeFit/components/ui/menubar.tsx); search
other UI components mentioned (dialog, sheet, resizable) for `rounded-xs` and
update them too so the border-radius styles apply correctly (look for the
className concatenations in those components and swap the token).
In `@kits/agentic/resumeFit/components/ui/pagination.tsx`:
- Line 9: The import includes an unused symbol causing a lint/unused-import
issue: remove the unused Button import from the import statement (leave only
buttonVariants) in the file where the import appears (the import line that
currently reads "import { Button, buttonVariants } from
'@/components/ui/button'"); alternatively, if Button is intended to be used in
this module (e.g., in the pagination component render), add its usage where
appropriate—preferably remove the unused Button to keep imports minimal.
In `@kits/agentic/resumeFit/components/ui/progress.tsx`:
- Around line 8-29: The Progress component accepts a value that isn't clamped,
so out-of-range values produce incorrect transforms; update the Progress
function (Progress component) to clamp the incoming value to the 0–100 range
before using it in the transform (used in ProgressPrimitive.Indicator), e.g.,
compute a local clampedValue = Math.min(100, Math.max(0, value ?? 0)) and use
that clampedValue in the translateX calculation to ensure the indicator never
underflows or overflows.
In `@kits/agentic/resumeFit/components/ui/select.tsx`:
- Line 7: The import path for the utility function `cn` in select.tsx is
inconsistent with other components; replace the relative import `import { cn }
from '../../lib/utils'` with the aliased path used elsewhere (`@/lib/utils`) so
`cn` is imported via `import { cn } from '@/lib/utils'` to match `command.tsx`
and `dropdown-menu.tsx` and keep module resolution consistent across the kit.
In `@kits/agentic/resumeFit/components/ui/sidebar.tsx`:
- Around line 85-86: The cookie write in sidebar.tsx currently uses
SIDEBAR_COOKIE_NAME, SIDEBAR_COOKIE_MAX_AGE and openState but omits Secure and
SameSite attributes; update the document.cookie assignment in the function where
these variables are used (the sidebar open/close handler) to append
;SameSite=Strict (or Lax if needed) and conditionally append ;Secure when
running under HTTPS (detect via location.protocol === 'https:') so the final
cookie string includes path, max-age, SameSite and Secure flags to harden the
cookie.
In `@kits/agentic/resumeFit/components/ui/skeleton.tsx`:
- Around line 1-13: Rename the file from skeleton.tsx to PascalCase Skeleton.tsx
and update all imports to reference "Skeleton" (e.g., import { Skeleton } from
'.../Skeleton') so the component filename matches the exported React component
name; ensure any default or named imports across the repo that currently point
to "skeleton" are updated, and run a quick search for "skeleton.tsx" and "from
'./skeleton'" to catch and replace remaining references to the old filename.
In `@kits/agentic/resumeFit/components/ui/spinner.tsx`:
- Around line 1-16: Rename the component file from spinner.tsx to Spinner.tsx
and update all imports to match the PascalCase filename; locate the React
component function Spinner and its export (export { Spinner }) and ensure any
import sites that currently import from "spinner" are updated to import from
"Spinner" so module resolution and casing follow the repo convention.
In `@kits/agentic/resumeFit/components/ui/switch.tsx`:
- Around line 1-31: The component file is named using lowercase (switch.tsx) but
the exported React component is PascalCased (Switch); rename the file to
Switch.tsx to follow the repository convention and ensure tooling/exports align.
After renaming, update all imports that reference the old filename to import
from the new Switch filename, and verify the exported symbol Switch (function
Switch / export { Switch }) remains unchanged so consumers continue to work.
In `@kits/agentic/resumeFit/components/ui/textarea.tsx`:
- Around line 1-18: The component file is not PascalCase; rename the file from
textarea.tsx to Textarea.tsx and update all imports that reference this
component to use the new filename (ensure case-sensitive imports across the
repo), keeping the exported component name Textarea unchanged; also verify any
barrel/index exports or tests that import this file are updated to the new
casing so builds pass on case-sensitive filesystems.
In `@kits/agentic/resumeFit/components/ui/toaster.tsx`:
- Line 3: There is a stale duplicate of the useToast hook causing tech debt;
remove the unused duplicate module (the unused components/ui/use-toast copy) and
keep the single source at the hooks implementation used by toaster.tsx
(importing '@/hooks/use-toast'), then run a quick repo-wide search to ensure all
imports reference the canonical use-toast and update any stray imports to
'@/hooks/use-toast' so only the one hook implementation remains.
In `@kits/agentic/resumeFit/components/ui/tooltip.tsx`:
- Around line 21-29: The Tooltip component currently wraps each instance in its
own TooltipProvider causing isolated timers/state; update the Tooltip function
to stop creating a provider per instance by removing TooltipProvider and render
TooltipPrimitive.Root directly (keep the props spread) so consumers can place a
single TooltipProvider at app root; ensure any exports still include
TooltipPrimitive.Provider or TooltipProvider so callers can import and mount a
shared provider when needed (references: Tooltip function, TooltipProvider,
TooltipPrimitive.Root).
In `@kits/agentic/resumeFit/components/ui/use-mobile.tsx`:
- Around line 5-19: Remove the unused duplicate hook implementation that exports
useIsMobile from the components/ui version and keep the canonical implementation
in hooks/use-mobile; delete the components/ui/use-mobile.tsx file, then
update/verify all imports to reference the single canonical useIsMobile (from
hooks/use-mobile) and run a quick repo-wide search to remove any remaining
duplicate useIsMobile files in other kits so only the hooks/ copy remains.
In `@kits/agentic/resumeFit/components/ui/use-toast.ts`:
- Around line 174-182: The effect in use-toast registers and unregisters the
shared listeners array using setState on mount/unmount but currently depends on
state which causes repeated subscribe/unsubscribe churn; update the
React.useEffect in use-toast so its dependency array is [] (empty) to run only
on mount/unmount, leaving the existing logic that pushes setState into listeners
and removes it in the cleanup (references: React.useEffect, listeners, setState,
state).
In `@kits/agentic/resumeFit/config.json`:
- Around line 18-21: Populate the empty URL fields in the config by filling the
demoUrl, githubUrl, deployUrl, and documentationUrl keys with their real links:
set demoUrl to the live preview URL (e.g.
https://agent-b0389f66h-srijita22s-projects.vercel.app/), set githubUrl to the
repository URL for this kit, set deployUrl to the public deployment/dashboard
URL if different from demoUrl, and set documentationUrl to the docs or README
URL; update the values for the keys "demoUrl", "githubUrl", "deployUrl", and
"documentationUrl" in the config.json so they point to the actual resources
referenced in the PR.
- Around line 9-14: The config.json step uses envKey "RESUME_FIT_FLOW" but the
code reads AGENTIC_GENERATE_CONTENT; pick one convention and make all files
consistent. Either change envKey in the step object to
"AGENTIC_GENERATE_CONTENT" (and update .env.example) or update lamatic-client.ts
and actions/config.ts to read process.env.RESUME_FIT_FLOW (and update
.env.example); ensure the envKey value in the step object, the env var
referenced in lamatic-client.ts and actions/config.ts, and .env.example all
match exactly (check the step id "resume-fit-flow" and any usages of
AGENTIC_GENERATE_CONTENT/RESUME_FIT_FLOW).
In `@kits/agentic/resumeFit/flows/resume-fit-flow/meta.json`:
- Around line 3-8: The flow metadata in meta.json is incomplete—populate the
"description" with a concise mission summary, add meaningful "tags" to
categorize the flow, provide a representative "testInput" (example JSON/string
that exercises the flow), and supply real URLs for "githubUrl",
"documentationUrl", and "deployUrl" pointing to the repository, user-facing
docs, and deployed flow endpoint; update these fields in
kits/agentic/resumeFit/flows/resume-fit-flow/meta.json (the "description",
"tags", "testInput", "githubUrl", "documentationUrl", and "deployUrl" keys) so
the flow can be validated and reused.
In `@kits/agentic/resumeFit/hooks/use-mobile.ts`:
- Around line 5-19: There are two identical hooks named useIsMobile; consolidate
them by keeping a single canonical implementation (the function useIsMobile that
sets mql, onChange, and state) and replace the duplicate location with a simple
re-export that imports and re-exports that canonical useIsMobile so there’s one
source of truth; also change the hook’s public return from forcing a boolean
(!!isMobile) to returning the actual state (boolean | undefined) so callers can
detect SSR/initial undefined and avoid hydration layout flash—update the
function signature/return to boolean | undefined and export that from the
canonical module, then have the secondary file just re-export useIsMobile.
In `@kits/agentic/resumeFit/hooks/use-toast.ts`:
- Around line 174-182: The useEffect currently depends on state which causes
listeners to be re-subscribed on every state change; change the dependency array
to [] so the effect runs only once and uses the stable setState function; locate
the effect that pushes setState into the shared listeners array (the
React.useEffect block referencing listeners, setState and state) and replace the
dependency [state] with an empty array [] to prevent repeated add/remove cycles.
In `@kits/agentic/resumeFit/lib/lamatic-client.ts`:
- Line 2: The import of config from '../actions/config' in lamatic-client.ts is
unused; remove the unused import statement (the "config" identifier) from the
top of the file to eliminate the dead drop and keep the module payload clean —
locate the import line that reads "import {config} from '../actions/config'" and
delete it.
- Around line 15-19: The console.log call that prints ENV CHECK with
process.env.LAMATIC_API_URL, process.env.LAMATIC_PROJECT_ID and
process.env.LAMATIC_API_KEY leaks secrets; remove this debug log or replace it
with a non-sensitive check that redacts or masks the API key and any secret-like
values (e.g., only log existence/boolean or a masked substring) so that
LAMATIC_API_KEY is never printed in plaintext; update the call referencing those
env vars to either be removed entirely or to use a safe/redacted message.
In `@kits/agentic/resumeFit/package.json`:
- Line 46: The package.json currently uses unpinned dependency ranges (e.g., the
"@vercel/analytics" dependency entry and similar entries for "geist" and
"react-markdown"), so update those dependency entries in package.json to use
specific version strings instead of "latest" (pin exact versions) to ensure
reproducible builds; locate the dependency keys "@vercel/analytics", "geist",
and "react-markdown" in the dependencies block and replace their values with the
chosen fixed version numbers.
- Around line 2-6: The package.json identity fields are incorrect for the
resumeFit kit: update the "name" field from "agent-kit-reasoning" to a
consistent kit name (e.g., "resumeFit" or the intended package name) and correct
the "repository.url" to point to this kit's actual repo; also update other
identity fields if needed (e.g., "author" or "repository.type") so "name",
"author", and "repository.url" accurately reflect the resumeFit package and its
repository (look for the "name" and "repository" entries in package.json to make
these edits).
- Line 71: The package.json currently pins "zod" to "3.25.67", which is
outdated; update the dependency entry for "zod" in package.json to the current
stable release (e.g., a caret range like "^4.3.6" or the latest exact version),
run install and the test suite to catch breaking changes, and update any code
using Zod APIs (look for Zod imports/usages across the repo) to match v4
typings/behavior or add a short comment in package.json explaining why you
intentionally keep v3.25.67 if you choose not to upgrade.
In `@kits/agentic/resumeFit/postcss.config.js`:
- Around line 1-6: The PostCSS config exports a plugins object using the old
"tailwindcss" plugin; update module.exports to use the new v4 plugin name
"@tailwindcss/postcss" instead of "tailwindcss" (keep the autoprefixer entry
unchanged) so the plugins object becomes `@tailwindcss/postcss`: {} and
autoprefixer: {}; ensure the module.exports structure and keys remain valid for
CommonJS.
In `@kits/agentic/resumeFit/README.md`:
- Around line 44-45: Add proper blank lines around the headings "## 🔑 Setup"
and "## Required Keys and Config" (ensure a blank line before and after each
heading), insert a blank line immediately after the fenced code block near line
74 so the next content is separated, and update the standalone fenced code block
at line 79 to include a language specifier (e.g., ```plaintext or ```text) to
satisfy the linter's requirement.
- Around line 60-66: The README documents AGENTIC_GENERATE_CONTENT but
config.json uses envKey "RESUME_FIT_FLOW", causing a mismatch; fix by making the
env var name consistent across both places — either update README to document
RESUME_FIT_FLOW or change config.json envKey to "AGENTIC_GENERATE_CONTENT" (and
update any code that reads process.env.RESUME_FIT_FLOW or
process.env.AGENTIC_GENERATE_CONTENT accordingly), then verify all references
(e.g., in the resumeFit flow initialization and any deployment scripts) use the
chosen symbol consistently.
- Around line 1-12: The README currently references the wrong kit (Agent Kit
Generation) and wrong deploy/demo links; update the title text to "Resume Fit
Agent", change the live demo anchor href to the correct resumeFit preview URL,
update the Deploy with Vercel button's root-directory query param from
kits/agentic/generation to kits/agentic/resumeFit, and replace the "Generation"
kit mentions (e.g., the phrase on line 24) with "Resume Fit" so all displayed
labels and URLs consistently point to the Resume Fit agent.
In `@kits/agentic/resumeFit/tsconfig.json`:
- Around line 30-33: The tsconfig "include" array contains a duplicate entry
".next\\dev/types/**/*.ts" and uses Windows-style backslashes which break
cross-platform builds; remove the duplicated ".next\\dev/types/**/*.ts" entry
and change backslashes to forward slashes for the matching entries (e.g.,
replace ".next\\dev/types/**/*.ts" with ".next/dev/types/**/*.ts" and
".next\\types/**/*.ts" with ".next/types/**/*.ts") so the include paths are
unique and portable.
---
Outside diff comments:
In `@kits/agentic/deep-search/package.json`:
- Around line 46-63: Replace the three unpinned dependencies in
package.json—"@vercel/analytics", "geist", and "react-markdown"—with exact,
pinned version strings (not "latest"); update the dependency entries for those
package names, run your package manager to regenerate the lockfile
(npm/yarn/pnpm) and commit the updated package.json and lockfile to ensure
reproducible installs.
In `@kits/agentic/generation/package.json`:
- Around line 53-61: The package.json currently leaves two dependencies unpinned
("lamatic" and "react-markdown") which violates the pinned-dependencies rule;
update the kits/agentic/generation package.json by replacing the "latest" ranges
for the lamatic and react-markdown entries with exact version strings (no caret
or tilde) representing the tested/stable versions you want to lock to—obtain the
appropriate exact versions via npm/yarn (e.g., npm view <pkg> version or from
your lockfile) and commit the updated entries so both "lamatic" and
"react-markdown" are fully pinned.
In `@kits/automation/hiring/package.json`:
- Around line 45-55: The package.json still has unpinned dependencies
"@vercel/analytics", "@vercel/blob", "geist", and "lamatic" listed as "latest";
update package.json to pin each of these four dependencies to explicit version
strings (choose the currently tested/approved versions), run npm/yarn install to
update lockfile, and commit the updated package.json and
package-lock.json/yarn.lock so the kit no longer relies on floating "latest"
versions.
In `@kits/embed/chat/package.json`:
- Around line 18-68: The package.json contains many unpinned dependencies using
"latest" (e.g., `@radix-ui/react-accordion`, `@radix-ui/react-dialog`,
`@vercel/analytics`, `@vercel/blob`, cmdk, embla-carousel-react, geist, input-otp,
lamatic, next-themes, react-day-picker, react-hook-form, react-resizable-panels,
recharts, sonner, vaul); replace each "latest" specifier with a pinned exact
version (e.g., "1.2.3" or a specific semver like "1.2.3" without ranges) in
kits/embed/chat/package.json so builds are reproducible, then run your package
manager (npm install or yarn install) to update the lockfile and verify the app
builds and tests pass; ensure all modified keys (the listed package names) are
updated consistently and commit the updated package.json and lockfile.
In `@kits/embed/search/package.json`:
- Around line 18-68: Summary: package.json uses "latest" for many deps which
risks non-reproducible builds; pin them to specific versions. Fix: replace every
"latest" entry (notably the `@radix-ui/`* packages, `@vercel/`* packages, cmdk,
embla-carousel-react, geist, input-otp, lamatic, next-themes, react-day-picker,
react-hook-form, react-resizable-panels, recharts, sonner, vaul, etc.) with
explicit semver versions—prefer matching versions from the repo root lockfile or
the tested release (or use exact versions like 1.2.3) and update package.json
accordingly; run npm/yarn/pnpm install to regenerate the lockfile and verify
builds; add a short comment in the kit's package.json header or CI policy to
enforce pinned versions for all kits going forward.
In `@kits/embed/sheets/package.json`:
- Around line 22-71: The package.json uses inconsistent "latest" tags causing
unpredictable installs; replace all "latest" entries with pinned semantic
versions—e.g., set explicit versions for `@radix-ui/react-checkbox`,
`@radix-ui/react-dialog`, `@radix-ui/react-dropdown-menu`, `@radix-ui/react-popover`,
`@radix-ui/react-select`, `@radix-ui/react-toast` and other "latest" entries such as
`@vercel/analytics`, geist, immer, lamatic, use-sync-external-store, and zustand
to exact versions; determine the appropriate version numbers by aligning with
the project's currently tested lockfile or by choosing the same major/minor used
elsewhere (e.g., match nearby `@radix-ui/`* pins like
`@radix-ui/react-accordion`@1.2.2), update the package.json entries to those exact
versions, and regenerate the lockfile (npm/yarn pnpm install) to ensure
deterministic installs.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 11049398-9762-4710-a88d-e34401ad8ddd
⛔ Files ignored due to path filters (2)
kits/agentic/generation/pnpm-lock.yamlis excluded by!**/pnpm-lock.yamlkits/agentic/resumeFit/package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (88)
kits/agentic/deep-search/package.jsonkits/agentic/generation/package.jsonkits/agentic/resumeFit/.env.examplekits/agentic/resumeFit/.gitignorekits/agentic/resumeFit/README.mdkits/agentic/resumeFit/actions/config.tskits/agentic/resumeFit/actions/orchestrate.tskits/agentic/resumeFit/app/globals.csskits/agentic/resumeFit/app/layout.tsxkits/agentic/resumeFit/app/page.tsxkits/agentic/resumeFit/components.jsonkits/agentic/resumeFit/components/header.tsxkits/agentic/resumeFit/components/theme-provider.tsxkits/agentic/resumeFit/components/ui/accordion.tsxkits/agentic/resumeFit/components/ui/alert-dialog.tsxkits/agentic/resumeFit/components/ui/alert.tsxkits/agentic/resumeFit/components/ui/aspect-ratio.tsxkits/agentic/resumeFit/components/ui/avatar.tsxkits/agentic/resumeFit/components/ui/badge.tsxkits/agentic/resumeFit/components/ui/breadcrumb.tsxkits/agentic/resumeFit/components/ui/button-group.tsxkits/agentic/resumeFit/components/ui/button.tsxkits/agentic/resumeFit/components/ui/calendar.tsxkits/agentic/resumeFit/components/ui/card.tsxkits/agentic/resumeFit/components/ui/carousel.tsxkits/agentic/resumeFit/components/ui/chart.tsxkits/agentic/resumeFit/components/ui/checkbox.tsxkits/agentic/resumeFit/components/ui/collapsible.tsxkits/agentic/resumeFit/components/ui/command.tsxkits/agentic/resumeFit/components/ui/context-menu.tsxkits/agentic/resumeFit/components/ui/dialog.tsxkits/agentic/resumeFit/components/ui/drawer.tsxkits/agentic/resumeFit/components/ui/dropdown-menu.tsxkits/agentic/resumeFit/components/ui/empty.tsxkits/agentic/resumeFit/components/ui/field.tsxkits/agentic/resumeFit/components/ui/form.tsxkits/agentic/resumeFit/components/ui/hover-card.tsxkits/agentic/resumeFit/components/ui/input-group.tsxkits/agentic/resumeFit/components/ui/input-otp.tsxkits/agentic/resumeFit/components/ui/input.tsxkits/agentic/resumeFit/components/ui/item.tsxkits/agentic/resumeFit/components/ui/kbd.tsxkits/agentic/resumeFit/components/ui/label.tsxkits/agentic/resumeFit/components/ui/menubar.tsxkits/agentic/resumeFit/components/ui/navigation-menu.tsxkits/agentic/resumeFit/components/ui/pagination.tsxkits/agentic/resumeFit/components/ui/popover.tsxkits/agentic/resumeFit/components/ui/progress.tsxkits/agentic/resumeFit/components/ui/radio-group.tsxkits/agentic/resumeFit/components/ui/resizable.tsxkits/agentic/resumeFit/components/ui/scroll-area.tsxkits/agentic/resumeFit/components/ui/select.tsxkits/agentic/resumeFit/components/ui/separator.tsxkits/agentic/resumeFit/components/ui/sheet.tsxkits/agentic/resumeFit/components/ui/sidebar.tsxkits/agentic/resumeFit/components/ui/skeleton.tsxkits/agentic/resumeFit/components/ui/slider.tsxkits/agentic/resumeFit/components/ui/sonner.tsxkits/agentic/resumeFit/components/ui/spinner.tsxkits/agentic/resumeFit/components/ui/switch.tsxkits/agentic/resumeFit/components/ui/table.tsxkits/agentic/resumeFit/components/ui/tabs.tsxkits/agentic/resumeFit/components/ui/textarea.tsxkits/agentic/resumeFit/components/ui/toast.tsxkits/agentic/resumeFit/components/ui/toaster.tsxkits/agentic/resumeFit/components/ui/toggle-group.tsxkits/agentic/resumeFit/components/ui/toggle.tsxkits/agentic/resumeFit/components/ui/tooltip.tsxkits/agentic/resumeFit/components/ui/use-mobile.tsxkits/agentic/resumeFit/components/ui/use-toast.tskits/agentic/resumeFit/config.jsonkits/agentic/resumeFit/flows/resume-fit-flow/README.mdkits/agentic/resumeFit/flows/resume-fit-flow/config.jsonkits/agentic/resumeFit/flows/resume-fit-flow/inputs.jsonkits/agentic/resumeFit/flows/resume-fit-flow/meta.jsonkits/agentic/resumeFit/hooks/use-mobile.tskits/agentic/resumeFit/hooks/use-toast.tskits/agentic/resumeFit/lib/lamatic-client.tskits/agentic/resumeFit/lib/utils.tskits/agentic/resumeFit/next.config.mjskits/agentic/resumeFit/package.jsonkits/agentic/resumeFit/postcss.config.jskits/agentic/resumeFit/tailwind.config.jskits/agentic/resumeFit/tsconfig.jsonkits/automation/hiring/package.jsonkits/embed/chat/package.jsonkits/embed/search/package.jsonkits/embed/sheets/package.json
| RESUME_FIT_FLOW="AGENTIC_GENERATE_CONTENT Flow ID" | ||
| LAMATIC_API_URL="LAMATIC_API_URL" | ||
| LAMATIC_PROJECT_ID="LAMATIC_PROJECT_ID" | ||
| LAMATIC_API_KEY="LAMATIC_API_KEY" No newline at end of file |
There was a problem hiding this comment.
Critical mission failure detected, agent! Environment variable name mismatch.
Your .env.example defines RESUME_FIT_FLOW, but actions/config.ts reads from process.env.AGENTIC_GENERATE_CONTENT. This mismatch means the flow ID will be undefined at runtime, causing workflow execution to fail.
Choose one name and align both files. Based on the coding guideline that "flow IDs [should be read] from environment variables," ensure consistency.
🛠️ Option A: Update .env.example to match config.ts
-RESUME_FIT_FLOW="AGENTIC_GENERATE_CONTENT Flow ID"
+AGENTIC_GENERATE_CONTENT="your-flow-id-here"
LAMATIC_API_URL="LAMATIC_API_URL"
LAMATIC_PROJECT_ID="LAMATIC_PROJECT_ID"
LAMATIC_API_KEY="LAMATIC_API_KEY"
+🛠️ Option B: Update config.ts to match .env.example
Update actions/config.ts:
- workflowId: process.env.AGENTIC_GENERATE_CONTENT,
+ workflowId: process.env.RESUME_FIT_FLOW,As per coding guidelines: "Kit server action files must call Lamatic flows via the SDK and read flow IDs from environment variables."
🧰 Tools
🪛 dotenv-linter (4.0.0)
[warning] 2-2: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 2-2: [UnorderedKey] The LAMATIC_API_URL key should go before the RESUME_FIT_FLOW key
(UnorderedKey)
[warning] 3-3: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 3-3: [UnorderedKey] The LAMATIC_PROJECT_ID key should go before the RESUME_FIT_FLOW key
(UnorderedKey)
[warning] 4-4: [EndingBlankLine] No blank line at the end of the file
(EndingBlankLine)
[warning] 4-4: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
[warning] 4-4: [UnorderedKey] The LAMATIC_API_KEY key should go before the LAMATIC_API_URL key
(UnorderedKey)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/.env.example` around lines 1 - 4, The env var name is
inconsistent: .env.example defines RESUME_FIT_FLOW but actions/config.ts reads
process.env.AGENTIC_GENERATE_CONTENT; update the code so both use the same name
(prefer changing actions/config.ts to read process.env.RESUME_FIT_FLOW) and
ensure any references to AGENTIC_GENERATE_CONTENT are replaced with
RESUME_FIT_FLOW so the flow ID is loaded correctly at runtime.
| export const config = { | ||
| flows: { | ||
| resumeFit: { | ||
| name: "Resume Fit Flow", | ||
| workflowId: process.env.AGENTIC_GENERATE_CONTENT, | ||
| inputSchema: { | ||
| instructions: "string", | ||
| mode: "string" | ||
| } | ||
| } | ||
| } | ||
| } No newline at end of file |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Agent, your config needs alignment with mission naming conventions.
Two observations:
-
Environment variable naming:
AGENTIC_GENERATE_CONTENTis generic and doesn't align with the flow nameresumeFit. ConsiderRESUME_FIT_FLOWorRESUME_FIT_WORKFLOW_IDfor clarity. (This ties to the mismatch flagged in.env.example.) -
Input schema format: The
inputSchemauses plain string literals ("string") rather than a proper schema definition (e.g., Zod schema or JSON Schema). If this is consumed by validation logic, ensure the downstream code handles this format.
♻️ Suggested naming alignment
export const config = {
flows: {
resumeFit: {
name: "Resume Fit Flow",
- workflowId: process.env.AGENTIC_GENERATE_CONTENT,
+ workflowId: process.env.RESUME_FIT_FLOW,
inputSchema: {
instructions: "string",
mode: "string"
}
}
}
}As per coding guidelines: "Kit server action files must call Lamatic flows via the SDK and read flow IDs from environment variables."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/actions/config.ts` around lines 1 - 12, The config
object (config.flows.resumeFit) uses a poorly named env var and an invalid
inputSchema format: rename the workflowId env var from AGENTIC_GENERATE_CONTENT
to a descriptive name like RESUME_FIT_FLOW or RESUME_FIT_WORKFLOW_ID and update
.env/.env.example accordingly, and replace the string-literal inputSchema with a
proper schema object consumed by your validation layer (e.g., a Zod schema or a
JSON Schema) so flows.resumeFit.inputSchema is a real schema the SDK/validation
logic can use; ensure the code that calls the Lamatic flow reads
process.env.RESUME_FIT_FLOW (or chosen name) and that the new schema shape
matches the downstream validator.
| @layer base { | ||
| * { | ||
| @apply border; | ||
| } | ||
| body { | ||
| @apply bg-white text-black; | ||
| } | ||
| } No newline at end of file |
There was a problem hiding this comment.
Critical intel, agent: dark mode is compromised.
The body styles use hardcoded bg-white text-black instead of the CSS variable-driven bg-background text-foreground. This will override your carefully crafted dark mode tokens, leaving operatives stranded in light mode regardless of theme selection.
🛠️ Proposed fix to restore dark mode capability
`@layer` base {
* {
`@apply` border;
}
body {
- `@apply` bg-white text-black;
+ `@apply` bg-background text-foreground;
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| @layer base { | |
| * { | |
| @apply border; | |
| } | |
| body { | |
| @apply bg-white text-black; | |
| } | |
| } | |
| `@layer` base { | |
| * { | |
| `@apply` border; | |
| } | |
| body { | |
| `@apply` bg-background text-foreground; | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/app/globals.css` around lines 120 - 127, Replace the
hardcoded light-theme utilities in the `@layer` base body rule—specifically change
the body selector's "bg-white text-black" usage to the theme-aware tokens (e.g.,
"bg-background text-foreground" or the corresponding CSS variable utilities) so
the body respects dark mode tokens; update the body rule inside `@layer` base to
use those theme variables/classes instead of bg-white and text-black.
| 'use client' | ||
|
|
||
| import * as React from 'react' | ||
| import { | ||
| ThemeProvider as NextThemesProvider, | ||
| type ThemeProviderProps, | ||
| } from 'next-themes' | ||
|
|
||
| export function ThemeProvider({ children, ...props }: ThemeProviderProps) { | ||
| return <NextThemesProvider {...props}>{children}</NextThemesProvider> | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Agent, your cover identity needs adjustment.
Per operational guidelines, React component files in the components/ directory should use PascalCase naming. This file should be renamed from theme-provider.tsx to ThemeProvider.tsx.
The implementation itself is mission-ready and correctly wraps next-themes.
As per coding guidelines: "Use PascalCase for React component filenames in the components/ directory"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/components/theme-provider.tsx` around lines 1 - 11,
The file name uses kebab-case but React component files in components/ must be
PascalCase; rename the file from theme-provider.tsx to ThemeProvider.tsx and
ensure any imports referencing this file are updated accordingly; keep the
exported component ThemeProvider and its signature (function ThemeProvider({
children, ...props }: ThemeProviderProps)) unchanged so the implementation
continues to wrap NextThemesProvider as-is.
| function AlertDialogAction({ | ||
| className, | ||
| ...props | ||
| }: React.ComponentProps<typeof AlertDialogPrimitive.Action>) { | ||
| return ( | ||
| <AlertDialogPrimitive.Action | ||
| className={cn(buttonVariants(), className)} | ||
| {...props} | ||
| /> | ||
| ) | ||
| } | ||
|
|
||
| function AlertDialogCancel({ | ||
| className, | ||
| ...props | ||
| }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) { | ||
| return ( | ||
| <AlertDialogPrimitive.Cancel | ||
| className={cn(buttonVariants({ variant: 'outline' }), className)} | ||
| {...props} | ||
| /> | ||
| ) | ||
| } |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Agent, two operatives are missing their identification badges.
AlertDialogAction and AlertDialogCancel are the only components in this module without data-slot attributes. All their teammates have them for consistent styling hooks. Consider adding them for operational consistency.
🏷️ Proposed fix for consistency
function AlertDialogAction({
className,
...props
}: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {
return (
<AlertDialogPrimitive.Action
+ data-slot="alert-dialog-action"
className={cn(buttonVariants(), className)}
{...props}
/>
)
}
function AlertDialogCancel({
className,
...props
}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {
return (
<AlertDialogPrimitive.Cancel
+ data-slot="alert-dialog-cancel"
className={cn(buttonVariants({ variant: 'outline' }), className)}
{...props}
/>
)
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/components/ui/alert-dialog.tsx` around lines 121 -
143, Add the missing data-slot attributes to the AlertDialogAction and
AlertDialogCancel components so they match the rest of the module's styling
hooks: update the JSX for AlertDialogPrimitive.Action in function
AlertDialogAction to include data-slot="action" and update the JSX for
AlertDialogPrimitive.Cancel in function AlertDialogCancel to include
data-slot="cancel", preserving the existing className and props spreading.
| export function useIsMobile() { | ||
| const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) | ||
|
|
||
| React.useEffect(() => { | ||
| const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) | ||
| const onChange = () => { | ||
| setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) | ||
| } | ||
| mql.addEventListener('change', onChange) | ||
| setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) | ||
| return () => mql.removeEventListener('change', onChange) | ||
| }, []) | ||
|
|
||
| return !!isMobile | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Find all exported `useIsMobile` definitions
rg -n --type=ts --type=tsx '\bexport\s+function\s+useIsMobile\s*\(' -C2
# 2) Find all imports that reference any use-mobile module
rg -n --type=ts --type=tsx 'from\s+["'\''][^"'\'']*use-mobile["'\'']' -C1Repository: Lamatic/AgentKit
Length of output: 87
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Find all exported useIsMobile function definitions
echo "=== Searching for useIsMobile exports ==="
rg -n -t ts 'export\s+(function|const)\s+useIsMobile' --color=never || echo "No matches found"
# 2) Find all imports from use-mobile modules
echo -e "\n=== Searching for use-mobile imports ==="
rg -n -t ts 'from\s+["\x27].*use-mobile["\x27]' --color=never || echo "No matches found"
# 3) List the specific files mentioned
echo -e "\n=== Checking file existence ==="
ls -la kits/agentic/resumeFit/components/ui/use-mobile.tsx 2>/dev/null || echo "components/ui/use-mobile.tsx does not exist"
ls -la kits/agentic/resumeFit/hooks/use-mobile.ts 2>/dev/null || echo "hooks/use-mobile.ts does not exist"
# 4) Show content of files if they exist
echo -e "\n=== File contents ==="
if [ -f kits/agentic/resumeFit/components/ui/use-mobile.tsx ]; then
echo "--- kits/agentic/resumeFit/components/ui/use-mobile.tsx ---"
cat kits/agentic/resumeFit/components/ui/use-mobile.tsx
fi
if [ -f kits/agentic/resumeFit/hooks/use-mobile.ts ]; then
echo "--- kits/agentic/resumeFit/hooks/use-mobile.ts ---"
cat kits/agentic/resumeFit/hooks/use-mobile.ts
fiRepository: Lamatic/AgentKit
Length of output: 3912
Your mission: eliminate the ghost hook in components/ui/.
Duplicate useIsMobile implementations confirmed. Both kits/agentic/resumeFit/hooks/use-mobile.ts and kits/agentic/resumeFit/components/ui/use-mobile.tsx export identical logic (565 bytes each). All imports across the codebase correctly reference @/hooks/use-mobile—the components/ui/use-mobile.tsx variant is unused deadcode.
Delete kits/agentic/resumeFit/components/ui/use-mobile.tsx. This duplication pattern exists across all kits (resumeFit, deep-search, generation, hiring, blog-automation, and others)—consider a systematic cleanup to consolidate all useIsMobile to the canonical hooks/ location.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/components/ui/use-mobile.tsx` around lines 5 - 19,
Remove the unused duplicate hook implementation that exports useIsMobile from
the components/ui version and keep the canonical implementation in
hooks/use-mobile; delete the components/ui/use-mobile.tsx file, then
update/verify all imports to reference the single canonical useIsMobile (from
hooks/use-mobile) and run a quick repo-wide search to remove any remaining
duplicate useIsMobile files in other kits so only the hooks/ copy remains.
| React.useEffect(() => { | ||
| listeners.push(setState) | ||
| return () => { | ||
| const index = listeners.indexOf(setState) | ||
| if (index > -1) { | ||
| listeners.splice(index, 1) | ||
| } | ||
| } | ||
| }, [state]) |
There was a problem hiding this comment.
Agent, we have a potential leak in the operation.
The useEffect dependency array includes [state], but this subscription logic only needs to execute once on mount. With state as a dependency, every state update triggers:
- Cleanup (removes old listener)
- Re-run (adds listener again)
This creates unnecessary churn. The listener reference (setState) is stable, so the dependency should be an empty array [].
🛠️ Proposed fix
React.useEffect(() => {
listeners.push(setState)
return () => {
const index = listeners.indexOf(setState)
if (index > -1) {
listeners.splice(index, 1)
}
}
- }, [state])
+ }, [])📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| React.useEffect(() => { | |
| listeners.push(setState) | |
| return () => { | |
| const index = listeners.indexOf(setState) | |
| if (index > -1) { | |
| listeners.splice(index, 1) | |
| } | |
| } | |
| }, [state]) | |
| React.useEffect(() => { | |
| listeners.push(setState) | |
| return () => { | |
| const index = listeners.indexOf(setState) | |
| if (index > -1) { | |
| listeners.splice(index, 1) | |
| } | |
| } | |
| }, []) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/components/ui/use-toast.ts` around lines 174 - 182,
The effect in use-toast registers and unregisters the shared listeners array
using setState on mount/unmount but currently depends on state which causes
repeated subscribe/unsubscribe churn; update the React.useEffect in use-toast so
its dependency array is [] (empty) to run only on mount/unmount, leaving the
existing logic that pushes setState into listeners and removes it in the cleanup
(references: React.useEffect, listeners, setState, state).
| "description": "", | ||
| "tags": [], | ||
| "testInput": "", | ||
| "githubUrl": "", | ||
| "documentationUrl": "", | ||
| "deployUrl": "" |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Mission brief: complete the flow metadata before release.
Leaving description, testInput, and URLs empty makes the flow harder to validate and reuse. Fill these with real values (including repo/docs/deploy links).
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/flows/resume-fit-flow/meta.json` around lines 3 - 8,
The flow metadata in meta.json is incomplete—populate the "description" with a
concise mission summary, add meaningful "tags" to categorize the flow, provide a
representative "testInput" (example JSON/string that exercises the flow), and
supply real URLs for "githubUrl", "documentationUrl", and "deployUrl" pointing
to the repository, user-facing docs, and deployed flow endpoint; update these
fields in kits/agentic/resumeFit/flows/resume-fit-flow/meta.json (the
"description", "tags", "testInput", "githubUrl", "documentationUrl", and
"deployUrl" keys) so the flow can be validated and reused.
| export function useIsMobile() { | ||
| const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) | ||
|
|
||
| React.useEffect(() => { | ||
| const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) | ||
| const onChange = () => { | ||
| setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) | ||
| } | ||
| mql.addEventListener('change', onChange) | ||
| setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) | ||
| return () => mql.removeEventListener('change', onChange) | ||
| }, []) | ||
|
|
||
| return !!isMobile | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Verify duplicate hook files exist
fd -t f 'use-mobile' kits/agentic/resumeFitRepository: Lamatic/AgentKit
Length of output: 154
Your mission, should you choose to accept it: eliminate the duplicate asset.
Intelligence confirms an identical useIsMobile hook exists at kits/agentic/resumeFit/components/ui/use-mobile.tsx. Consolidate these into a single source of truth and re-export from the secondary location to prevent divergence.
Secondary concern: !!isMobile returns false during SSR and initial render (when isMobile is undefined), which may cause layout flash on mobile. Verify this hydration behavior aligns with your use case.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/hooks/use-mobile.ts` around lines 5 - 19, There are
two identical hooks named useIsMobile; consolidate them by keeping a single
canonical implementation (the function useIsMobile that sets mql, onChange, and
state) and replace the duplicate location with a simple re-export that imports
and re-exports that canonical useIsMobile so there’s one source of truth; also
change the hook’s public return from forcing a boolean (!!isMobile) to returning
the actual state (boolean | undefined) so callers can detect SSR/initial
undefined and avoid hydration layout flash—update the function signature/return
to boolean | undefined and export that from the canonical module, then have the
secondary file just re-export useIsMobile.
| module.exports = { | ||
| plugins: { | ||
| tailwindcss: {}, | ||
| autoprefixer: {}, | ||
| }, | ||
| } No newline at end of file |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
What is the correct PostCSS plugin name for Tailwind CSS v4?
💡 Result:
The correct PostCSS plugin name for Tailwind CSS v4 is @tailwindcss/postcss.
Citations:
- 1: https://tailwindcss.com/docs/installation/using-postcss
- 2: https://tailwindcss.com/blog/tailwindcss-v4
- 3: https://v3.tailwindcss.com/docs/v4-beta
- 4: https://tailwindcss.com/docs/upgrade-guide
Your mission: Update the PostCSS configuration for Tailwind CSS v4 compatibility.
The PostCSS plugin configuration doesn't align with the Tailwind CSS v4+ requirement. The v4 approach uses @tailwindcss/postcss instead of the v3 tailwindcss plugin.
Configuration update required
module.exports = {
plugins: {
- tailwindcss: {},
+ '@tailwindcss/postcss': {},
autoprefixer: {},
},
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| module.exports = { | |
| plugins: { | |
| tailwindcss: {}, | |
| autoprefixer: {}, | |
| }, | |
| } | |
| module.exports = { | |
| plugins: { | |
| '@tailwindcss/postcss': {}, | |
| autoprefixer: {}, | |
| }, | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/postcss.config.js` around lines 1 - 6, The PostCSS
config exports a plugins object using the old "tailwindcss" plugin; update
module.exports to use the new v4 plugin name "@tailwindcss/postcss" instead of
"tailwindcss" (keep the autoprefixer entry unchanged) so the plugins object
becomes `@tailwindcss/postcss`: {} and autoprefixer: {}; ensure the module.exports
structure and keys remain valid for CommonJS.
| @@ -0,0 +1,128 @@ | |||
| "use server" | |||
|
|
|||
| import { lamaticClient } from "../lib/lamatic-client" | |||
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Agent, we have an unused asset in the field.
The lamaticClient is imported but never deployed in this operation. Per our intelligence briefings, kit server actions must call Lamatic flows via the SDK. Your current approach uses raw fetch instead.
This message will self-destruct if you choose to accept this refactor:
🔧 Proposed mission parameters
-import { lamaticClient } from "../lib/lamatic-client"
+// If SDK is required per guidelines, use lamaticClient here
+// Otherwise, remove this unused importBased on learnings: "Kit server action files (e.g., actions/orchestrate.ts) must call Lamatic flows via the SDK and read flow IDs from environment variables"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/actions/orchestrate.ts` at line 3, The file imports
lamaticClient but still uses raw fetch to start flows; replace the fetch call in
the orchestrate function with a call to the Lamatic SDK using lamaticClient
(e.g., lamaticClient.runFlow / invokeFlow or the SDK method your project
exposes), read the target flow ID from an environment variable (e.g.,
process.env.RESUME_FIT_FLOW_ID) and pass the same payload/inputs, then handle
the SDK response and errors the same way you previously handled fetch results;
update any tests or callers to expect the SDK response shape.
| const res = await fetch(process.env.LAMATIC_API_URL!, { | ||
| method: "POST", | ||
| headers: { | ||
| "Content-Type": "application/json", | ||
| "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`, | ||
| "x-project-id": process.env.LAMATIC_PROJECT_ID!, | ||
| }, |
There was a problem hiding this comment.
Critical intel gap detected, agent.
You're accessing environment variables with non-null assertions (!) without prior validation. If these variables are missing, your mission will crash at runtime with cryptic errors.
🛡️ Secure the perimeter
+ const apiUrl = process.env.LAMATIC_API_URL
+ const apiKey = process.env.LAMATIC_API_KEY
+ const projectId = process.env.LAMATIC_PROJECT_ID
+
+ if (!apiUrl || !apiKey || !projectId) {
+ throw new Error("Missing required environment variables: LAMATIC_API_URL, LAMATIC_API_KEY, or LAMATIC_PROJECT_ID")
+ }
+
-const res = await fetch(process.env.LAMATIC_API_URL!, {
+const res = await fetch(apiUrl, {
method: "POST",
headers: {
"Content-Type": "application/json",
- "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`,
- "x-project-id": process.env.LAMATIC_PROJECT_ID!,
+ "Authorization": `Bearer ${apiKey}`,
+ "x-project-id": projectId,
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const res = await fetch(process.env.LAMATIC_API_URL!, { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| "Authorization": `Bearer ${process.env.LAMATIC_API_KEY}`, | |
| "x-project-id": process.env.LAMATIC_PROJECT_ID!, | |
| }, | |
| const apiUrl = process.env.LAMATIC_API_URL | |
| const apiKey = process.env.LAMATIC_API_KEY | |
| const projectId = process.env.LAMATIC_PROJECT_ID | |
| if (!apiUrl || !apiKey || !projectId) { | |
| throw new Error("Missing required environment variables: LAMATIC_API_URL, LAMATIC_API_KEY, or LAMATIC_PROJECT_ID") | |
| } | |
| const res = await fetch(apiUrl, { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| "Authorization": `Bearer ${apiKey}`, | |
| "x-project-id": projectId, | |
| }, |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/actions/orchestrate.ts` around lines 51 - 57, The
fetch call in orchestrate.ts uses non-null assertions on
process.env.LAMATIC_API_URL!, LAMATIC_API_KEY and LAMATIC_PROJECT_ID without
validation; replace those inline assertions by first reading and validating each
env var into constants (e.g., lamaticUrl, lamaticKey, lamaticProjectId) and if
any is missing throw or return a clear, descriptive error before calling fetch
(or use a helper like ensureEnvVar). Update the block around the fetch call (the
res = await fetch(...) usage) to use the validated constants so runtime crashes
are avoided and error messages explicitly name which env var is absent.
| console.log("STATUS:", res.status) | ||
| console.log("CONTENT TYPE:", res.headers.get("content-type")) | ||
|
|
||
| const resData = await res.json() | ||
| console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2)) |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Agent, your communications are compromised.
These console.log statements expose operational details (status codes, full response payloads) in production. Consider using a proper logging framework with appropriate log levels, or remove these debug statements before deployment.
🕵️ Stealth mode recommended
-console.log("STATUS:", res.status)
-console.log("CONTENT TYPE:", res.headers.get("content-type"))
-
- const resData = await res.json()
-console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2))
+ const resData = await res.json()
+ // Consider structured logging for production observability📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| console.log("STATUS:", res.status) | |
| console.log("CONTENT TYPE:", res.headers.get("content-type")) | |
| const resData = await res.json() | |
| console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2)) | |
| const resData = await res.json() | |
| // Consider structured logging for production observability |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/actions/orchestrate.ts` around lines 77 - 81, Remove
the three debug console.log statements that print res.status,
res.headers.get("content-type"), and the entire JSON payload in orchestrate.ts;
instead either delete them or replace with calls to the project's structured
logger at an appropriate debug level (e.g., logger.debug) and ensure any logged
response body is redacted or limited (avoid JSON.stringify of full resData) so
no sensitive operational data is emitted in production; update the code paths
that reference res.status/res.headers/get/res.json to use the logger (or no-op)
accordingly.
| const resData = await res.json() | ||
| console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2)) |
There was a problem hiding this comment.
Mission abort condition not handled, agent.
The fetch response status is logged but not validated. A non-2xx response will still proceed to res.json(), potentially causing parsing failures or masking server errors.
🎯 Tactical improvement
+if (!res.ok) {
+ throw new Error(`API request failed with status ${res.status}`)
+}
+
const resData = await res.json()
-console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2))📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const resData = await res.json() | |
| console.log("FULL RESPONSE:", JSON.stringify(resData, null, 2)) | |
| if (!res.ok) { | |
| throw new Error(`API request failed with status ${res.status}`) | |
| } | |
| const resData = await res.json() |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/actions/orchestrate.ts` around lines 80 - 81, The code
calls res.json() unconditionally and logs the parsed body, which will fail or
hide errors for non-2xx responses; update the fetch handling in orchestrate.ts
to check res.ok (or res.status) before calling res.json(), and on non-ok
responses log the status, statusText and response text (or throw an error)
instead of proceeding to use resData — specifically adjust the block that
references res, res.json() and resData to validate the response and either
return/throw early or handle the error path cleanly.
| const _geist = Geist({ subsets: ["latin"] }); | ||
| const _geistMono = Geist_Mono({ subsets: ["latin"] }); |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Loaded equipment not deployed — font variables unused.
The Geist font variables _geist and _geistMono are imported and configured but never applied to the body className. Either use the font class names or remove the unused imports.
🔧 Option A: Apply the font classes
-const _geist = Geist({ subsets: ["latin"] });
-const _geistMono = Geist_Mono({ subsets: ["latin"] });
+const geistSans = Geist({ subsets: ["latin"], variable: "--font-geist-sans" });
+const geistMono = Geist_Mono({ subsets: ["latin"], variable: "--font-geist-mono" });
...
- <body className={`font-sans antialiased`}>
+ <body className={`${geistSans.variable} ${geistMono.variable} font-sans antialiased`}>Also applies to: 39-39
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/app/layout.tsx` around lines 6 - 7, The Geist font
imports _geist and _geistMono are configured but not applied; update the root
layout (layout.tsx) to add their font class/variable values to the body
element's className (e.g., include _geist.variable and _geistMono.variable or
_geist.className/_geistMono.className depending on how Geist exports them) so
the fonts are actually used, or remove the unused _geist and _geistMono imports
if you choose to drop the fonts; ensure you reference the exact symbols _geist
and _geistMono when making the change.
| "tailwindcss-animate": "^1.0.7", | ||
| "typewriter-effect": "^2.22.0", | ||
| "vaul": "^0.9.9", | ||
| "zod": "3.25.67" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check available zod versions on npm
echo "=== Checking latest zod versions on npm ==="
curl -s "https://registry.npmjs.org/zod" | jq '.["dist-tags"], .versions | keys | .[-10:]'Repository: Lamatic/AgentKit
Length of output: 504
🏁 Script executed:
#!/bin/bash
# Get detailed information about zod versions
echo "=== Zod dist-tags (latest versions) ==="
curl -s "https://registry.npmjs.org/zod" | jq '.["dist-tags"]'
echo -e "\n=== Checking if version 3.25.67 exists ==="
curl -s "https://registry.npmjs.org/zod/3.25.67" | jq '.version // "NOT FOUND"' 2>/dev/null || echo "Version 3.25.67 not found"
echo -e "\n=== Zod versions in 3.25.x range ==="
curl -s "https://registry.npmjs.org/zod" | jq '.versions | keys[] | select(startswith("3.25"))' | head -20
echo -e "\n=== Latest 20 stable (non-canary/alpha) versions ==="
curl -s "https://registry.npmjs.org/zod" | jq '.versions | keys[] | select(test("^[0-9]+\\.[0-9]+\\.[0-9]+$")) | select(startswith("3") or startswith("4"))' | tail -20Repository: Lamatic/AgentKit
Length of output: 1154
Update dependency to latest stable zod version — 3.25.67 is significantly outdated.
Version 3.25.67 is a valid release, but it's nearly two major versions behind the current stable release (4.3.6). Consider updating to a more recent version for bug fixes, security patches, and compatibility improvements. If compatibility with 3.25.67 is intentional, document the reasoning.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/package.json` at line 71, The package.json currently
pins "zod" to "3.25.67", which is outdated; update the dependency entry for
"zod" in package.json to the current stable release (e.g., a caret range like
"^4.3.6" or the latest exact version), run install and the test suite to catch
breaking changes, and update any code using Zod APIs (look for Zod
imports/usages across the repo) to match v4 typings/behavior or add a short
comment in package.json explaining why you intentionally keep v3.25.67 if you
choose not to upgrade.
| # Agent Kit Generation by Lamatic.ai | ||
|
|
||
| <p align="center"> | ||
| <a href="https://agent-kit-generation.vercel.app" target="_blank"> | ||
| <img src="https://img.shields.io/badge/Live%20Demo-black?style=for-the-badge" alt="Live Demo" /> | ||
| </a> | ||
| </p> | ||
|
|
||
|
|
||
| **Agent Kit Generation** is an AI-powered content generation system built with [Lamatic.ai](https://lamatic.ai). It uses intelligent workflows to generate text, images, and JSON content through a modern Next.js interface with markdown rendering support. | ||
|
|
||
| [](https://vercel.com/new/clone?repository-url=https://github.com/Lamatic/AgentKit&root-directory=kits/agentic/generation&env=AGENTIC_GENERATE_CONTENT,LAMATIC_API_URL,LAMATIC_PROJECT_ID,LAMATIC_API_KEY&envDescription=Your%20Lamatic%20Generation%20keys%20are%20required.&envLink=https://lamatic.ai/templates/agentkits/agentic/agent-kit-generation) |
There was a problem hiding this comment.
Agent, your cover story doesn't match your mission — this is a template from another operation!
This README describes "Agent Kit Generation" but you're deploying "Resume Fit". The deploy button on line 12 points to kits/agentic/generation instead of kits/agentic/resumeFit. The live demo link references the wrong application. This documentation will mislead operatives attempting to deploy.
Update all references:
- Title: "Agent Kit Generation" → "Resume Fit Agent"
- Deploy URL root-directory:
kits/agentic/generation→kits/agentic/resumeFit - Live demo link: Update to the correct resumeFit preview URL
- Line 24: "Generation" agent kit → "Resume Fit" agent kit
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/README.md` around lines 1 - 12, The README currently
references the wrong kit (Agent Kit Generation) and wrong deploy/demo links;
update the title text to "Resume Fit Agent", change the live demo anchor href to
the correct resumeFit preview URL, update the Deploy with Vercel button's
root-directory query param from kits/agentic/generation to
kits/agentic/resumeFit, and replace the "Generation" kit mentions (e.g., the
phrase on line 24) with "Resume Fit" so all displayed labels and URLs
consistently point to the Resume Fit agent.
| ## 🔑 Setup | ||
| ## Required Keys and Config |
There was a problem hiding this comment.
Minor formatting issues flagged by static analysis.
Lines 44-45 need blank lines around headings. Line 74 needs a blank line after the fenced code block. Line 79's code block should specify a language (e.g., plaintext or text).
Also applies to: 74-75, 79-79
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)
[warning] 44-44: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 45-45: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Above
(MD022, blanks-around-headings)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/README.md` around lines 44 - 45, Add proper blank
lines around the headings "## 🔑 Setup" and "## Required Keys and Config"
(ensure a blank line before and after each heading), insert a blank line
immediately after the fenced code block near line 74 so the next content is
separated, and update the standalone fenced code block at line 79 to include a
language specifier (e.g., ```plaintext or ```text) to satisfy the linter's
requirement.
| ```bash | ||
| # Lamatic | ||
| AGENTIC_GENERATE_CONTENT = "AGENTIC_GENERATE_CONTENT Flow ID" | ||
| LAMATIC_API_URL = "LAMATIC_API_URL" | ||
| LAMATIC_PROJECT_ID = "LAMATIC_PROJECT_ID" | ||
| LAMATIC_API_KEY = "LAMATIC_API_KEY" | ||
| ``` |
There was a problem hiding this comment.
Environment variable mismatch between documentation and configuration.
The README documents AGENTIC_GENERATE_CONTENT as the flow ID variable, but config.json specifies envKey: "RESUME_FIT_FLOW". These must align for successful mission execution.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/README.md` around lines 60 - 66, The README documents
AGENTIC_GENERATE_CONTENT but config.json uses envKey "RESUME_FIT_FLOW", causing
a mismatch; fix by making the env var name consistent across both places —
either update README to document RESUME_FIT_FLOW or change config.json envKey to
"AGENTIC_GENERATE_CONTENT" (and update any code that reads
process.env.RESUME_FIT_FLOW or process.env.AGENTIC_GENERATE_CONTENT
accordingly), then verify all references (e.g., in the resumeFit flow
initialization and any deployment scripts) use the chosen symbol consistently.
| ".next\\dev/types/**/*.ts", | ||
| ".next\\dev/types/**/*.ts", | ||
| "next-env.d.ts", | ||
| ".next/types/**/*.ts" |
There was a problem hiding this comment.
Intel duplication detected in your include paths, agent.
Line 30 and 31 are identical — a copy-paste oversight. Additionally, the Windows-style path separators (\\) on lines 30-31 may cause issues on Unix-based systems (Linux/macOS). Use forward slashes for cross-platform compatibility.
🔧 Proposed path corrections
"include": [
"**/*.mts",
"**/*.ts",
"**/*.tsx",
- ".next\\dev/types/**/*.ts",
- ".next\\dev/types/**/*.ts",
+ ".next/types/**/*.ts",
"next-env.d.ts",
".next/types/**/*.ts"
],📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ".next\\dev/types/**/*.ts", | |
| ".next\\dev/types/**/*.ts", | |
| "next-env.d.ts", | |
| ".next/types/**/*.ts" | |
| ".next/types/**/*.ts", | |
| "next-env.d.ts", | |
| ".next/types/**/*.ts" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@kits/agentic/resumeFit/tsconfig.json` around lines 30 - 33, The tsconfig
"include" array contains a duplicate entry ".next\\dev/types/**/*.ts" and uses
Windows-style backslashes which break cross-platform builds; remove the
duplicated ".next\\dev/types/**/*.ts" entry and change backslashes to forward
slashes for the matching entries (e.g., replace ".next\\dev/types/**/*.ts" with
".next/dev/types/**/*.ts" and ".next\\types/**/*.ts" with ".next/types/**/*.ts")
so the include paths are unique and portable.
Label: agentkit-challenge
🔍 What This Kit Does
ResumeFit is an AI-powered resume screening agent that evaluates candidate resumes against job descriptions.
It solves the problem of manual and inconsistent resume screening by providing:
The system delivers structured, explainable insights to assist in faster and more objective hiring decisions.
⚙️ Providers & Prerequisites
🔌 Providers
🧾 Prerequisites
💻 How to Run Locally