docs: package-manager-aware CLI snippets via <CodeGroup>#103
docs: package-manager-aware CLI snippets via <CodeGroup>#103soleil-colza wants to merge 3 commits intomainfrom
Conversation
Wrap every pnpm command block on the Get Started and CLI pages in a Mintlify <CodeGroup> with pnpm / npm / yarn / bun tabs. Tab labels are identical across blocks so within-page sync triggers automatically: clicking npm on one snippet flips every other snippet on the page. For arkor init, the --use-<pm> flag in the CI example now matches the selected tab. Same for create arkor / dev / exec arkor wiring across the four runners. Cross-page persistence is not natively supported by Mintlify (mintlify/components#91); deferred for now. Also drop the now-redundant "examples use pnpm" notes in quickstart.mdx and cli/overview.mdx, since the tabs themselves show all four forms.
…(EN + JA) These pages mention pnpm exec arkor X / pnpm create arkor inline rather than as code blocks, so the CodeGroup approach does not apply. Rewrite to be package-manager-neutral: "the scaffolder generates...", "run arkor build...", etc. Mirrors the EN+JA tab work in the previous commit so a Bun reader does not hit pnpm-only phrasing on adjacent pages.
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 464c6e8bb9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ``` | ||
|
|
||
| ```bash npm | ||
| npm create arkor my-arkor-app --template triage |
There was a problem hiding this comment.
Add
-- before npm create template flag
Update the npm snippet to pass create-arkor flags after -- (for example, npm create arkor my-arkor-app -- --template triage). In npm v7+ argument forwarding for npm create/npm init requires the separator; without it, --template triage is consumed by npm config parsing instead of reaching the scaffolder, so this command does not reliably skip the template prompt as the section promises. The same regression appears in the Japanese mirror.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
Updates the Mintlify docs to be package-manager-aware by replacing single-package-manager command blocks with <CodeGroup> tab groups (pnpm/npm/yarn/bun) across EN + JA, and by removing pnpm-specific phrasing in surrounding prose.
Changes:
- Wrapes CLI-related shell snippets in
<CodeGroup>blocks with synchronized pnpm/npm/yarn/bun tabs. - Removes/rewrites pnpm-only notes and prose references to be package-manager-neutral.
- Updates EN + JA docs in parallel to keep both locales consistent.
Reviewed changes
Copilot reviewed 22 out of 22 changed files in this pull request and generated 22 comments.
Show a summary per file
| File | Description |
|---|---|
| docs/quickstart.mdx | Adds CodeGroup-tabbed scaffolding/dev/login snippets; removes pnpm-only prerequisite phrasing; updates related prose references. |
| docs/studio/jobs.mdx | Rewords a pnpm-specific rebuild hint to be package-manager-neutral. |
| docs/introduction.mdx | Adds CodeGroup “Try it” snippet and removes pnpm-only inline login mention. |
| docs/cookbook/customizing-templates.mdx | Replaces pnpm-specific prose with package-manager-neutral scaffolder wording. |
| docs/concepts/studio.mdx | Rewords pnpm-specific rebuild hint to be package-manager-neutral. |
| docs/concepts/project-structure.mdx | Replaces pnpm-specific prose with “scaffolder” wording. |
| docs/cli/overview.mdx | Updates overview prose to reflect tabbed snippets and package-manager neutrality. |
| docs/cli/init.mdx | Adds CodeGroup-tabbed init examples (interactive + CI/non-interactive + examples) and updates related prose. |
| docs/cli/dev.mdx | Adds CodeGroup-tabbed dev examples. |
| docs/cli/build-and-start.mdx | Adds CodeGroup-tabbed build/start examples. |
| docs/cli/auth.mdx | Adds CodeGroup-tabbed auth command examples (login/logout/whoami). |
| docs/ja/quickstart.mdx | JA mirror of quickstart CodeGroup tabs + prose neutralization. |
| docs/ja/studio/jobs.mdx | JA mirror: rewords rebuild hint to be package-manager-neutral. |
| docs/ja/introduction.mdx | JA mirror: adds CodeGroup “試してみる” snippet and removes pnpm-only inline login mention. |
| docs/ja/cookbook/customizing-templates.mdx | JA mirror: replaces pnpm-specific scaffolding prose. |
| docs/ja/concepts/studio.mdx | JA mirror: rewords rebuild hint to be package-manager-neutral. |
| docs/ja/concepts/project-structure.mdx | JA mirror: replaces pnpm-specific prose with “プロジェクト生成ツール” wording. |
| docs/ja/cli/overview.mdx | JA mirror: updates overview prose to reflect tabbed snippets and package-manager neutrality. |
| docs/ja/cli/init.mdx | JA mirror: adds CodeGroup-tabbed init examples and updates related prose. |
| docs/ja/cli/dev.mdx | JA mirror: adds CodeGroup-tabbed dev examples. |
| docs/ja/cli/build-and-start.mdx | JA mirror: adds CodeGroup-tabbed build/start examples. |
| docs/ja/cli/auth.mdx | JA mirror: adds CodeGroup-tabbed auth command examples. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - **Playground。** ジョブが完了したら、最終アダプタをセレクタから選んでチャット。モード切替でベースモデルとアダプタを行き来できます。学習中に中間チェックポイントで推論を走らせたい場合は Studio ではなく `onCheckpoint` コールバックを使ってください。 | ||
|
|
||
| 学習の合間に `src/arkor/` を編集した場合は、Run training ページをリロード(または `pnpm exec arkor build` を実行)してから次のクリックをすると、新しいコードが動きます。 | ||
| 学習の合間に `src/arkor/` を編集した場合は、Run training ページをリロード(または `arkor build` を実行)してから次のクリックをすると、新しいコードが動きます。 |
| - Pick from three end-to-end templates that finish in minutes: `triage` (support classification), `translate` (9 languages), and `redaction` (PII extraction). | ||
| - React to training in code via lifecycle callbacks, not a dashboard. | ||
| - Run training on Arkor's managed GPUs with no separate infra setup. Try it without an account; run `pnpm exec arkor login --oauth` before your next run if you want it tied to an account. Merging anonymous workspaces and jobs into an account once you sign in is on the roadmap. | ||
| - Run training on Arkor's managed GPUs with no separate infra setup. Try it without an account; run `arkor login --oauth` before your next run if you want it tied to an account. Merging anonymous workspaces and jobs into an account once you sign in is on the roadmap. |
| 3. **完成モデルを試す。** Playground ページでベースモデルや任意の完了ジョブの最終アダプタを選んでチャットできます。中間チェックポイントは Playground からはロードしません。学習中の推論には [`onCheckpoint`](/ja/concepts/lifecycle) コールバックをトレーナーで使ってください。 | ||
|
|
||
| dev ループのメモ: Studio の `/api/manifest` エンドポイントはリクエストごとにトレーナーをリビルド・再 import しますが(キャッシュバストクエリ付き、`packages/arkor/src/studio/manifest.ts` を参照)、UI が fetch するのは Run training ページがマウントされたときだけです。`src/arkor/` を編集して同じ Run training ページに留まり続けると、次のクリックは既存の `.arkor/build/index.mjs` を再利用して古いコードで走ります。確実に新しいコードを取り込むには、編集とクリックの間にページをリロード(あるいはターミナルから `pnpm exec arkor build`)してください。 | ||
| dev ループのメモ: Studio の `/api/manifest` エンドポイントはリクエストごとにトレーナーをリビルド・再 import しますが(キャッシュバストクエリ付き、`packages/arkor/src/studio/manifest.ts` を参照)、UI が fetch するのは Run training ページがマウントされたときだけです。`src/arkor/` を編集して同じ Run training ページに留まり続けると、次のクリックは既存の `.arkor/build/index.mjs` を再利用して古いコードで走ります。確実に新しいコードを取り込むには、編集とクリックの間にページをリロード(あるいはターミナルから `arkor build`)してください。 |
| If you edit `src/arkor/` between runs, refresh the Run training page (or run `arkor build`) before the next click so the new code is what runs. | ||
|
|
| ``` | ||
|
|
||
| ```bash npm | ||
| npm create arkor my-arkor-app --template triage |
| 3. **Try a finished model.** A Playground page lets you pick the base model or the final adapter from any completed job and chat with it. The Playground does not load intermediate checkpoints; for mid-run inference, use [`onCheckpoint`](/concepts/lifecycle) callbacks in your trainer. | ||
|
|
||
| A note on the dev loop: Studio's `/api/manifest` endpoint rebuilds and re-imports your trainer on every request (with a cache-bust query, see `packages/arkor/src/studio/manifest.ts`), but the UI only fetches it when the Run training page mounts. So if you edit `src/arkor/` and stay on the same Run training page, the next click reuses the existing `.arkor/build/index.mjs` and runs your old code. Refresh the page (or run `pnpm exec arkor build` from the terminal) between edits and clicks to pick up the new code reliably. | ||
| A note on the dev loop: Studio's `/api/manifest` endpoint rebuilds and re-imports your trainer on every request (with a cache-bust query, see `packages/arkor/src/studio/manifest.ts`), but the UI only fetches it when the Run training page mounts. So if you edit `src/arkor/` and stay on the same Run training page, the next click reuses the existing `.arkor/build/index.mjs` and runs your old code. Refresh the page (or run `arkor build` from the terminal) between edits and clicks to pick up the new code reliably. |
| --- | ||
|
|
||
| `arkor` CLI は Arkor プロジェクトを取り巻くコマンド面です。プロジェクト生成ツール([`pnpm create arkor`](/ja/quickstart))が `arkor` をローカル devDependency としてインストールするので、CLI をグローバルにインストールしていない限り、素の `arkor` ではなく利用しているパッケージマネージャーのローカル bin 実行コマンド(例: `pnpm exec arkor <command>`、`npx arkor <command>`、`yarn arkor <command>`、`bunx arkor <command>`)を使ってください。以降の例は pnpm 形式で記載しますが、他のパッケージマネージャーでも同じように動きます。 | ||
| `arkor` CLI は Arkor プロジェクトを取り巻くコマンド面です。プロジェクト生成ツール([`create arkor`](/ja/quickstart))が `arkor` をローカル devDependency としてインストールするので、CLI をグローバルにインストールしていない限り、素の `arkor` ではなく利用しているパッケージマネージャーのローカル bin 実行コマンド(例: `pnpm exec arkor <command>`、`npx arkor <command>`、`yarn arkor <command>`、`bunx arkor <command>`)を使ってください。以降のスニペットはタブグループになっており、普段使うパッケージマネージャーを選べばページ全体がそれに揃います。 |
|
|
||
| </CodeGroup> | ||
|
|
||
| Scaffolds `src/arkor/index.ts`, `src/arkor/trainer.ts`, `arkor.config.ts`, and a starter `package.json` in the **current directory**. Use this when you want to add Arkor to an existing repo (the [`create arkor`](/quickstart) flow runs the same scaffolder one directory up). |
|
|
||
| </CodeGroup> | ||
|
|
||
| `src/arkor/index.ts`、`src/arkor/trainer.ts`、`arkor.config.ts`、スターター `package.json` を **カレントディレクトリー** に生成します。既存リポジトリに Arkor を追加したいときに使います([`create arkor`](/ja/quickstart) のフローは同じツールを 1 つ上のディレクトリーで実行します)。 |
|
|
||
| プロジェクト生成ツール(`pnpm create arkor`)がどのテンプレートを使うか尋ねてきます。最終的に作りたいものに最も近いものを選んでください: | ||
| ```bash npm | ||
| npm create arkor my-arkor-app |
…orms, scaffolder wording) Three categories of accurate review feedback applied across EN + JA: - npm `create` snippets now pin `@latest` (matches create-arkor README) and pass `--` before the `--template` flag so npm v7+ forwards it to the scaffolder instead of consuming it. - Bare `arkor build` / `arkor login` mentions in inline prose now spell out the four package-manager forms (`pnpm build` / `npm run build` / `yarn build` / `bun run build` for build, runner forms for login). The pages already say `arkor` is a local devDependency, so the bare invocations were a copy/paste trap. - `create arkor` references in `cli/overview` and `cli/init` are no longer formatted as a runnable command (it isn't one). Reworded to "scaffolder" with an anchor link to the Quickstart's "Scaffold a project" section, where the actual 4-tab CodeGroup lives.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1ee2b0633c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| When you click it, Studio sends `POST /api/train`. The backend spawns `arkor start` in a subprocess and streams its stdout / stderr back as raw text. The pre-formatted log box auto-scrolls; what you see is exactly what the spawned `arkor start` would print in a terminal. | ||
|
|
||
| There is no input form for picking the trainer or passing flags: Studio always runs the trainer registered through `createArkor`, and `arkor start` reuses `.arkor/build/index.mjs` if it already exists. Edits to `src/arkor/` are not picked up automatically across multiple clicks on the same page; reload the Run training page (or run `pnpm exec arkor build` from a terminal) between edits and the next click. See [CLI § build / start](/cli/build-and-start) for the precise rebuild rules. | ||
| There is no input form for picking the trainer or passing flags: Studio always runs the trainer registered through `createArkor`, and `arkor start` reuses `.arkor/build/index.mjs` if it already exists. Edits to `src/arkor/` are not picked up automatically across multiple clicks on the same page; reload the Run training page (or run the build script from a terminal: `pnpm build` / `npm run build` / `yarn build` / `bun run build`) between edits and the next click. See [CLI § build / start](/cli/build-and-start) for the precise rebuild rules. |
There was a problem hiding this comment.
Recommend
arkor build instead of package build script
The new guidance to run pnpm build / npm run build / yarn build / bun run build can be wrong for valid Arkor setups created via arkor init in an existing repo, because init only adds missing scripts and does not overwrite an existing build script (packages/cli-internal/src/scaffold.ts lines 117-123; test at packages/cli-internal/src/scaffold.test.ts lines 109 and 126-129). In that case, users can run their app’s unrelated build step instead of rebuilding .arkor/build/index.mjs, so Studio may continue to execute stale trainer code despite following this doc.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 22 out of 22 changed files in this pull request and generated 8 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| When you click it, Studio sends `POST /api/train`. The backend spawns `arkor start` in a subprocess and streams its stdout / stderr back as raw text. The pre-formatted log box auto-scrolls; what you see is exactly what the spawned `arkor start` would print in a terminal. | ||
|
|
||
| There is no input form for picking the trainer or passing flags: Studio always runs the trainer registered through `createArkor`, and `arkor start` reuses `.arkor/build/index.mjs` if it already exists. Edits to `src/arkor/` are not picked up automatically across multiple clicks on the same page; reload the Run training page (or run `pnpm exec arkor build` from a terminal) between edits and the next click. See [CLI § build / start](/cli/build-and-start) for the precise rebuild rules. | ||
| There is no input form for picking the trainer or passing flags: Studio always runs the trainer registered through `createArkor`, and `arkor start` reuses `.arkor/build/index.mjs` if it already exists. Edits to `src/arkor/` are not picked up automatically across multiple clicks on the same page; reload the Run training page (or run the build script from a terminal: `pnpm build` / `npm run build` / `yarn build` / `bun run build`) between edits and the next click. See [CLI § build / start](/cli/build-and-start) for the precise rebuild rules. |
| - **Playground.** After a job completes, pick the final adapter from the selector and chat with it. Use the mode toggle to switch between the base model and the adapter. To run inference on intermediate checkpoints while a run is still in flight, use `onCheckpoint` callbacks instead of Studio. | ||
|
|
||
| If you edit `src/arkor/` between runs, refresh the Run training page (or run `pnpm exec arkor build`) before the next click so the new code is what runs. | ||
| If you edit `src/arkor/` between runs, refresh the Run training page (or run the build script: `pnpm build` / `npm run build` / `yarn build` / `bun run build`) before the next click so the new code is what runs. |
| - **Concepts.** Read [Concepts](/concepts/overview) to build a mental model of `createArkor`, `createTrainer`, the lifecycle callbacks, and Studio. | ||
| - **Customize the trainer.** Open `src/arkor/trainer.ts` and tweak `lora.r`, `maxSteps`, or add more callbacks. Refresh the Run training page (or run `pnpm exec arkor build`) before the next click so your edits land. | ||
| - **Try another template.** Run `pnpm create arkor` again with a different `--template` to compare. | ||
| - **Customize the trainer.** Open `src/arkor/trainer.ts` and tweak `lora.r`, `maxSteps`, or add more callbacks. Refresh the Run training page (or run the build script: `pnpm build` / `npm run build` / `yarn build` / `bun run build`) before the next click so your edits land. |
| 3. **Try a finished model.** A Playground page lets you pick the base model or the final adapter from any completed job and chat with it. The Playground does not load intermediate checkpoints; for mid-run inference, use [`onCheckpoint`](/concepts/lifecycle) callbacks in your trainer. | ||
|
|
||
| A note on the dev loop: Studio's `/api/manifest` endpoint rebuilds and re-imports your trainer on every request (with a cache-bust query, see `packages/arkor/src/studio/manifest.ts`), but the UI only fetches it when the Run training page mounts. So if you edit `src/arkor/` and stay on the same Run training page, the next click reuses the existing `.arkor/build/index.mjs` and runs your old code. Refresh the page (or run `pnpm exec arkor build` from the terminal) between edits and clicks to pick up the new code reliably. | ||
| A note on the dev loop: Studio's `/api/manifest` endpoint rebuilds and re-imports your trainer on every request (with a cache-bust query, see `packages/arkor/src/studio/manifest.ts`), but the UI only fetches it when the Run training page mounts. So if you edit `src/arkor/` and stay on the same Run training page, the next click reuses the existing `.arkor/build/index.mjs` and runs your old code. Refresh the page (or run the build script from the terminal: `pnpm build` / `npm run build` / `yarn build` / `bun run build`) between edits and clicks to pick up the new code reliably. |
| クリックすると Studio は `POST /api/train` を送ります。バックエンドはサブプロセスで `arkor start` を spawn し、stdout / stderr を生テキストとしてストリーム返却します。整形済みログボックスは自動スクロールし、表示されるのはターミナルで `arkor start` を走らせたときの出力そのものです。 | ||
|
|
||
| トレーナー選択やフラグを渡す入力フォームはありません: Studio は常に `createArkor` で登録されたトレーナーを走らせ、`arkor start` は `.arkor/build/index.mjs` があれば再利用します。同じページで複数回クリックする間に `src/arkor/` の編集は自動では拾われません。編集の合間に Run training ページをリロード(あるいはターミナルから `pnpm exec arkor build`)してから次のクリックをしてください。具体的なリビルドルールは [CLI § build / start](/ja/cli/build-and-start) を参照。 | ||
| トレーナー選択やフラグを渡す入力フォームはありません: Studio は常に `createArkor` で登録されたトレーナーを走らせ、`arkor start` は `.arkor/build/index.mjs` があれば再利用します。同じページで複数回クリックする間に `src/arkor/` の編集は自動では拾われません。編集の合間に Run training ページをリロード(あるいはターミナルからビルドスクリプトを実行: `pnpm build` / `npm run build` / `yarn build` / `bun run build`)してから次のクリックをしてください。具体的なリビルドルールは [CLI § build / start](/ja/cli/build-and-start) を参照。 |
| - **Playground。** ジョブが完了したら、最終アダプタをセレクタから選んでチャット。モード切替でベースモデルとアダプタを行き来できます。学習中に中間チェックポイントで推論を走らせたい場合は Studio ではなく `onCheckpoint` コールバックを使ってください。 | ||
|
|
||
| 学習の合間に `src/arkor/` を編集した場合は、Run training ページをリロード(または `pnpm exec arkor build` を実行)してから次のクリックをすると、新しいコードが動きます。 | ||
| 学習の合間に `src/arkor/` を編集した場合は、Run training ページをリロード(またはビルドスクリプトを実行: `pnpm build` / `npm run build` / `yarn build` / `bun run build`)してから次のクリックをすると、新しいコードが動きます。 |
| - **コンセプト。** [Concepts](/ja/concepts/overview) を読み、`createArkor`、`createTrainer`、ライフサイクルコールバック、Studio のメンタルモデルを構築してください。 | ||
| - **トレーナーをカスタマイズ。** `src/arkor/trainer.ts` を開き、`lora.r` や `maxSteps` を調整したり、コールバックを追加したり。Run training ページをリロード(または `pnpm exec arkor build`)してから次のクリックで反映されます。 | ||
| - **別のテンプレートを試す。** `pnpm create arkor` を別の `--template` で再実行して比較してみてください。 | ||
| - **トレーナーをカスタマイズ。** `src/arkor/trainer.ts` を開き、`lora.r` や `maxSteps` を調整したり、コールバックを追加したり。Run training ページをリロード(またはビルドスクリプトを実行: `pnpm build` / `npm run build` / `yarn build` / `bun run build`)してから次のクリックで反映されます。 |
| 3. **完成モデルを試す。** Playground ページでベースモデルや任意の完了ジョブの最終アダプタを選んでチャットできます。中間チェックポイントは Playground からはロードしません。学習中の推論には [`onCheckpoint`](/ja/concepts/lifecycle) コールバックをトレーナーで使ってください。 | ||
|
|
||
| dev ループのメモ: Studio の `/api/manifest` エンドポイントはリクエストごとにトレーナーをリビルド・再 import しますが(キャッシュバストクエリ付き、`packages/arkor/src/studio/manifest.ts` を参照)、UI が fetch するのは Run training ページがマウントされたときだけです。`src/arkor/` を編集して同じ Run training ページに留まり続けると、次のクリックは既存の `.arkor/build/index.mjs` を再利用して古いコードで走ります。確実に新しいコードを取り込むには、編集とクリックの間にページをリロード(あるいはターミナルから `pnpm exec arkor build`)してください。 | ||
| dev ループのメモ: Studio の `/api/manifest` エンドポイントはリクエストごとにトレーナーをリビルド・再 import しますが(キャッシュバストクエリ付き、`packages/arkor/src/studio/manifest.ts` を参照)、UI が fetch するのは Run training ページがマウントされたときだけです。`src/arkor/` を編集して同じ Run training ページに留まり続けると、次のクリックは既存の `.arkor/build/index.mjs` を再利用して古いコードで走ります。確実に新しいコードを取り込むには、編集とクリックの間にページをリロード(あるいはターミナルからビルドスクリプトを実行: `pnpm build` / `npm run build` / `yarn build` / `bun run build`)してください。 |
Summary
<CodeGroup>withpnpm/npm/yarn/buntabs (EN + JA mirror).arkor init, the--use-<pm>flag in the CI example tracks the selected tab (CLI already supports--use-npm/--use-pnpm/--use-yarn/--use-bun).quickstart.mdxandcli/overview.mdx; the tabs show all four forms inline.pnpm exec arkor .../pnpm create arkormentions inconcepts/,cookbook/, andstudio/pages to be package-manager-neutral so a Bun reader does not hit pnpm-only phrasing on adjacent pages.Mintlify research
Cross-page persistence (a Bun reader staying on Bun across navigations) is not natively supported by Mintlify (components/code-groups, components#91). Within-page sync is. Per discussion on the issue, cross-page persistence is deferred to a future change rather than a custom localStorage shim.
Test plan
cd docs && npx mintlify devand open/quickstart. Confirm the four tabs render and clickingnpmflips every snippet on the page tonpm.pnpm). Documented as out of scope./ja/quickstartto confirm the JA mirror behaves the same.bun create arkor /tmp/test-bunsucceeds./concepts/*,/cookbook/*,/studio/*pages for any leftoverpnpm exec arkor Xphrasing in prose.