adamantite 0.37.0 → 0.38.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # adamantite
2
2
 
3
+ ## 0.38.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#397](https://github.com/adelrodriguez/adamantite/pull/397) [`8381104`](https://github.com/adelrodriguez/adamantite/commit/8381104aea6a2e6d2dfbc1a434dbb299ad9ac331) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Let interactive `adamantite doctor` hand findings off to an installed coding agent:
8
+ Claude Code, Codex, Cursor, Gemini CLI, Grok Build, or OpenCode. Doctor detects
9
+ installed agents by probing each CLI and only offers the ones on `PATH`, then starts the
10
+ selected agent in the terminal with a one-line seed prompt that tells the agent to run
11
+ Doctor itself, so the agent's own UI owns permissions, trust, and authentication and no
12
+ findings content appears in process arguments. Doctor warns before handing off a working
13
+ tree that is not known to be clean, reassesses once after the agent session ends, and
14
+ exits 0 only when no findings remain — the agent's exit code is ignored. The agent runs
15
+ in Doctor's process group and Doctor ignores Ctrl-C while the agent owns the terminal,
16
+ so terminal signals reach only the agent. When an agent fails to start, the Markdown
17
+ prompt copy remains available. Non-interactive output is unchanged.
18
+
19
+ - [#396](https://github.com/adelrodriguez/adamantite/pull/396) [`5428bdd`](https://github.com/adelrodriguez/adamantite/commit/5428bddf3228319e5be42ca5a5fd7f2b03bdf423) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Format binary and ternary operators at the start of continuation lines
20
+
21
+ The format preset now sets `experimentalOperatorPosition: "start"`, so multiline conditions place `&&`, `||`, `??`, and ternary operators at the beginning of the wrapped line instead of the end. The managed oxfmt version moves to 0.65.0, which supports the option. Expect a one-time reformat of multiline expressions the next time you run `format`.
22
+
23
+ - [#393](https://github.com/adelrodriguez/adamantite/pull/393) [`af18c34`](https://github.com/adelrodriguez/adamantite/commit/af18c346d0e7a2efa35d511d2850bb50282831ce) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Make `adamantite doctor` emit verifiable repair findings and prompts instead of mutating projects. Interactive runs show formatted findings and offer to copy one Markdown prompt. Non-interactive runs print Markdown directly so a calling agent can follow it, including assessment warnings that explain why a finding is absent. Warning-only runs still exit 0. `update` now only updates managed dependencies. Keep `doctor --fix` as a one-release error stub, remove the deprecated `typecheck` alias, and require `pnpm-workspace.yaml` to define packages before treating a project as a monorepo.
24
+
25
+ Align the pinned Effect packages on `4.0.0-rc.112` so the published CLI installs one compatible runtime.
26
+
27
+ ### Patch Changes
28
+
29
+ - [#386](https://github.com/adelrodriguez/adamantite/pull/386) [`e78de64`](https://github.com/adelrodriguez/adamantite/commit/e78de6400b9494a10f677c180b2f0037adbb50dc) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Fix `serializeTsObjectLiteral` corrupting keys that contain a double quote and dropping own `__proto__` keys
30
+
31
+ The key-unquoting regex matched escaped quotes inside serialized keys, so migrating a knip or oxfmt config with a quote-containing key produced a `*.config.ts` file with invalid syntax. It also unquoted `__proto__`, which an object literal treats as prototype assignment; the migration path never hits this because `parseJson` strips `__proto__`, but any direct caller would lose the key. Quote-containing keys now stay quoted, and `__proto__` keys are emitted as computed properties (`["__proto__"]:`) so they survive as own properties.
32
+
33
+ - [#395](https://github.com/adelrodriguez/adamantite/pull/395) [`62cd29a`](https://github.com/adelrodriguez/adamantite/commit/62cd29a12ca3ce4ad48b012d00053934d42c8f03) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Emit `oxlint.config.ts` with sorted keys so a fresh `adamantite check` passes
34
+
35
+ The core preset enables `sort-keys`, but `adamantite init` generated the config with its keys in `options`, `ignorePatterns`, `extends` order, so running the managed `check` script in a freshly initialized project immediately failed on the file init had just written. The generator now sorts the top-level keys and the keys inside `options` in the order the rule expects. Caught by the new `test:smoke` script, which runs the built CLI's `init` against a real fixture project and then executes the real oxlint, oxfmt, and knip binaries on the result.
36
+
37
+ - [#386](https://github.com/adelrodriguez/adamantite/pull/386) [`e78de64`](https://github.com/adelrodriguez/adamantite/commit/e78de6400b9494a10f677c180b2f0037adbb50dc) Thanks [@adelrodriguez](https://github.com/adelrodriguez)! - Fix knip and oxfmt migrations writing non-identifier config keys as bare identifiers
38
+
39
+ The config writers interpolated keys directly into the generated `*.config.ts`, so a legal knip key such as `lint-staged` or a rule name containing punctuation produced invalid TypeScript. Keys are now emitted through `serializeTsPropertyKey`, which quotes non-identifier keys and writes `__proto__` as a computed property.
40
+
3
41
  ## 0.37.0
4
42
 
5
43
  ### Minor Changes
package/README.md CHANGED
@@ -32,8 +32,8 @@ and Sherif so humans and coding agents can use the same project workflow.
32
32
  and Vue, test runners like Jest and Vitest, Node.js, and stricter opt-in rule sets.
33
33
  - **Project setup**: Create package scripts, configuration files, editor settings, and CI
34
34
  through an interactive or non-interactive initializer.
35
- - **Setup maintenance**: Assess managed integrations with `doctor`, apply safe fixes, and
36
- migrate older Adamantite configurations.
35
+ - **Setup maintenance**: Assess managed integrations with `doctor`, update managed
36
+ dependencies, and give humans or agents repair instructions.
37
37
  - **Workspace checks**: Find unused code with Knip and dependency inconsistencies with
38
38
  Sherif.
39
39
  - **Agent guidance**: Add a managed Adamantite section to `AGENTS.md`.
@@ -164,31 +164,41 @@ adamantite monorepo --fix
164
164
 
165
165
  ### `adamantite doctor`
166
166
 
167
- Assess every Adamantite-managed integration. The default command is read-only. Use
168
- `--fix` to install or update managed packages, create missing supported configurations,
169
- update supported configurations, and run known migrations.
167
+ Assess every Adamantite-managed integration. Doctor is read-only. Each finding describes
168
+ the current state, the goal state, and how to verify the repair.
170
169
 
171
170
  ```sh
172
171
  adamantite doctor
173
- adamantite doctor --fix
174
- adamantite doctor
175
172
  ```
176
173
 
177
- Manual-fix findings remain report-only.
174
+ In an interactive terminal, Doctor presents each finding as formatted text and offers to
175
+ hand off to an installed coding agent, or to copy one combined Markdown repair prompt. A
176
+ handoff starts the selected agent CLI in the terminal with a short seed prompt; the agent
177
+ runs `adamantite doctor` itself to read the findings and edits the project under its own
178
+ permission and trust flow. When the agent session ends, Doctor reassesses and exits 0
179
+ only when no findings remain. Doctor detects installed agents by probing each supported
180
+ CLI — Claude Code (`claude`), Codex (`codex`), Cursor (`cursor-agent`), Gemini CLI
181
+ (`gemini`), Grok Build (`grok`), and OpenCode (`opencode`) — and lists only the ones
182
+ found on `PATH`. It warns before starting an agent on a working tree that is not known
183
+ to be clean. OpenCode pre-fills its input with the seed prompt, so that handoff needs
184
+ one Enter press to start.
185
+
186
+ A coding agent can also run `adamantite doctor` in the target project to receive Markdown
187
+ directly. In a non-interactive run, Doctor prints the combined repair prompt and exits 1
188
+ when findings remain. If only assessment warnings remain, Doctor prints a Markdown
189
+ warning report and exits 0.
178
190
 
179
191
  ### `adamantite update`
180
192
 
181
- Run applicable migrations and update Adamantite-managed dependencies:
193
+ Update Adamantite-managed dependencies, then report any setup findings:
182
194
 
183
195
  ```sh
184
196
  adamantite update
185
- adamantite doctor --fix
186
197
  adamantite doctor
187
198
  ```
188
199
 
189
- `update` handles known legacy transitions, including JSON Oxlint, Oxfmt, and Knip
190
- configurations and the legacy type-check script. Use `doctor --fix` afterward to complete
191
- safe setup repairs.
200
+ `update` exits 0 when dependency updates succeed, even if doctor findings remain. Use
201
+ `adamantite doctor` as the CI gate.
192
202
 
193
203
  ### Pass arguments to underlying tools
194
204
 
@@ -255,8 +265,8 @@ Configs generated by `adamantite init` include this automatically.
255
265
  them.
256
266
  - Adamantite manages recognized package scripts and supported configuration shapes. It
257
267
  reports custom configurations that require manual work instead of overwriting them.
258
- - `fix`, `format`, `analyze --fix`, `monorepo --fix`, `doctor --fix`, `init`, and `update`
259
- can change project files. Review the resulting diff.
268
+ - `fix`, `format`, `analyze --fix`, `monorepo --fix`, `init`, and `update` can change
269
+ project files. Doctor is read-only.
260
270
 
261
271
  ## Agent skill
262
272
 
package/dist/index.js CHANGED
@@ -1,23 +1,19 @@
1
- import*as e from"@effect/platform-node/NodeRuntime";import*as t from"@effect/platform-node/NodeServices";import*as n from"effect/Effect";import*as r from"effect/Exit";import*as i from"effect/Layer";import*as a from"effect/Runtime";import*as o from"effect/Stdio";import*as s from"effect/unstable/process/ChildProcessSpawner";import*as c from"effect/Array";import*as l from"effect/unstable/cli/Command";import*as u from"effect/unstable/cli/Flag";import*as d from"effect/Context";import*as ee from"effect/unstable/process/ChildProcess";import{stripVTControlCharacters as f}from"node:util";import*as p from"effect/Data";import{pipe as m}from"effect/Function";import*as h from"effect/Option";import*as g from"effect/Predicate";import*as _ from"effect/String";import{parse as te,printParseErrorCode as v}from"jsonc-parser";import*as y from"effect/FileSystem";import*as b from"effect/Path";import ne from"node:process";import*as re from"effect/Record";import*as x from"effect/Result";import{defu as ie}from"defu";import*as S from"effect/unstable/cli/Argument";import{print as ae}from"esrap";import oe from"esrap/languages/ts";import{parseSync as se}from"oxc-parser";import{addDevDependency as ce,detectPackageManager as le,runScriptCommand as ue}from"nypm";import*as C from"effect/Schema";import*as w from"@clack/prompts";import*as de from"effect/Console";import*as fe from"effect/Terminal";function pe(e){return g.isError(e)?m(f(e.message),_.split(/\r\n|[\r\n]/),c.map(e=>_.trimEnd(e)),c.filter(e=>_.isNonEmpty(e))):[]}function T(e){return m(pe(e),c.head,h.map(e=>{let t=_.trim(e);return/[.!?]$/.test(t)?` Cause: ${t}`:` Cause: ${t}.`}),h.getOrElse(()=>``))}function me(e){let t=pe(e);if(!c.isReadonlyArrayNonEmpty(t))return``;let n=c.takeRight(t,20);return`\n${(n.length<t.length?[`…`,...n]:n).join(`
2
- `)}`}function he(e=[]){return e.length===0?`- Unknown JSON/JSONC parsing error`:e.slice(0,3).map(e=>`- ${v(e.error)} (offset: ${e.offset})`).join(`
3
- `)}var ge=class extends p.TaggedError(`CliNotFound`){get message(){return`Command \`${this.command}\` not found. Please install it and try again.`}},E=class extends p.TaggedError(`CommandFailed`){get message(){return`Command \`${this.command}\` failed with exit code ${this.exitCode}.`}},_e=class extends p.TaggedError(`FailedToCreateDirectory`){get message(){return`Failed to create directory ${this.path?`\`${this.path}\``:`the target directory`}.${T(this.cause)}`}},ve=class extends p.TaggedError(`FailedToInstallDependency`){get message(){return`Failed to install dependencies${this.packages?.length?`: ${this.packages.join(`, `)}`:``}.${me(this.cause)}`}},ye=class extends p.TaggedError(`FailedToInstallExtension`){get message(){let e=this.extension?`\`${this.extension}\``:`the target extension`;return g.isNumber(this.cause)?`Failed to install ${e}. The \`code\` CLI exited with code ${this.cause}.`:`Failed to install ${e}.${T(this.cause)}`}},be=class extends p.TaggedError(`FailedToMergeConfig`){get message(){return`Failed to merge configuration.${T(this.cause)}`}},xe=class extends p.TaggedError(`FailedToParseFile`){get message(){return[`Failed to parse ${this.path?`\`${this.path}\``:`the target file`}.`,`Please fix the JSON/JSONC syntax and run the command again.`,``,`Parse details:`,he(this.errors)].join(`
4
- `)}},Se=class extends p.TaggedError(`FailedToReadFile`){get message(){return`Failed to read ${this.path?`\`${this.path}\``:`the target file`}.${T(this.cause)}`}},Ce=class extends p.TaggedError(`FailedToDeleteFile`){get message(){return`Failed to delete ${this.path?`\`${this.path}\``:`the target file`}.${T(this.cause)}`}},we=class extends p.TaggedError(`FailedToWriteFile`){get message(){return`Failed to write ${this.path?`\`${this.path}\``:`the target file`}.${T(this.cause)}`}},Te=class extends p.TaggedError(`FileNotFound`){get message(){return this.path?`File not found: \`${this.path}\`.`:`File not found.`}},Ee=class extends p.TaggedError(`InvalidConfigFormat`){get message(){return`Invalid config format in ${this.path?`\`${this.path}\``:`the target config file`}. The config must be a JSON object (for example: {}).`}},D=class extends p.TaggedError(`InvalidInitOptions`){get message(){return`Invalid init options. ${this.reason}`}},De=class extends p.TaggedError(`UnsupportedConfigState`){get message(){return`Unsupported config state in ${this.path?`\`${this.path}\``:`the target config file`}.${this.reason?` ${this.reason}`:``}`}},Oe=class extends p.TaggedError(`NoPackageManager`){get message(){return`No package manager detected. Please run this command from a project with a lockfile.${T(this.cause)}`}};p.TaggedError(`MissingPackageVersion`);var O=class extends p.TaggedError(`MigrationValidationFailed`){get message(){return`Migration \`${this.migrationId}\` validation failed. ${this.reason}`}},ke=class extends p.TaggedError(`OperationCancelled`){get message(){return`Operation cancelled.${this.reason?` Reason: ${this.reason}`:``}`}},Ae=class extends p.TaggedError(`PassthroughNotSupported`){get message(){return`Command \`adamantite ${this.command}\` does not invoke a single underlying CLI and cannot accept passthrough arguments.`}},je=class extends p.TaggedError(`VscodeCliNotFound`){get message(){return`VS Code CLI (\`code\`) not found. Please install it to manage extensions.${T(this.cause)}`}},k=class extends d.Service()(`CommandRunner`){static layer=i.succeed(this)({run:n.fn(`CommandRunner.run`)(function*({args:e,command:t,cwd:r,stderr:i=`inherit`,stdin:a=`ignore`,stdout:o=`inherit`}){return yield*n.scoped(n.gen(function*(){return yield*(yield*ee.make(t,e,{cwd:r,stderr:i,stdin:a,stdout:o})).exitCode})).pipe(n.mapError(e=>e.reason._tag===`NotFound`?new ge({command:t}):e))})})};const A=d.Reference(`adamantite/ForwardedArguments`,{defaultValue:()=>[]});function j(e){return e}const Me=e=>y.FileSystem.pipe(n.flatMap(t=>t.makeDirectory(e,{recursive:!0})),n.mapError(t=>new _e({cause:t,path:e}))),M=e=>y.FileSystem.pipe(n.flatMap(t=>t.readFileString(e)),n.mapError(t=>new Se({cause:t,path:e}))),Ne=e=>y.FileSystem.pipe(n.flatMap(t=>t.readFileString(e)),n.map(e=>m(e,h.some)),n.catch(t=>t.reason._tag===`NotFound`?n.succeedNone:n.fail(new Se({cause:t,path:e})))),N=(e,t)=>y.FileSystem.pipe(n.flatMap(n=>n.writeFileString(e,t)),n.mapError(t=>new we({cause:t,path:e}))),P=(e,t)=>N(e,`${JSON.stringify(t,null,2)}\n`),Pe=e=>y.FileSystem.pipe(n.flatMap(t=>t.remove(e)),n.mapError(t=>new Ce({cause:t,path:e}))),F=(e,t)=>n.suspend(()=>{let r=[],i=te(e,r,{allowTrailingComma:!0});return r.length>0?n.fail(new xe({errors:r,path:t})):n.succeed(i)}),I=e=>g.isObject(e),Fe=e=>Array.isArray(e);function Ie(e,t={}){let{continuationIndent:n,indentation:r=2}=t,i=JSON.stringify(e,null,r).replaceAll(/"([A-Za-z_$][\w$]*)":/g,`$1:`);return n?i.replaceAll(`
5
- `,`\n${n}`):i}const Le=(e,t)=>n.try({catch:e=>new be({cause:e}),try:()=>ie(e,t)}),Re=/^workspace:/,ze=/^[\^~]/;function Be(e){return e.trim().replace(Re,``).replace(ze,``)}const L=(e=ne.cwd())=>n.gen(function*(){let t=(yield*b.Path).join(e,`package.json`),n=yield*M(t);return yield*F(n,t)}),Ve=(e,t)=>n.gen(function*(){let n=yield*b.Path;yield*P(n.join(e,`package.json`),t)});function He(e){return e===`bun`||e===`deno`||e===`npm`||e===`pnpm`||e===`yarn`}const R={analyze:`adamantite analyze`,check:`adamantite check`,"check:monorepo":`adamantite monorepo`,fix:`adamantite fix`,"fix:monorepo":`adamantite monorepo --fix`,format:`adamantite format`};function Ue(e){let t=e.scripts??{};return m(re.keys(R),c.filter(e=>t[e]===R[e]))}function We(e,t){let n=e.scripts??{};return c.filterMap(t,e=>{let t=n[e];return t!==void 0&&t!==``&&t!==R[e]?x.succeed({command:t,script:e}):x.failVoid})}function Ge(e){return e.endsWith(`.jsonc`)?`jsonc`:e.endsWith(`.json`)?`json`:`ts`}function Ke(e,t){return c.findFirst(e.legacyConfigs,e=>Ge(e)===t)}function qe(e){let t=Ke(e,`json`),n=Ke(e,`jsonc`);return m(h.zipWith(t,n,e=>`${e}(c)`),h.orElse(()=>n),h.orElse(()=>t),h.getOrElse(()=>``))}function Je(e,t,n,r){return n===null||r.length===0?[]:n.format===`ts`?[`Found both \`${t.config}\` and \`${qe(t)}\`. Adamantite will use \`${t.config}\`.`]:m(h.zipWith(Ke(t,`json`),Ke(t,`jsonc`),(t,n)=>`Found both \`${t}\` and \`${n}\`. Multiple legacy ${e} configs exist; Adamantite will treat \`${n}\` as the source of truth when migration is needed.`),h.toArray)}const Ye=n.fn(`detectToolingConfig`)(function*(e,t,r){let i=yield*y.FileSystem,a=yield*b.Path,o=[r.config,...r.legacyConfigs].map(t=>({file:t,format:Ge(t),path:a.join(e,t)})),s=yield*n.forEach(o,e=>i.exists(e.path),{concurrency:`unbounded`}),l=o.filter((e,t)=>s[t]),u=m(c.findFirst(l,e=>e.format===`ts`),h.orElse(()=>c.findFirst(l,e=>e.format===`jsonc`)),h.orElse(()=>c.findFirst(l,e=>e.format===`json`)),h.getOrNull),d=l.filter(e=>e!==u&&e.format!==`ts`);return{active:u,legacy:d,warnings:Je(t,r,u,d)}});function Xe(e,t,n){let r=e.devDependencies?.[t.name]??e.dependencies?.[t.name];return r?Be(r)===t.version?[]:[{currentVersion:r,description:`Update \`${t.name}\` from \`${r}\` to \`${t.version}\`.`,package:t.name,targetVersion:t.version,type:`update_package`}]:[{description:`Install \`${t.name}@${t.version}\` for ${n}.`,package:t.name,targetVersion:t.version,type:`install_package`}]}function Ze(e,t){return e.active===null?[{description:`Create \`${t.configFile}\` for \`${t.toolName}\`.`,path:t.configFile,type:`create_config`}]:e.active.format===`ts`?[]:[{description:`Migrate legacy \`${e.active.file}\` to \`${t.configFile}\`.`,migrationId:t.migrationId,type:`run_migration`}]}function Qe(e,t){let n=Ue(e);return t.some(e=>n.includes(e))}function $e(e){return j({assess:(t,r)=>n.sync(()=>Qe(r,e.scripts)?{actions:Xe(r,e,e.purpose),applicable:!0,warnings:[]}:{applicable:!1,warnings:[]}),kind:`tooling`,name:e.name,version:e.version})}function et(e){let t=[{path:e.configFiles.config,type:`config`},...e.configFiles.legacyConfigs.map(e=>({path:e,type:`legacy_config`}))],r=t=>Ye(t,e.name,e.configFiles);return j({assess:(t,i)=>n.gen(function*(){if(!Qe(i,e.scripts))return{applicable:!1,warnings:[]};let n=yield*r(t);return{actions:[...Xe(i,e,e.purpose),...Ze(n,{configFile:e.configFiles.config,migrationId:e.migrationId,toolName:e.name})],applicable:!0,warnings:n.warnings}}),config:e.configFiles.config,create:t=>n.gen(function*(){let n=yield*b.Path;yield*N(n.join(t,e.configFiles.config),e.configContent())}),detect:r,files:t,kind:`tooling`,name:e.name,version:e.version})}function tt(e={}){let t=Object.entries(e).map(([e,t])=>e===`rules`&&I(t)?[` rules: {`,` ...analyze.rules,`,...Object.entries(t).map(([e,t])=>` ${e}: ${Ie(t,{continuationIndent:` `,indentation:` `})},`),` },`].join(`
6
- `):` ${e}: ${Ie(t)},`);return t.length===0?[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = analyze`,``,`export default config`,``].join(`
1
+ import*as e from"@effect/platform-node/NodeRuntime";import*as t from"@effect/platform-node/NodeServices";import*as n from"effect/Effect";import*as r from"effect/Exit";import*as i from"effect/Layer";import*as a from"effect/Runtime";import*as o from"effect/Stdio";import*as s from"effect/unstable/process/ChildProcessSpawner";import*as c from"effect/Array";import*as l from"effect/unstable/cli/Command";import*as u from"effect/unstable/cli/Flag";import*as d from"effect/Context";import*as f from"effect/unstable/process/ChildProcess";import{stripVTControlCharacters as p}from"node:util";import*as m from"effect/Data";import{pipe as h}from"effect/Function";import*as g from"effect/Option";import*as _ from"effect/Predicate";import*as v from"effect/String";import{parse as ee,printParseErrorCode as y}from"jsonc-parser";import*as b from"effect/FileSystem";import*as x from"effect/Path";import S from"node:process";import*as te from"effect/Record";import*as C from"effect/Result";import{defu as ne}from"defu";import{Visitor as re,parseSync as ie}from"oxc-parser";import*as w from"effect/unstable/cli/Argument";import*as ae from"effect/Order";import{print as oe}from"esrap";import se from"esrap/languages/ts";import{addDevDependency as ce,detectPackageManager as le,runScriptCommand as ue}from"nypm";import*as T from"effect/Schema";import*as E from"@clack/prompts";import*as de from"effect/Console";import*as fe from"effect/Terminal";function pe(e){return _.isError(e)?h(p(e.message),v.split(/\r\n|[\r\n]/),c.map(e=>v.trimEnd(e)),c.filter(e=>v.isNonEmpty(e))):[]}function D(e){return h(pe(e),c.head,g.map(e=>{let t=v.trim(e);return/[.!?]$/.test(t)?` Cause: ${t}`:` Cause: ${t}.`}),g.getOrElse(()=>``))}function me(e){let t=pe(e);if(!c.isReadonlyArrayNonEmpty(t))return``;let n=c.takeRight(t,20);return`\n${(n.length<t.length?[`…`,...n]:n).join(`
2
+ `)}`}function he(e=[]){return e.length===0?`- Unknown JSON/JSONC parsing error`:e.slice(0,3).map(e=>`- ${y(e.error)} (offset: ${e.offset})`).join(`
3
+ `)}var ge=class extends m.TaggedError(`CliNotFound`){get message(){return`Command \`${this.command}\` not found. Please install it and try again.`}},O=class extends m.TaggedError(`CommandFailed`){get message(){return`Command \`${this.command}\` failed with exit code ${this.exitCode}.`}},_e=class extends m.TaggedError(`FailedToCreateDirectory`){get message(){return`Failed to create directory ${this.path?`\`${this.path}\``:`the target directory`}.${D(this.cause)}`}},ve=class extends m.TaggedError(`FailedToInstallDependency`){get message(){return`Failed to install dependencies${this.packages?.length?`: ${this.packages.join(`, `)}`:``}.${me(this.cause)}`}},ye=class extends m.TaggedError(`FailedToInstallExtension`){get message(){let e=this.extension?`\`${this.extension}\``:`the target extension`;return _.isNumber(this.cause)?`Failed to install ${e}. The \`code\` CLI exited with code ${this.cause}.`:`Failed to install ${e}.${D(this.cause)}`}},be=class extends m.TaggedError(`FailedToMergeConfig`){get message(){return`Failed to merge configuration.${D(this.cause)}`}},xe=class extends m.TaggedError(`FailedToParseFile`){get message(){return[`Failed to parse ${this.path?`\`${this.path}\``:`the target file`}.`,`Please fix the JSON/JSONC syntax and run the command again.`,``,`Parse details:`,he(this.errors)].join(`
4
+ `)}},Se=class extends m.TaggedError(`FailedToReadFile`){get message(){return`Failed to read ${this.path?`\`${this.path}\``:`the target file`}.${D(this.cause)}`}},Ce=class extends m.TaggedError(`FailedToWriteFile`){get message(){return`Failed to write ${this.path?`\`${this.path}\``:`the target file`}.${D(this.cause)}`}},we=class extends m.TaggedError(`FileNotFound`){get message(){return this.path?`File not found: \`${this.path}\`.`:`File not found.`}},Te=class extends m.TaggedError(`InvalidConfigFormat`){get message(){return`Invalid config format in ${this.path?`\`${this.path}\``:`the target config file`}. The config must be a JSON object (for example: {}).`}},k=class extends m.TaggedError(`InvalidInitOptions`){get message(){return`Invalid init options. ${this.reason}`}},Ee=class extends m.TaggedError(`UnsupportedConfigState`){get message(){return`Unsupported config state in ${this.path?`\`${this.path}\``:`the target config file`}.${this.reason?` ${this.reason}`:``}`}},De=class extends m.TaggedError(`NoPackageManager`){get message(){return`No package manager detected. Please run this command from a project with a lockfile.${D(this.cause)}`}};m.TaggedError(`MissingPackageVersion`);var Oe=class extends m.TaggedError(`OperationCancelled`){get message(){return`Operation cancelled.${this.reason?` Reason: ${this.reason}`:``}`}},ke=class extends m.TaggedError(`PassthroughNotSupported`){get message(){return`Command \`adamantite ${this.command}\` does not invoke a single underlying CLI and cannot accept passthrough arguments.`}},Ae=class extends m.TaggedError(`VscodeCliNotFound`){get message(){return`VS Code CLI (\`code\`) not found. Please install it to manage extensions.${D(this.cause)}`}},A=class extends d.Service()(`CommandRunner`){static layer=i.succeed(this)({run:n.fn(`CommandRunner.run`)(function*({args:e,command:t,cwd:r,detached:i,stderr:a=`inherit`,stdin:o=`ignore`,stdout:s=`inherit`}){return yield*n.scoped(n.gen(function*(){return yield*(yield*f.make(t,e,{cwd:r,detached:i,stderr:a,stdin:o,stdout:s})).exitCode})).pipe(n.mapError(e=>e.reason._tag===`NotFound`?new ge({command:t}):e))})})};const j=d.Reference(`adamantite/ForwardedArguments`,{defaultValue:()=>[]});function M(e){return e}const je=e=>b.FileSystem.pipe(n.flatMap(t=>t.makeDirectory(e,{recursive:!0})),n.mapError(t=>new _e({cause:t,path:e}))),N=e=>b.FileSystem.pipe(n.flatMap(t=>t.readFileString(e)),n.mapError(t=>new Se({cause:t,path:e}))),P=e=>b.FileSystem.pipe(n.flatMap(t=>t.readFileString(e)),n.map(e=>h(e,g.some)),n.catch(t=>t.reason._tag===`NotFound`?n.succeedNone:n.fail(new Se({cause:t,path:e})))),F=(e,t)=>b.FileSystem.pipe(n.flatMap(n=>n.writeFileString(e,t)),n.mapError(t=>new Ce({cause:t,path:e}))),I=(e,t)=>F(e,`${JSON.stringify(t,null,2)}\n`),L=(e,t)=>n.suspend(()=>{let r=[],i=ee(e,r,{allowTrailingComma:!0});return r.length>0?n.fail(new xe({errors:r,path:t})):n.succeed(i)}),R=e=>_.isObject(e),Me=e=>Array.isArray(e);function Ne(e){return e===`__proto__`?`["__proto__"]`:/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function Pe(e,t={}){let{continuationIndent:n,indentation:r=2}=t,i=JSON.stringify(e,null,r).replaceAll(/(?<!\\)"__proto__":/g,`["__proto__"]:`).replaceAll(/(?<!\\)"([A-Za-z_$][\w$]*)":/g,`$1:`);return n?i.replaceAll(`
5
+ `,`\n${n}`):i}const Fe=(e,t)=>n.try({catch:e=>new be({cause:e}),try:()=>ne(e,t)}),Ie=/^workspace:/,Le=/^[\^~]/;function Re(e){return e.trim().replace(Ie,``).replace(Le,``)}const z=(e=S.cwd())=>n.gen(function*(){let t=(yield*x.Path).join(e,`package.json`),n=yield*N(t);return yield*L(n,t)}),ze=(e,t)=>n.gen(function*(){let n=yield*x.Path;yield*I(n.join(e,`package.json`),t)});function Be(e){return e===`bun`||e===`deno`||e===`npm`||e===`pnpm`||e===`yarn`}const B={analyze:`adamantite analyze`,check:`adamantite check`,"check:monorepo":`adamantite monorepo`,fix:`adamantite fix`,"fix:monorepo":`adamantite monorepo --fix`,format:`adamantite format`};function Ve(e){let t=e.scripts??{};return h(te.keys(B),c.filter(e=>t[e]===B[e]))}function He(e,t){let n=e.scripts??{};return c.filterMap(t,e=>{let t=n[e];return t!==void 0&&t!==``&&t!==B[e]?C.succeed({command:t,script:e}):C.failVoid})}function Ue(e){return e.endsWith(`.jsonc`)?`jsonc`:e.endsWith(`.json`)?`json`:`ts`}function We(e,t){return c.findFirst(e.legacyConfigs,e=>Ue(e)===t)}function Ge(e){let t=We(e,`json`),n=We(e,`jsonc`);return h(g.zipWith(t,n,e=>`${e}(c)`),g.orElse(()=>n),g.orElse(()=>t),g.getOrElse(()=>``))}function Ke(e,t,n,r){return n===null||r.length===0?[]:n.format===`ts`?[`Found both \`${t.config}\` and \`${Ge(t)}\`. Adamantite will use \`${t.config}\`.`]:h(g.zipWith(We(t,`json`),We(t,`jsonc`),(t,n)=>`Found both \`${t}\` and \`${n}\`. Multiple legacy ${e} configs exist; Adamantite will treat \`${n}\` as the source of truth in its findings.`),g.toArray)}const qe=n.fn(`detectToolingConfig`)(function*(e,t,r){let i=yield*b.FileSystem,a=yield*x.Path,o=[r.config,...r.legacyConfigs].map(t=>({file:t,format:Ue(t),path:a.join(e,t)})),s=yield*n.forEach(o,e=>i.exists(e.path),{concurrency:`unbounded`}),l=o.filter((e,t)=>s[t]),u=h(c.findFirst(l,e=>e.format===`ts`),g.orElse(()=>c.findFirst(l,e=>e.format===`jsonc`)),g.orElse(()=>c.findFirst(l,e=>e.format===`json`)),g.getOrNull),d=l.filter(e=>e!==u&&e.format!==`ts`);return{active:u,legacy:d,warnings:Ke(t,r,u,d)}});function Je(e,t,n){let r=e.devDependencies?.[t.name]??e.dependencies?.[t.name];return r?Re(r)===t.version?[]:[{currentVersion:r,description:`Update \`${t.name}\` from \`${r}\` to \`${t.version}\`.`,package:t.name,targetVersion:t.version,type:`update_package`}]:[{description:`Install \`${t.name}@${t.version}\` for ${n}.`,package:t.name,targetVersion:t.version,type:`install_package`}]}function Ye(e,t){return e.map(e=>({currentState:e.type===`install_package`?`The required package \`${e.package}\` is not installed.`:`The installed \`${e.package}\` version is \`${e.currentVersion}\`, but Adamantite requires \`${e.targetVersion}\`.`,goal:[`Run \`adamantite update\` so \`${e.package}@${e.targetVersion}\` is installed.`],id:`${e.type===`install_package`?`missing`:`outdated`}-${e.package}`,integration:t,title:e.type===`install_package`?`Missing ${e.package}`:`Outdated ${e.package}`}))}function Xe(e,t){if(e.active===null)return[{currentState:`The managed \`${t.configFile}\` file is missing.`,goal:[`Create \`${t.configFile}\` with the reference content.`,`Do not create a legacy JSON or JSONC ${t.toolName} config.`],id:`missing-${t.toolName}-config`,integration:t.toolName,reference:{content:t.configContent,language:`ts`},title:`Missing ${t.toolName} configuration`}];if(e.active.format!==`ts`)return[{currentState:`Legacy \`${e.active.file}\` is the active ${t.toolName} configuration.`,goal:[`Port the project settings into \`${t.configFile}\` using the reference content as the base.`,`Delete every legacy ${t.toolName} JSON or JSONC config after its settings are preserved.`],id:`legacy-${t.toolName}-config`,integration:t.toolName,notes:[`Preserve project-specific settings. Do not replace them with the reference defaults.`],reference:{content:t.configContent,language:`ts`},title:`Legacy ${t.toolName} configuration`}];let n=[];return e.legacy.length>0&&n.push({currentState:`Legacy ${t.toolName} config files remain next to \`${t.configFile}\`: ${e.legacy.map(({file:e})=>`\`${e}\``).join(`, `)}.`,goal:[`Delete the legacy files after you confirm that \`${t.configFile}\` preserves their project-specific settings.`],id:`shadowed-legacy-${t.toolName}-config`,integration:t.toolName,title:`Legacy ${t.toolName} files remain`}),t.inspection?.kind===`invalid`&&n.push({currentState:`\`${t.configFile}\` does not meet Adamantite's required shape. ${t.inspection.reason}`,goal:[t.invalidGoal??`Update \`${t.configFile}\` so it includes the required Adamantite preset while preserving project-specific settings.`],id:`invalid-${t.toolName}-config`,integration:t.toolName,notes:[`Treat the reference as a known-good example, not an exact replacement.`],reference:{content:t.configContent,language:`ts`},title:`Invalid ${t.toolName} configuration`}),n}function Ze(e,t){let n=Ve(e);return t.some(e=>n.includes(e))}function Qe(e){return M({assess:(t,r)=>n.sync(()=>{if(!Ze(r,e.scripts))return{applicable:!1,warnings:[]};let t=Je(r,e,e.purpose);return{applicable:!0,findings:Ye(t,e.name),packageActions:t,warnings:[]}}),kind:`tooling`,name:e.name,version:e.version})}function $e(e){let t=[{path:e.configFiles.config,type:`config`},...e.configFiles.legacyConfigs.map(e=>({path:e,type:`legacy_config`}))],r=t=>qe(t,e.name,e.configFiles);return M({assess:(t,i)=>n.gen(function*(){if(!Ze(i,e.scripts))return{applicable:!1,warnings:[]};let n=yield*r(t),a=Je(i,e,e.purpose),o=e.configContent(),s=n.active?.format===`ts`?e.inspectConfig(yield*N(n.active.path)):void 0;return{applicable:!0,findings:[...Ye(a,e.name),...Xe(n,{configContent:o,configFile:e.configFiles.config,inspection:s,toolName:e.name})],packageActions:a,warnings:n.warnings}}),config:e.configFiles.config,create:t=>n.gen(function*(){let n=yield*x.Path;yield*F(n.join(t,e.configFiles.config),e.configContent())}),detect:r,files:t,kind:`tooling`,name:e.name,version:e.version})}function et(e,t){for(let n of e.body)if(n.type===`ImportDeclaration`&&n.source.value===t){for(let e of n.specifiers)if(e.type===`ImportDefaultSpecifier`)return e.local.name}return null}function tt(e,t){for(let n of e.body)if(n.type===`VariableDeclaration`){for(let e of n.declarations)if(e.id.type===`Identifier`&&e.id.name===t)return e.init}return null}function nt(e,t,n){let r=!1;return new re({Identifier:e=>{e.start>=n.start&&e.end<=n.end&&e.name===t&&(r=!0)}}).visit(e),r}function rt(e,t){let n=e.body.filter(e=>e.type===`ExportDefaultDeclaration`);if(n.length!==1)return!1;let r=n[0]?.declaration;if(!r)return!1;if(r.type!==`Identifier`)return nt(e,t,r);if(r.name===t)return!0;let i=tt(e,r.name);return i!==null&&nt(e,t,i)}function it(e,t){let n=ie(`config.ts`,e,{astType:`ts`,lang:`ts`,sourceType:`module`});if(n.errors.length>0)return{kind:`invalid`,reason:`The file is not valid TypeScript.`};let r=et(n.program,t.moduleName);return r?rt(n.program,r)?{kind:`configured`}:{kind:`invalid`,reason:`The imported ${t.presetName} preset is not used by the exported configuration.`}:{kind:`invalid`,reason:`The file must import the ${t.presetName} preset from \`${t.moduleName}\`.`}}function at(e){return it(e,{moduleName:`adamantite/analyze`,presetName:`Adamantite analyze`})}function ot(e={}){let t=Object.entries(e).map(([e,t])=>e===`rules`&&R(t)?[` rules: {`,` ...analyze.rules,`,...Object.entries(t).map(([e,t])=>` ${Ne(e)}: ${Pe(t,{continuationIndent:` `,indentation:` `})},`),` },`].join(`
6
+ `):` ${Ne(e)}: ${Pe(t)},`);return t.length===0?[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = analyze`,``,`export default config`,``].join(`
7
7
  `):[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = {`,` ...analyze,`,...t,`}`,``,`export default config`,``].join(`
8
- `)}var z=et({configContent:()=>tt(),configFiles:{config:`knip.config.ts`,legacyConfigs:[`knip.json`,`knip.jsonc`]},migrationId:`legacy-knip-json`,name:`knip`,purpose:"the managed `analyze` script",scripts:[`analyze`],version:`6.32.2`});const nt=u.boolean(`fix`).pipe(u.withDescription(`Automatically fix issues`)),rt=u.boolean(`strict`).pipe(u.withDescription(`Enable strict mode`));var it=l.make(`analyze`,{fix:nt,strict:rt}).pipe(l.withDescription(`Find unused dependencies, exports, and files using knip`),l.withExamples([{command:`adamantite analyze -- --directory packages/app`,description:`Run knip from a specific directory`}]),l.withHandler(({fix:e,strict:t})=>n.gen(function*(){let n=yield*A,r=yield*k,i=[];e&&i.push(`--fix`,`--allow-remove-files`),t&&i.push(`--production`,`--strict`),i.push(...n);let a=yield*r.run({args:i,command:z.name});a!==s.ExitCode(0)&&(yield*new E({command:z.name,exitCode:a}))})));const at=`**/node_modules,**/.yarn,**/.git,**/dist,**/build,**/out,**/.next,**/.open-next,**/.nuxt,**/.output,**/.svelte-kit,**/.vitepress/cache,**/.turbo,**/.vercel,**/.netlify,**/.wrangler,**/.docusaurus,**/.cache,**/.parcel-cache,**/.vite,**/.astro,**/_astro,**/storybook-static,**/_generated,**/__generated__,**/*.gen.*,**/*.generated.*,**/generated,**/codegen,**/graphql-types.*,**/*.d.ts.map,**/coverage,**/.nyc_output,**/.expo,**/.expo-shared,**/next-env.d.ts,**/worker-configuration.d.ts`.split(`,`),ot=[`respectEslintDisableDirectives`,`typeAware`,`typeCheck`],st="`oxlint.config.ts` must export an object literal directly, with or without `defineConfig(...)`, for Adamantite to patch `options` safely.",ct="`oxlint.config.ts` has an `options` property, but it is not an object literal that Adamantite can patch safely.",lt="`oxlint.config.ts` has an `options` object Adamantite cannot patch safely. Make sure each required option is a plain `key: true | false` property—avoid spreads (`...rest`), computed keys (`[name]: ...`), duplicate keys, methods/getters/setters, and non-boolean-literal values.";function ut(e=[]){return e.includes(`core`)?e:[`core`,...e]}function dt(e){return e.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase())}function ft(e){let t=(c.isArray(e)?e:[]).filter(e=>g.isString(e)).filter(e=>!at.includes(e));return t.length===0?`core.ignorePatterns`:`[...core.ignorePatterns, ${t.map(e=>JSON.stringify(e)).join(`, `)}]`}function pt(e,t,n=[]){let{ignorePatterns:r,options:i,...a}=e,o=[`import { defineConfig } from "oxlint"`,...t.map(e=>`import ${dt(e)} from "${e===`core`?`adamantite/lint`:`adamantite/lint/${e}`}"`)],s=[...t.map(e=>dt(e)),...n.map(e=>JSON.stringify(e))],c=JSON.stringify(g.isObject(i)?{...i,respectEslintDisableDirectives:!0,typeAware:!0,typeCheck:!0}:{respectEslintDisableDirectives:!0,typeAware:!0,typeCheck:!0},null,2),l=Object.entries(a).map(([e,t])=>[e,JSON.stringify(t,null,2)]),u=`[${s.join(`, `)}]`,d=[[`options`,c],[`ignorePatterns`,ft(r)],...l,[`extends`,u]].map(([e,t])=>` ${e}: ${t},`).join(`
9
- `);return[...o,``,`export default defineConfig({`,d,`})`,``].join(`
10
- `)}const mt=h.liftThrowable(e=>se(`oxlint.config.ts`,e,{astType:`ts`,lang:`ts`,sourceType:`module`}));function ht(e){return mt(e).pipe(h.flatMap(e=>e.errors.length===0?h.fromNullishOr(e.program):h.none()))}function gt(e){let{code:t}=ae(e,oe({quotes:`double`}));return t.endsWith(`
11
- `)?t:`${t}\n`}function _t(e){return e.type===`Identifier`?m(e.name,h.some):e.type===`Literal`&&g.isString(e.value)?m(e.value,h.some):h.none()}function vt(e){return e.type===`ObjectExpression`?m(e,h.some):e.type!==`CallExpression`||e.callee.type!==`Identifier`||e.callee.name!==`defineConfig`?h.none():m(e.arguments.length===1?c.head(e.arguments):h.none(),h.filter(e=>e.type===`ObjectExpression`))}function yt(e){return m(e.body,c.filter(e=>e.type===`ExportDefaultDeclaration`),e=>e.length===1?c.head(e):h.none(),h.flatMap(e=>vt(e.declaration)))}function bt(e,t){let n=null;for(let r of e.properties){if(r.type===`SpreadElement`||r.computed)return{status:`manual`};let e=h.contains(_t(r.key),t);if(r.method||r.kind!==`init`){if(e)return{status:`manual`};continue}if(e){if(n)return{status:`manual`};n=r}}return n?{property:n,status:`found`}:{status:`missing`}}function xt(e){return{computed:!1,end:0,key:{end:0,name:e,start:0,type:`Identifier`},kind:`init`,method:!1,shorthand:!1,start:0,type:`Property`,value:{end:0,raw:`true`,start:0,type:`Literal`,value:!0}}}function St(){return{computed:!1,end:0,key:{end:0,name:`options`,start:0,type:`Identifier`},kind:`init`,method:!1,shorthand:!1,start:0,type:`Property`,value:{end:0,properties:ot.map(e=>xt(e)),start:0,type:`ObjectExpression`}}}function Ct(e,t){let n=[],r=!1;for(let e of ot){let i=bt(t,e);if(i.status===`manual`)return{kind:`manual`,reason:lt};if(i.status===`missing`){n.push(e);continue}let a=i.property.value;if(a.type!==`Literal`||!g.isBoolean(a.value))return{kind:`manual`,reason:lt};a.value||(a.raw=`true`,a.value=!0,r=!0)}return n.length>0&&(t.properties.unshift(...n.map(e=>xt(e))),r=!0),r?{kind:`patchable`,updatedContent:gt(e)}:{kind:`configured`}}function wt(e){let t=ht(e);if(h.isNone(t))return{kind:`manual`,reason:st};let n=yt(t.value);if(h.isNone(n))return{kind:`manual`,reason:st};let r=bt(n.value,`options`);return r.status===`manual`?{kind:`manual`,reason:ct}:r.status===`missing`?(n.value.properties.unshift(St()),{kind:`patchable`,updatedContent:gt(t.value)}):r.property.value.type===`ObjectExpression`?Ct(t.value,r.property.value):{kind:`manual`,reason:ct}}const B=`oxlint.config.ts`,Tt=`.oxlintrc.json`,Et=[{path:B,type:`config`},{path:Tt,type:`legacy_config`}],Dt={config:B,legacyConfigs:[Tt]},Ot=`1.79.0`,kt=e=>Ye(e,`oxlint`,Dt);var V=j({assess:(e,t)=>n.gen(function*(){let n=Ue(t);if(!n.includes(`check`)&&!n.includes(`fix`))return{applicable:!1,warnings:[]};let r=yield*kt(e),i=[...Xe(t,{name:`oxlint`,version:Ot},`the managed lint scripts`),...Ze(r,{configFile:B,migrationId:`legacy-oxlint-json`,toolName:`oxlint`})],a=r.active;if(a?.format===`ts`){let e=wt(yield*M(a.path));e.kind===`patchable`&&i.push({description:"Update `oxlint.config.ts` with Adamantite's required options.",path:B,type:`update_config`}),e.kind===`manual`&&i.push({description:"Manually update `oxlint.config.ts` with Adamantite's required options; Adamantite cannot patch the current file shape safely.",path:B,type:`manual_fix`})}return{actions:i,applicable:!0,warnings:r.warnings}}),config:B,create:(e,t=[])=>n.gen(function*(){let n=yield*b.Path,r=pt({},ut(t));yield*N(n.join(e,B),r)}),detect:kt,files:Et,kind:`tooling`,name:`oxlint`,update:e=>n.gen(function*(){let t=yield*y.FileSystem,n=(yield*b.Path).join(e,B);if(!(yield*t.exists(n)))return yield*new Te({path:B});let r=wt(yield*M(n));if(r.kind!==`configured`){if(r.kind===`manual`)return yield*new De({path:B,reason:r.reason});yield*N(n,r.updatedContent)}}),version:Ot});const At=S.file(`files`,{mustExist:!0}).pipe(S.withDescription(`Specific files to lint (optional)`),S.variadic());var jt=l.make(`check`,{files:At}).pipe(l.withDescription(`Find issues and type errors in code using oxlint`),l.withHandler(({files:e})=>n.gen(function*(){let t=yield*A,n=yield*(yield*k).run({args:[...e,...t],command:V.name});n!==s.ExitCode(0)&&(yield*new E({command:V.name,exitCode:n}))})));const Mt=new Set([`sortImports`,`sortPackageJson`,`sortTailwindcss`]);function Nt(e){let t=e.split(`
12
- `);return t.length===1?e.slice(1,-1).trim():t.slice(1,-1).map(e=>` ${e.trimStart()}`).join(`
13
- `)}function Pt(e,t){let n=Nt(Ie(t));return[` ${e}: {`,` ...format.${e},`,...n===``?[]:[n],` },`].join(`
14
- `)}function Ft(e={}){let t=Object.entries(e).map(([e,t])=>Mt.has(e)&&I(t)?Pt(e,t):` ${e}: ${Ie(t,{continuationIndent:` `})},`);return t.length===0?[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig(format)`,``].join(`
15
- `):[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig({`,` ...format,`,...t,`})`,``].join(`
16
- `)}var H=et({configContent:()=>Ft(),configFiles:{config:`oxfmt.config.ts`,legacyConfigs:[`.oxfmtrc.json`,`.oxfmtrc.jsonc`]},migrationId:`legacy-oxfmt-json`,name:`oxfmt`,purpose:"the managed `format` script",scripts:[`format`],version:`0.63.0`}),U=$e({name:`sherif`,purpose:`the managed monorepo scripts`,scripts:[`check:monorepo`,`fix:monorepo`],version:`1.13.0`}),W=$e({name:`oxlint-tsgolint`,purpose:`the managed lint scripts`,scripts:[`check`,`fix`],version:`7.0.2001`});function It(e){return e}const Lt=n.fn(`runMigration`)(function*(e,t){let r=yield*b.Path,i=e.files??[],a=yield*n.forEach(i,e=>{let i=r.join(t.cwd,e);return Ne(i).pipe(n.map(e=>[i,e]))},{concurrency:`unbounded`});return yield*e.migrate(t).pipe(n.tap(()=>e.validate?.(t)??n.void),n.onError(()=>n.forEach(([e,t])=>h.match(t,{onNone:()=>Pe(e).pipe(n.ignore),onSome:t=>N(e,t).pipe(n.ignore)}))(a)))}),Rt=[{name:`check`,script:`check`},{args:[`--check`],name:`format`,script:`format`},{name:`monorepo`,script:`check:monorepo`},{name:`analyze`,script:`analyze`}];function zt(e,t){let n=[];for(let r of Rt)t.includes(r.script)&&n.push({command:ue(e,r.script,{args:r.args}),name:r.name});return n}function Bt(e){return Rt.some(t=>e.includes(t.script))}function Vt(e){return{_tag:`File`,path:e}}function Ht(e){return{_tag:`Version`,value:e}}const Ut=[`.node-version`,`.nvmrc`],Wt=C.Struct({volta:C.Struct({node:C.NonEmptyString})}),Gt=C.Struct({engines:C.Struct({node:C.NonEmptyString})}),Kt=C.Struct({name:C.NonEmptyString,version:C.NonEmptyString});function qt(e){return e.split(`
17
- `).map(e=>e.split(`#`)[0]?.trim()??``).some(e=>/^node(?:js)?\s+\S/.test(e))}function Jt(e){return C.is(Kt)(e)&&e.name.toLowerCase()===`node`}function Yt(e){if(C.is(Wt)(e))return!0;if(g.isObject(e)&&g.isObject(e.devEngines)){let t=e.devEngines.runtime;if((Array.isArray(t)?t:[t]).some(e=>Jt(e)))return!0}return C.is(Gt)(e)}var Xt=class extends d.Service()(`NodeVersionResolver`){static layer=i.effect(this,n.gen(function*(){let e=yield*y.FileSystem,t=yield*b.Path,r=(r,i)=>Ne(t.join(r,i)).pipe(n.provideService(y.FileSystem,e));return{resolve:n.fn(`NodeVersionResolver.resolve`)(function*(e){for(let t of Ut){let n=yield*r(e,t);if(h.exists(n,e=>_.isNonEmpty(e.trim())))return Vt(t)}let n=yield*r(e,`.tool-versions`);if(h.exists(n,e=>qt(e)))return Vt(`.tool-versions`);let i=yield*r(e,`package.json`);return h.isSome(i)&&Yt(yield*F(i.value,t.join(e,`package.json`)))?Vt(`package.json`):Ht(`lts/*`)})}}))};function Zt(e){return` - name: Setup Node.js
8
+ `)}var V=$e({configContent:()=>ot(),configFiles:{config:`knip.config.ts`,legacyConfigs:[`knip.json`,`knip.jsonc`]},inspectConfig:at,name:`knip`,purpose:"the managed `analyze` script",scripts:[`analyze`],version:`6.32.2`});const st=u.boolean(`fix`).pipe(u.withDefault(!1),u.withDescription(`Automatically fix issues`)),ct=u.boolean(`strict`).pipe(u.withDefault(!1),u.withDescription(`Enable strict mode`));var lt=l.make(`analyze`,{fix:st,strict:ct}).pipe(l.withDescription(`Find unused dependencies, exports, and files using knip`),l.withExamples([{command:`adamantite analyze -- --directory packages/app`,description:`Run knip from a specific directory`}]),l.withHandler(({fix:e,strict:t})=>n.gen(function*(){let n=yield*j,r=yield*A,i=[];e&&i.push(`--fix`,`--allow-remove-files`),t&&i.push(`--production`,`--strict`),i.push(...n);let a=yield*r.run({args:i,command:V.name});a!==s.ExitCode(0)&&(yield*new O({command:V.name,exitCode:a}))})));const ut=`**/node_modules,**/.yarn,**/.git,**/dist,**/build,**/out,**/.next,**/.open-next,**/.nuxt,**/.output,**/.svelte-kit,**/.vitepress/cache,**/.turbo,**/.vercel,**/.netlify,**/.wrangler,**/.docusaurus,**/.cache,**/.parcel-cache,**/.vite,**/.astro,**/_astro,**/storybook-static,**/_generated,**/__generated__,**/*.gen.*,**/*.generated.*,**/generated,**/codegen,**/graphql-types.*,**/*.d.ts.map,**/coverage,**/.nyc_output,**/.expo,**/.expo-shared,**/next-env.d.ts,**/worker-configuration.d.ts`.split(`,`),dt=[`respectEslintDisableDirectives`,`typeAware`,`typeCheck`],ft="`oxlint.config.ts` must export an object literal directly, with or without `defineConfig(...)`, for Adamantite to patch `options` safely.",pt="`oxlint.config.ts` has an `options` property, but it is not an object literal that Adamantite can patch safely.",mt="`oxlint.config.ts` has an `options` object Adamantite cannot patch safely. Make sure each required option is a plain `key: true | false` property—avoid spreads (`...rest`), computed keys (`[name]: ...`), duplicate keys, methods/getters/setters, and non-boolean-literal values.";function ht(e=[]){return e.includes(`core`)?e:[`core`,...e]}function gt(e){return e.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase())}const _t=ae.mapInput(ae.String,e=>e[0]);function vt(e){let t=(c.isArray(e)?e:[]).filter(e=>_.isString(e)).filter(e=>!ut.includes(e));return t.length===0?`core.ignorePatterns`:`[...core.ignorePatterns, ${t.map(e=>JSON.stringify(e)).join(`, `)}]`}function yt(e,t,n=[]){let{ignorePatterns:r,options:i,...a}=e,o=[`import { defineConfig } from "oxlint"`,...t.map(e=>`import ${gt(e)} from "${e===`core`?`adamantite/lint`:`adamantite/lint/${e}`}"`)],s=[...t.map(e=>gt(e)),...n.map(e=>JSON.stringify(e))],l=_.isObject(i)?{...i}:{};l.respectEslintDisableDirectives=!0,l.typeAware=!0,l.typeCheck=!0;let u=JSON.stringify(Object.fromEntries(c.sort(Object.entries(l),_t)),null,2),d=Object.entries(a).map(([e,t])=>[e,JSON.stringify(t,null,2)]),f=[[`extends`,`[${s.join(`, `)}]`],[`ignorePatterns`,vt(r)],[`options`,u],...d],p=c.sort(f,_t).map(([e,t])=>` ${e}: ${t},`).join(`
9
+ `);return[...o,``,`export default defineConfig({`,p,`})`,``].join(`
10
+ `)}const bt=g.liftThrowable(e=>ie(`oxlint.config.ts`,e,{astType:`ts`,lang:`ts`,sourceType:`module`}));function xt(e){return bt(e).pipe(g.flatMap(e=>e.errors.length===0?g.fromNullishOr(e.program):g.none()))}function St(e){let{code:t}=oe(e,se({quotes:`double`}));return t.endsWith(`
11
+ `)?t:`${t}\n`}function Ct(e){return e.type===`Identifier`?h(e.name,g.some):e.type===`Literal`&&_.isString(e.value)?h(e.value,g.some):g.none()}function wt(e){return e.type===`ObjectExpression`?h(e,g.some):e.type!==`CallExpression`||e.callee.type!==`Identifier`||e.callee.name!==`defineConfig`?g.none():h(e.arguments.length===1?c.head(e.arguments):g.none(),g.filter(e=>e.type===`ObjectExpression`))}function Tt(e){return h(e.body,c.filter(e=>e.type===`ExportDefaultDeclaration`),e=>e.length===1?c.head(e):g.none(),g.flatMap(e=>wt(e.declaration)))}function Et(e,t){let n=null;for(let r of e.properties){if(r.type===`SpreadElement`||r.computed)return{status:`manual`};let e=g.contains(Ct(r.key),t);if(r.method||r.kind!==`init`){if(e)return{status:`manual`};continue}if(e){if(n)return{status:`manual`};n=r}}return n?{property:n,status:`found`}:{status:`missing`}}function Dt(e){return{computed:!1,end:0,key:{end:0,name:e,start:0,type:`Identifier`},kind:`init`,method:!1,shorthand:!1,start:0,type:`Property`,value:{end:0,raw:`true`,start:0,type:`Literal`,value:!0}}}function Ot(){return{computed:!1,end:0,key:{end:0,name:`options`,start:0,type:`Identifier`},kind:`init`,method:!1,shorthand:!1,start:0,type:`Property`,value:{end:0,properties:dt.map(e=>Dt(e)),start:0,type:`ObjectExpression`}}}function kt(e,t){let n=[],r=!1;for(let e of dt){let i=Et(t,e);if(i.status===`manual`)return{kind:`manual`,reason:mt};if(i.status===`missing`){n.push(e);continue}let a=i.property.value;if(a.type!==`Literal`||!_.isBoolean(a.value))return{kind:`manual`,reason:mt};a.value||(a.raw=`true`,a.value=!0,r=!0)}return n.length>0&&(t.properties.unshift(...n.map(e=>Dt(e))),r=!0),r?{kind:`patchable`,updatedContent:St(e)}:{kind:`configured`}}function At(e){let t=xt(e);if(g.isNone(t))return{kind:`manual`,reason:ft};let n=Tt(t.value);if(g.isNone(n))return{kind:`manual`,reason:ft};let r=Et(n.value,`options`);return r.status===`manual`?{kind:`manual`,reason:pt}:r.status===`missing`?(n.value.properties.unshift(Ot()),{kind:`patchable`,updatedContent:St(t.value)}):r.property.value.type===`ObjectExpression`?kt(t.value,r.property.value):{kind:`manual`,reason:pt}}const H=`oxlint.config.ts`,jt=`.oxlintrc.json`,Mt=[{path:H,type:`config`},{path:jt,type:`legacy_config`}],Nt={config:H,legacyConfigs:[jt]},Pt=`1.79.0`,Ft=e=>qe(e,`oxlint`,Nt);var U=M({assess:(e,t)=>n.gen(function*(){let n=Ve(t);if(!n.includes(`check`)&&!n.includes(`fix`))return{applicable:!1,warnings:[]};let r=yield*Ft(e),i=Je(t,{name:`oxlint`,version:Pt},`the managed lint scripts`),a=r.active,o;if(a?.format===`ts`){let e=At(yield*N(a.path));o=e.kind===`configured`?{kind:`configured`}:{kind:`invalid`,reason:e.kind===`manual`?e.reason:`The required Oxlint options are missing or set to false.`}}let s=yt({},ht());return{applicable:!0,findings:[...Ye(i,`oxlint`),...Xe(r,{configContent:s,configFile:H,inspection:o,invalidGoal:"Set `respectEslintDisableDirectives`, `typeAware`, and `typeCheck` to `true` in the `options` object. Preserve every other project setting.",toolName:`oxlint`})],packageActions:i,warnings:r.warnings}}),config:H,create:(e,t=[])=>n.gen(function*(){let n=yield*x.Path,r=yt({},ht(t));yield*F(n.join(e,H),r)}),detect:Ft,files:Mt,kind:`tooling`,name:`oxlint`,update:e=>n.gen(function*(){let t=yield*b.FileSystem,n=(yield*x.Path).join(e,H);if(!(yield*t.exists(n)))return yield*new we({path:H});let r=At(yield*N(n));if(r.kind!==`configured`){if(r.kind===`manual`)return yield*new Ee({path:H,reason:r.reason});yield*F(n,r.updatedContent)}}),version:Pt});const It=w.file(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to lint (optional)`),w.variadic());var Lt=l.make(`check`,{files:It}).pipe(l.withDescription(`Find issues and type errors in code using oxlint`),l.withHandler(({files:e})=>n.gen(function*(){let t=yield*j,n=yield*(yield*A).run({args:[...e,...t],command:U.name});n!==s.ExitCode(0)&&(yield*new O({command:U.name,exitCode:n}))})));const Rt=[{command:`claude`,name:`Claude Code`,seedArguments:e=>[e]},{command:`codex`,name:`Codex`,seedArguments:e=>[e]},{command:`cursor-agent`,name:`Cursor`,seedArguments:e=>[e]},{command:`gemini`,name:`Gemini CLI`,seedArguments:e=>[`-i`,e]},{command:`grok`,name:`Grok Build`,probeArguments:[`version`],seedArguments:e=>[e]},{command:`opencode`,name:`OpenCode`,seedArguments:e=>[`--prompt`,e]}],zt=e=>n.gen(function*(){let t=yield*A;return(yield*n.forEach(Rt,r=>t.run({args:[...r.probeArguments??[`--version`]],command:r.command,cwd:e,stderr:`ignore`,stdout:`ignore`}).pipe(n.timeout(`10 seconds`),n.as(r),n.catch(()=>n.succeed(null))),{concurrency:Rt.length})).filter(e=>e!==null)});var Bt=class extends m.TaggedError(`AgentSessionFailed`){};const Vt=()=>{},Ht=e=>n.acquireUseRelease(n.sync(()=>{let e=S.listeners(`SIGINT`);return S.removeAllListeners(`SIGINT`),S.on(`SIGINT`,Vt),e}),()=>e,e=>n.sync(()=>{S.removeAllListeners(`SIGINT`);for(let t of e)S.on(`SIGINT`,t)})),Ut=({agent:e,cwd:t})=>n.gen(function*(){let n=yield*A;yield*Ht(n.run({args:e.seedArguments("Run `adamantite doctor` — through your package runner, such as `npx` or `pnpm exec`, if it is not on PATH — and resolve every finding it reports. Rerun `adamantite doctor` until it exits 0."),command:e.command,cwd:t,detached:!1,stderr:`inherit`,stdin:`inherit`,stdout:`inherit`}))}).pipe(n.asVoid,n.mapError(e=>new Bt({cause:e,reason:e._tag===`CliNotFound`?`not-found`:`spawn-failed`}))),Wt=e=>n.gen(function*(){let t=yield*(yield*A).run({args:[`diff`,`--quiet`,`HEAD`],command:`git`,cwd:e,stderr:`ignore`,stdout:`ignore`});return t===s.ExitCode(0)?`clean`:t===s.ExitCode(1)?`dirty`:`unknown`}).pipe(n.catch(()=>n.succeed(`unknown`))),Gt=[{name:`check`,script:`check`},{args:[`--check`],name:`format`,script:`format`},{name:`monorepo`,script:`check:monorepo`},{name:`analyze`,script:`analyze`}];function Kt(e,t){let n=[];for(let r of Gt)t.includes(r.script)&&n.push({command:ue(e,r.script,{args:r.args}),name:r.name});return n}function qt(e){return Gt.some(t=>e.includes(t.script))}var W=class extends d.Service()(`DependencyInstaller`){static layer=i.succeed(this)({addDevDependencies:n.fn(`DependencyInstaller.addDevDependencies`)((e,t,r)=>n.tryPromise({catch:t=>new ve({cause:t,packages:e}),try:()=>ce(e,{...r,cwd:t})}).pipe(n.asVoid)),detectPackageManager:n.fn(`DependencyInstaller.detectPackageManager`)(e=>n.tryPromise({catch:e=>new De({cause:e}),try:()=>le(e)}).pipe(n.map(e=>e??null)))})};function Jt(e){return{_tag:`File`,path:e}}function Yt(e){return{_tag:`Version`,value:e}}const Xt=[`.node-version`,`.nvmrc`],Zt=T.Struct({volta:T.Struct({node:T.NonEmptyString})}),Qt=T.Struct({engines:T.Struct({node:T.NonEmptyString})}),$t=T.Struct({name:T.NonEmptyString,version:T.NonEmptyString});function en(e){return e.split(`
12
+ `).map(e=>e.split(`#`)[0]?.trim()??``).some(e=>/^node(?:js)?\s+\S/.test(e))}function tn(e){return T.is($t)(e)&&e.name.toLowerCase()===`node`}function nn(e){if(T.is(Zt)(e))return!0;if(_.isObject(e)&&_.isObject(e.devEngines)){let t=e.devEngines.runtime;if((Array.isArray(t)?t:[t]).some(e=>tn(e)))return!0}return T.is(Qt)(e)}var rn=class extends d.Service()(`NodeVersionResolver`){static layer=i.effect(this,n.gen(function*(){let e=yield*b.FileSystem,t=yield*x.Path,r=(r,i)=>P(t.join(r,i)).pipe(n.provideService(b.FileSystem,e));return{resolve:n.fn(`NodeVersionResolver.resolve`)(function*(e){for(let t of Xt){let n=yield*r(e,t);if(g.exists(n,e=>v.isNonEmpty(e.trim())))return Jt(t)}let n=yield*r(e,`.tool-versions`);if(g.exists(n,e=>en(e)))return Jt(`.tool-versions`);let i=yield*r(e,`package.json`);return g.isSome(i)&&nn(yield*L(i.value,t.join(e,`package.json`)))?Jt(`package.json`):Yt(`lts/*`)})}}))};const an=/^\s*node-version:\s*"?\d/m,on=/^[>|](?:[1-9][+-]?|[+-][1-9]?)?(?:\s+#.*)?$/,sn=/\b(?:(?:bun|npm|pnpm|yarn)(?:\s+(?!run\b)\S+)*\s+run\s+check|deno(?:\s+(?!task\b)\S+)*\s+task\s+check)\b/,cn=/^(\s*)(?:-\s*)?(?:command|run):\s*(.*)$/;function ln(e){let t=e.split(`
13
+ `);for(let[e,n]of t.entries()){let r=cn.exec(n);if(!r)continue;let i=r[1]?.length??0,a=(r[2]??``).trim();if(sn.test(a))return!0;if(on.test(a))for(let n of t.slice(e+1)){let e=n.trim();if(e.length!==0){if(n.length-n.trimStart().length<=i)break;if(sn.test(e))return!0}}}return!1}function un(e){return` - name: Setup Node.js
18
14
  uses: actions/setup-node@v7
19
15
  with:
20
- ${e._tag===`File`?`node-version-file: "${e.path}"`:`node-version: "${e.value}"`}`}function Qt(e){return{bun:`${Zt(e)}
16
+ ${e._tag===`File`?`node-version-file: "${e.path}"`:`node-version: "${e.value}"`}`}function dn(e){return{bun:`${un(e)}
21
17
 
22
18
  - name: Setup Bun
23
19
  uses: oven-sh/setup-bun@v2
@@ -37,22 +33,22 @@ import*as e from"@effect/platform-node/NodeRuntime";import*as t from"@effect/pla
37
33
  uses: denoland/setup-deno@v2
38
34
 
39
35
  - name: Install dependencies
40
- run: deno install --frozen`,npm:`${Zt(e)}
36
+ run: deno install --frozen`,npm:`${un(e)}
41
37
  cache: "npm"
42
38
 
43
39
  - name: Install dependencies
44
40
  run: npm ci`,pnpm:` - name: Setup pnpm
45
41
  uses: pnpm/action-setup@v4
46
42
 
47
- ${Zt(e)}
43
+ ${un(e)}
48
44
  cache: "pnpm"
49
45
 
50
46
  - name: Install dependencies
51
- run: pnpm install --frozen-lockfile`,yarn:`${Zt(e)}
47
+ run: pnpm install --frozen-lockfile`,yarn:`${un(e)}
52
48
  cache: "yarn"
53
49
 
54
50
  - name: Install dependencies
55
- run: yarn install --frozen-lockfile`}}function $t({packageManager:e,scripts:t},n){let r=zt(e,t);return r.length===0?null:`${`name: adamantite
51
+ run: yarn install --frozen-lockfile`}}function fn({packageManager:e,scripts:t},n){let r=Kt(e,t);return r.length===0?null:`${`name: adamantite
56
52
 
57
53
  on:
58
54
  push:
@@ -84,17 +80,32 @@ ${r.map(e=>` - name: ${e.name}\n command: ${e.command}`).joi
84
80
  - name: Checkout
85
81
  uses: actions/checkout@v7
86
82
 
87
- ${Qt(n)[e]}
83
+ ${dn(n)[e]}
88
84
 
89
85
  - name: Run \${{ matrix.name }}
90
- run: \${{ matrix.command }}`}\n`}const en=[{path:`.github/workflows/adamantite.yml`,type:`ci`}],tn=(e,t)=>n.gen(function*(){let n=yield*b.Path,r=yield*Xt,i=n.join(e,en[0].path),a=$t(t,yield*r.resolve(e));a&&(yield*N(i,a))});var G=j({create:(e,t)=>n.gen(function*(){let n=yield*b.Path;yield*Me(n.dirname(n.join(e,en[0].path))),yield*tn(e,t)}),detect:e=>n.gen(function*(){let t=yield*y.FileSystem,n=yield*b.Path;return yield*t.exists(n.join(e,en[0].path))}),files:en,kind:`ci`,name:`github`,update:tn}),K=class extends d.Service()(`DependencyInstaller`){static layer=i.succeed(this)({addDevDependencies:n.fn(`DependencyInstaller.addDevDependencies`)((e,t,r)=>n.tryPromise({catch:t=>new ve({cause:t,packages:e}),try:()=>ce(e,{...r,cwd:t})}).pipe(n.asVoid)),detectPackageManager:n.fn(`DependencyInstaller.detectPackageManager`)(e=>n.tryPromise({catch:e=>new Oe({cause:e}),try:()=>le(e)}).pipe(n.map(e=>e??null)))})};const nn=/^\s*node-version:\s*"?\d/m;function rn(){return G.files[0].path}const an=e=>n.gen(function*(){let t=yield*b.Path;return yield*Ne(t.join(e,rn()))}),on=e=>n.gen(function*(){let t=yield*K,n=Ue(yield*L(e));if(!Bt(n))return{reason:`scripts`,supported:!1};let r=yield*t.detectPackageManager(e);return r?He(r.name)?{packageManager:r.name,scripts:n,supported:!0}:{packageManagerName:r.name,reason:`unsupported-package-manager`,supported:!1}:{reason:`no-package-manager`,supported:!1}});var sn=It({check:e=>n.gen(function*(){let t=yield*an(e.cwd);if(!h.exists(t,e=>nn.test(e)))return{status:`not-applicable`,warnings:[]};let n=yield*on(e.cwd);return n.supported?{status:`needed`,summary:`Replacing the hard-coded Node.js version in the GitHub Actions workflow with the project's Node.js version declaration.`,warnings:[]}:{status:`not-applicable`,warnings:[n.reason===`scripts`?`No CI-compatible managed scripts were found, so the GitHub Actions workflow was not updated.`:n.reason===`no-package-manager`?`Could not detect a package manager, so the GitHub Actions workflow was not updated.`:`\`${n.packageManagerName}\` is not a supported package manager for CI workflow generation, so the GitHub Actions workflow was not updated.`]}}),files:[rn()],id:`hardcoded-node-version`,migrate:e=>n.gen(function*(){let t=yield*on(e.cwd);return t.supported?(yield*G.update(e.cwd,{packageManager:t.packageManager,scripts:t.scripts}),{warnings:[]}):yield*n.die(Error(`check() guaranteed workflow regeneration is supported`))}),tags:[`update`],title:`Hard-coded workflow Node.js version`,validate:e=>n.gen(function*(){let t=yield*an(e.cwd);if(h.exists(t,e=>nn.test(e)))return yield*new O({migrationId:`hardcoded-node-version`,reason:`The GitHub Actions workflow still contains a hard-coded Node.js version.`})})});function cn(e,t){return n.gen(function*(){let r=yield*b.Path,i=yield*t.integration.detect(e);if(i.active===null||i.active.format===`ts`)return yield*n.die(Error(`check() guaranteed a legacy ${t.displayName} config exists`));let a=i.active.path,o=r.join(e,t.integration.config),s=yield*M(a),c=yield*F(s,a);if(!I(c))return yield*new Ee({path:a});let{$schema:l,...u}=c;yield*N(o,t.serialize(u));for(let e of[i.active,...i.legacy])yield*Pe(e.path);return{warnings:[]}})}function ln(e){return It({check:t=>n.gen(function*(){let n=yield*e.integration.detect(t.cwd);return n.active===null||n.active.format===`ts`?{status:`not-applicable`,warnings:n.warnings}:{status:`needed`,summary:`Migrating legacy \`${n.active.file}\` configuration to \`${e.integration.config}\`.`,warnings:n.warnings}}),files:e.integration.files.map(e=>e.path),id:e.id,migrate:t=>cn(t.cwd,e),tags:[`update`],title:e.title,validate:t=>n.gen(function*(){if((yield*e.integration.detect(t.cwd)).active?.format!==`ts`)return yield*new O({migrationId:e.id,reason:`\`${e.integration.config}\` is not the active ${e.displayName} config.`})})})}var un=ln({displayName:`Knip`,id:`legacy-knip-json`,integration:z,serialize:tt,title:`Legacy Knip JSON config`}),dn=ln({displayName:`Oxfmt`,id:`legacy-oxfmt-json`,integration:H,serialize:Ft,title:`Legacy oxfmt JSON config`});const fn=/^(?:\.\/)?node_modules\/adamantite\/presets\/lint\/([a-z0-9-]+)\.(?:json|ts)$/,pn=/^adamantite\/lint(?:\/([a-z0-9-]+))?$/;function mn(e){let t=Array.isArray(e.extends)?e.extends.filter(e=>typeof e==`string`):g.isString(e.extends)?[e.extends]:[],n=new Set(ut()),r=new Set;for(let e of t){let t=e.match(fn),i=e.match(pn),a=t?.[1]??(i?i[1]??`core`:null);a?n.add(a):r.add(e)}let{extends:i,...a}=e;return pt(a,[...n],[...r])}var hn=ln({displayName:`Oxlint`,id:`legacy-oxlint-json`,integration:V,serialize:mn,title:`Legacy oxlint JSON config`});const gn=(e=ne.cwd())=>n.gen(function*(){let t=yield*y.FileSystem,n=yield*b.Path;return(yield*t.exists(n.join(e,`pnpm-workspace.yaml`)))?!0:(yield*L(e)).workspaces!==void 0}),q=[{path:`tsconfig.json`,type:`config`}],J=`adamantite/typescript`,_n={extends:J},vn=["Skipping `tsconfig.json` setup: a root config in a monorepo makes TypeScript treat all packages as one project.",`To use the TypeScript preset, add \`"extends": "${J}"\` to each package's \`tsconfig.json\` or to a shared base config.`];function yn(e){return g.isString(e)?e===J?e:[e,J]:c.isArray(e)?e.includes(J)?e:[...e,J]:J}var Y=j({config:q[0].path,create:e=>n.gen(function*(){let t=yield*b.Path;yield*P(t.join(e,q[0].path),_n)}),detect:e=>n.gen(function*(){let t=yield*y.FileSystem,n=yield*b.Path;return yield*t.exists(n.join(e,q[0].path))}),files:q,kind:`workspace`,name:`tsconfig`,update:e=>n.gen(function*(){let t=(yield*b.Path).join(e,q[0].path),n=yield*M(t),r=yield*F(n,t);if(!g.isObject(r))return yield*new Ee({path:t});let i={...yield*Le(_n,r),extends:yn(`extends`in r?r.extends:void 0)};yield*P(t,i)})});const bn=`adamantite typecheck`;function xn(){return V.files[1].path}function Sn(){return G.files[0].path}function Cn(e){let t={...e.scripts};return t.typecheck===bn?(delete t.typecheck,t.check??=R.check,{migrated:!0,packageJson:{...e,scripts:t}}):{migrated:!1,packageJson:e}}var wn=It({check:e=>n.gen(function*(){let{migrated:t}=Cn(yield*L(e.cwd));return t?{status:`needed`,summary:"Migrating `typecheck` to `check` so oxlint handles linting and type diagnostics together.",warnings:[]}:{status:`not-applicable`,warnings:[]}}),files:[`package.json`,V.config,xn(),Y.config,Sn()],id:`legacy-typecheck-script`,migrate:e=>n.gen(function*(){let t=yield*K,r=[],i=Cn(yield*L(e.cwd));if(!i.migrated)return yield*n.die(Error(`check() guaranteed the legacy typecheck script exists`));yield*Ve(e.cwd,i.packageJson);let a=yield*V.detect(e.cwd);a.active===null?yield*V.create(e.cwd):a.active.format===`ts`&&(yield*V.update(e.cwd)),(yield*gn(e.cwd))?r.push(...vn):yield*(yield*Y.detect(e.cwd))?Y.update(e.cwd):Y.create(e.cwd);let o=yield*G.detect(e.cwd),s=Ue(i.packageJson);if(o&&Bt(s)){let n=yield*t.detectPackageManager(e.cwd);n&&He(n.name)?yield*G.update(e.cwd,{packageManager:n.name,scripts:s}):n?r.push(`\`${n.name}\` is not a supported package manager for CI workflow generation, so the GitHub Actions workflow was not updated.`):r.push(`Could not detect a package manager, so the GitHub Actions workflow was not updated.`)}return{warnings:r}}),tags:[`update`],title:`Legacy typecheck script`,validate:e=>n.gen(function*(){if((yield*L(e.cwd)).scripts?.typecheck===bn)return yield*new O({migrationId:`legacy-typecheck-script`,reason:"The legacy `typecheck` script is still present in `package.json`."});if((yield*V.detect(e.cwd)).active?.format!==`ts`)return yield*new O({migrationId:`legacy-typecheck-script`,reason:`\`${V.config}\` is not the active oxlint config.`});if(!(yield*gn(e.cwd))&&!(yield*Y.detect(e.cwd)))return yield*new O({migrationId:`legacy-typecheck-script`,reason:`\`${Y.config}\` is missing after the migration.`})})});const X=[{path:`.zed/settings.json`,type:`config`}],Tn={languages:{Astro:{format_on_save:`on`,prettier:{allowed:!0,plugins:[`prettier-plugin-astro`]}},CSS:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},HTML:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JSON:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JSONC:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JavaScript:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},MDX:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},Markdown:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},TSX:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},TypeScript:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},YAML:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}}},lsp:{oxfmt:{initialization_options:{settings:{"fmt.configPath":null,run:`onSave`}}},oxlint:{initialization_options:{settings:{configPath:null,fixKind:`safe_fix`,run:`onType`,typeAware:!0,unusedDisableDirectives:`deny`}}}}};function En(e){return!I(e)||!Fe(e.plugins)?e:Object.fromEntries([...Object.entries(e),[`plugins`,c.dedupe(e.plugins)]])}function Dn(e){let t=e.languages;if(!I(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>!(e in Tn.languages)||!I(t)?[e,t]:[e,Object.fromEntries(Object.entries(t).map(([e,t])=>e===`formatter`&&Fe(t)?[e,c.dedupe(t)]:e===`prettier`?[e,En(t)]:[e,t]))]));return{...e,languages:n}}var Z=j({config:X[0].path,create:e=>n.gen(function*(){let t=yield*b.Path,n=t.join(e,X[0].path);yield*Me(t.dirname(n)),yield*P(n,Tn)}),detect:e=>n.gen(function*(){let t=yield*y.FileSystem,n=yield*b.Path;return yield*t.exists(n.join(e,X[0].path))}),files:X,kind:`editor`,name:`zed`,update:e=>n.gen(function*(){let t=(yield*b.Path).join(e,X[0].path),n=yield*M(t),r=yield*F(n,t);if(!g.isObject(r))return yield*new Ee({path:t});let i=Dn(yield*Le(Tn,r));yield*P(t,i)})});const On=Object.entries({configPath:null,"fmt.experimental":!0,typeAware:!1,unusedDisableDirectives:!1});function kn(){return Z.files[0].path}function An(e,t){return On.some(([n,r])=>n===e&&r===t)}function jn(e){let t=e.lsp;if(!I(t))return null;let n=t.oxfmt;if(!I(n))return null;let r=n.initialization_options;if(!I(r))return null;let i=r.settings;return I(i)?{initializationOptions:r,lsp:t,oxfmt:n,settings:i}:null}const Mn=e=>n.gen(function*(){let t=(yield*b.Path).join(e,kn()),n=yield*Ne(t);if(h.isNone(n))return null;let r=yield*F(n.value,t);return I(r)?{config:r,settingsPath:t}:null}),Nn=e=>n.gen(function*(){let t=yield*Mn(e),n=t===null?null:jn(t.config);if(t===null||n===null)return null;let r=Object.entries(n.settings).filter(([e,t])=>An(e,t)).map(([e])=>e);return{...t,...n,staleKeys:r}}),Pn=[dn,un,hn,wn,sn,It({check:e=>n.gen(function*(){let t=yield*Nn(e.cwd);return t===null||t.staleKeys.length===0?{status:`not-applicable`,warnings:[]}:{status:`needed`,summary:`Removing lint-only and deprecated settings from the Zed oxfmt language server configuration.`,warnings:[]}}),files:[kn()],id:`legacy-zed-oxfmt-settings`,migrate:e=>n.gen(function*(){let t=yield*Nn(e.cwd);if(t===null||t.staleKeys.length===0)return yield*n.die(Error(`check() guaranteed stale Zed oxfmt settings exist`));let r={"fmt.configPath":null,...Object.fromEntries(Object.entries(t.settings).filter(([e,t])=>!An(e,t)))};return yield*P(t.settingsPath,{...t.config,lsp:{...t.lsp,oxfmt:{...t.oxfmt,initialization_options:{...t.initializationOptions,settings:r}}}}),{warnings:[]}}),tags:[`update`],title:`Legacy Zed oxfmt settings`,validate:e=>n.gen(function*(){let t=yield*Nn(e.cwd);if(t!==null&&t.staleKeys.length>0)return yield*new O({migrationId:`legacy-zed-oxfmt-settings`,reason:`\`${kn()}\` still contains stale oxfmt language server settings.`})})})],Fn=Object.fromEntries(Pn.map(e=>[e.id,e])),In=n.fn(`collectApplicableAssessments`)(function*(e,t,r){let i=r??(yield*L(t));return yield*n.forEach(e,e=>e.assess(t,i).pipe(n.map(t=>t.applicable?h.some({assessment:t,integration:e}):h.none())),{concurrency:`unbounded`}).pipe(n.map(e=>c.getSomes(e)))});function Ln(e,t,n){return In(e,t,n)}var Q=class extends d.Service()(`Prompter`){static layerWithSpinner(e){return i.succeed(this)({cancel:e=>n.sync(()=>{w.cancel(e)}),confirm:e=>n.promise(()=>w.confirm(e)).pipe(n.filterOrFail(e=>!w.isCancel(e),()=>new ke({}))),intro:e=>n.sync(()=>{w.intro(e)}),log:{error:e=>n.sync(()=>{w.log.error(e)}),info:e=>n.sync(()=>{w.log.info(e)}),success:e=>n.sync(()=>{w.log.success(e)}),warning:e=>n.sync(()=>{w.log.warning(e)})},multiselect:e=>n.promise(()=>w.multiselect(e)).pipe(n.filterOrFail(e=>!w.isCancel(e),()=>new ke({}))),outro:e=>n.sync(()=>{w.outro(e)}),withSpinner:(t,i)=>n.acquireUseRelease(n.sync(()=>{let t=e();return t.start(i.start),t}),e=>t({message:t=>n.sync(()=>{e.message(t)})}),(e,t)=>n.sync(()=>{e.stop(r.match(t,{onFailure:()=>i.failure,onSuccess:e=>g.isFunction(i.success)?i.success(e):i.success}))}))})}static layer=this.layerWithSpinner(w.spinner)};const Rn=' .o8 . o8o . \n "888 .o8 `"\' .o8 \n .oooo. .oooo888 .oooo. ooo. .oo. .oo. .oooo. ooo. .oo. .o888oo oooo .o888oo .ooooo. \n`P )88b d88\' `888 `P )88b `888P"Y88bP"Y88b `P )88b `888P"Y88b 888 `888 888 d88\' `88b \n .oP"888 888 888 .oP"888 888 888 888 .oP"888 888 888 888 888 888 888ooo888 \nd8( 888 888 888 d8( 888 888 888 888 d8( 888 888 888 888 . 888 888 . 888 .o \n`Y888""8o `Y8bod88P" `Y888""8o o888o o888o o888o `Y888""8o o888o o888o "888" o888o "888" `Y8bod8P\' \n \n \n ',zn=()=>n.gen(function*(){let e=yield*(yield*fe.Terminal).columns,t=Rn.split(`
91
- `).reduce((e,t)=>Math.max(e,t.trim().length),0);!e||e<t||(yield*de.info(Rn))}),Bn=u.boolean(`fix`).pipe(u.withDescription(`Automatically fix safe package install/update issues`)),Vn=[z,H,V,U,W];var Hn=l.make(`doctor`,{fix:Bn}).pipe(l.withDescription(`Check Adamantite-managed integrations in the current project`),l.withHandler(({fix:e})=>n.gen(function*(){let t=ne.cwd(),r=yield*Q;yield*zn(),yield*r.intro(`💠 adamantite doctor`);let i=yield*L(t);if(!i.devDependencies?.adamantite&&!i.dependencies?.adamantite)return yield*r.log.warning("`adamantite` is not installed in this project. Install it before running `adamantite doctor`."),yield*r.outro(`⚠️ Doctor found issues.`),yield*new E({command:`doctor`,exitCode:s.ExitCode(1)});let a=yield*Ln(Vn,t,i);for(let{assessment:e}of a)for(let t of e.warnings)yield*r.log.warning(t);if(a.length===0){yield*r.log.success(`No applicable integrations found.`),yield*r.outro(`✅ Doctor completed successfully!`);return}let o=a.flatMap(({assessment:e,integration:t})=>e.actions.map(e=>({action:e,integration:t})));if(o.length===0){yield*r.log.success(`No issues found.`),yield*r.outro(`✅ Doctor completed successfully!`);return}let c=new Set;e&&(yield*n.gen(function*(){let e=o.filter(({action:e})=>e.type===`install_package`||e.type===`update_package`);if(e.length>0){let n=yield*K,i=[];for(let{action:t}of e)(t.type===`install_package`||t.type===`update_package`)&&i.push(`${t.package}@${t.targetVersion}`);yield*n.addDevDependencies(i,t,{silent:!0});for(let t of e){let{action:e}=t;e.type===`install_package`&&(yield*r.log.success(`Fixed: installed \`${e.package}@${e.targetVersion}\`.`)),e.type===`update_package`&&(yield*r.log.success(`Fixed: updated \`${e.package}\` from \`${e.currentVersion}\` to \`${e.targetVersion}\`.`)),c.add(t)}}for(let e of o){let{action:n,integration:i}=e;n.type!==`create_config`||!(`create`in i)||(yield*i.create(t),yield*r.log.success(`Fixed: created \`${n.path}\`.`),c.add(e))}for(let e of o){let{action:n,integration:i}=e;n.type!==`update_config`||!(`update`in i)||(yield*i.update(t),yield*r.log.success(`Fixed: updated \`${n.path}\`.`),c.add(e))}for(let e of o){let{action:n}=e;if(n.type!==`run_migration`)continue;let i=Fn[n.migrationId];if(!i)continue;let a=yield*i.check({cwd:t});for(let e of a.warnings)yield*r.log.warning(e);if(a.status!==`needed`){c.add(e);continue}let o=yield*r.withSpinner(()=>Lt(i,{cwd:t}),{failure:`Migration "${i.title}" failed, files restored.`,start:a.summary,success:`Fixed: ${n.description}`});for(let e of o.warnings)yield*r.log.warning(e);c.add(e)}}).pipe(n.tapError(()=>n.gen(function*(){yield*r.outro(`❌ Doctor failed`)}))));let l=o.filter(e=>!c.has(e));if(e&&l.length===0){yield*r.outro(`✅ Doctor completed successfully!`);return}for(let{action:t}of e?l:o)yield*r.log.warning(`Needs attention: ${t.description}`);yield*r.outro(`⚠️ Doctor found issues.`),yield*new E({command:`doctor`,exitCode:s.ExitCode(1)})})));const Un=S.file(`files`,{mustExist:!0}).pipe(S.withDescription(`Specific files to fix (optional)`),S.variadic()),Wn=u.boolean(`suggested`).pipe(u.withDescription(`Apply suggested fixes`)),Gn=u.boolean(`dangerous`).pipe(u.withDescription(`Apply dangerous fixes`)),Kn=u.boolean(`all`).pipe(u.withDescription(`Apply all fixes, including suggested and dangerous fixes`));var qn=l.make(`fix`,{all:Kn,dangerous:Gn,files:Un,suggested:Wn}).pipe(l.withDescription(`Fix issues in code using oxlint`),l.withHandler(({all:e,dangerous:t,files:r,suggested:i})=>n.gen(function*(){let n=yield*A,a=yield*k,o=c.dedupe([`--fix`,...i||e?[`--fix-suggestions`]:[],...t||e?[`--fix-dangerously`]:[],...r]),l=yield*a.run({args:[...o,...n],command:V.name});l!==s.ExitCode(0)&&(yield*new E({command:V.name,exitCode:l}))})));const Jn=S.file(`files`,{mustExist:!0}).pipe(S.withDescription(`Specific files to format (optional)`),S.variadic()),Yn=u.boolean(`check`).pipe(u.withDescription(`Check if files are formatted without writing`));var Xn=l.make(`format`,{check:Yn,files:Jn}).pipe(l.withDescription(`Format files using oxfmt`),l.withHandler(({check:e,files:t})=>n.gen(function*(){let n=yield*A,r=yield*k,i=[];e&&i.push(`--check`),i.push(...t,...n);let a=yield*r.run({args:i,command:H.name});a!==s.ExitCode(0)&&(yield*new E({command:H.name,exitCode:a}))})));const Zn=[{path:`.vscode/settings.json`,type:`config`}],Qn={"[css]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[graphql]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[javascript]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[javascriptreact]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[json]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[jsonc]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[typescript]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[typescriptreact]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"editor.codeActionsOnSave":{"source.fixAll.oxc":`explicit`},"editor.defaultFormatter":`oxc.oxc-vscode`,"editor.formatOnPaste":!0,"editor.formatOnSave":!0,"oxc.typeAware":!0};var $=j({config:Zn[0].path,create:e=>n.gen(function*(){let t=yield*b.Path,n=t.join(e,Zn[0].path);yield*Me(t.dirname(n)),yield*P(n,Qn)}),detect:e=>n.gen(function*(){let t=yield*y.FileSystem,n=yield*b.Path;return yield*t.exists(n.join(e,Zn[0].path))}),extension:(e=[])=>n.gen(function*(){let t=[];(e.includes(`check`)||e.includes(`fix`)||e.includes(`format`))&&t.push(`oxc.oxc-vscode`),e.includes(`analyze`)&&t.push(`webpro.vscode-knip`);for(let e of t){let t=yield*(yield*k).run({args:[`--install-extension`,e],command:`code`}).pipe(n.mapError(t=>t._tag===`CliNotFound`&&t.command===`code`?new je({cause:t}):new ye({cause:t,extension:e})));if(t!==s.ExitCode(0))return yield*new ye({cause:t,extension:e})}}),files:Zn,kind:`editor`,name:`vscode`,update:e=>n.gen(function*(){let t=(yield*b.Path).join(e,Zn[0].path),n=yield*M(t),r=yield*F(n,t);if(!g.isObject(r))return yield*new Ee({path:t});let i=yield*Le(Qn,r);yield*P(t,i)})});const $n=`<!-- ADAMANTITE:START -->`,er=`<!-- ADAMANTITE:END -->`;function tr(e,t){let n=ue(e,t),r=R[t];switch(t){case`analyze`:return`- Run \`${n}\` after changing dependencies, imports, or exports. Direct command: \`${r}\`.`;case`check`:return`- Run \`${n}\` to catch lint and type issues. Direct command: \`${r}\`.`;case`check:monorepo`:return`- Run \`${n}\` to check monorepo package consistency. Direct command: \`${r}\`.`;case`fix`:return`- Run \`${n}\` to apply safe lint fixes. Direct command: \`${r}\`.`;case`fix:monorepo`:return`- Run \`${n}\` to fix monorepo package consistency. Direct command: \`${r}\`.`;case`format`:return`- Run \`${n}\` after editing files. Direct command: \`${r}\`.`}}function nr({packageManager:e,scripts:t}){let n=[`format`,`check`,`fix`,`analyze`,`check:monorepo`,`fix:monorepo`].filter(e=>t.includes(e)).map(t=>tr(e,t)),r=[`## Adamantite`,``,`This project uses Adamantite for its managed formatting, linting, type checking, and dependency-analysis setup.`,``,...n.length>0?[`- Prefer the package scripts Adamantite added for this workspace.`,...n]:[],"- Use `adamantite doctor` to inspect managed setup and `adamantite doctor --fix` for safe local fixes."].join(`
92
- `);return[$n,``,r,``,er,``].join(`
93
- `)}const rr=(e,t)=>n.gen(function*(){let n=(yield*b.Path).join(e,`AGENTS.md`),r=m(yield*Ne(n),h.getOrElse(()=>``)),i=m(r,_.indexOf($n)),a=m(r,_.indexOf(er)),o=m(h.all({end:a,start:i}),h.filter(({end:e,start:t})=>t<e)),s=nr(t);if(h.isSome(o)){let{end:e,start:t}=o.value,i=e+23,a=`${r.slice(0,t)}${s.trimEnd()}${r.slice(i)}`;return yield*N(n,a.endsWith(`
94
- `)?a:`${a}\n`),`updated`}if(h.isSome(i)||h.isSome(a))return`malformed`;let c=r.length===0||r.endsWith(`
86
+ run: \${{ matrix.command }}`}\n`}const pn=[{path:`.github/workflows/adamantite.yml`,type:`ci`}],mn=(e,t)=>n.gen(function*(){let n=yield*x.Path,r=yield*rn,i=n.join(e,pn[0].path),a=fn(t,yield*r.resolve(e));a&&(yield*F(i,a))});var hn=M({assess:(e,t)=>n.gen(function*(){let n=(yield*x.Path).join(e,pn[0].path),r=yield*P(n);if(r._tag===`None`)return{applicable:!1,warnings:[]};let i=Ve(t),a=an.test(r.value),o=i.includes(`check`)&&!ln(r.value);if(!a&&!o)return{applicable:!0,findings:[],packageActions:[],warnings:[]};if(!qt(i))return{applicable:!0,findings:[],packageActions:[],warnings:[`No CI-compatible managed scripts were found, so the GitHub Actions workflow cannot be regenerated.`]};let s=yield*(yield*W).detectPackageManager(e);return s?Be(s.name)?{applicable:!0,findings:[{currentState:[...a?[`The workflow contains a hard-coded Node.js version.`]:[],...o?["The workflow does not run the managed `check` script."]:[]].join(` `),goal:["Make the workflow run the managed `check` script.",`Use the project's Node.js version declaration instead of a hard-coded version.`],id:`outdated-adamantite-workflow`,integration:`github`,notes:[`The detected package manager is \`${s.name}\`. Preserve unrelated workflow jobs and project-specific settings.`],title:`Outdated Adamantite workflow`}],packageActions:[],warnings:[]}:{applicable:!0,findings:[],packageActions:[],warnings:[`\`${s.name}\` is not a supported package manager for CI workflow generation, so the GitHub Actions workflow cannot be regenerated.`]}:{applicable:!0,findings:[],packageActions:[],warnings:[`Could not detect a package manager, so the GitHub Actions workflow cannot be regenerated.`]}}),create:(e,t)=>n.gen(function*(){let n=yield*x.Path;yield*je(n.dirname(n.join(e,pn[0].path))),yield*mn(e,t)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,pn[0].path))}),files:pn,kind:`ci`,name:`github`,update:mn});const G=[{path:`.zed/settings.json`,type:`config`}],gn={languages:{Astro:{format_on_save:`on`,prettier:{allowed:!0,plugins:[`prettier-plugin-astro`]}},CSS:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},HTML:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JSON:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JSONC:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},JavaScript:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},MDX:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},Markdown:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}},TSX:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},TypeScript:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}},{code_action:`source.fixAll.oxc`}],prettier:{allowed:!1}},YAML:{format_on_save:`on`,formatter:[{language_server:{name:`oxfmt`}}],prettier:{allowed:!1}}},lsp:{oxfmt:{initialization_options:{settings:{"fmt.configPath":null,run:`onSave`}}},oxlint:{initialization_options:{settings:{configPath:null,fixKind:`safe_fix`,run:`onType`,typeAware:!0,unusedDisableDirectives:`deny`}}}}},_n={configPath:null,"fmt.experimental":!0,typeAware:!1,unusedDisableDirectives:!1};function vn(e){let t=e.lsp,n=R(t)?t.oxfmt:void 0,r=R(n)?n.initialization_options:void 0,i=R(r)?r.settings:void 0;if(!R(i))return[];let a=Object.entries(_n);return Object.entries(i).filter(([e,t])=>a.some(([n,r])=>n===e&&r===t)).map(([e])=>e)}function yn(e){return!R(e)||!Me(e.plugins)?e:Object.fromEntries([...Object.entries(e),[`plugins`,c.dedupe(e.plugins)]])}function bn(e){let t=e.languages;if(!R(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>!(e in gn.languages)||!R(t)?[e,t]:[e,Object.fromEntries(Object.entries(t).map(([e,t])=>e===`formatter`&&Me(t)?[e,c.dedupe(t)]:e===`prettier`?[e,yn(t)]:[e,t]))]));return Object.fromEntries([...Object.entries(e),[`languages`,n]])}var K=M({assess:(e,t)=>n.gen(function*(){let t=(yield*x.Path).join(e,G[0].path),n=yield*P(t);if(n._tag===`None`)return{applicable:!1,warnings:[]};let r=yield*L(n.value,t),i=R(r)?vn(r):[];return{applicable:!0,findings:i.length===0?[]:[{currentState:`\`${G[0].path}\` contains stale oxfmt settings: ${i.map(e=>`\`${e}\``).join(`, `)}.`,goal:[`Remove only the stale oxfmt entries that still have Adamantite's old default values.`,`Preserve entries that the project changed.`],id:`legacy-zed-oxfmt-settings`,integration:`zed`,title:`Legacy Zed oxfmt settings`}],packageActions:[],warnings:[]}}),config:G[0].path,create:e=>n.gen(function*(){let t=yield*x.Path,n=t.join(e,G[0].path);yield*je(t.dirname(n)),yield*I(n,gn)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,G[0].path))}),files:G,kind:`editor`,name:`zed`,update:e=>n.gen(function*(){let t=(yield*x.Path).join(e,G[0].path),n=yield*N(t),r=yield*L(n,t);if(!_.isObject(r))return yield*new Te({path:t});let i=bn(yield*Fe(gn,r));yield*I(t,i)})});const xn=new Set([`sortImports`,`sortPackageJson`,`sortTailwindcss`]);function Sn(e){return it(e,{moduleName:`adamantite/format`,presetName:`Adamantite format`})}function Cn(e){let t=e.split(`
87
+ `);return t.length===1?e.slice(1,-1).trim():t.slice(1,-1).map(e=>` ${e.trimStart()}`).join(`
88
+ `)}function wn(e,t){let n=Cn(Pe(t));return[` ${e}: {`,` ...format.${e},`,...n===``?[]:[n],` },`].join(`
89
+ `)}function Tn(e={}){let t=Object.entries(e).map(([e,t])=>{if(xn.has(e)&&R(t))return wn(e,t);let n=Pe(t,{continuationIndent:` `});return` ${Ne(e)}: ${n},`});return t.length===0?[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig(format)`,``].join(`
90
+ `):[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig({`,` ...format,`,...t,`})`,``].join(`
91
+ `)}var q=$e({configContent:()=>Tn(),configFiles:{config:`oxfmt.config.ts`,legacyConfigs:[`.oxfmtrc.json`,`.oxfmtrc.jsonc`]},inspectConfig:Sn,name:`oxfmt`,purpose:"the managed `format` script",scripts:[`format`],version:`0.65.0`}),J=Qe({name:`sherif`,purpose:`the managed monorepo scripts`,scripts:[`check:monorepo`,`fix:monorepo`],version:`1.13.0`}),En=Qe({name:`oxlint-tsgolint`,purpose:`the managed lint scripts`,scripts:[`check`,`fix`],version:`7.0.2001`});const Dn=/^(?:packages|"packages"|'packages')\s*:/u;function On(e){return e.replace(/(?:^|\s+)#.*$/u,``).trim()}function kn(e){let t=e.replace(/^\uFEFF/u,``).split(/\r?\n/u),n=t.findIndex(e=>Dn.test(e));if(n===-1)return!1;let r=On((t[n]??``).replace(Dn,``));if(r===`[`){for(let e of t.slice(n+1)){let t=On(e);if(t.length!==0)return t!==`]`}return!1}if(r&&!r.startsWith(`#`))return!/^\[\s*\]$/u.test(r);for(let e of t.slice(n+1)){if(/^\s*-\s*[^#\s]/u.test(e))return!0;if(/^\S/u.test(e)&&!e.startsWith(`#`))return!1}return!1}const An=(e=S.cwd())=>n.gen(function*(){let t=yield*x.Path,n=yield*P(t.join(e,`pnpm-workspace.yaml`));if(g.isSome(n)&&kn(n.value))return!0;let r=(yield*z(e)).workspaces;return((c.isArray(r)?r:r?.packages)?.length??0)>0}),Y=[{path:`tsconfig.json`,type:`config`}],X=`adamantite/typescript`,jn={extends:X},Mn=["Skipping `tsconfig.json` setup: a root config in a monorepo makes TypeScript treat all packages as one project.",`To use the TypeScript preset, add \`"extends": "${X}"\` to each package's \`tsconfig.json\` or to a shared base config.`];function Nn(e){return _.isString(e)?e===X?e:[e,X]:c.isArray(e)?e.includes(X)?e:[...e,X]:X}var Z=M({assess:(e,t)=>n.gen(function*(){let n=Ve(t);if(!n.includes(`check`)&&!n.includes(`fix`))return{applicable:!1,warnings:[]};if(yield*An(e))return{applicable:!0,findings:[],packageActions:[],warnings:Mn};let r=(yield*x.Path).join(e,Y[0].path),i=yield*P(r);if(i._tag===`None`)return{applicable:!0,findings:[{currentState:"`tsconfig.json` is missing.",goal:["Create `tsconfig.json` and set `extends` to include `adamantite/typescript`."],id:`missing-tsconfig`,integration:`tsconfig`,reference:{content:`${JSON.stringify(jn,null,2)}\n`,language:`json`},title:`Missing TypeScript configuration`}],packageActions:[],warnings:[]};let a=yield*L(i.value,r);return{applicable:!0,findings:_.isObject(a)&&(a.extends===X||c.isArray(a.extends)&&a.extends.includes(X))?[]:[{currentState:"`tsconfig.json` does not extend `adamantite/typescript`.",goal:["Add `adamantite/typescript` to `extends`. Preserve every existing TypeScript option and existing base config."],id:`missing-adamantite-tsconfig-extends`,integration:`tsconfig`,reference:{content:`${JSON.stringify(jn,null,2)}\n`,language:`json`},title:`TypeScript preset is not configured`}],packageActions:[],warnings:[]}}),config:Y[0].path,create:e=>n.gen(function*(){let t=yield*x.Path;yield*I(t.join(e,Y[0].path),jn)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,Y[0].path))}),files:Y,kind:`workspace`,name:`tsconfig`,update:e=>n.gen(function*(){let t=(yield*x.Path).join(e,Y[0].path),n=yield*N(t),r=yield*L(n,t);if(!_.isObject(r))return yield*new Te({path:t});let i=yield*Fe(jn,r),a=Object.fromEntries([...Object.entries(i),[`extends`,Nn(`extends`in r?r.extends:void 0)]]);yield*I(t,a)})});const Pn=[V,q,U,J,En,Z,hn,K],Fn=n.fn(`collectApplicableAssessments`)(function*(e,t,r){return yield*n.forEach(e,e=>e.assess(t,r).pipe(n.map(t=>t.applicable?g.some({assessment:t,name:e.name}):g.none())),{concurrency:`unbounded`}).pipe(n.map(e=>c.getSomes(e)))});function In(e,t,n){return Fn(e,t,n)}const Ln=n.fn(`assessProject`)(function*(e,t){let n=t??(yield*z(e)),r=yield*In(Pn,e,n);return{applicableIntegrations:r.map(({name:e})=>e),findings:r.flatMap(({assessment:e})=>e.findings),packageActions:r.flatMap(({assessment:e})=>e.packageActions),warnings:r.flatMap(({assessment:e})=>e.warnings)}});function Rn(e,t){return e.findings.length===0?zn(e.warnings,t):Bn(e.findings,e.warnings,t)}function zn(e,t){return[`# Adamantite doctor warnings`,``,`This project uses Adamantite ${t} to manage linting, formatting, and type tooling.`,"`adamantite doctor` found no repair findings, but reported these warnings:",``,...e.map(e=>`- ${e}`),``].join(`
92
+ `)}function Bn(e,t,n){let r=e.map((e,t)=>{let n=e.goal.map(e=>` - ${e}`).join(`
93
+ `),r=e.reference?`\n- **Reference:**\n\n\`\`\`${e.reference.language}\n${e.reference.content.trimEnd()}\n\`\`\``:``,i=e.notes&&e.notes.length>0?`\n- **Notes:**\n${e.notes.map(e=>` - ${e}`).join(`
94
+ `)}`:``;return`## ${t+1}. ${e.title}\n\n- **Current state:** ${e.currentState}\n- **Goal:**\n${n}${r}${i}`}),i=t.length>0?[`## Assessment warnings`,``,`Account for these warnings while fixing the findings:`,``,...t.map(e=>`- ${e}`),``]:[];return[`# Adamantite doctor findings`,``,`This project uses Adamantite ${n} to manage linting, formatting, and type tooling.`,`\`adamantite doctor\` found ${e.length} issue(s). Fix them so that \`adamantite doctor\` exits 0.`,`Before editing, make sure the working tree is clean or the user has accepted the risk.`,``,...i,r.join(`
95
+
96
+ `),``,`## Verify`,``,"Run `adamantite doctor`. All findings above must be gone and it must exit 0.",`Do not suppress or work around checks; fix the underlying state.`,``].join(`
97
+ `)}var Vn=class extends d.Service()(`TerminalCapabilities`){static layer=i.succeed(this)({copyToClipboard:e=>n.sync(()=>{let t=Buffer.from(e).toString(`base64`);S.stdout.write(`\u001B]52;c;${t}\u0007`)}),isInteractive:n.sync(()=>S.stdin.isTTY&&S.stdout.isTTY)})},Q=class extends d.Service()(`Prompter`){static layerWithSpinner(e){return i.succeed(this)({cancel:e=>n.sync(()=>{E.cancel(e)}),confirm:e=>n.promise(()=>E.confirm(e)).pipe(n.filterOrFail(e=>!E.isCancel(e),()=>new Oe({}))),intro:e=>n.sync(()=>{E.intro(e)}),log:{error:e=>n.sync(()=>{E.log.error(e)}),info:e=>n.sync(()=>{E.log.info(e)}),success:e=>n.sync(()=>{E.log.success(e)}),warning:e=>n.sync(()=>{E.log.warning(e)})},message:e=>n.sync(()=>{E.log.message(e,{spacing:0,withGuide:!1})}),multiselect:e=>n.promise(()=>E.multiselect(e)).pipe(n.filterOrFail(e=>!E.isCancel(e),()=>new Oe({}))),note:(e,t)=>n.sync(()=>{E.note(e,t)}),outro:e=>n.sync(()=>{E.outro(e)}),select:e=>n.promise(()=>E.select(e)).pipe(n.filterOrFail(e=>!E.isCancel(e),()=>new Oe({}))),withSpinner:(t,i)=>n.acquireUseRelease(n.sync(()=>{let t=e();return t.start(i.start),t}),e=>t({message:t=>n.sync(()=>{e.message(t)})}),(e,t)=>n.sync(()=>{e.stop(r.match(t,{onFailure:()=>i.failure,onSuccess:e=>_.isFunction(i.success)?i.success(e):i.success}))}))})}static layer=this.layerWithSpinner(E.spinner)};function Hn(e){let t=[`Current state\n${e.currentState}`,`Goal\n${e.goal.map(e=>`• ${e}`).join(`
98
+ `)}`];return e.reference&&t.push(`Reference\n${e.reference.content.trimEnd()}`),e.notes&&e.notes.length>0&&t.push(`Notes\n${e.notes.map(e=>`• ${e}`).join(`
99
+ `)}`),t.join(`
100
+
101
+ `)}const Un=n.fn(`printFindings`)(function*(e){let t=yield*Q;for(let[n,r]of e.entries())yield*t.note(Hn(r),`${n+1}. ${r.title}`)}),Wn=' .o8 . o8o . \n "888 .o8 `"\' .o8 \n .oooo. .oooo888 .oooo. ooo. .oo. .oo. .oooo. ooo. .oo. .o888oo oooo .o888oo .ooooo. \n`P )88b d88\' `888 `P )88b `888P"Y88bP"Y88b `P )88b `888P"Y88b 888 `888 888 d88\' `88b \n .oP"888 888 888 .oP"888 888 888 888 .oP"888 888 888 888 888 888 888ooo888 \nd8( 888 888 888 d8( 888 888 888 888 d8( 888 888 888 888 . 888 888 . 888 .o \n`Y888""8o `Y8bod88P" `Y888""8o o888o o888o o888o `Y888""8o o888o o888o "888" o888o "888" `Y8bod8P\' \n \n \n ',Gn=()=>n.gen(function*(){let e=yield*(yield*fe.Terminal).columns,t=Wn.split(`
102
+ `).reduce((e,t)=>Math.max(e,t.trim().length),0);!e||e<t||(yield*de.info(Wn))}),Kn=u.boolean(`fix`).pipe(u.withDefault(!1),u.withDescription(`Removed. Run doctor and follow its findings`)),qn=`0.38.0`;var Jn=l.make(`doctor`,{fix:Kn}).pipe(l.withDescription(`Assess Adamantite-managed integrations in the current project`),l.withHandler(({fix:e})=>n.gen(function*(){let t=S.cwd(),r=yield*Q,i=yield*Vn,a=yield*i.isInteractive;a&&(yield*Gn(),yield*r.intro(`💠 adamantite doctor`));let o=n.gen(function*(){return yield*r.outro(`⚠️ Doctor found issues.`),yield*new O({command:`doctor`,exitCode:s.ExitCode(1)})});if(e){let e="`doctor --fix` has been removed. Run `adamantite doctor` and follow the reported goal criteria.";return a?(yield*r.log.error(e),yield*r.outro(`❌ Doctor did not run`)):yield*r.message(e),yield*new O({command:`doctor`,exitCode:s.ExitCode(1)})}let c=yield*z(t);if(!c.devDependencies?.adamantite&&!c.dependencies?.adamantite){let e="`adamantite` is not installed in this project. Install it before running `adamantite doctor`.";return a?(yield*r.log.warning(e),yield*r.outro(`⚠️ Doctor found issues.`)):yield*r.message(e),yield*new O({command:`doctor`,exitCode:s.ExitCode(1)})}let l=yield*Ln(t);if(a)for(let e of l.warnings)yield*r.log.warning(e);if(l.applicableIntegrations.length===0){a&&(yield*r.log.success(`No applicable integrations found.`),yield*r.outro(`✅ Doctor completed successfully!`));return}if(l.findings.length===0){a?(yield*r.log.success(`No issues found.`),yield*r.outro(`✅ Doctor completed successfully!`)):l.warnings.length>0&&(yield*r.message(Rn(l,qn)));return}if(!a)return yield*r.message(Rn(l,qn)),yield*new O({command:`doctor`,exitCode:s.ExitCode(1)});let u=e=>n.gen(function*(){(yield*r.confirm({initialValue:!0,message:`Copy the Markdown prompt for a coding agent?`}))&&(yield*r.message(e),yield*i.copyToClipboard(e),yield*r.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`))});yield*Un(l.findings);let d=yield*r.withSpinner(()=>zt(t),{start:`Checking for installed coding agents...`,success:e=>e.length===0?`No supported coding agent CLI was found on PATH.`:`Found ${e.map(e=>e.name).join(`, `)}.`});d.length===0&&(yield*r.log.info(`Doctor can hand findings off when one of these CLIs is installed: ${Rt.map(e=>`\`${e.command}\``).join(`, `)}.`));let f=Rn(l,qn),p=yield*r.select({message:`How do you want to resolve these findings?`,options:[...d.map(e=>({label:`Hand off to ${e.name}`,value:e})),{label:`Copy the Markdown prompt for a coding agent`,value:`copy`},{label:`Do nothing`,value:`done`}]});if(p===`done`)return yield*o;if(p===`copy`)return yield*r.message(f),yield*i.copyToClipboard(f),yield*r.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`),yield*o;let m=p,h=yield*Wt(t);if(h!==`clean`&&(yield*r.log.warning(h===`dirty`?`The Git working tree has uncommitted changes. The agent will edit files on top of them.`:`Doctor could not confirm a clean Git working tree. The agent will edit files without a checkpoint to return to.`),!(yield*r.confirm({initialValue:!1,message:`Hand off to ${m.name} anyway?`})))||(yield*r.log.info(`Handing the terminal to ${m.name}. Exit the agent to return to Doctor.`),!(yield*Ut({agent:m,cwd:t}).pipe(n.as(!0),n.catchTag(`AgentSessionFailed`,e=>r.log.error(e.reason===`not-found`?`\`${m.command}\` was not found on PATH. Install ${m.name} or copy the prompt instead.`:`Failed to start ${m.name}: ${e.cause.message}`).pipe(n.as(!1)))))))return yield*u(f),yield*o;let g=yield*Ln(t);if(g.findings.length===0){yield*r.log.success(`All findings were resolved by ${m.name}.`),yield*r.outro(`✅ Doctor completed successfully!`);return}return yield*r.log.warning(`${g.findings.length} of ${l.findings.length} findings remain after the ${m.name} session.`),yield*Un(g.findings),yield*u(Rn(g,qn)),yield*o}).pipe(n.catchTag(`OperationCancelled`,()=>n.gen(function*(){return yield*(yield*Q).cancel(`Doctor was cancelled. The findings remain.`),yield*new O({command:`doctor`,exitCode:s.ExitCode(1)})})))));const Yn=w.file(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to fix (optional)`),w.variadic()),Xn=u.boolean(`suggested`).pipe(u.withDefault(!1),u.withDescription(`Apply suggested fixes`)),Zn=u.boolean(`dangerous`).pipe(u.withDefault(!1),u.withDescription(`Apply dangerous fixes`)),Qn=u.boolean(`all`).pipe(u.withDefault(!1),u.withDescription(`Apply all fixes, including suggested and dangerous fixes`));var $n=l.make(`fix`,{all:Qn,dangerous:Zn,files:Yn,suggested:Xn}).pipe(l.withDescription(`Fix issues in code using oxlint`),l.withHandler(({all:e,dangerous:t,files:r,suggested:i})=>n.gen(function*(){let n=yield*j,a=yield*A,o=c.dedupe([`--fix`,...i||e?[`--fix-suggestions`]:[],...t||e?[`--fix-dangerously`]:[],...r]),l=yield*a.run({args:[...o,...n],command:U.name});l!==s.ExitCode(0)&&(yield*new O({command:U.name,exitCode:l}))})));const er=w.file(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to format (optional)`),w.variadic()),tr=u.boolean(`check`).pipe(u.withDefault(!1),u.withDescription(`Check if files are formatted without writing`));var nr=l.make(`format`,{check:tr,files:er}).pipe(l.withDescription(`Format files using oxfmt`),l.withHandler(({check:e,files:t})=>n.gen(function*(){let n=yield*j,r=yield*A,i=[];e&&i.push(`--check`),i.push(...t,...n);let a=yield*r.run({args:i,command:q.name});a!==s.ExitCode(0)&&(yield*new O({command:q.name,exitCode:a}))})));const rr=[{path:`.vscode/settings.json`,type:`config`}],ir={"[css]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[graphql]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[javascript]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[javascriptreact]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[json]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[jsonc]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[typescript]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"[typescriptreact]":{"editor.defaultFormatter":`oxc.oxc-vscode`},"editor.codeActionsOnSave":{"source.fixAll.oxc":`explicit`},"editor.defaultFormatter":`oxc.oxc-vscode`,"editor.formatOnPaste":!0,"editor.formatOnSave":!0,"oxc.typeAware":!0};var $=M({config:rr[0].path,create:e=>n.gen(function*(){let t=yield*x.Path,n=t.join(e,rr[0].path);yield*je(t.dirname(n)),yield*I(n,ir)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,rr[0].path))}),extension:(e=[])=>n.gen(function*(){let t=[];(e.includes(`check`)||e.includes(`fix`)||e.includes(`format`))&&t.push(`oxc.oxc-vscode`),e.includes(`analyze`)&&t.push(`webpro.vscode-knip`);for(let e of t){let t=yield*(yield*A).run({args:[`--install-extension`,e],command:`code`}).pipe(n.mapError(t=>t._tag===`CliNotFound`&&t.command===`code`?new Ae({cause:t}):new ye({cause:t,extension:e})));if(t!==s.ExitCode(0))return yield*new ye({cause:t,extension:e})}}),files:rr,kind:`editor`,name:`vscode`,update:e=>n.gen(function*(){let t=(yield*x.Path).join(e,rr[0].path),n=yield*N(t),r=yield*L(n,t);if(!_.isObject(r))return yield*new Te({path:t});let i=yield*Fe(ir,r);yield*I(t,i)})});const ar=`<!-- ADAMANTITE:START -->`,or=`<!-- ADAMANTITE:END -->`;function sr(e,t){let n=ue(e,t),r=B[t];switch(t){case`analyze`:return`- Run \`${n}\` after changing dependencies, imports, or exports. Direct command: \`${r}\`.`;case`check`:return`- Run \`${n}\` to catch lint and type issues. Direct command: \`${r}\`.`;case`check:monorepo`:return`- Run \`${n}\` to check monorepo package consistency. Direct command: \`${r}\`.`;case`fix`:return`- Run \`${n}\` to apply safe lint fixes. Direct command: \`${r}\`.`;case`fix:monorepo`:return`- Run \`${n}\` to fix monorepo package consistency. Direct command: \`${r}\`.`;case`format`:return`- Run \`${n}\` after editing files. Direct command: \`${r}\`.`}}function cr({packageManager:e,scripts:t}){let n=[`format`,`check`,`fix`,`analyze`,`check:monorepo`,`fix:monorepo`].filter(e=>t.includes(e)).map(t=>sr(e,t)),r=[`## Adamantite`,``,`This project uses Adamantite for its managed formatting, linting, type checking, and dependency-analysis setup.`,``,...n.length>0?[`- Prefer the package scripts Adamantite added for this workspace.`,...n]:[],"- Run `adamantite doctor` and follow its findings to repair managed setup."].join(`
103
+ `);return[ar,``,r,``,or,``].join(`
104
+ `)}const lr=(e,t)=>n.gen(function*(){let n=(yield*x.Path).join(e,`AGENTS.md`),r=h(yield*P(n),g.getOrElse(()=>``)),i=h(r,v.indexOf(ar)),a=h(r,v.indexOf(or)),o=h(g.all({end:a,start:i}),g.filter(({end:e,start:t})=>t<e)),s=cr(t);if(g.isSome(o)){let{end:e,start:t}=o.value,i=e+23,a=`${r.slice(0,t)}${s.trimEnd()}${r.slice(i)}`;return yield*F(n,a.endsWith(`
105
+ `)?a:`${a}\n`),`updated`}if(g.isSome(i)||g.isSome(a))return`malformed`;let c=r.length===0||r.endsWith(`
95
106
 
96
107
  `)?``:r.endsWith(`
97
108
  `)?`
98
109
  `:`
99
110
 
100
- `;return yield*N(n,`${r}${c}${s}`),`updated`}),ir=(e,t)=>n.gen(function*(){let r=yield*K;yield*(yield*Q).withSpinner(()=>n.gen(function*(){let n=yield*gn(e);yield*r.addDevDependencies(t,e,{silent:!0,workspace:n})}),{failure:`Failed to install dependencies.`,start:`Installing dependencies...`,success:`Dependencies installed.`})});function ar(e,t,r){return n.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(a=>n.gen(function*(){let n=yield*t.detect(e);for(let e of n.warnings)yield*i.log.warning(e);return n.active===null?(yield*a.message(`\`${t.config}\` not found, creating...`),yield*r,{created:!0,legacyConfig:null}):n.active.format===`ts`?(yield*a.message(`Found \`${t.config}\`, keeping existing config.`),{created:!1,legacyConfig:null}):(yield*a.message(`Found \`${n.active.file}\`, keeping existing config.`),{created:!1,legacyConfig:n.active.file})}),{failure:`Failed to set up ${t.name} config.`,start:`Setting up ${t.name} config...`,success:e=>e.created?`${t.name} config created successfully.`:`${t.name} config is ready.`});a.legacyConfig&&(yield*i.log.info(`Legacy \`${a.legacyConfig}\` was preserved during \`adamantite init\`. Run \`adamantite doctor --fix\` to migrate it to the latest ${t.name} config.`))})}const or=e=>`\`${e.script}\` is currently \`${e.command}\`; Adamantite would replace it with \`${R[e.script]}\`.`,sr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*L(e),o=r.overwriteScripts?[]:We(a,t),s=new Set(o.map(e=>e.script)),c=t.filter(e=>!s.has(e));yield*i.withSpinner(()=>n.gen(function*(){if(c.length!==0){a.scripts??={};for(let e of c)a.scripts[e]=R[e];yield*Ve(e,a)}}),{failure:"Failed to add scripts to `package.json`.",start:"Adding scripts to your `package.json`...",success:o.length===0?"Scripts added to your `package.json`":c.length===0?"Kept your existing `package.json` scripts.":"Scripts added to your `package.json`; conflicting scripts were kept."});let l=r.nonInteractive?"Use `--overwrite-scripts` to replace it.":"Re-run `adamantite init` and confirm overwriting to replace it.";for(let e of o)yield*i.log.warning(`Kept existing \`${e.script}\` script (\`${e.command}\`) instead of \`${R[e.script]}\`. ${l}`);return o.length>0&&(yield*i.log.info("Adamantite commands forward extra arguments after `--`, so custom flags can be kept, e.g. `adamantite monorepo -- --ignore-dependency tailwindcss`.")),c}),cr=(e,t)=>n.gen(function*(){let r=yield*Q;if(t){yield*m(vn,n.forEach(e=>r.log.info(e)));return}yield*r.withSpinner(t=>n.gen(function*(){return(yield*Y.detect(e))?(yield*t.message(`\`${Y.config}\` found, updating...`),yield*Y.update(e),!1):(yield*t.message(`\`${Y.config}\` not found, creating...`),yield*Y.create(e),!0)}),{failure:`Failed to set up TypeScript config.`,start:`Setting up TypeScript config...`,success:e=>e?`\`${Y.config}\` created successfully`:`\`${Y.config}\` updated successfully`})}),lr=(e,t)=>n.gen(function*(){let r=yield*Q;t.includes(`vscode`)&&(yield*r.withSpinner(t=>n.gen(function*(){let n=yield*$.detect(e);return yield*t.message(`\`${$.config}\` ${n?`found, updating`:`not found, creating`}...`),yield*n?$.update(e):$.create(e),!n}),{failure:`Failed to set up VS Code config.`,start:`Checking for \`${$.config}\`...`,success:e=>`\`${$.config}\` ${e?`created`:`updated`} with Adamantite preset.`})),t.includes(`zed`)&&(yield*r.withSpinner(t=>n.gen(function*(){let n=yield*Z.detect(e);return yield*t.message(`\`${Z.config}\` ${n?`found, updating`:`not found, creating`}...`),yield*n?Z.update(e):Z.create(e),!n}),{failure:`Failed to set up Zed config.`,start:`Checking for \`${Z.config}\`...`,success:e=>`\`${Z.config}\` ${e?`created`:`updated`} with Adamantite preset.`}))}),ur=(e,t)=>n.gen(function*(){let r=yield*Q,i=e.includes(`zed`),a=e.includes(`vscode`);yield*r.withSpinner(e=>n.gen(function*(){return a&&(yield*e.message(`Installing VS Code extension...`),yield*$.extension(t)),!0}),{start:`Installing editor extensions...`,success:i&&!a?`Zed extensions require manual install.`:`Editor extensions installed successfully.`}).pipe(n.catchTag(`FailedToInstallExtension`,e=>n.gen(function*(){return yield*r.log.warning(`⚠️ ${e.message}`),yield*r.log.warning(`Please install it manually after setup completes.`),!1})),n.catchTag(`VscodeCliNotFound`,()=>n.gen(function*(){return yield*r.log.error(`VSCode CLI ('code' command) not found.`),yield*r.log.info(`To install it:`),yield*r.log.info(` 1. Open VS Code`),yield*r.log.info(` 2. Press Cmd+Shift+P (macOS) or Ctrl+Shift+P (Windows/Linux)`),yield*r.log.info(` 3. Run 'Shell Command: Install "code" command in PATH'`),!1}))),i&&(yield*r.log.info("Install the Zed `oxc` extension: zed://extension/oxc"))}),dr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=G.files[0].path;yield*i.withSpinner(i=>n.gen(function*(){let n=yield*G.detect(e);return yield*i.message(n?`\`${a}\` found, updating...`:`Creating \`${a}\`...`),yield*n?G.update(e,{packageManager:t,scripts:r}):G.create(e,{packageManager:t,scripts:r}),!n}),{failure:`Failed to set up GitHub Actions workflow.`,start:`Setting up GitHub Actions workflow...`,success:e=>`GitHub Actions workflow ${e?`created`:`updated`} successfully.`})}).pipe(n.catchTag([`FailedToCreateDirectory`,`FailedToParseFile`,`FailedToReadFile`,`FailedToWriteFile`,`PlatformError`],e=>n.gen(function*(){let t=yield*Q;yield*t.log.warning(`Could not set up the GitHub Actions workflow. ${e.message}`),yield*t.log.warning("Fix the reported problem and run `adamantite init` again, or create the workflow manually.")}))),fr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(()=>rr(e,{packageManager:t,scripts:r}),{failure:`Failed to update AGENTS.md.`,start:`Updating AGENTS.md...`,success:`AGENTS.md check complete.`}).pipe(n.catchTag([`FailedToReadFile`,`FailedToWriteFile`],e=>n.gen(function*(){return yield*i.log.warning(`Could not update AGENTS.md. ${e.message} Adamantite will continue initialization.`),`failed`})));a!==`failed`&&a===`malformed`&&(yield*i.log.warning(`Could not update AGENTS.md because Adamantite markers are incomplete. Remove the stale ADAMANTITE marker and run adamantite init again.`))}),pr=[`check`,`fix`,`format`,`check:monorepo`,`fix:monorepo`,`analyze`],mr=[`react`,`nextjs`,`vue`,`jest`,`vitest`,`node`,`antislop`],hr=[`vscode`,`zed`],gr=n.fn(`validateInitOptions`)(function*(e,t){let n={agents:e.agents,editors:c.dedupe(e.editors),githubActions:e.githubActions,installExtensions:e.installExtensions,overwriteScripts:e.overwriteScripts,presets:c.dedupe(e.presets),scripts:c.dedupe(e.scripts),typescript:e.typescript};if(n.scripts.length===0)return yield*new D({reason:"Select at least one script with `--script <name>`."});let r=n.scripts.includes(`check`)||n.scripts.includes(`fix`);return(n.scripts.includes(`check:monorepo`)||n.scripts.includes(`fix:monorepo`))&&!t.isMonorepo?yield*new D({reason:`Monorepo scripts can only be selected in a detected monorepo.`}):n.presets.length>0&&!r?yield*new D({reason:"`--preset` requires the `check` or `fix` script."}):n.typescript&&!r?yield*new D({reason:"`--typescript` requires the `check` or `fix` script."}):n.installExtensions&&n.editors.length===0?yield*new D({reason:"`--install-extensions` requires at least one `--editor`."}):n.githubActions&&!Bt(n.scripts)?yield*new D({reason:"`--github-actions` requires a CI-compatible script."}):n.githubActions&&t.nonInteractive&&!He(t.packageManager)?yield*new D({reason:`\`--github-actions\` does not support the detected package manager \`${t.packageManager}\`. Use bun, deno, npm, pnpm, or yarn.`}):n}),_r=u.boolean(`non-interactive`).pipe(u.withDescription(`Configure without prompts; requires at least one --script`)),vr=u.choice(`script`,pr).pipe(u.atMost(pr.length),u.withDescription(`Package script to configure; repeatable and required in non-interactive mode. Monorepo scripts require a detected monorepo`)),yr=u.choice(`preset`,mr).pipe(u.atMost(mr.length),u.withDescription(`Oxlint preset to configure; repeatable and requires --script check or fix`)),br=u.choice(`editor`,hr).pipe(u.atMost(hr.length),u.withDescription(`Editor to configure; may be specified multiple times`)),xr=u.boolean(`typescript`).pipe(u.withDescription(`Configure the TypeScript preset; requires --script check or fix`)),Sr=u.boolean(`install-extensions`).pipe(u.withDescription(`Install recommended extensions; requires at least one --editor`)),Cr=u.boolean(`github-actions`).pipe(u.withDescription(`Configure CI; requires a compatible script and bun, deno, npm, pnpm, or yarn`)),wr=u.boolean(`agents`).pipe(u.withDescription(`Add Adamantite guidance to AGENTS.md`)),Tr=u.boolean(`overwrite-scripts`).pipe(u.withDescription(`Replace existing package scripts that conflict with Adamantite's managed commands`)),Er=n.fn(`collectInteractiveInitOptions`)(function*(e,t){let n=yield*Q,r=yield*n.multiselect({message:"Which scripts do you want to add to your `package.json`?",options:[{hint:`recommended`,label:`check - find issues and type errors using oxlint`,value:`check`},{hint:`recommended`,label:`fix - fix code issues using oxlint`,value:`fix`},{hint:`recommended`,label:`format - code formatting using oxfmt`,value:`format`},{disabled:!t,hint:t?void 0:`available for monorepo projects`,label:`check:monorepo - check for monorepo-specific issues using Sherif`,value:`check:monorepo`},{disabled:!t,hint:t?void 0:`available for monorepo projects`,label:`fix:monorepo - fix monorepo-specific issues using Sherif`,value:`fix:monorepo`},{label:`analyze - find unused dependencies, exports, and files using knip`,value:`analyze`}]}),i=We(yield*L(e),r),a=!1;if(i.length>0){for(let e of i)yield*n.log.warning(or(e));a=yield*n.confirm({initialValue:!1,message:i.length===1?`Overwrite this existing script with Adamantite's command?`:`Overwrite these existing scripts with Adamantite's commands?`})}let o=r.includes(`check`)||r.includes(`fix`),s=[];o&&(s=yield*n.multiselect({message:`Which presets do you want to install? (core is always included)`,options:[{hint:`React correctness, JSX accessibility, and render performance rules`,label:`react`,value:`react`},{hint:`Next.js pitfalls around scripts, fonts, images, and document/head usage`,label:`next.js`,value:`nextjs`},{hint:`Vue 3 correctness rules and deprecated API detection`,label:`vue`,value:`vue`},{hint:`Jest test hygiene: focused/disabled tests, matcher and snapshot discipline`,label:`jest`,value:`jest`},{hint:`Vitest test hygiene: focused/disabled tests, matcher and snapshot discipline`,label:`vitest`,value:`vitest`},{hint:`Node.js callback and CommonJS pitfalls`,label:`node`,value:`node`},{hint:`Rejects low-signal escape hatches: unjustified assertions, unknown leaks, module mocks`,label:`antislop`,value:`antislop`}],required:!1}));let c=o?yield*n.confirm({initialValue:!0,message:t?"Adamantite provides a TypeScript preset to enforce strict type-safety. In a monorepo, each package's `tsconfig.json` must extend it. Would you like instructions on how to set it up?":`Adamantite provides a TypeScript preset to enforce strict type-safety. Would you like to use it?`}):!1,l=yield*n.multiselect({message:`Which editors do you want to configure? (optional)`,options:[{label:`VSCode / Cursor / Windsurf`,value:`vscode`},{label:`Zed`,value:`zed`}],required:!1}),u=l.length>0?yield*n.confirm({initialValue:!0,message:`Do you want to install the recommended editor extensions?`}):!1,d=Bt(r)?yield*n.confirm({message:`Do you want to add a GitHub Actions workflow to run checks in CI?`}):!1;return{agents:yield*n.confirm({initialValue:!0,message:`Add Adamantite guidance to AGENTS.md so coding agents know how to run project checks?`}),editors:l,githubActions:d,installExtensions:u,overwriteScripts:a,presets:s,scripts:r,typescript:c}});var Dr=l.make(`init`,{agents:wr,editors:br,githubActions:Cr,installExtensions:Sr,nonInteractive:_r,overwriteScripts:Tr,presets:yr,scripts:vr,typescript:xr}).pipe(l.withDescription(`Initialize Adamantite in the current directory. Setup flags require --non-interactive; omitted boolean setup flags are disabled`),l.withExamples([{command:`adamantite init --non-interactive --script check`,description:`Configure linting without prompts`},{command:`adamantite init --non-interactive --script check --script format --preset react --editor vscode --typescript --install-extensions --github-actions --agents`,description:`Configure a React project with VS Code, TypeScript, CI, and agent guidance`},{command:`adamantite init --non-interactive --script check:monorepo`,description:`Configure monorepo checks in a detected monorepo`}]),l.withHandler(e=>n.gen(function*(){let t=ne.cwd(),n=yield*Q;yield*zn(),yield*n.intro(`💠 adamantite init`);let r=yield*(yield*K).detectPackageManager(t);if(!r)return yield*new Oe({});if(r.warnings?.length)for(let e of r.warnings)yield*n.log.warning(e);yield*n.log.info(`Detected package manager: ${r.name}`);let i=yield*gn(t);if(i&&(yield*n.log.info(`We've detected a monorepo setup in your project.`)),!e.nonInteractive&&c.some([e.scripts.length>0,e.presets.length>0,e.editors.length>0,e.typescript,e.installExtensions,e.githubActions,e.agents,e.overwriteScripts],g.isTruthy))return yield*new D({reason:"Setup flags require `--non-interactive`."});let a=e.nonInteractive?e:yield*Er(t,i),o=yield*gr(a,{isMonorepo:i,nonInteractive:e.nonInteractive,packageManager:r.name}),s=o.scripts,l=o.presets,u=o.editors,d=o.typescript,ee=o.installExtensions,f=o.githubActions,p=o.agents,m=s.includes(`check`)||s.includes(`fix`),h=s.includes(`format`),_=s.includes(`check:monorepo`)||s.includes(`fix:monorepo`),te=s.includes(`analyze`),v=[`adamantite`];m&&v.push(`${V.name}@${V.version}`,`${W.name}@${W.version}`),h&&v.push(`${H.name}@${H.version}`),_&&v.push(`${U.name}@${U.version}`),te&&v.push(`${z.name}@${z.version}`),yield*ir(t,v),h&&(yield*ar(t,H,H.create(t))),m&&(yield*ar(t,V,V.create(t,l))),te&&(yield*ar(t,z,z.create(t)));let y=yield*sr(t,s,{nonInteractive:e.nonInteractive,overwriteScripts:o.overwriteScripts});if(p&&(yield*fr(t,r.name,y)),d&&(yield*cr(t,i)),yield*lr(t,u),ee&&(yield*ur(u,s)),f){let e=r.name;He(e)?yield*dr(t,e,s):yield*n.log.warning(`Skipping GitHub Actions setup: \`${e}\` is not a supported package manager for CI workflow generation.`)}yield*n.log.success(`Your project is now configured`),yield*n.outro(`💠 Adamantite initialized successfully!`)}).pipe(n.catchTags({OperationCancelled:()=>n.gen(function*(){yield*(yield*Q).cancel(`You've cancelled the initialization process.`)})}))));const Or=u.boolean(`fix`).pipe(u.withDescription(`Automatically fix issues`));var kr=l.make(`monorepo`,{fix:Or}).pipe(l.withDescription(`Find and fix monorepo-specific issues using Sherif`),l.withHandler(({fix:e})=>n.gen(function*(){let t=yield*A,n=yield*k,r=e?[`--fix`,...t]:[...t],i=yield*n.run({args:r,command:U.name,stdin:`inherit`});i!==s.ExitCode(0)&&(yield*new E({command:U.name,exitCode:i}))}))),Ar=l.make(`typecheck`).pipe(l.withDescription("Deprecated alias for `check`"),l.withHandler(()=>n.gen(function*(){let e=yield*A,t=yield*Q,n=yield*k;yield*t.log.warning("Deprecated. Use `adamantite check` for typechecking.");let r=yield*n.run({args:[...e],command:V.name});r!==s.ExitCode(0)&&(yield*new E({command:V.name,exitCode:r}))})));const jr=[V,W,H,U,z],Mr=[V,W,H,U,z];function Nr(e,t){return c.filterMap(Mr,n=>{if(t.has(n.name))return x.failVoid;let r=e.devDependencies?.[n.name]??e.dependencies?.[n.name];return r&&Be(r)!==n.version?x.succeed({currentVersion:r,name:n.name,targetVersion:n.version}):x.failVoid})}var Pr=l.make(`update`).pipe(l.withDescription(`Run applicable Adamantite migrations and update managed dependencies`),l.withHandler(()=>n.gen(function*(){let e=ne.cwd(),t=yield*Q,r=yield*K,i={cwd:e};yield*zn(),yield*t.intro(`💠 adamantite update`);let a=t=>Ln(jr,e,t),o=yield*a(),s=new Set,l=e=>n.gen(function*(){for(let n of e)s.has(n)||(s.add(n),yield*t.log.warning(n))});yield*l(o.flatMap(({assessment:e})=>e.warnings));let u=[];for(let e of Pn.filter(e=>e.tags.includes(`update`))){let n=yield*e.check(i);yield*l(n.warnings),n.status===`needed`&&(yield*l((yield*t.withSpinner(()=>Lt(e,i),{failure:`Migration "${e.title}" failed, files restored.`,start:n.summary,success:`Migration "${e.title}" completed successfully.`})).warnings),u.push(e.id))}u.length>0&&(yield*t.log.success(`Migrations ran successfully.`));let d=yield*L(e),ee=(yield*a(d)).flatMap(({assessment:e})=>e.actions),f=ee.filter(e=>e.type===`create_config`||e.type===`update_config`||e.type===`manual_fix`),p=c.filterMap(ee,e=>{switch(e.type){case`install_package`:return x.succeed({currentVersion:`not installed`,name:e.package,targetVersion:e.targetVersion});case`update_package`:return x.succeed({currentVersion:e.currentVersion,name:e.package,targetVersion:e.targetVersion});default:return x.failVoid}}),m=new Set(p.map(e=>e.name)),h=[...p,...Nr(d,m)];if(h.length>0){yield*t.log.info(`The following dependencies will be updated:`);for(let e of h)yield*t.log.info(` ${e.name}: ${e.currentVersion} → ${e.targetVersion}`);yield*t.withSpinner(()=>r.addDevDependencies(h.map(e=>`${e.name}@${e.targetVersion}`),e,{silent:!0}),{failure:`Failed to update dependencies`,start:`Updating dependencies...`,success:`Dependencies updated successfully`}),yield*t.log.success(`Dependencies updated successfully.`)}if(f.length>0){yield*t.log.warning("Some configuration follow-up belongs to `adamantite doctor --fix`.");for(let e of f)yield*t.log.warning(`Doctor follow-up: ${e.description}`)}return u.length===0&&h.length===0&&f.length===0?(yield*t.log.success(`No changes needed.`),`no-changes`):`success`}).pipe(n.tapError(()=>n.gen(function*(){yield*(yield*Q).outro(`❌ Update failed`)})),n.tap(e=>n.gen(function*(){let t=yield*Q;switch(e){case`no-changes`:yield*t.outro(`✅ Adamantite is already up to date.`);break;case`success`:yield*t.outro(`✅ Update completed successfully!`)}})))));const Fr=[it,jt,qn,Xn,kr,Ar],Ir=[it,jt,Hn,qn,Xn,Dr,kr,Ar,Pr],Lr=new Set(Ir.map(e=>e.name)),Rr=new Set(Fr.map(e=>e.name)),zr=l.make(`adamantite`).pipe(l.withDescription(`Opinionated preset package for modern TypeScript applications`),l.withSubcommands(Ir)),Br=n.fn(`runCli`)(function*(e,t){let[r,i]=c.splitWhere(e,e=>e===`--`),a=c.drop(i,1),o=r.find(e=>Lr.has(e));if(a.length>0&&o!==void 0&&!Rr.has(o))return yield*new Ae({command:o});yield*l.runWith(zr,{version:t})(r).pipe(n.provideService(A,a))}),Vr=n.gen(function*(){let e=yield*(yield*o.Stdio).args;yield*Br(e,`0.37.0`)}).pipe(n.as(0),n.catchTag(`CommandFailed`,e=>n.succeed(e.exitCode)),n.catch(e=>n.service(Q).pipe(n.flatMap(t=>t.log.error(e.message)),n.as(s.ExitCode(1)))),n.provide(i.mergeAll(t.layer,Xt.layer.pipe(i.provide(t.layer)),Q.layer,k.layer,K.layer)));e.runMain(Vr,{teardown:(e,t)=>{if(r.isSuccess(e)){t(Number(e.value));return}a.defaultTeardown(e,t)}});export{};
111
+ `;return yield*F(n,`${r}${c}${s}`),`updated`}),ur=(e,t)=>n.gen(function*(){let r=yield*W;yield*(yield*Q).withSpinner(()=>n.gen(function*(){let n=yield*An(e);yield*r.addDevDependencies(t,e,{silent:!0,workspace:n})}),{failure:`Failed to install dependencies.`,start:`Installing dependencies...`,success:`Dependencies installed.`})});function dr(e,t,r){return n.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(a=>n.gen(function*(){let n=yield*t.detect(e);for(let e of n.warnings)yield*i.log.warning(e);return n.active===null?(yield*a.message(`\`${t.config}\` not found, creating...`),yield*r,{created:!0,legacyConfig:null}):n.active.format===`ts`?(yield*a.message(`Found \`${t.config}\`, keeping existing config.`),{created:!1,legacyConfig:null}):(yield*a.message(`Found \`${n.active.file}\`, keeping existing config.`),{created:!1,legacyConfig:n.active.file})}),{failure:`Failed to set up ${t.name} config.`,start:`Setting up ${t.name} config...`,success:e=>e.created?`${t.name} config created successfully.`:`${t.name} config is ready.`});a.legacyConfig&&(yield*i.log.info(`Legacy \`${a.legacyConfig}\` was preserved during \`adamantite init\`. Run \`adamantite doctor\` and follow its findings to migrate it to the latest ${t.name} config.`))})}const fr=e=>`\`${e.script}\` is currently \`${e.command}\`; Adamantite would replace it with \`${B[e.script]}\`.`,pr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*z(e),o=r.overwriteScripts?[]:He(a,t),s=new Set(o.map(e=>e.script)),c=t.filter(e=>!s.has(e));yield*i.withSpinner(()=>n.gen(function*(){if(c.length!==0){a.scripts??={};for(let e of c)a.scripts[e]=B[e];yield*ze(e,a)}}),{failure:"Failed to add scripts to `package.json`.",start:"Adding scripts to your `package.json`...",success:o.length===0?"Scripts added to your `package.json`":c.length===0?"Kept your existing `package.json` scripts.":"Scripts added to your `package.json`; conflicting scripts were kept."});let l=r.nonInteractive?"Use `--overwrite-scripts` to replace it.":"Re-run `adamantite init` and confirm overwriting to replace it.";for(let e of o)yield*i.log.warning(`Kept existing \`${e.script}\` script (\`${e.command}\`) instead of \`${B[e.script]}\`. ${l}`);return o.length>0&&(yield*i.log.info("Adamantite commands forward extra arguments after `--`, so custom flags can be kept, e.g. `adamantite monorepo -- --ignore-dependency tailwindcss`.")),c}),mr=(e,t)=>n.gen(function*(){let r=yield*Q;if(t){yield*h(Mn,n.forEach(e=>r.log.info(e)));return}yield*r.withSpinner(t=>n.gen(function*(){return(yield*Z.detect(e))?(yield*t.message(`\`${Z.config}\` found, updating...`),yield*Z.update(e),!1):(yield*t.message(`\`${Z.config}\` not found, creating...`),yield*Z.create(e),!0)}),{failure:`Failed to set up TypeScript config.`,start:`Setting up TypeScript config...`,success:e=>e?`\`${Z.config}\` created successfully`:`\`${Z.config}\` updated successfully`})}),hr=(e,t)=>n.gen(function*(){let r=yield*Q;t.includes(`vscode`)&&(yield*r.withSpinner(t=>n.gen(function*(){let n=yield*$.detect(e);return yield*t.message(`\`${$.config}\` ${n?`found, updating`:`not found, creating`}...`),yield*n?$.update(e):$.create(e),!n}),{failure:`Failed to set up VS Code config.`,start:`Checking for \`${$.config}\`...`,success:e=>`\`${$.config}\` ${e?`created`:`updated`} with Adamantite preset.`})),t.includes(`zed`)&&(yield*r.withSpinner(t=>n.gen(function*(){let n=yield*K.detect(e);return yield*t.message(`\`${K.config}\` ${n?`found, updating`:`not found, creating`}...`),yield*n?K.update(e):K.create(e),!n}),{failure:`Failed to set up Zed config.`,start:`Checking for \`${K.config}\`...`,success:e=>`\`${K.config}\` ${e?`created`:`updated`} with Adamantite preset.`}))}),gr=(e,t)=>n.gen(function*(){let r=yield*Q,i=e.includes(`zed`),a=e.includes(`vscode`);yield*r.withSpinner(e=>n.gen(function*(){return a&&(yield*e.message(`Installing VS Code extension...`),yield*$.extension(t)),!0}),{start:`Installing editor extensions...`,success:i&&!a?`Zed extensions require manual install.`:`Editor extensions installed successfully.`}).pipe(n.catchTag(`FailedToInstallExtension`,e=>n.gen(function*(){return yield*r.log.warning(`⚠️ ${e.message}`),yield*r.log.warning(`Please install it manually after setup completes.`),!1})),n.catchTag(`VscodeCliNotFound`,()=>n.gen(function*(){return yield*r.log.error(`VSCode CLI ('code' command) not found.`),yield*r.log.info(`To install it:`),yield*r.log.info(` 1. Open VS Code`),yield*r.log.info(` 2. Press Cmd+Shift+P (macOS) or Ctrl+Shift+P (Windows/Linux)`),yield*r.log.info(` 3. Run 'Shell Command: Install "code" command in PATH'`),!1}))),i&&(yield*r.log.info("Install the Zed `oxc` extension: zed://extension/oxc"))}),_r=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=hn.files[0].path;yield*i.withSpinner(i=>n.gen(function*(){let n=yield*hn.detect(e);return yield*i.message(n?`\`${a}\` found, updating...`:`Creating \`${a}\`...`),yield*n?hn.update(e,{packageManager:t,scripts:r}):hn.create(e,{packageManager:t,scripts:r}),!n}),{failure:`Failed to set up GitHub Actions workflow.`,start:`Setting up GitHub Actions workflow...`,success:e=>`GitHub Actions workflow ${e?`created`:`updated`} successfully.`})}).pipe(n.catchTag([`FailedToCreateDirectory`,`FailedToParseFile`,`FailedToReadFile`,`FailedToWriteFile`,`PlatformError`],e=>n.gen(function*(){let t=yield*Q;yield*t.log.warning(`Could not set up the GitHub Actions workflow. ${e.message}`),yield*t.log.warning("Fix the reported problem and run `adamantite init` again, or create the workflow manually.")}))),vr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(()=>lr(e,{packageManager:t,scripts:r}),{failure:`Failed to update AGENTS.md.`,start:`Updating AGENTS.md...`,success:`AGENTS.md check complete.`}).pipe(n.catchTag([`FailedToReadFile`,`FailedToWriteFile`],e=>n.gen(function*(){return yield*i.log.warning(`Could not update AGENTS.md. ${e.message} Adamantite will continue initialization.`),`failed`})));a!==`failed`&&a===`malformed`&&(yield*i.log.warning(`Could not update AGENTS.md because Adamantite markers are incomplete. Remove the stale ADAMANTITE marker and run adamantite init again.`))}),yr=[`check`,`fix`,`format`,`check:monorepo`,`fix:monorepo`,`analyze`],br=[`react`,`nextjs`,`vue`,`jest`,`vitest`,`node`,`antislop`],xr=[`vscode`,`zed`],Sr=n.fn(`validateInitOptions`)(function*(e,t){let n={agents:e.agents,editors:c.dedupe(e.editors),githubActions:e.githubActions,installExtensions:e.installExtensions,overwriteScripts:e.overwriteScripts,presets:c.dedupe(e.presets),scripts:c.dedupe(e.scripts),typescript:e.typescript};if(n.scripts.length===0)return yield*new k({reason:"Select at least one script with `--script <name>`."});let r=n.scripts.includes(`check`)||n.scripts.includes(`fix`);return(n.scripts.includes(`check:monorepo`)||n.scripts.includes(`fix:monorepo`))&&!t.isMonorepo?yield*new k({reason:`Monorepo scripts can only be selected in a detected monorepo.`}):n.presets.length>0&&!r?yield*new k({reason:"`--preset` requires the `check` or `fix` script."}):n.typescript&&!r?yield*new k({reason:"`--typescript` requires the `check` or `fix` script."}):n.installExtensions&&n.editors.length===0?yield*new k({reason:"`--install-extensions` requires at least one `--editor`."}):n.githubActions&&!qt(n.scripts)?yield*new k({reason:"`--github-actions` requires a CI-compatible script."}):n.githubActions&&t.nonInteractive&&!Be(t.packageManager)?yield*new k({reason:`\`--github-actions\` does not support the detected package manager \`${t.packageManager}\`. Use bun, deno, npm, pnpm, or yarn.`}):n}),Cr=u.boolean(`non-interactive`).pipe(u.withDefault(!1),u.withDescription(`Configure without prompts; requires at least one --script`)),wr=u.choice(`script`,yr).pipe(u.atMost(yr.length),u.withDescription(`Package script to configure; repeatable and required in non-interactive mode. Monorepo scripts require a detected monorepo`)),Tr=u.choice(`preset`,br).pipe(u.atMost(br.length),u.withDescription(`Oxlint preset to configure; repeatable and requires --script check or fix`)),Er=u.choice(`editor`,xr).pipe(u.atMost(xr.length),u.withDescription(`Editor to configure; may be specified multiple times`)),Dr=u.boolean(`typescript`).pipe(u.withDefault(!1),u.withDescription(`Configure the TypeScript preset; requires --script check or fix`)),Or=u.boolean(`install-extensions`).pipe(u.withDefault(!1),u.withDescription(`Install recommended extensions; requires at least one --editor`)),kr=u.boolean(`github-actions`).pipe(u.withDefault(!1),u.withDescription(`Configure CI; requires a compatible script and bun, deno, npm, pnpm, or yarn`)),Ar=u.boolean(`agents`).pipe(u.withDefault(!1),u.withDescription(`Add Adamantite guidance to AGENTS.md`)),jr=u.boolean(`overwrite-scripts`).pipe(u.withDefault(!1),u.withDescription(`Replace existing package scripts that conflict with Adamantite's managed commands`)),Mr=n.fn(`collectInteractiveInitOptions`)(function*(e,t){let n=yield*Q,r=yield*n.multiselect({message:"Which scripts do you want to add to your `package.json`?",options:[{hint:`recommended`,label:`check - find issues and type errors using oxlint`,value:`check`},{hint:`recommended`,label:`fix - fix code issues using oxlint`,value:`fix`},{hint:`recommended`,label:`format - code formatting using oxfmt`,value:`format`},{disabled:!t,hint:t?void 0:`available for monorepo projects`,label:`check:monorepo - check for monorepo-specific issues using Sherif`,value:`check:monorepo`},{disabled:!t,hint:t?void 0:`available for monorepo projects`,label:`fix:monorepo - fix monorepo-specific issues using Sherif`,value:`fix:monorepo`},{label:`analyze - find unused dependencies, exports, and files using knip`,value:`analyze`}]}),i=He(yield*z(e),r),a=!1;if(i.length>0){for(let e of i)yield*n.log.warning(fr(e));a=yield*n.confirm({initialValue:!1,message:i.length===1?`Overwrite this existing script with Adamantite's command?`:`Overwrite these existing scripts with Adamantite's commands?`})}let o=r.includes(`check`)||r.includes(`fix`),s=[];o&&(s=yield*n.multiselect({message:`Which presets do you want to install? (core is always included)`,options:[{hint:`React correctness, JSX accessibility, and render performance rules`,label:`react`,value:`react`},{hint:`Next.js pitfalls around scripts, fonts, images, and document/head usage`,label:`next.js`,value:`nextjs`},{hint:`Vue 3 correctness rules and deprecated API detection`,label:`vue`,value:`vue`},{hint:`Jest test hygiene: focused/disabled tests, matcher and snapshot discipline`,label:`jest`,value:`jest`},{hint:`Vitest test hygiene: focused/disabled tests, matcher and snapshot discipline`,label:`vitest`,value:`vitest`},{hint:`Node.js callback and CommonJS pitfalls`,label:`node`,value:`node`},{hint:`Rejects low-signal escape hatches: unjustified assertions, unknown leaks, module mocks`,label:`antislop`,value:`antislop`}],required:!1}));let c=o?yield*n.confirm({initialValue:!0,message:t?"Adamantite provides a TypeScript preset to enforce strict type-safety. In a monorepo, each package's `tsconfig.json` must extend it. Would you like instructions on how to set it up?":`Adamantite provides a TypeScript preset to enforce strict type-safety. Would you like to use it?`}):!1,l=yield*n.multiselect({message:`Which editors do you want to configure? (optional)`,options:[{label:`VSCode / Cursor / Windsurf`,value:`vscode`},{label:`Zed`,value:`zed`}],required:!1}),u=l.length>0?yield*n.confirm({initialValue:!0,message:`Do you want to install the recommended editor extensions?`}):!1,d=qt(r)?yield*n.confirm({message:`Do you want to add a GitHub Actions workflow to run checks in CI?`}):!1;return{agents:yield*n.confirm({initialValue:!0,message:`Add Adamantite guidance to AGENTS.md so coding agents know how to run project checks?`}),editors:l,githubActions:d,installExtensions:u,overwriteScripts:a,presets:s,scripts:r,typescript:c}});var Nr=l.make(`init`,{agents:Ar,editors:Er,githubActions:kr,installExtensions:Or,nonInteractive:Cr,overwriteScripts:jr,presets:Tr,scripts:wr,typescript:Dr}).pipe(l.withDescription(`Initialize Adamantite in the current directory. Setup flags require --non-interactive; omitted boolean setup flags are disabled`),l.withExamples([{command:`adamantite init --non-interactive --script check`,description:`Configure linting without prompts`},{command:`adamantite init --non-interactive --script check --script format --preset react --editor vscode --typescript --install-extensions --github-actions --agents`,description:`Configure a React project with VS Code, TypeScript, CI, and agent guidance`},{command:`adamantite init --non-interactive --script check:monorepo`,description:`Configure monorepo checks in a detected monorepo`}]),l.withHandler(e=>n.gen(function*(){let t=S.cwd(),n=yield*Q;yield*Gn(),yield*n.intro(`💠 adamantite init`);let r=yield*(yield*W).detectPackageManager(t);if(!r)return yield*new De({});if(r.warnings?.length)for(let e of r.warnings)yield*n.log.warning(e);yield*n.log.info(`Detected package manager: ${r.name}`);let i=yield*An(t);if(i&&(yield*n.log.info(`We've detected a monorepo setup in your project.`)),!e.nonInteractive&&c.some([e.scripts.length>0,e.presets.length>0,e.editors.length>0,e.typescript,e.installExtensions,e.githubActions,e.agents,e.overwriteScripts],_.isTruthy))return yield*new k({reason:"Setup flags require `--non-interactive`."});let a=e.nonInteractive?e:yield*Mr(t,i),o=yield*Sr(a,{isMonorepo:i,nonInteractive:e.nonInteractive,packageManager:r.name}),s=o.scripts,l=o.presets,u=o.editors,d=o.typescript,f=o.installExtensions,p=o.githubActions,m=o.agents,h=s.includes(`check`)||s.includes(`fix`),g=s.includes(`format`),v=s.includes(`check:monorepo`)||s.includes(`fix:monorepo`),ee=s.includes(`analyze`),y=[`adamantite`];h&&y.push(`${U.name}@${U.version}`,`${En.name}@${En.version}`),g&&y.push(`${q.name}@${q.version}`),v&&y.push(`${J.name}@${J.version}`),ee&&y.push(`${V.name}@${V.version}`),yield*ur(t,y),g&&(yield*dr(t,q,q.create(t))),h&&(yield*dr(t,U,U.create(t,l))),ee&&(yield*dr(t,V,V.create(t)));let b=yield*pr(t,s,{nonInteractive:e.nonInteractive,overwriteScripts:o.overwriteScripts});if(m&&(yield*vr(t,r.name,b)),d&&(yield*mr(t,i)),yield*hr(t,u),f&&(yield*gr(u,s)),p){let e=r.name;Be(e)?yield*_r(t,e,s):yield*n.log.warning(`Skipping GitHub Actions setup: \`${e}\` is not a supported package manager for CI workflow generation.`)}yield*n.log.success(`Your project is now configured`),yield*n.outro(`💠 Adamantite initialized successfully!`)}).pipe(n.catchTags({OperationCancelled:()=>n.gen(function*(){yield*(yield*Q).cancel(`You've cancelled the initialization process.`)})}))));const Pr=u.boolean(`fix`).pipe(u.withDefault(!1),u.withDescription(`Automatically fix issues`));var Fr=l.make(`monorepo`,{fix:Pr}).pipe(l.withDescription(`Find and fix monorepo-specific issues using Sherif`),l.withHandler(({fix:e})=>n.gen(function*(){let t=yield*j,n=yield*A,r=e?[`--fix`,...t]:[...t],i=yield*n.run({args:r,command:J.name,stdin:`inherit`});i!==s.ExitCode(0)&&(yield*new O({command:J.name,exitCode:i}))})));const Ir=[U,En,q,J,V];function Lr(e,t){return c.filterMap(Ir,n=>{if(t.has(n.name))return C.failVoid;let r=e.devDependencies?.[n.name]??e.dependencies?.[n.name];return r&&Re(r)!==n.version?C.succeed({currentVersion:r,name:n.name,targetVersion:n.version}):C.failVoid})}var Rr=l.make(`update`).pipe(l.withDescription(`Update Adamantite-managed dependencies and report setup findings`),l.withHandler(()=>n.gen(function*(){let e=S.cwd(),t=yield*Q,n=yield*W;yield*Gn(),yield*t.intro(`💠 adamantite update`);let r=yield*z(e),i=yield*Ln(e,r),a=i.packageActions,o=new Set(a.map(e=>e.package)),s=[...a.map(e=>({currentVersion:e.type===`install_package`?`not installed`:e.currentVersion,name:e.package,targetVersion:e.targetVersion})),...Lr(r,o)];if(s.length>0){yield*t.log.info(`The following dependencies will be updated:`);for(let e of s)yield*t.log.info(` ${e.name}: ${e.currentVersion} → ${e.targetVersion}`);yield*t.withSpinner(()=>n.addDevDependencies(s.map(e=>`${e.name}@${e.targetVersion}`),e,{silent:!0}),{failure:`Failed to update dependencies`,start:`Updating dependencies...`,success:`Dependencies updated successfully`}),yield*t.log.success(`Dependencies updated successfully.`)}let c=s.length===0?i:yield*Ln(e);for(let e of c.warnings)yield*t.log.warning(e);let l=c.findings;return l.length>0&&(yield*Un(l),yield*t.log.info("Run `adamantite doctor` to get the combined Markdown repair prompt.")),s.length===0&&l.length===0?(yield*t.log.success(`No changes needed.`),`no-changes`):`success`}).pipe(n.tapError(()=>n.gen(function*(){yield*(yield*Q).outro(`❌ Update failed`)})),n.tap(e=>n.gen(function*(){yield*(yield*Q).outro(e===`no-changes`?`✅ Adamantite is already up to date.`:`✅ Update completed successfully!`)})))));const zr=[lt,Lt,$n,nr,Fr],Br=[lt,Lt,Jn,$n,nr,Nr,Fr,Rr],Vr=new Set(Br.map(e=>e.name)),Hr=new Set(zr.map(e=>e.name)),Ur=l.make(`adamantite`).pipe(l.withDescription(`Opinionated preset package for modern TypeScript applications`),l.withSubcommands(Br)),Wr=n.fn(`runCli`)(function*(e,t){let[r,i]=c.splitWhere(e,e=>e===`--`),a=c.drop(i,1),o=r.find(e=>Vr.has(e));if(a.length>0&&o!==void 0&&!Hr.has(o))return yield*new ke({command:o});yield*l.runWith(Ur,{version:t})(r).pipe(n.provideService(j,a))}),Gr=n.gen(function*(){let e=yield*(yield*o.Stdio).args;yield*Wr(e,`0.38.0`)}).pipe(n.as(0),n.catchTag(`CommandFailed`,e=>n.succeed(e.exitCode)),n.catch(e=>n.service(Q).pipe(n.flatMap(t=>t.log.error(e.message)),n.as(s.ExitCode(1)))),n.provide(i.mergeAll(t.layer,rn.layer.pipe(i.provide(t.layer)),Q.layer,A.layer,W.layer,Vn.layer)));e.runMain(Gr,{teardown:(e,t)=>{if(r.isSuccess(e)){t(Number(e.value));return}a.defaultTeardown(e,t)}});export{};
@@ -5,6 +5,7 @@ const config = {
5
5
  bracketSpacing: true,
6
6
  embeddedLanguageFormatting: "auto",
7
7
  endOfLine: "lf",
8
+ experimentalOperatorPosition: "start",
8
9
  htmlWhitespaceSensitivity: "css",
9
10
  insertFinalNewline: true,
10
11
  jsdoc: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adamantite",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "description": "An strict and opinionated set of presets for modern TypeScript applications",
5
5
  "keywords": [
6
6
  "adamantite",
@@ -58,25 +58,25 @@
58
58
  },
59
59
  "dependencies": {
60
60
  "@clack/prompts": "1.7.0",
61
- "@effect/platform-node": "4.0.0-rc.108",
61
+ "@effect/platform-node": "4.0.0-rc.112",
62
62
  "defu": "6.1.7",
63
- "effect": "4.0.0-rc.108",
64
- "esrap": "2.3.2",
63
+ "effect": "4.0.0-rc.112",
64
+ "esrap": "2.3.6",
65
65
  "jsonc-parser": "3.3.1",
66
66
  "nypm": "0.6.9",
67
- "oxc-parser": "^0.144.0"
67
+ "oxc-parser": "^0.147.0"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@changesets/changelog-github": "1.0.0",
71
- "@changesets/cli": "3.0.0",
72
- "@effect/vitest": "4.0.0-rc.108",
73
- "@tanstack/intent": "0.3.6",
71
+ "@changesets/cli": "3.0.1",
72
+ "@effect/vitest": "4.0.0-rc.112",
73
+ "@tanstack/intent": "0.3.7",
74
74
  "@types/figlet": "1.7.0",
75
75
  "@types/node": "22.20.1",
76
- "@vitest/coverage-v8": "4.1.10",
76
+ "@vitest/coverage-v8": "4.1.11",
77
77
  "figlet": "1.11.4",
78
78
  "knip": "6.32.2",
79
- "oxfmt": "0.63.0",
79
+ "oxfmt": "0.65.0",
80
80
  "oxlint": "1.79.0",
81
81
  "oxlint-tsgolint": "7.0.2001",
82
82
  "sherif": "1.13.0",
@@ -84,7 +84,7 @@
84
84
  "type-fest": "5.8.0",
85
85
  "typescript": "7.0.2",
86
86
  "unplugin-macros": "0.23.2",
87
- "vitest": "4.1.10"
87
+ "vitest": "4.1.11"
88
88
  },
89
89
  "peerDependencies": {
90
90
  "typescript": ">=7"
@@ -96,15 +96,17 @@
96
96
  "scripts": {
97
97
  "analyze": "knip",
98
98
  "build": "tsdown",
99
- "bump:deps": "pnpm update --interactive",
99
+ "bump:deps": "pnpm update --interactive --latest",
100
100
  "check": "oxlint",
101
101
  "dev": "tsdown --watch",
102
102
  "fix": "oxlint --fix",
103
103
  "format": "oxfmt",
104
104
  "release": "changeset publish",
105
105
  "test": "vitest run",
106
- "test:build": "pnpm run build && node scripts/test-build.ts",
106
+ "test:build": "node scripts/test-build.ts",
107
107
  "test:coverage": "vitest run --coverage",
108
+ "test:dist": "pnpm run build && pnpm run test:build && pnpm run test:smoke",
109
+ "test:smoke": "node scripts/test-smoke.ts",
108
110
  "test:watch": "vitest",
109
111
  "version": "changeset version"
110
112
  }
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: adamantite
3
- description: Configures and maintains Adamantite linting, formatting, type-safety, analysis, editor, and CI tooling in TypeScript projects. Use when initializing Adamantite, running its checks, repairing a broken or drifted setup, or updating and migrating an existing installation.
3
+ description: Configures and maintains Adamantite linting, formatting, type-safety, analysis, editor, and CI tooling in TypeScript projects. Use when initializing Adamantite, running its checks, updating managed dependencies, or following Doctor findings in an existing installation.
4
4
  metadata:
5
5
  type: core
6
6
  library: adamantite
7
- library_version: "0.34.0"
7
+ library_version: "0.37.0"
8
8
  sources:
9
9
  - "adelrodriguez/adamantite:src/cli.ts"
10
10
  - "adelrodriguez/adamantite:src/commands/*.ts"
@@ -72,42 +72,35 @@ bun run analyze -- -- --directory packages/app
72
72
 
73
73
  ## Diagnose and repair
74
74
 
75
- Start with the read-only assessment:
75
+ Run the read-only assessment:
76
76
 
77
77
  ```shell
78
78
  adamantite doctor
79
79
  ```
80
80
 
81
- If it reports safe automatic actions, apply them and reassess:
81
+ Follow each finding. Doctor supplies the current state, the goal criteria, reference
82
+ content when needed, and the verification command. In an interactive terminal, Doctor
83
+ offers to hand off to an installed coding agent CLI, or to copy the combined Markdown prompt. In a
84
+ non-interactive run — the path an agent uses — Doctor prints Markdown directly. Findings
85
+ produce a repair prompt and exit 1. Assessment warnings alone produce a warning report
86
+ and exit 0. Run `adamantite doctor` again until it exits 0.
82
87
 
83
- ```shell
84
- adamantite doctor --fix
85
- adamantite doctor
86
- ```
87
-
88
- `doctor --fix` is the mutating repair dispatcher. It installs or updates managed packages,
89
- creates or updates supported configs, and runs known migrations. Manual-fix findings remain
90
- report-only; follow their instructions instead of overwriting custom configuration.
91
-
92
- ## Update and migrate
88
+ ## Update
93
89
 
94
90
  For an existing installation, run:
95
91
 
96
92
  ```shell
97
93
  adamantite update
98
- adamantite doctor --fix
99
94
  adamantite doctor
100
95
  ```
101
96
 
102
- `update` runs applicable legacy migrations and updates Adamantite-managed dependencies. It
103
- may leave supported config creation, config updates, or manual work to `doctor --fix`.
104
- Migrations restore affected files if they fail; still review the resulting diff and run the
105
- project's tests after any mutation.
97
+ `update` updates Adamantite-managed dependencies. It then reports any remaining doctor
98
+ findings. Follow those findings and review the resulting diff.
106
99
 
107
100
  ## Decision guide
108
101
 
109
102
  - New target project: `init`, then run the configured checks.
110
- - Suspected drift or broken setup: `doctor`, then `doctor --fix` if appropriate.
103
+ - Suspected drift or broken setup: run `doctor` and follow its findings.
111
104
  - Existing project upgrading Adamantite: `update`, then the doctor sequence.
112
105
  - Code-quality failure: choose `check`, `format --check`, `analyze`, or `monorepo` based on
113
106
  the failing subsystem; do not reinitialize the project.