[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CV268BH7084XE3ASMXFC37":3,"skill-same:01M6CV268BH7084XE3ASMXFC37":56},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":37,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M6CV268BH7084XE3ASMXFC37","add-screen",null,"Add a Compose Multiplatform feature screen with its route, encoded arguments, NavGraph entry, ViewModel, Koin registration, shared UI conventions, and validation. Use when adding a screen or changing navigation and screen-level dependency wiring.","roncofaber\u002Fcrucible-lens","roncofaber","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F48035351?v=4","01M6CV1Y8G75MY5ZBY47GZXYGD","Fabrice Roncoroni","01M6CV1YCNR0JBT13J84NGB3QC",1,"BSD-3-Clause","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002Fagent-skills\u002Fadd-screen\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28],"add screen","validation","ui","use","dependency","compose","navigation","registration","route","conventions","2026-11-10 10:12:30",false,"---\nname: add-screen\ndescription: Add a Compose Multiplatform feature screen with its route, encoded arguments, NavGraph entry, ViewModel, Koin registration, shared UI conventions, and validation. Use when adding a screen or changing navigation and screen-level dependency wiring.\n---\n\n# Add a screen\n\n## Route and navigation\n\nAdd the route to `ui\u002Fnavigation\u002FScreen.kt`. Encode every dynamic path segment with `encodeRouteSegment` when navigating and decode it through the navigation argument APIs at the destination.\n\nRegister the destination in `ui\u002Fnavigation\u002FNavGraph.kt`. Follow nearby destinations for transitions, argument declarations, back navigation, deep links, and scanner integration. Do not pass resource snapshots through routes; pass stable identifiers and load through the repository.\n\n## ViewModel and dependency injection\n\nCreate a ViewModel for any screen that loads or mutates data. Start work in `viewModelScope`, cancel or supersede stale loads where the existing feature pattern does so, and represent loading through `LoadState\u003CT>`.\n\nRegister the ViewModel with `viewModelOf(::X)` in `di\u002FAppModule.kt`. Register new dependencies in the same module. Missing Koin registrations compile and fail at runtime, so verify the complete constructor graph.\n\nResolve screen-scoped dependencies with `koinViewModel()` or `koinInject()`. Obtain `AppPreferences` through Koin instead of threading it through `NavGraph`.\n\n## Compose structure\n\n- Use `AppTopBar` for a static title and `CollapsingAppTopBar` for an entity-name detail title.\n- Use `PullToRefreshBox` with `loadState.isRefreshingNow`; do not translate content with `distanceFraction`.\n- Render initial loading, error, loaded, empty, and refresh states consistently with neighboring screens.\n- Use `AppIcon(AppIcons.X)`, `MaterialTheme.shapes`, `AppElevation`, the stock typography ramp, and motion specs from `AppAnimations.kt`.\n- Reuse shared components in `ui\u002Fcommon` before adding a local variant.\n- Use `collectAsStateWithLifecycle` for lifecycle-bound state.\n\n## Documentation and tests\n\n- Update `dev\u002Farchitecture.md` for new routes, ViewModels, packages, or dependency injection wiring.\n- Update `dev\u002Fstyle.md` only when introducing or changing a UI convention.\n- Update `dev\u002Fplatform-parity.md` if either platform behaves differently.\n- Add an `Unreleased` changelog entry because a new user-facing screen is visible behavior.\n- Test extracted deterministic logic in `commonTest`; do not invent a screen test harness for a single change.\n\n## Verify\n\n```bash\n.\u002Fscripts\u002Fverify-change.sh\n.\u002Fgradlew :composeApp:compileKotlinIosSimulatorArm64\n```\n","# Add a screen\n\n## Route and navigation\n\nAdd the route to `ui\u002Fnavigation\u002FScreen.kt`. Encode every dynamic path segment with `encodeRouteSegment` when navigating and decode it through the navigation argument APIs at the destination.\n\nRegister the destination in `ui\u002Fnavigation\u002FNavGraph.kt`. Follow nearby destinations for transitions, argument declarations, back navigation, deep links, and scanner integration. Do not pass resource snapshots through routes; pass stable identifiers and load through the repository.\n\n## ViewModel and dependency injection\n\nCreate a ViewModel for any screen that loads or mutates data. Start work in `viewModelScope`, cancel or supersede stale loads where the existing feature pattern does so, and represent loading through `LoadState\u003CT>`.\n\nRegister the ViewModel with `viewModelOf(::X)` in `di\u002FAppModule.kt`. Register new dependencies in the same module. Missing Koin registrations compile and fail at runtime, so verify the complete constructor graph.\n\nResolve screen-scoped dependencies with `koinViewModel()` or `koinInject()`. Obtain `AppPreferences` through Koin instead of threading it through `NavGraph`.\n\n## Compose structure\n\n- Use `AppTopBar` for a static title and `CollapsingAppTopBar` for an entity-name detail title.\n- Use `PullToRefreshBox` with `loadState.isRefreshingNow`; do not translate content with `distanceFraction`.\n- Render initial loading, error, loaded, empty, and refresh states consistently with neighboring screens.\n- Use `AppIcon(AppIcons.X)`, `MaterialTheme.shapes`, `AppElevation`, the stock typography ramp, and motion specs from `AppAnimations.kt`.\n- Reuse shared components in `ui\u002Fcommon` before adding a local variant.\n- Use `collectAsStateWithLifecycle` for lifecycle-bound state.\n\n## Documentation and tests\n\n- Update `dev\u002Farchitecture.md` for new routes, ViewModels, packages, or dependency injection wiring.\n- Update `dev\u002Fstyle.md` only when introducing or changing a UI convention.\n- Update `dev\u002Fplatform-parity.md` if either platform behaves differently.\n- Add an `Unreleased` changelog entry because a new user-facing screen is visible behavior.\n- Test extracted deterministic logic in `commonTest`; do not invent a screen test harness for a single change.\n\n## Verify\n\n```bash\n.\u002Fscripts\u002Fverify-change.sh\n.\u002Fgradlew :composeApp:compileKotlinIosSimulatorArm64\n```\n",{"name":5,"description":7},"main","9ceaf87c9c62e4b7eb416b5f5516465f8c08443d","agent-skills\u002Fadd-screen",0,"https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens","https:\u002F\u002Fgithub.com\u002Froncofaber","🐍 Python is my rock, and I am ready to roll! 🪨 ","2026-09-17 22:32:31",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add roncofaber\u002Fcrucible-lens --skill add-screen",{"tool":48,"command":49},"bunx","bunx skills add roncofaber\u002Fcrucible-lens --skill add-screen",{"tool":51,"command":52},"pnpm","pnpm dlx skills add roncofaber\u002Fcrucible-lens --skill add-screen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002Fagent-skills\u002Fadd-screen\u002FSKILL.md",true,[],[57,72,92,124,130],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":29},"01M6CV2B46QMSS5HNCHPX2XY5Z","release","Cut, build, sign, tag, or publish a Crucible Lens release. Use only when explicitly asked to release, ship, publish, tag, bump the version, or produce signed release artifacts. Follow the ordered safeguards without improvising.","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002Fagent-skills\u002Frelease\u002FSKILL.md",[],[59,64,65,66,67,68,22,69,70,71],"build","artifacts","produce","publish","ship","version","only","bump",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":29},"01M6CV28FNZJBJM7SAKY4ZWQ8T","audit-docs","Audit AGENTS.md, README.md, project skills, and dev documentation against the repository, then repair factual drift and unnecessary duplication. Use only when explicitly asked to audit, refresh, migrate, or verify project documentation.","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002Fagent-skills\u002Faudit-docs\u002FSKILL.md",[],[79,80,81,82,83,84,22,85,70,86,87,88,89,90,91],"audit docs","docs","audit","README","migrate","refresh","verify","duplication","drift","repair","repository","documentation","dev",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":108,"publishedAt":29},"01M6CV23MY7X7GXTK51Z4J16R4","add-api-endpoint","Add or change a Crucible API endpoint, request or response model, pagination path, repository cache, or scientific metadata write. Use when touching data\u002Fapi, data\u002Frepository, API serialization, or create and edit network flows.","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002Fagent-skills\u002Fadd-api-endpoint\u002FSKILL.md",[98,103],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":104,"categoryName":105,"taxonomyType":106,"taxonomyTypeDesc":107},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[109,110,111,112,89,113,114,115,116,117,118,119,120,121,122,22,123],"api","endpoint","api endpoint","add api endpoint","change","create","metadata","cache","serialization","network","data","model","write","edit","pagination",{"skillNo":125,"name":59,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":29},"01M6CV224Y9A83VEVXPMW6AEHP","Cut, build, sign, tag, or publish a Crucible Lens release when explicitly requested.","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Frelease\u002FSKILL.md",[],[59,67,64],{"skillNo":131,"name":74,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":29},"01M6CV20VEDHVRPM7JPV1G5WBB","Audit and refresh project documentation when explicitly requested.","https:\u002F\u002Fgithub.com\u002Froncofaber\u002Fcrucible-lens\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Faudit-docs\u002FSKILL.md",[],[80,79,81,90,84]]