natureco-cli 5.18.2 → 5.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/package.json +1 -1
  2. package/skills/airunway-aks-setup/SKILL.md +73 -0
  3. package/skills/algorithmic-art/SKILL.md +405 -0
  4. package/skills/appinsights-instrumentation/SKILL.md +76 -0
  5. package/skills/azure-ai/SKILL.md +71 -0
  6. package/skills/azure-aigateway/SKILL.md +129 -0
  7. package/skills/azure-cloud-migrate/SKILL.md +52 -0
  8. package/skills/azure-compliance/SKILL.md +108 -0
  9. package/skills/azure-compute/SKILL.md +46 -0
  10. package/skills/azure-cost/SKILL.md +45 -0
  11. package/skills/azure-deploy/SKILL.md +97 -0
  12. package/skills/azure-diagnostics/SKILL.md +151 -0
  13. package/skills/azure-enterprise-infra-planner/SKILL.md +54 -0
  14. package/skills/azure-hosted-copilot-sdk/SKILL.md +89 -0
  15. package/skills/azure-kubernetes/SKILL.md +153 -0
  16. package/skills/azure-kusto/SKILL.md +231 -0
  17. package/skills/azure-messaging/SKILL.md +57 -0
  18. package/skills/azure-prepare/SKILL.md +165 -0
  19. package/skills/azure-quotas/SKILL.md +276 -0
  20. package/skills/azure-rbac/SKILL.md +17 -0
  21. package/skills/azure-reliability/SKILL.md +387 -0
  22. package/skills/azure-resource-lookup/SKILL.md +108 -0
  23. package/skills/azure-resource-visualizer/SKILL.md +183 -0
  24. package/skills/azure-storage/SKILL.md +100 -0
  25. package/skills/azure-upgrade/SKILL.md +91 -0
  26. package/skills/azure-validate/SKILL.md +72 -0
  27. package/skills/brainstorming/SKILL.md +159 -0
  28. package/skills/brand-guidelines/SKILL.md +73 -0
  29. package/skills/brandkit/SKILL.md +798 -0
  30. package/skills/brutalist-skill/SKILL.md +92 -0
  31. package/skills/canvas-design/SKILL.md +130 -0
  32. package/skills/cavecrew/SKILL.md +82 -0
  33. package/skills/caveman-commit/SKILL.md +65 -0
  34. package/skills/caveman-help/SKILL.md +63 -0
  35. package/skills/caveman-review/SKILL.md +55 -0
  36. package/skills/caveman-stats/SKILL.md +10 -0
  37. package/skills/claude-api/SKILL.md +356 -0
  38. package/skills/composition-patterns/SKILL.md +89 -0
  39. package/skills/decision-mapping/SKILL.md +84 -0
  40. package/skills/deploy-to-vercel/SKILL.md +296 -0
  41. package/skills/design-an-interface/SKILL.md +94 -0
  42. package/skills/design-doc-mermaid/SKILL.md +498 -0
  43. package/skills/develop-userscripts/SKILL.md +84 -0
  44. package/skills/doc-coauthoring/SKILL.md +375 -0
  45. package/skills/documentation/SKILL.md +109 -0
  46. package/skills/docx/SKILL.md +590 -0
  47. package/skills/edit-article/SKILL.md +15 -0
  48. package/skills/entra-agent-id/SKILL.md +356 -0
  49. package/skills/entra-app-registration/SKILL.md +191 -0
  50. package/skills/faceless-explainer/SKILL.md +202 -0
  51. package/skills/fastify/SKILL.md +75 -0
  52. package/skills/general-video/SKILL.md +143 -0
  53. package/skills/git-guardrails-claude-code/SKILL.md +95 -0
  54. package/skills/github-actions-docs/SKILL.md +98 -0
  55. package/skills/gpt-tasteskill/SKILL.md +74 -0
  56. package/skills/grill-me/SKILL.md +7 -0
  57. package/skills/grilling/SKILL.md +10 -0
  58. package/skills/handoff/SKILL.md +16 -0
  59. package/skills/hyperframes/SKILL.md +152 -0
  60. package/skills/hyperframes-animation/SKILL.md +82 -0
  61. package/skills/hyperframes-cli/SKILL.md +109 -0
  62. package/skills/hyperframes-core/SKILL.md +78 -0
  63. package/skills/hyperframes-creative/SKILL.md +68 -0
  64. package/skills/hyperframes-media/SKILL.md +97 -0
  65. package/skills/image-to-code-skill/SKILL.md +1228 -0
  66. package/skills/imagegen-frontend-mobile/SKILL.md +1465 -0
  67. package/skills/imagegen-frontend-web/SKILL.md +987 -0
  68. package/skills/implement/SKILL.md +15 -0
  69. package/skills/init/SKILL.md +91 -0
  70. package/skills/internal-comms/SKILL.md +32 -0
  71. package/skills/lark-approval/SKILL.md +56 -0
  72. package/skills/lark-base/SKILL.md +157 -0
  73. package/skills/lark-doc/SKILL.md +81 -0
  74. package/skills/lark-shared/SKILL.md +168 -0
  75. package/skills/lark-workflow-meeting-summary/SKILL.md +122 -0
  76. package/skills/linting-neostandard-eslint9/SKILL.md +64 -0
  77. package/skills/loop-me/SKILL.md +32 -0
  78. package/skills/microsoft-foundry/SKILL.md +262 -0
  79. package/skills/migrate-to-shoehorn/SKILL.md +118 -0
  80. package/skills/minimalist-skill/SKILL.md +85 -0
  81. package/skills/motion-graphics/SKILL.md +170 -0
  82. package/skills/music-to-video/SKILL.md +197 -0
  83. package/skills/node/SKILL.md +94 -0
  84. package/skills/nodejs-core/SKILL.md +156 -0
  85. package/skills/oauth/SKILL.md +186 -0
  86. package/skills/obsidian-vault/SKILL.md +59 -0
  87. package/skills/octocat/SKILL.md +93 -0
  88. package/skills/openclaw-secure-linux-cloud/SKILL.md +157 -0
  89. package/skills/opensource-guide-coach/SKILL.md +218 -0
  90. package/skills/output-skill/SKILL.md +49 -0
  91. package/skills/pdf/SKILL.md +314 -0
  92. package/skills/pptx/SKILL.md +232 -0
  93. package/skills/pr-to-video/SKILL.md +235 -0
  94. package/skills/product-launch-video/SKILL.md +205 -0
  95. package/skills/python-appservice-deploy/SKILL.md +36 -0
  96. package/skills/qa/SKILL.md +130 -0
  97. package/skills/react-best-practices/SKILL.md +149 -0
  98. package/skills/react-native-skills/SKILL.md +121 -0
  99. package/skills/react-view-transitions/SKILL.md +320 -0
  100. package/skills/readme-i18n/SKILL.md +176 -0
  101. package/skills/redesign-skill/SKILL.md +178 -0
  102. package/skills/remotion/SKILL.md +364 -0
  103. package/skills/request-refactor-plan/SKILL.md +68 -0
  104. package/skills/resolving-merge-conflicts/SKILL.md +14 -0
  105. package/skills/running-claude-code-via-litellm-copilot/SKILL.md +263 -0
  106. package/skills/scaffold-exercises/SKILL.md +106 -0
  107. package/skills/secure-linux-web-hosting/SKILL.md +162 -0
  108. package/skills/setup-pre-commit/SKILL.md +91 -0
  109. package/skills/shadcn/SKILL.md +267 -0
  110. package/skills/simple/SKILL.md +52 -0
  111. package/skills/skill-creator/SKILL.md +485 -0
  112. package/skills/skill-optimizer/SKILL.md +47 -0
  113. package/skills/skills-cli/SKILL.md +281 -0
  114. package/skills/slack-gif-creator/SKILL.md +254 -0
  115. package/skills/snipgrapher/SKILL.md +58 -0
  116. package/skills/soft-skill/SKILL.md +98 -0
  117. package/skills/stitch-skill/SKILL.md +184 -0
  118. package/skills/supabase/SKILL.md +135 -0
  119. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  120. package/skills/systematic-debugging/SKILL.md +296 -0
  121. package/skills/talking-head-recut/SKILL.md +1191 -0
  122. package/skills/taste-skill/SKILL.md +1206 -0
  123. package/skills/taste-skill-v1/SKILL.md +226 -0
  124. package/skills/tdd/SKILL.md +108 -0
  125. package/skills/teach/SKILL.md +140 -0
  126. package/skills/test-driven-development/SKILL.md +371 -0
  127. package/skills/theme-factory/SKILL.md +59 -0
  128. package/skills/to-prd/SKILL.md +75 -0
  129. package/skills/typescript-magician/SKILL.md +117 -0
  130. package/skills/tzst/SKILL.md +68 -0
  131. package/skills/ubiquitous-language/SKILL.md +93 -0
  132. package/skills/use-my-browser/SKILL.md +110 -0
  133. package/skills/using-superpowers/SKILL.md +121 -0
  134. package/skills/vercel-cli-with-tokens/SKILL.md +353 -0
  135. package/skills/vercel-optimize/SKILL.md +322 -0
  136. package/skills/viral-instagram-reels/SKILL.md +180 -0
  137. package/skills/viral-short-form/SKILL.md +147 -0
  138. package/skills/viral-short-form-ideas/SKILL.md +184 -0
  139. package/skills/viral-tiktok-content/SKILL.md +180 -0
  140. package/skills/web-artifacts-builder/SKILL.md +74 -0
  141. package/skills/web-design-guidelines/SKILL.md +39 -0
  142. package/skills/webapp-testing/SKILL.md +96 -0
  143. package/skills/website-to-video/SKILL.md +145 -0
  144. package/skills/writing-beats/SKILL.md +67 -0
  145. package/skills/writing-fragments/SKILL.md +79 -0
  146. package/skills/writing-great-skills/SKILL.md +82 -0
  147. package/skills/writing-guidelines/SKILL.md +39 -0
  148. package/skills/writing-plans/SKILL.md +174 -0
  149. package/skills/writing-shape/SKILL.md +79 -0
  150. package/skills/xdrop/SKILL.md +78 -0
  151. package/skills/xget/SKILL.md +87 -0
  152. package/skills/xlsx/SKILL.md +292 -0
  153. package/src/tools/browser_use.js +2 -1
  154. package/src/tools/skills_download.js +217 -0
  155. package/src/utils/tools.js +2 -2
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: lark-workflow-meeting-summary
3
+ version: 1.0.0
4
+ description: "会议纪要整理工作流:汇总指定时间范围内的会议纪要并生成结构化报告。当用户需要整理会议纪要、生成会议周报、回顾一段时间内的会议内容时使用。"
5
+ metadata:
6
+ requires:
7
+ bins: ["lark-cli"]
8
+ ---
9
+
10
+ # 会议纪要汇总工作流
11
+
12
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),其中包含认证、权限处理**。然后阅读 [`../lark-vc/SKILL.md`](../lark-vc/SKILL.md),了解会议纪要相关操作。
13
+
14
+ **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-vc/references/vc-domain-boundaries.md`](../lark-vc/references/vc-domain-boundaries.md)**,不读将导致命令使用、会议产物决策、领域边界职责判断错误:
15
+ > 1. 了解日历 & VC、会议产物 & 文档的关联关系和职责划分
16
+ > 2. 了解会议产物(妙记和纪要)之间的关联关系,例如:**妙记和纪要产生条件相互独立**
17
+ > 3. 了解不同会议产物的组成部分,以便根据需求决策使用哪种产物的数据
18
+ > 4. 了解会议总结、分析和信息提取的标准流程
19
+
20
+ ## 适用场景
21
+
22
+ - "帮我整理这周的会议纪要" / "总结最近的会议" / "生成会议周报"
23
+ - "看看今天开了哪些会" / "回顾过去一周开了哪些会"
24
+
25
+ ## 前置条件
26
+
27
+ 仅支持 **user 身份**。执行前确保已授权:
28
+
29
+ ```bash
30
+ lark-cli auth login --domain vc # 基础(查询+纪要)
31
+ lark-cli auth login --domain vc,drive # 含读取纪要文档正文、生成文档
32
+ ```
33
+
34
+ ## 工作流
35
+
36
+ ```
37
+ {时间范围} ─► vc +search ──► 会议列表 (meeting_ids)
38
+
39
+
40
+ vc +detail ──► 获取 note_id
41
+
42
+
43
+ note +detail ──► 纪要文档 tokens
44
+
45
+
46
+ drive metas batch_query 纪要元数据
47
+
48
+
49
+ 结构化报告
50
+ ```
51
+
52
+ ### Step 1: 确定时间范围
53
+
54
+ 默认**过去 7 天**。推断规则:"今天"→当天,"这周"→本周一~now,"上周"→上周一~上周日,"这个月"→1日~now。
55
+
56
+ > **注意**:日期转换必须调用系统命令(如 `date`),不要心算。时间范围参数需根据 CLI 实际要求格式化(通常为 `YYYY-MM-DD` 或 ISO 8601)。
57
+
58
+ ### Step 2: 查询会议记录
59
+
60
+ ```bash
61
+ # page-size 最大为 30
62
+ lark-cli vc +search --start "<YYYY-MM-DD>" --end "<YYYY-MM-DD>" --format json --page-size 30
63
+ ```
64
+
65
+ - 时间范围拆分:搜索的时间范围最大为 1 个月。搜索更长时间范围的会议,需要拆分为多次时间范围为一个月查询。
66
+ - `--end` 为**包含当天**的日期(即查"今天"时 start 和 end 都填今天)
67
+ - `--format json` 输出 JSON 格式,你更佳擅长解析 JSON 数据。
68
+ - `--page-size 30` 每页最多 30 条。
69
+ - 有 `page_token` 时必须继续翻页,收集所有 `id` 字段(meeting-id)
70
+
71
+ ### Step 3: 获取纪要元数据
72
+
73
+ 1. 查询会议关联的纪要信息
74
+ ```bash
75
+ # 首先获取 note_id 和 minute_token
76
+ lark-cli vc +detail --meeting-ids "id1,id2,...,idN"
77
+
78
+ # 然后用 note_id 获取文档 tokens(如有多个需分别获取)
79
+ lark-cli note +detail --note-id "note_id"
80
+ ```
81
+ - 根据上一步搜集到的 `meeting-id` 查询。
82
+ - 单次最多查询 50 个,超过 50 个需分批调用。
83
+ - 部分会议没有 `note_id` 或报错 `no notes available`,在最终输出中标注"无纪要"。
84
+ - 记录每个纪要的 `note_id`(纪要 ID)、`note_display_type`(展示类型:`unknown` / `normal` / `unified`)、`note_doc_token`(纪要文档 Token)和 `verbatim_doc_token`(逐字稿文档 Token)。
85
+
86
+ > **逐字稿路由按 `note_display_type` 决定**(详见 [vc-domain-boundaries.md](../lark-vc/references/vc-domain-boundaries.md) 的 Note 域):
87
+ > - `normal`:逐字稿是独立文档,链接/正文走 `verbatim_doc_token`。
88
+ > - `unified`:逐字稿**不是独立文档**,没有可分享的逐字稿文档链接;需要逐字稿内容时用 `note +transcript --note-id <note_id>`([lark-note](../lark-note/SKILL.md))拉取到本地,报告中标注"unified 纪要"即可。
89
+
90
+ 2. 获取纪要文档和逐字稿文档链接
91
+ ```bash
92
+ # 学习命令使用方式
93
+ lark-cli schema drive.metas.batch_query
94
+
95
+ # 批量获取纪要文档与逐字稿链接: 一次最多查询 10 个文档
96
+ # 仅对 note_doc_token 与 normal 纪要的 verbatim_doc_token 查询链接
97
+ lark-cli drive metas batch_query --data '{"request_docs": [{"doc_type": "docx", "doc_token": "<doc_token>"}], "with_url": true}'
98
+ ```
99
+
100
+ ### Step 4: 整理纪要报告
101
+
102
+ 根据时间跨度选择输出格式:
103
+
104
+ - **单日汇总**("今天"/"昨天"):用"今日会议概览"标题,逐会议列出会议时间、主题、纪要链接、逐字稿链接(`unified` 纪要无逐字稿链接,标注"unified 纪要,逐字稿需 `note +transcript` 拉取")。
105
+ - **多日/周报**("这周"/"过去 7 天"等):用"会议纪要周报"标题,含概览统计、逐会议详情。
106
+
107
+ ### Step 5: 生成文档(可选,用户要求时)
108
+
109
+ 阅读 [`../lark-doc/SKILL.md`](../lark-doc/SKILL.md) 学习云文档技能。
110
+
111
+ ```bash
112
+ lark-cli docs +create --api-version v2 --doc-format markdown --content $'<title>会议纪要汇总 (<start> - <end>)</title>\n<内容>'
113
+ # 或追加到已有文档
114
+ lark-cli docs +update --api-version v2 --doc "<url_or_token>" --command append --doc-format markdown --content $'<内容>'
115
+ ```
116
+
117
+ ## 参考
118
+
119
+ - [lark-shared](../lark-shared/SKILL.md) — 认证、权限(必读)
120
+ - [lark-vc](../lark-vc/SKILL.md) — `+search`、`+detail` 详细用法
121
+ - [lark-note](../lark-note/SKILL.md) — `note +detail`、`note +transcript`(unified 纪要逐字稿)
122
+ - [lark-doc](../lark-doc/SKILL.md) — `+fetch`、`+create`、`+update` 详细用法
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: linting-neostandard-eslint9
3
+ description: Configures ESLint v9 flat config and neostandard for JavaScript and TypeScript projects, including migrating from legacy `.eslintrc*` files or the `standard` package. Use when you need to set up or fix linting with `eslint.config.js` or `eslint.config.mjs`, troubleshoot lint errors, configure neostandard rules, migrate from `.eslintrc` to flat config, or integrate linting into CI pipelines and pre-commit hooks.
4
+ metadata:
5
+ tags: linting, neostandard, eslint, eslint9, flat-config, javascript, typescript
6
+ ---
7
+
8
+ ## When to use
9
+
10
+ Use this skill when you need to:
11
+ - Set up linting in a JavaScript or TypeScript project
12
+ - Use `neostandard` as a Standard-like ESLint v9 flat-config baseline
13
+ - Configure `eslint@9` with the flat config system (`eslint.config.js`/`eslint.config.mjs`)
14
+ - Migrate from `standard` to `neostandard` or ESLint v9
15
+ - Migrate from legacy `.eslintrc*` configuration to ESLint v9
16
+ - Run linting consistently in CI and local development
17
+
18
+ ## Quick start: basic neostandard setup
19
+
20
+ Install dependencies and create a minimal `eslint.config.js`:
21
+
22
+ ```bash
23
+ npm install --save-dev eslint@9 neostandard
24
+ ```
25
+
26
+ ```js
27
+ // eslint.config.js
28
+ import neostandard from 'neostandard'
29
+
30
+ export default neostandard()
31
+ ```
32
+
33
+ Verify the config works:
34
+
35
+ ```bash
36
+ npx eslint .
37
+ ```
38
+
39
+ ## Common setup workflow (new project)
40
+
41
+ 1. Install `eslint@9` and `neostandard` (see Quick start above)
42
+ 2. Create `eslint.config.js` with `neostandard()` as the base
43
+ 3. Add any project-specific rule overrides on top
44
+ 4. Run `npx eslint .` to confirm no config errors
45
+ 5. Add a lint script to `package.json`: `"lint": "eslint ."`
46
+ 6. Integrate into CI with a non-fix run; use `--fix` only in local workflows
47
+
48
+ ## How to use
49
+
50
+ Read individual rule files for implementation details and examples:
51
+
52
+ - [rules/neostandard.md](rules/neostandard.md) - Install, configure, and extend neostandard with ESLint
53
+ - [rules/eslint-v9-flat-config.md](rules/eslint-v9-flat-config.md) - Build ESLint v9 flat config for JS/TS projects
54
+ - [rules/migration-from-standard.md](rules/migration-from-standard.md) - Migrate from `standard` to `neostandard` or ESLint v9
55
+ - [rules/migration-from-legacy-eslint.md](rules/migration-from-legacy-eslint.md) - Migrate from `.eslintrc*` to flat config safely
56
+ - [rules/ci-and-editor-integration.md](rules/ci-and-editor-integration.md) - CI scripts, pre-commit, and editor setup
57
+
58
+ ## Core principles
59
+
60
+ - Prefer reproducible linting with pinned major versions
61
+ - Keep config minimal and explicit
62
+ - Use flat config for ESLint v9 projects
63
+ - Treat lint failures as quality gates in CI
64
+ - Enable auto-fix for local workflows, but validate with non-fix CI runs
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: loop-me
3
+ description: Grill me about specs for the workflows I want to build, within this workspace.
4
+ disable-model-invocation: true
5
+ argument-hint: "A workflow to design, or nothing to go find one"
6
+ ---
7
+
8
+ Run a stateful `/grilling` session whose only output is **workflow** specs. Use the grilling discipline — relentless, one question at a time, a recommended answer attached to each — aimed at the vocabulary and goal below. Create, edit, and delete specs as the grilling resolves things.
9
+
10
+ ## The loop lens
11
+
12
+ A **loop** is a recurring pattern in the user's life: their career, their week, their morning, a single repeated activity. Picturing a life as loops within loops reveals how predictable its activities really are — which is what makes them worth **delegating**. Use the lens to find loops worth specifying, and propose ones the user hasn't noticed.
13
+
14
+ A **workflow** is the spec of one loop, made real. You run a workflow on a loop — the loop is its running instantiation. Workflows live in `workflows/*.md` and are the source of truth.
15
+
16
+ ## Vocabulary
17
+
18
+ A shared language, reached for only when a workflow calls for it — never a checklist. **Mandate nothing structural**: a workflow needs no AI, no checkpoint, and no schedule unless the grilling shows it does.
19
+
20
+ - **Trigger** — what fires each run: an **event** (a new email, a new issue) or a **schedule** (every morning). Event-triggering is usually the more efficient.
21
+ - **Checkpoint** — a human-in-the-loop point where the user is asked to verify or decide. Some workflows have none and run autonomously; some use no AI at all.
22
+ - **Push right** — defer the checkpoint as far as it will go. Do maximal work before involving the human, so they are asked once, late, with everything prepared.
23
+ - **Brief** — what a checkpoint presents: a tight, decision-ready summary — what was produced, why, and a link down to the asset itself — never the raw output. The user reads a brief, not a draft. Speed of review is imperative.
24
+
25
+ ## Definition of done
26
+
27
+ A workflow spec is done when an implementer agent could build it without asking a single question. Grill until then; nothing is done while a question remains.
28
+
29
+ ## The workspace
30
+
31
+ - `workflows/*.md` — one spec per workflow.
32
+ - `NOTES.md` — raw notes on the user's world: the tools they use, the channels they process, and their own terminology for both. When it is empty or thin, interview them about their world before specifying anything. Sharpen fuzzy terms into canonical ones as they surface, and record them here.
@@ -0,0 +1,262 @@
1
+ ---
2
+ name: microsoft-foundry
3
+ description: "Deploy, evaluate, fine-tune, and manage Foundry agents end-to-end with azd: hosted agent scaffold/run/deploy, prompt agent create, batch eval, continuous eval, prompt optimizer, Agent Optimizer scaffold, agent.yaml, dataset curation from traces, model fine-tuning (SFT/DPO/RFT). USE FOR: azd ai agent, azd provision/deploy, deploy agent, hosted agent, create agent, add tool to agent, invoke agent, evaluate agent, continuous eval, continuous monitoring, optimize prompt, improve prompt, optimize agent instructions, agent optimizer, deploy model, Foundry project, RBAC, role assignment, permissions, quota, capacity, region, troubleshoot agent, deployment failure, AI Services, create Foundry resource, provision, knowledge index, customize deployment, onboard, availability, fine-tune, SFT, DPO, RFT, training-data, grader, distillation, fine-tuned model, large file upload. DO NOT USE FOR: Azure Functions, App Service, general Azure deploy (use azure-deploy), general Azure prep (use azure-prepare)."
4
+ license: MIT
5
+ metadata:
6
+ author: Microsoft
7
+ version: "1.1.27"
8
+ ---
9
+
10
+ # Microsoft Foundry Skill
11
+
12
+ This skill helps developers work with Microsoft Foundry resources, covering model discovery and deployment, complete dev lifecycle of AI agent, evaluation workflows, and troubleshooting.
13
+
14
+ ## Pre-Execution Requirements
15
+
16
+ Before using Foundry MCP operations, call the Azure MCP `foundry` tool and inspect the available Foundry MCP tools and related parameters. Treat this as the discovery/help step for MCP-based workflows.
17
+
18
+ ## Sub-Skills
19
+
20
+ > **MANDATORY: Before executing ANY workflow-specific steps, you MUST read the corresponding sub-skill document.** Do not call workflow-specific MCP tools for a workflow without reading its skill document. This applies even if you already know the MCP tool parameters — the skill document contains required workflow steps, pre-checks, and validation logic that must be followed. This rule applies on every new user message that triggers a different workflow, even if the skill is already loaded.
21
+
22
+ This skill includes specialized sub-skills for specific workflows. **Use these instead of the main skill when they match your task:**
23
+
24
+ | Sub-Skill | When to Use | Reference |
25
+ |-----------|-------------|-----------|
26
+ | **deploy** | Deploy hosted agents to Foundry, smoke-test a deployment, create or update prompt agents, and manage agent versions and multi-environment deploys. | [deploy](foundry-agent/deploy/deploy.md) |
27
+ | **invoke** | Send messages to an agent, single or multi-turn conversations | [invoke](foundry-agent/invoke/invoke.md) |
28
+ | **invocations-ws** | Build, deploy, and connect to hosted agents that speak the `invocations_ws` duplex WebSocket protocol — voice agents, real-time streams, and signaling for out-of-band media transports. | [invocations-ws](foundry-agent/invocations-ws/invocations-ws.md) |
29
+ | **observe** | Evaluate agent quality, run batch evals, analyze failures, optimize prompts, improve agent instructions, compare versions, set up CI/CD monitoring, and enable continuous production evaluation | [observe](foundry-agent/observe/observe.md) |
30
+ | **trace** | Query traces, analyze latency/failures, correlate eval results to specific responses via App Insights `customEvents` | [trace](foundry-agent/trace/trace.md) |
31
+ | **troubleshoot** | View hosted agent logs, query telemetry, diagnose failures | [troubleshoot](foundry-agent/troubleshoot/troubleshoot.md) |
32
+ | **create (quick start)** | Create a new hosted Foundry agent from scratch end-to-end — scaffold, provision a new Foundry project, deploy, and smoke-test. Opinionated happy-path that accepts common overrides (language, region, sample, topic, existing project, existing model). For anything not covered by the quickstart, use **create**. | [create/quick-start-hosted.md](foundry-agent/create/quick-start-hosted.md) |
33
+ | **create** | Use when the standard end-to-end happy path doesn't fit — lifting existing agent code into the project, deploying outside the default code path, wiring connections at scaffold time, advanced setup, or recovering from a failed quickstart run. | [create](foundry-agent/create/create-hosted.md) |
34
+ | **agent-optimizer** | Make existing Python hosted-agent code optimization-ready, configure eval.yaml, run Agent Optimizer jobs, apply candidates locally, and deploy through azd after review. | [agent-optimizer](foundry-agent/agent-optimizer/agent-optimizer.md) |
35
+ | **eval-datasets** | Harvest production traces into evaluation datasets, manage dataset versions and splits, track evaluation metrics over time, detect regressions, and maintain full lineage from trace to deployment. Use for: create dataset from traces, dataset versioning, evaluation trending, regression detection, dataset comparison, eval lineage. | [eval-datasets](foundry-agent/eval-datasets/eval-datasets.md) |
36
+ | **project/create** | Creating a new Azure AI Foundry project for hosting agents and models. Use when onboarding to Foundry or setting up new infrastructure. | [project/create/create-foundry-project.md](project/create/create-foundry-project.md) |
37
+ | **resource/create** | Creating Azure AI Services multi-service resource (Foundry resource) using Azure CLI. Use when manually provisioning AI Services resources with granular control. | [resource/create/create-foundry-resource.md](resource/create/create-foundry-resource.md) |
38
+ | **private-network** | Answer questions about Foundry network isolation **and** deploy Foundry with VNet isolation (BYO VNet, Managed VNet, hybrid). Covers architecture concepts, template selection, deployment, and post-deployment validation. | [resource/private-network/private-network.md](resource/private-network/private-network.md) |
39
+ | **models/deploy-model** | Unified model deployment with intelligent routing. Handles quick preset deployments, fully customized deployments (version/SKU/capacity/RAI), and capacity discovery across regions. Routes to sub-skills: `preset` (quick deploy), `customize` (full control), `capacity` (find availability). | [models/deploy-model/SKILL.md](models/deploy-model/SKILL.md) |
40
+ | **quota** | Managing quotas and capacity for Microsoft Foundry resources. Use when checking quota usage, troubleshooting deployment failures due to insufficient quota, requesting quota increases, or planning capacity. | [quota/quota.md](quota/quota.md) |
41
+ | **rbac** | Managing RBAC permissions, role assignments, managed identities, and service principals for Microsoft Foundry resources. Use for access control, auditing permissions, and CI/CD setup. | [rbac/rbac.md](rbac/rbac.md) |
42
+ | **finetuning** | Fine-tune models on Azure AI Foundry — SFT distillation, DPO preference optimization, RFT with graders and tool calling. Dataset preparation, grader calibration, training, checkpoint selection, deployment, evaluation. Use for: fine-tune, SFT, DPO, RFT, training data, grader, distillation, fine-tuned model, large file upload. | [finetuning/SKILL.md](finetuning/SKILL.md) |
43
+
44
+ > 💡 **Tip:** For a complete onboarding flow: `project/create` (public) or `private-network` (VNet isolation) → `models/deploy-model` → agent workflows (`create` → `deploy` → `invoke`).
45
+
46
+ > 💡 **Fine-Tuning:** Use `finetuning` for all model customization — SFT distillation, DPO preference optimization, and RFT with graders. Includes quickstart, grader calibration, and training curve analysis.
47
+
48
+ > 💡 **Model Deployment:** Use `models/deploy-model` for all deployment scenarios — it intelligently routes between quick preset deployment, customized deployment with full control, and capacity discovery across regions.
49
+
50
+ > 💡 **Prompt Optimization:** For requests like "optimize my prompt" or "improve my agent instructions," load [observe](foundry-agent/observe/observe.md) and use the `prompt_optimize` MCP tool through that eval-driven workflow.
51
+
52
+ ## Infrastructure Lifecycle
53
+
54
+ Match user intent to the correct infrastructure workflow.
55
+
56
+ | User Intent | Workflow |
57
+ |-------------|---------|
58
+ | "Create Foundry" / "Set up Foundry" (ambiguous) | Use `AskUserQuestion`: (a) just an AI Services resource, (b) a project with public access, or (c) a project with network isolation? Route: (a) → [resource/create](resource/create/create-foundry-resource.md), (b) → [project/create](project/create/create-foundry-project.md), (c) → [private-network](resource/private-network/private-network.md) |
59
+ | Set up Foundry with VNet isolation | [private-network](resource/private-network/private-network.md) |
60
+ | Create a Foundry project (public) | [project/create](project/create/create-foundry-project.md) |
61
+ | Create a bare Foundry resource | [resource/create](resource/create/create-foundry-resource.md) |
62
+
63
+ ## Agent Development Lifecycle
64
+
65
+ Match user intent to the correct agent workflow. Read each sub-skill in order before executing.
66
+
67
+ | User Intent | Workflow (read in order) |
68
+ |-------------|------------------------|
69
+ | Create a new hosted agent end-to-end (scaffold + deploy + test) | [quick-start-hosted](foundry-agent/create/quick-start-hosted.md) (self-contained end-to-end) |
70
+ | Anything beyond the standard quickstart (existing code, deployment customization, scaffold-time connections, recovery) | [create](foundry-agent/create/create-hosted.md) → [deploy](foundry-agent/deploy/deploy.md) → [invoke](foundry-agent/invoke/invoke.md) |
71
+ | Optimize existing Python hosted agent | [agent-optimizer](foundry-agent/agent-optimizer/agent-optimizer.md) → scaffold/review → eval.yaml → optimize → apply candidate → deploy → invoke |
72
+ | Deploy an agent (code already exists) | deploy (includes eval-suite setup) → invoke → observe (evaluate/optimize) |
73
+ | Update/redeploy an agent after code changes | deploy (includes eval-suite setup) → invoke → observe (evaluate/optimize) |
74
+ | Invoke/test/chat with an agent | invoke |
75
+ | Optimize / improve agent prompt or instructions | observe (Step 4: Optimize) |
76
+ | Evaluate and optimize agent (full loop) | observe |
77
+ | Enable continuous evaluation monitoring | observe (Step 6: CI/CD & Monitoring) |
78
+ | Troubleshoot an agent issue | invoke → troubleshoot |
79
+ | Fix a broken agent (troubleshoot + redeploy) | invoke → troubleshoot → apply fixes → deploy → invoke |
80
+
81
+ ## Agent: .foundry Workspace Standard
82
+
83
+ Every agent source folder can keep Foundry-specific cache and overlay state under `.foundry/`:
84
+
85
+ ```text
86
+ <agent-root>/
87
+ .foundry/
88
+ agent-metadata.yaml
89
+ agent-metadata.prod.yaml
90
+ suites/
91
+ datasets/
92
+ evaluators/
93
+ results/
94
+ ```
95
+
96
+ - In azd projects, derive deployment context (project endpoint, agent name/version, ACR, App Insights) from `azure.yaml` plus `azd env get-values`; do not duplicate those values in metadata when azd already provides them.
97
+ - `agent-metadata.yaml` is the preferred local/dev overlay for non-azd values, remote Foundry suite references, local cache paths, result summaries, and explicit overrides. Optional sidecar files such as `agent-metadata.prod.yaml` can hold a single prod or CI-targeted overlay without mixing multiple environments in one file.
98
+ - `suites/`, `datasets/`, and `evaluators/` are local cache folders. Reuse them when they are current, and ask before refreshing or overwriting them.
99
+ - See [Agent Metadata Contract](references/agent-metadata-contract.md) for the canonical schema and workflow rules.
100
+
101
+ ## Agent: Setup References
102
+
103
+ - [Standard Agent Setup](references/standard-agent-setup.md) — advanced setup for production workloads that need data-residency control (bring-your-own Cosmos DB / Storage / AI Search via a Foundry capability host). The default `azd ai agent` flow uses **Basic Agent Setup** and does **not** provision `capabilityHosts/agents` — do not flag its absence as a bug. For default post-provision state, see the "Expected env-var fingerprint" section in [foundry-agent/create/create-hosted.md](foundry-agent/create/create-hosted.md).
104
+
105
+ ## Agent: Common Project Context Resolution
106
+
107
+ Agent skills should run this step **only when they need configuration values they don't already have**. If a value (for example, agent root, environment, project endpoint, or agent name) is already known from the user's message or a previous skill in the same session, skip resolution for that value.
108
+
109
+ ### Step 1: Discover Agent Roots and azd Context
110
+
111
+ First check whether the workspace has `azure.yaml` with services using `host: azure.ai.agent`.
112
+
113
+ - **One azd agent service** -> use that service's `project` folder as the agent root.
114
+ - **Multiple azd agent services** -> require the user to choose the target service/folder.
115
+ - **No azd agent service** -> search the workspace for `.foundry/` folders that contain `agent-metadata.yaml` or `agent-metadata.<env>.yaml`.
116
+ - **One match** -> use that agent root.
117
+ - **Multiple matches** -> require the user to choose the target agent folder.
118
+ - **No matches** -> for create/deploy workflows, seed a new `.foundry/` folder during setup; for all other workflows, stop and ask the user which agent source folder to initialize.
119
+
120
+ After selecting an agent root, keep all local `.foundry` cache inspection, source inspection, evaluator suggestions, dataset suggestions, and prompt-optimization context inside that folder only. Do **not** scan sibling agent folders unless the user explicitly switches roots.
121
+
122
+ ### Step 2: Resolve Environment and Deployment Context
123
+
124
+ If `azure.yaml` is present, resolve the azd environment first:
125
+
126
+ 1. Environment explicitly named by the user
127
+ 2. `AZURE_ENV_NAME` from `azd env get-values`
128
+ 3. azd default environment from `.azure/config.json`
129
+ 4. Environment already selected earlier in the session
130
+
131
+ Run `azd env get-values` for the selected environment when project/deployment values are not already known. Prefer azd values for deployment context:
132
+
133
+ | azd Variable | Resolves To |
134
+ |-------------|-------------|
135
+ | `AZURE_AI_PROJECT_ENDPOINT` or `AZURE_AIPROJECT_ENDPOINT` | Project endpoint |
136
+ | `AGENT_<SERVICE>_NAME` | Agent name for the selected azd service |
137
+ | `AGENT_<SERVICE>_VERSION` | Agent version for the selected azd service |
138
+ | `AZURE_CONTAINER_REGISTRY_NAME` or `AZURE_CONTAINER_REGISTRY_ENDPOINT` | ACR registry name / image URL prefix |
139
+ | `APPLICATIONINSIGHTS_CONNECTION_STRING` | App Insights connection string for trace workflows |
140
+ | `AZURE_SUBSCRIPTION_ID`, `AZURE_RESOURCE_GROUP`, `AZURE_AI_ACCOUNT_NAME`, `AZURE_AI_PROJECT_NAME` | Azure resource lookup and Playground links |
141
+
142
+ When azd supplies these values, use them as the source of truth and do not copy them into `.foundry/agent-metadata*.yaml` on metadata writes.
143
+
144
+ ### Step 3: Select Metadata Overlay and Resolve Environment
145
+
146
+ Inside the selected agent root, choose the metadata file in this order:
147
+ 1. Metadata filename or path explicitly provided by the user or workflow
148
+ 2. If an explicit environment is already known and `.foundry/agent-metadata.<env>.yaml` exists, use that file
149
+ 3. `.foundry/agent-metadata.yaml`
150
+ 4. If multiple metadata files remain and no rule above selects one, prompt the user to choose
151
+
152
+ Read the selected metadata file and resolve any remaining environment choice in this order:
153
+ 1. Environment explicitly named by the user
154
+ 2. If the selected metadata file defines exactly one environment, use it
155
+ 3. Environment already selected earlier in the session
156
+ 4. `defaultEnvironment` from metadata
157
+
158
+ If the selected metadata file still contains multiple environments and none of the rules above selects one, prompt the user to choose. Keep the selected agent root, metadata file, environment, and whether context came from azd or metadata visible in every workflow summary.
159
+
160
+ If the selected environment exposes older `testSuites[]` metadata but not `evaluationSuites[]`, treat `testSuites[]` as the source for this session and normalize each entry in memory to the `evaluationSuites[]` shape before continuing. If the metadata is older still and only exposes legacy `testCases[]`, normalize that list the same way. Preserve dataset and evaluator fields, keep any existing `tags`, and map legacy `priority` to `tags.tier` only when `tags.tier` is missing: `P0` -> `smoke`, `P1` -> `regression`, `P2` -> `coverage`.
161
+
162
+ ### Step 4: Resolve eval.yaml Local Evaluation Intent
163
+
164
+ If `eval.yaml` exists in the selected agent root, parse it before generating new suites:
165
+
166
+ - `agent.name` -> target agent candidate; verify it matches the selected azd/metadata agent before using it.
167
+ - `dataset.local_uri` -> local seed dataset candidate; legacy `dataset_file` may be normalized in memory.
168
+ - `dataset.name` / `dataset.version` -> registered dataset candidate.
169
+ - `validation_dataset` -> optional validation dataset candidate.
170
+ - `evaluators[]` -> candidate Foundry evaluator names; verify with `evaluator_catalog_get` before treating them as remote evaluators.
171
+ - `name` -> local eval/suite candidate; verify remotely before persisting as `suiteName`.
172
+ - `options.eval_model`, `options.optimization_model`, `options.max_candidates`, `options.optimization_config.model_search_space`, `options.pass_threshold`, `max_samples`, `trace_days`, and `generation_instruction` -> setup defaults.
173
+
174
+ Treat `eval.yaml` as local evaluation intent, not proof that a Foundry suite exists. Persist synced suite/dataset/evaluator references to `.foundry` only after remote lookup or registration succeeds.
175
+
176
+ ### Step 5: Resolve Common Configuration
177
+
178
+ Layer sources in this order:
179
+
180
+ 1. Explicit user input and values already selected in the session
181
+ 2. azd environment values for deployment context
182
+ 3. `.foundry/agent-metadata*.yaml` overlay values and remote suite/cache references
183
+ 4. `agent.yaml` and `eval.yaml` local source configuration
184
+ 5. User prompts for anything still missing
185
+
186
+ If azd and metadata both provide the same value and they differ, stop and ask which source is authoritative. If they match, use the azd value and avoid rewriting the duplicate on future metadata writes.
187
+
188
+ | Effective Value | Preferred Source | Used By |
189
+ |-----------------|------------------|---------|
190
+ | Project endpoint | azd env | deploy, invoke, observe, trace, troubleshoot |
191
+ | Agent name/version | azd agent variables, then `agent.yaml` | invoke, observe, trace, troubleshoot |
192
+ | ACR | azd env | deploy |
193
+ | Evaluation suites and cache paths | `.foundry/agent-metadata*.yaml` | observe, eval-datasets |
194
+ | Local seed dataset/evaluator intent | `eval.yaml` | observe, eval-datasets |
195
+
196
+ ### Step 6: Write Metadata Overlay (Create/Deploy/Observe Only)
197
+
198
+ On any metadata write (deploy, auto-setup, dataset refresh, or trace-to-dataset update), persist only non-derivable overlay/cache state in the selected metadata file:
199
+
200
+ - azd binding (`azd.environmentName`, `azd.service`) when useful for future resolution
201
+ - `evaluationSuites[]` with remote suite/dataset/evaluator references and local cache paths
202
+ - `lastEval`, result files, comparison summaries, or explicit non-azd overrides
203
+
204
+ Do not copy azd-owned deployment values into metadata when azd already provides them. If the selected file is a preferred single-environment file, rewrite only that one environment block. If the selected file is a legacy multi-environment file, rewrite only the selected environment block. Never copy or merge environments across sibling metadata files automatically. If the selected environment still uses older `testSuites[]` or legacy `testCases[]`, rewrite it to `evaluationSuites[]` and remove migrated `priority` fields from the rewritten entries.
205
+
206
+ ### Step 7: Collect Missing Values
207
+
208
+ Use the `ask_user` or `askQuestions` tool **only for values not resolved** from the user's message, session context, metadata, or azd bootstrap. Common values skills may need:
209
+ - **Agent root** — Target azd service project folder or folder containing `.foundry/agent-metadata*.yaml`
210
+ - **Metadata file** — `agent-metadata.yaml` for local/dev, or an explicit sidecar such as `agent-metadata.prod.yaml`
211
+ - **Environment** — azd environment, `dev`, `prod`, or another environment key from metadata
212
+ - **Project endpoint** — AI Foundry project endpoint URL
213
+ - **Agent name** — Name of the target agent
214
+
215
+ > 💡 **Tip:** If the user already provides the agent path, environment, project endpoint, or agent name, extract it directly — do not ask again.
216
+
217
+ ## Agent: Agent Types
218
+
219
+ All agent skills support two agent types:
220
+
221
+ | Type | Kind | Description |
222
+ |------|------|-------------|
223
+ | **Prompt** | `"prompt"` | LLM-based agents backed by a model deployment |
224
+ | **Hosted** | `"hosted"` | Container-based agents running custom code |
225
+
226
+ Use `agent_get` MCP tool to determine an agent's type when needed.
227
+
228
+ ## Tool Usage Conventions
229
+
230
+ - Use the `ask_user` or `askQuestions` tool whenever collecting information from the user
231
+ - Use the `task` or `runSubagent` tool to delegate long-running or independent sub-tasks (e.g., env var scanning, status polling, Dockerfile generation)
232
+ - Prefer Azure MCP tools over direct CLI commands when available
233
+ - Reference official Microsoft documentation URLs instead of embedding CLI command syntax
234
+
235
+ ## Additional Resources
236
+
237
+ - [Foundry Hosted Agents](https://learn.microsoft.com/azure/ai-foundry/agents/concepts/hosted-agents?view=foundry)
238
+ - [Foundry Agent Runtime Components](https://learn.microsoft.com/azure/ai-foundry/agents/concepts/runtime-components?view=foundry)
239
+
240
+ ## SDK Quick Reference
241
+
242
+ - [Python](references/sdk/foundry-sdk-py.md)
243
+
244
+ ## Network Isolation Errors
245
+
246
+ Applies to **any** call against a Foundry project or its parent Foundry account — Foundry MCP tools, `azd`, `az` CLI, `curl`, REST, or SDK.
247
+
248
+ If an error matches `Public access is disabled` / `PublicNetworkAccessDisabled` / `403 Forbidden` from a private endpoint / connection timeout / the project endpoint FQDN resolves to a public IP, this typically means the parent Foundry account has `publicNetworkAccess=Disabled` or `Enabled from selected IP addresses`, and the current shell is outside its VNet.
249
+
250
+ Only if the error is ambiguous, confirm against the Foundry account using a management-plane call (works from anywhere with reader access):
251
+
252
+ ```bash
253
+ az cognitiveservices account show \
254
+ --name <account> --resource-group <rg> \
255
+ --query "properties.{publicNetworkAccess:publicNetworkAccess, networkAcls:networkAcls, privateEndpointConnections:privateEndpointConnections[].properties.privateLinkServiceConnectionState.status}"
256
+ ```
257
+
258
+ `publicNetworkAccess: "Disabled"` — or `"Enabled"` together with non-empty `networkAcls.ipRules` / `virtualNetworkRules` — confirms isolation. If `publicNetworkAccess: "Enabled"` and `networkAcls` is empty, the failure is a caller-side network issue (e.g. Private DNS resolving the FQDN to a public IP from inside a VNet with a private endpoint), not an account-config issue.
259
+
260
+ If it's indeed a network isolation issue, supported connection options are documented in [Choose a secure connection method to Foundry](https://learn.microsoft.com/azure/foundry/how-to/configure-private-link#choose-a-secure-connection-method-to-foundry).
261
+
262
+ > ℹ️ Foundry MCP tools cannot reach a VNet-isolated project even from inside the VNet.
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: migrate-to-shoehorn
3
+ description: Migrate test files from `as` type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace `as` in tests, or needs partial test data.
4
+ ---
5
+
6
+ # Migrate to Shoehorn
7
+
8
+ ## Why shoehorn?
9
+
10
+ `shoehorn` lets you pass partial data in tests while keeping TypeScript happy. It replaces `as` assertions with type-safe alternatives.
11
+
12
+ **Test code only.** Never use shoehorn in production code.
13
+
14
+ Problems with `as` in tests:
15
+
16
+ - Trained not to use it
17
+ - Must manually specify target type
18
+ - Double-as (`as unknown as Type`) for intentionally wrong data
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm i @total-typescript/shoehorn
24
+ ```
25
+
26
+ ## Migration patterns
27
+
28
+ ### Large objects with few needed properties
29
+
30
+ Before:
31
+
32
+ ```ts
33
+ type Request = {
34
+ body: { id: string };
35
+ headers: Record<string, string>;
36
+ cookies: Record<string, string>;
37
+ // ...20 more properties
38
+ };
39
+
40
+ it("gets user by id", () => {
41
+ // Only care about body.id but must fake entire Request
42
+ getUser({
43
+ body: { id: "123" },
44
+ headers: {},
45
+ cookies: {},
46
+ // ...fake all 20 properties
47
+ });
48
+ });
49
+ ```
50
+
51
+ After:
52
+
53
+ ```ts
54
+ import { fromPartial } from "@total-typescript/shoehorn";
55
+
56
+ it("gets user by id", () => {
57
+ getUser(
58
+ fromPartial({
59
+ body: { id: "123" },
60
+ }),
61
+ );
62
+ });
63
+ ```
64
+
65
+ ### `as Type` → `fromPartial()`
66
+
67
+ Before:
68
+
69
+ ```ts
70
+ getUser({ body: { id: "123" } } as Request);
71
+ ```
72
+
73
+ After:
74
+
75
+ ```ts
76
+ import { fromPartial } from "@total-typescript/shoehorn";
77
+
78
+ getUser(fromPartial({ body: { id: "123" } }));
79
+ ```
80
+
81
+ ### `as unknown as Type` → `fromAny()`
82
+
83
+ Before:
84
+
85
+ ```ts
86
+ getUser({ body: { id: 123 } } as unknown as Request); // wrong type on purpose
87
+ ```
88
+
89
+ After:
90
+
91
+ ```ts
92
+ import { fromAny } from "@total-typescript/shoehorn";
93
+
94
+ getUser(fromAny({ body: { id: 123 } }));
95
+ ```
96
+
97
+ ## When to use each
98
+
99
+ | Function | Use case |
100
+ | --------------- | -------------------------------------------------- |
101
+ | `fromPartial()` | Pass partial data that still type-checks |
102
+ | `fromAny()` | Pass intentionally wrong data (keeps autocomplete) |
103
+ | `fromExact()` | Force full object (swap with fromPartial later) |
104
+
105
+ ## Workflow
106
+
107
+ 1. **Gather requirements** - ask user:
108
+ - What test files have `as` assertions causing problems?
109
+ - Are they dealing with large objects where only some properties matter?
110
+ - Do they need to pass intentionally wrong data for error testing?
111
+
112
+ 2. **Install and migrate**:
113
+ - [ ] Install: `npm i @total-typescript/shoehorn`
114
+ - [ ] Find test files with `as` assertions: `grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"`
115
+ - [ ] Replace `as Type` with `fromPartial()`
116
+ - [ ] Replace `as unknown as Type` with `fromAny()`
117
+ - [ ] Add imports from `@total-typescript/shoehorn`
118
+ - [ ] Run type check to verify