Add a new built-in exercise to Liftosaur end-to-end — image (gymvisual.com → S3), catalog registration, description page, and the LLM/MCP exercise list. Use when adding one or more built-in exercises to the app catalog.
中文简介正在准备中。当前显示原文说明。
Add a new server-rendered page to the Liftosaur website. Use when creating new public-facing pages with routing, SSR, and client hydration.
中文简介正在准备中。当前显示原文说明。
实测评分 未实测
查看安装方法安装前可以查看交给 AI 代理的指令内容。
Create a new server-rendered page at the specified route. Requirements: $ARGUMENTS
Before creating files, read these existing examples to understand the patterns:
src/pages/allExercises/allExercisesHtml.tsx — simple HTML wrapper examplesrc/pages/allExercises/allExercisesContent.tsx — simple content componentsrc/allExercises.tsx — client entry hydrationlambda/allExercises.tsx — lambda render functionlambda/index.ts for the route registration pattern (search for getAllExercisesEndpoint)webpack.config.js for the entry point patternEvery public page uses 4 layers. For a page at /myroute with entry name mypage:
lambda/myPage.tsx)import { h } from "preact";
import { IAccount } from "../src/models/account";
import { MyPageHtml } from "../src/pages/myPage/myPageHtml";
import { renderPage } from "./render";
export function renderMyPageHtml(client: Window["fetch"], account?: IAccount): string {
return renderPage(<MyPageHtml client={client} account={account} />);
}
src/pages/myPage/myPageHtml.tsx)Wraps content in <Page>. Key props:
css={["mypage"]} / js={["mypage"]} — must match webpack entry keymaxWidth={1200} — page max widthtitle, canonical, description, ogUrl — SEO metadataaccount — optional user account for nav stateurl="/myroute" — highlights nav item in TopNavMenudata={data} — serialized for hydration (exclude client from data!)import { h, JSX } from "preact";
import { Page } from "../../components/page";
import { IAccount } from "../../models/account";
import { MyPageContent } from "./myPageContent";
interface IProps {
client: Window["fetch"];
account?: IAccount;
}
export function MyPageHtml(props: IProps): JSX.Element {
const { client, ...data } = props;
return (
<Page
css={["mypage"]} js={["mypage"]} maxWidth={1200}
title="Page Title | Liftosaur"
canonical="https://www.liftosaur.com/myroute"
description="Page description"
ogUrl="https://www.liftosaur.com/myroute"
account={props.account} data={data} client={client} url="/myroute"
>
<MyPageContent client={client} {...data} />
</Page>
);
}
src/pages/myPage/myPageContent.tsx)The interactive Preact component. Export the props interface (needed by Layer 4).
src/myPage.tsx)import { h } from "preact";
import { PageWrapper } from "./components/pageWrapper";
import { IMyPageContentProps, MyPageContent } from "./pages/myPage/myPageContent";
import { HydrateUtils } from "./utils/hydrate";
function main(): void {
HydrateUtils.hydratePage<IMyPageContentProps>((pageWrapperProps, data) => (
<PageWrapper {...pageWrapperProps}>
<MyPageContent {...data} client={window.fetch.bind(window)} />
</PageWrapper>
));
}
main();
webpack.config.js)Add to entry in mainConfig:
mypage: ["./src/myPage.tsx", "./src/index.css"],
lambda/index.ts)Add import:
import { renderMyPageHtml } from "./myPage";
Add endpoint + handler (near similar endpoints):
const getMyPageEndpoint = Endpoint.build("/myroute");
const getMyPageHandler: RouteHandler<IPayload, APIGatewayProxyResult, typeof getMyPageEndpoint> = async ({ payload }) => {
const { di } = payload;
let account: IAccount | undefined;
const userResult = await getUserAccount(payload, { withPrograms: true });
if (userResult.success) {
account = userResult.data.account;
}
return {
statusCode: 200,
body: renderMyPageHtml(di.fetch, account),
headers: { "content-type": "text/html" },
};
};
Register in router chain (~line 2700):
.get(getMyPageEndpoint, getMyPageHandler)
_redirects and _redirects_staging)Add redirect entries so the CDN (Netlify) proxies the route to the Lambda backend:
In _redirects:
/myroute https://api3.liftosaur.com/myroute 200
In _redirects_staging:
/myroute https://api3-dev.liftosaur.com/myroute 200
Place the entry before any parameterized routes for the same prefix (e.g. /myroute before /myroute/:id).
src/components/topNavMenu.tsx)If page should appear in nav, update getMenuItems().
PageWrapper (don't set nowrapper on <Page>)src/components/scrollableTabs.tsx): Tabbed contentsrc/components/selectLink.tsx): Dropdown link with bottom sheetsrc/components/exerciseImage.tsx): Exercise illustrationssrc/components/markdown.tsx): Renders markdownsrc/components/icons/src/models/builtinPrograms.ts): Metadata for builtin programslambda/dao/programDao.ts): Fetches program data from CDNdata prop on <Page> is serialized into a hidden #data div. Keep it lightweight.Settings.build() creates default settings for public pages without user context.npx tsc --noEmit after creating all files to verify no TypeScript errors.还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Add a new built-in exercise to Liftosaur end-to-end — image (gymvisual.com → S3), catalog registration, description page, and the LLM/MCP exercise list. Use when adding one or more built-in exercises to the app catalog.
中文简介正在准备中。当前显示原文说明。
Create a 30%-off coupon for an affiliate or creator on iOS and Android, and draft the reply that tells them how to use it. Use when asked to create, set up or send a coupon or promo code for an affiliate, influencer or creator.
中文简介正在准备中。当前显示原文说明。
Interactively investigate a production Rollbar error. Accepts an occurrence id, item id, item counter, or Rollbar URL. Fetches the error data, assesses how widespread it is, drills into affected users (events, logs, storage, captured state), and works with the developer toward a fix or ignore decision. Use for collaborative debugging; use /fix-rollbar for a straight fetch-and-fix of a single occurrence.
中文简介正在准备中。当前显示原文说明。
Investigate a user-reported issue using server logs, user events, storage snapshots, and Rollbar. Use when given a user id or email plus an issue description (e.g. from a support email).
中文简介正在准备中。当前显示原文说明。
Build a feature end to end — decide worktree vs here, design the architecture and debate it with codex, get the user's approval on a one-pass-readable plan, state the API/state contract, implement with visible diffs, then run two codex reviews (bugs + architecture) and document the result. Use when asked to build/implement/add a feature or do a refactor that involves design decisions.
中文简介正在准备中。当前显示原文说明。
Fix a production exception from Rollbar in an interactive Claude Code session. Fetches the occurrence data, analyzes the error, and either implements a fix or adds the error to the ignore list. Use when given a Rollbar occurrence ID.
中文简介正在准备中。当前显示原文说明。