adamantite 0.40.0 → 0.41.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/README.md CHANGED
@@ -52,7 +52,6 @@ and agent guidance. After setup, use the scripts written to `package.json`:
52
52
  ```sh
53
53
  bun run check
54
54
  bun run fix
55
- bun run format
56
55
  bun run analyze
57
56
  ```
58
57
 
@@ -62,9 +61,7 @@ scripts:
62
61
  ```sh
63
62
  adamantite check
64
63
  adamantite fix
65
- adamantite format
66
64
  adamantite analyze
67
- adamantite monorepo
68
65
  ```
69
66
 
70
67
  ## Non-interactive setup
@@ -77,7 +74,6 @@ npx adamantite init \
77
74
  --non-interactive \
78
75
  --script check \
79
76
  --script fix \
80
- --script format \
81
77
  --script analyze \
82
78
  --preset react \
83
79
  --editor vscode \
@@ -89,19 +85,20 @@ npx adamantite init \
89
85
 
90
86
  Available setup values:
91
87
 
92
- - Scripts: `check`, `fix`, `format`, `analyze`, `check:monorepo`, and `fix:monorepo`.
88
+ - Scripts: `check`, `fix`, and `analyze`. In a detected monorepo, `analyze` also installs
89
+ Sherif. The legacy `check:monorepo` and `fix:monorepo` values are rejected.
93
90
  - Presets: `react`, `nextjs`, `vue`, `jest`, `vitest`, and `node`.
94
91
  - Editors: `vscode` and `zed`.
95
92
 
96
93
  Presets and TypeScript require the `check` or `fix` script. Editor extension installation
97
- requires an editor. Monorepo scripts require a detected monorepo. GitHub Actions requires a
98
- compatible script and a supported package manager. Omitted boolean flags are disabled.
94
+ requires an editor. GitHub Actions requires a compatible script and a supported package
95
+ manager. Omitted boolean flags are disabled.
99
96
 
100
97
  Existing package scripts whose commands differ from Adamantite's are kept and reported
101
98
  instead of being replaced. The interactive initializer asks before overwriting them; in
102
99
  non-interactive mode, pass `--overwrite-scripts` to replace them. To keep custom flags,
103
100
  forward them to the Adamantite command after `--`, e.g.
104
- `adamantite monorepo -- --ignore-dependency tailwindcss`.
101
+ `adamantite analyze -- --directory packages/app`.
105
102
 
106
103
  In a detected monorepo, TypeScript setup does not write a root `tsconfig.json`, because a
107
104
  catch-all root config makes TypeScript treat all packages as one project. Adamantite
@@ -114,7 +111,7 @@ Run `adamantite --help` or `adamantite <command> --help` for the complete CLI re
114
111
 
115
112
  ### `adamantite check`
116
113
 
117
- Find lint and type errors without changing files:
114
+ Find formatting, lint, and type errors without changing files:
118
115
 
119
116
  ```sh
120
117
  adamantite check
@@ -123,7 +120,7 @@ adamantite check src
123
120
 
124
121
  ### `adamantite fix`
125
122
 
126
- Apply safe Oxlint fixes. Suggested and dangerous fixes require explicit flags:
123
+ Apply safe Oxlint fixes, then format the files with Oxfmt. Suggested and dangerous fixes require explicit flags:
127
124
 
128
125
  ```sh
129
126
  adamantite fix
@@ -132,35 +129,51 @@ adamantite fix --dangerous
132
129
  adamantite fix --all
133
130
  ```
134
131
 
135
- ### `adamantite format`
132
+ ### `adamantite format` (deprecated)
136
133
 
137
- Format files with Oxfmt, or check formatting without writing:
138
-
139
- ```sh
140
- adamantite format
141
- adamantite format src/index.ts
142
- adamantite format --check
143
- ```
134
+ `adamantite format` is deprecated and prints a warning. The next release removes it. Use
135
+ `adamantite fix` to apply formatting and `adamantite check` to verify formatting.
144
136
 
145
137
  ### `adamantite analyze`
146
138
 
147
- Find unused dependencies, exports, and files with Knip. The `--fix` option can remove
139
+ Find unused dependencies, exports, and files with Knip. In a detected monorepo, `analyze`
140
+ first finds dependency consistency problems with Sherif. The `--fix` option can remove
148
141
  unused files, so review its effect before use.
149
142
 
150
143
  ```sh
151
144
  adamantite analyze
152
145
  adamantite analyze --strict
153
146
  adamantite analyze --fix
147
+ adamantite analyze --only unused
148
+ adamantite analyze --only monorepo --fix -- --select highest
154
149
  ```
155
150
 
156
- ### `adamantite monorepo`
157
-
158
- Find dependency consistency problems in a monorepo with Sherif:
159
-
160
- ```sh
161
- adamantite monorepo
162
- adamantite monorepo --fix
163
- ```
151
+ - The `monorepo` stage (Sherif) runs first, and only in a detected monorepo. The `unused`
152
+ stage (Knip) always runs.
153
+ - Without `--fix`, both stages run and the exit code comes from the first failure. With
154
+ `--fix`, a Sherif failure skips Knip, because Knip must not remove code against a
155
+ dependency graph that Sherif did not repair.
156
+ - `--fix` applies to each stage that runs. `--strict` applies to Knip only.
157
+ - `--only monorepo` or `--only unused` runs one stage. `--only monorepo` fails outside a
158
+ monorepo and with `--strict`.
159
+ - Arguments after `--` go to Knip, or to the stage that `--only` selects.
160
+ - `analyze` runs Sherif without flags. Put project exceptions in the `sherif` field of the
161
+ root `package.json`, which Sherif reads. The keys are the Sherif CLI options in camelCase:
162
+ `ignoreDependency`, `ignoreRule`, `ignorePackage`, `select`, `noInstall`, and
163
+ `failOnWarnings`. For example: `"sherif": { "ignoreDependency": ["tailwindcss"] }`.
164
+ - A Sherif fix that must choose between versions prompts in a terminal. Without a terminal,
165
+ set `"sherif": { "select": "highest" }` in the root `package.json`, or run
166
+ `adamantite analyze --only monorepo --fix -- --select highest`.
167
+ - Use `--fix` locally, not in CI. Sherif refuses to fix in a CI environment (for example when
168
+ `CI` is set), so `analyze --fix` fails there in a monorepo. CI runs `adamantite analyze`
169
+ without `--fix`.
170
+
171
+ ### `adamantite monorepo` (deprecated)
172
+
173
+ `adamantite monorepo` is deprecated and prints a warning with the replacement command. The
174
+ next release removes it. Use `adamantite analyze`, or `adamantite analyze --only monorepo`
175
+ to run only Sherif. `adamantite doctor` reports the legacy `check:monorepo` and
176
+ `fix:monorepo` scripts and says how to remove them.
164
177
 
165
178
  ### `adamantite doctor`
166
179
 
@@ -207,8 +220,7 @@ Commands that invoke Knip, Oxlint, Oxfmt, or Sherif forward arguments after `--`
207
220
  ```sh
208
221
  adamantite analyze --strict -- --directory packages/app
209
222
  adamantite check src -- --deny-warnings
210
- adamantite format -- --ignore-path .formatignore
211
- adamantite monorepo -- --ignore-package package-a
223
+ adamantite analyze --only monorepo -- --ignore-package package-a
212
224
  ```
213
225
 
214
226
  Package managers consume one separator, so package scripts need a second one:
@@ -236,7 +248,7 @@ Adamantite publishes configuration that can also be consumed directly:
236
248
  | `adamantite/lint/vitest` | Vitest rules. |
237
249
  | `adamantite/lint/antislop` | Vendored [anti-slop](https://github.com/dmmulroy/anti-slop) rules that reject low-evidence, low-signal patterns. Also turns off `typescript/consistent-indexed-object-style` and `unicorn/no-immediate-mutation` from the core preset, which conflict with these rules. |
238
250
  | `adamantite/format` | Oxfmt configuration. |
239
- | `adamantite/analyze` | Knip configuration. |
251
+ | `adamantite/analyze` | Knip configuration. The `ignoreDependencies` named export groups suggested ignore lists; `init` sets `ignoreDependencies.monorepo` in a monorepo. |
240
252
  | `adamantite/typescript` | Strict TypeScript configuration for TS 7+. |
241
253
 
242
254
  When consuming the lint presets directly, hoist the core preset's ignore patterns onto the
@@ -265,8 +277,7 @@ Configs generated by `adamantite init` include this automatically.
265
277
  them.
266
278
  - Adamantite manages recognized package scripts and supported configuration shapes. It
267
279
  reports custom configurations that require manual work instead of overwriting them.
268
- - `fix`, `format`, `analyze --fix`, `monorepo --fix`, `init`, and `update` can change
269
- project files. Doctor is read-only.
280
+ - `fix`, `analyze --fix`, `init`, and `update` can change project files. Doctor is read-only.
270
281
 
271
282
  ## Agent skill
272
283
 
package/dist/index.js CHANGED
@@ -1,19 +1,24 @@
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 ne from"effect/Result";import{defu as re}from"defu";import{Visitor as ie,parseSync as ae}from"oxc-parser";import*as C from"effect/unstable/cli/Argument";import*as oe from"effect/Order";import{print as se}from"esrap";import ce from"esrap/languages/ts";import{addDevDependency as le,detectPackageManager as ue,runScriptCommand as de}from"nypm";import*as w from"effect/Schema";import*as T from"@clack/prompts";import*as fe from"effect/Console";import*as pe from"effect/Terminal";function me(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 E(e){return h(me(e),c.head,g.map(e=>{let t=v.trim(e);return/[.!?]$/.test(t)?` Cause: ${t}`:` Cause: ${t}.`}),g.getOrElse(()=>``))}function he(e){let t=me(e);if(!c.isReadonlyArrayNonEmpty(t))return``;let n=c.takeRight(t,20);return`\n${(n.length<t.length?[`…`,...n]:n).join(`
2
- `)}`}function ge(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 _e=class extends m.TaggedError(`CliNotFound`){get message(){return`Command \`${this.command}\` not found. Please install it and try again.`}},D=class extends m.TaggedError(`CommandFailed`){get message(){return`Command \`${this.command}\` failed with exit code ${this.exitCode}.`}},ve=class extends m.TaggedError(`FailedToCreateDirectory`){get message(){return`Failed to create directory ${this.path?`\`${this.path}\``:`the target directory`}.${E(this.cause)}`}},ye=class extends m.TaggedError(`FailedToInstallDependency`){get message(){return`Failed to install dependencies${this.packages?.length?`: ${this.packages.join(`, `)}`:``}.${he(this.cause)}`}},be=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}.${E(this.cause)}`}},xe=class extends m.TaggedError(`FailedToMergeConfig`){get message(){return`Failed to merge configuration.${E(this.cause)}`}},Se=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:`,ge(this.errors)].join(`
4
- `)}},Ce=class extends m.TaggedError(`FailedToReadFile`){get message(){return`Failed to read ${this.path?`\`${this.path}\``:`the target file`}.${E(this.cause)}`}},we=class extends m.TaggedError(`FailedToWriteFile`){get message(){return`Failed to write ${this.path?`\`${this.path}\``:`the target file`}.${E(this.cause)}`}},Te=class extends m.TaggedError(`FileNotFound`){get message(){return this.path?`File not found: \`${this.path}\`.`:`File not found.`}},Ee=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: {}).`}},O=class extends m.TaggedError(`InvalidInitOptions`){get message(){return`Invalid init options. ${this.reason}`}},De=class extends m.TaggedError(`UnsupportedConfigState`){get message(){return`Unsupported config state in ${this.path?`\`${this.path}\``:`the target config file`}.${this.reason?` ${this.reason}`:``}`}},Oe=class extends m.TaggedError(`NoPackageManager`){get message(){return`No package manager detected. Please run this command from a project with a lockfile.${E(this.cause)}`}};m.TaggedError(`MissingPackageVersion`);var ke=class extends m.TaggedError(`OperationCancelled`){get message(){return`Operation cancelled.${this.reason?` Reason: ${this.reason}`:``}`}},Ae=class extends m.TaggedError(`PassthroughNotSupported`){get message(){return`Command \`adamantite ${this.command}\` does not invoke a single underlying CLI and cannot accept passthrough arguments.`}},je=class extends m.TaggedError(`VscodeCliNotFound`){get message(){return`VS Code CLI (\`code\`) not found. Please install it to manage extensions.${E(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,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 _e({command:t}):e))})})};const A=d.Reference(`adamantite/ForwardedArguments`,{defaultValue:()=>[]});function j(e){return e}const Me=e=>b.FileSystem.pipe(n.flatMap(t=>t.makeDirectory(e,{recursive:!0})),n.mapError(t=>new ve({cause:t,path:e}))),M=e=>b.FileSystem.pipe(n.flatMap(t=>t.readFileString(e)),n.mapError(t=>new Ce({cause:t,path:e}))),N=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 Ce({cause:t,path:e})))),P=(e,t)=>b.FileSystem.pipe(n.flatMap(n=>n.writeFileString(e,t)),n.mapError(t=>new we({cause:t,path:e}))),F=(e,t)=>P(e,`${JSON.stringify(t,null,2)}\n`),I=(e,t)=>n.suspend(()=>{let r=[],i=ee(e,r,{allowTrailingComma:!0});return r.length>0?n.fail(new Se({errors:r,path:t})):n.succeed(i)}),L=e=>_.isObject(e),Ne=e=>Array.isArray(e);function Pe(e){return e===`__proto__`?`["__proto__"]`:/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function Fe(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 Ie=(e,t)=>n.try({catch:e=>new xe({cause:e}),try:()=>re(e,t)}),Le=/^workspace:/,Re=/^[\^~]/;function ze(e){return e.trim().replace(Le,``).replace(Re,``)}const R=(e=S.cwd())=>n.gen(function*(){let t=(yield*x.Path).join(e,`package.json`),n=yield*M(t);return yield*I(n,t)}),Be=(e,t)=>n.gen(function*(){let n=yield*x.Path;yield*F(n.join(e,`package.json`),t)});function Ve(e){return e===`bun`||e===`deno`||e===`npm`||e===`pnpm`||e===`yarn`}const z={analyze:`adamantite analyze`,check:`adamantite check`,"check:monorepo":`adamantite monorepo`,fix:`adamantite fix`,"fix:monorepo":`adamantite monorepo --fix`,format:`adamantite format`};function He(e){let t=e.scripts??{};return h(te.keys(z),c.filter(e=>t[e]===z[e]))}function Ue(e,t){let n=e.scripts??{};return c.filterMap(t,e=>{let t=n[e];return t!==void 0&&t!==``&&t!==z[e]?ne.succeed({command:t,script:e}):ne.failVoid})}function We(e){return e.endsWith(`.jsonc`)?`jsonc`:e.endsWith(`.json`)?`json`:`ts`}function Ge(e,t){return c.findFirst(e.legacyConfigs,e=>We(e)===t)}function Ke(e){let t=Ge(e,`json`),n=Ge(e,`jsonc`);return h(g.zipWith(t,n,e=>`${e}(c)`),g.orElse(()=>n),g.orElse(()=>t),g.getOrElse(()=>``))}function qe(e,t,n,r){return n===null||r.length===0?[]:n.format===`ts`?[`Found both \`${t.config}\` and \`${Ke(t)}\`. Adamantite will use \`${t.config}\`.`]:h(g.zipWith(Ge(t,`json`),Ge(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 Je=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:We(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:qe(t,r,u,d)}});function Ye(e,t,n){let r=e.devDependencies?.[t.name]??e.dependencies?.[t.name];return r?ze(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 Xe(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 Ze(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 Qe(e,t){let n=He(e);return t.some(e=>n.includes(e))}function $e(e){return j({assess:(t,r)=>n.sync(()=>{if(!Qe(r,e.scripts))return{applicable:!1,warnings:[]};let t=Ye(r,e,e.purpose);return{applicable:!0,findings:Xe(t,e.name),packageActions:t,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=>Je(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),a=Ye(i,e,e.purpose),o=e.configContent(),s=n.active?.format===`ts`?e.inspectConfig(yield*M(n.active.path)):void 0;return{applicable:!0,findings:[...Xe(a,e.name),...Ze(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*P(n.join(t,e.configFiles.config),e.configContent())}),detect:r,files:t,kind:`tooling`,name:e.name,version:e.version})}function tt(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 nt(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 rt(e,t,n){let r=!1;return new ie({Identifier:e=>{e.start>=n.start&&e.end<=n.end&&e.name===t&&(r=!0)}}).visit(e),r}function it(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 rt(e,t,r);if(r.name===t)return!0;let i=nt(e,r.name);return i!==null&&rt(e,t,i)}function at(e,t){let n=ae(`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=tt(n.program,t.moduleName);return r?it(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 ot(e){return at(e,{moduleName:`adamantite/analyze`,presetName:`Adamantite analyze`})}function st(e={}){let t=Object.entries(e).map(([e,t])=>e===`rules`&&L(t)?[` rules: {`,` ...analyze.rules,`,...Object.entries(t).map(([e,t])=>` ${Pe(e)}: ${Fe(t,{continuationIndent:` `,indentation:` `})},`),` },`].join(`
6
- `):` ${Pe(e)}: ${Fe(t)},`);return t.length===0?[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = analyze`,``,`export default config`,``].join(`
7
- `):[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = {`,` ...analyze,`,...t,`}`,``,`export default config`,``].join(`
8
- `)}var B=et({configContent:()=>st(),configFiles:{config:`knip.config.ts`,legacyConfigs:[`knip.json`,`knip.jsonc`]},inspectConfig:ot,name:`knip`,purpose:"the managed `analyze` script",scripts:[`analyze`],version:`6.32.2`});const ct=u.Boolean(`fix`).pipe(u.withDefault(!1),u.withDescription(`Automatically fix issues`)),lt=u.Boolean(`strict`).pipe(u.withDefault(!1),u.withDescription(`Enable strict mode`));var ut=l.make(`analyze`,{fix:ct,strict:lt}).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:B.name});a!==s.ExitCode(0)&&(yield*new D({command:B.name,exitCode:a}))})));const dt=`**/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(`,`),ft=[`respectEslintDisableDirectives`,`typeAware`,`typeCheck`],pt="`oxlint.config.ts` must export an object literal directly, with or without `defineConfig(...)`, for Adamantite to patch `options` safely.",mt="`oxlint.config.ts` has an `options` property, but it is not an object literal that Adamantite can patch safely.",ht="`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 gt(e=[]){return e.includes(`core`)?e:[`core`,...e]}function _t(e){return e.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase())}const vt=oe.mapInput(oe.String,e=>e[0]);function yt(e){let t=(c.isArray(e)?e:[]).filter(e=>_.isString(e)).filter(e=>!dt.includes(e));return t.length===0?`core.ignorePatterns`:`[...core.ignorePatterns, ${t.map(e=>JSON.stringify(e)).join(`, `)}]`}function bt(e,t,n=[]){let{ignorePatterns:r,options:i,...a}=e,o=[`import { defineConfig } from "oxlint"`,...t.map(e=>`import ${_t(e)} from "${e===`core`?`adamantite/lint`:`adamantite/lint/${e}`}"`)],s=[...t.map(e=>_t(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),vt)),null,2),d=Object.entries(a).map(([e,t])=>[e,JSON.stringify(t,null,2)]),f=[[`extends`,`[${s.join(`, `)}]`],[`ignorePatterns`,yt(r)],[`options`,u],...d],p=c.sort(f,vt).map(([e,t])=>` ${e}: ${t},`).join(`
1
+ import*as e from"@effect/platform-node/NodeRuntime";import*as t from"effect/Effect";import*as n from"effect/Exit";import*as r from"effect/Runtime";import*as i from"effect/Stdio";import*as a from"effect/unstable/process/ChildProcessSpawner";import*as o from"@effect/platform-node/NodeServices";import*as s from"effect/Array";import*as c from"effect/Layer";import*as l from"effect/unstable/cli/Command";import*as u from"effect/Option";import*as d from"effect/unstable/cli/Flag";import f from"node:process";import{stripVTControlCharacters as p,styleText as m}from"node:util";import*as h from"effect/Console";import*as g from"effect/Context";import*as _ from"effect/Result";import*as ee from"effect/unstable/process/ChildProcess";import*as v from"effect/Data";import{pipe as y}from"effect/Function";import*as b from"effect/Predicate";import*as x from"effect/String";import{parse as te,printParseErrorCode as ne}from"jsonc-parser";import*as S from"effect/FileSystem";import*as C from"effect/Path";import*as re from"effect/Record";import{defu as ie}from"defu";import*as ae from"effect/Order";import{Visitor as oe,parseSync as se}from"oxc-parser";import*as w from"effect/unstable/cli/Argument";import{print as ce}from"esrap";import le from"esrap/languages/ts";import{addDevDependency as ue,detectPackageManager as de,runScriptCommand as fe}from"nypm";import*as T from"effect/Schema";import*as E from"@clack/prompts";import*as pe from"effect/Terminal";function me(e){return b.isError(e)?y(p(e.message),x.split(/\r\n|[\r\n]/),s.map(e=>x.trimEnd(e)),s.filter(e=>x.isNonEmpty(e))):[]}function D(e){return y(me(e),s.head,u.map(e=>{let t=x.trim(e);return/[.!?]$/.test(t)?` Cause: ${t}`:` Cause: ${t}.`}),u.getOrElse(()=>``))}function he(e){let t=me(e);if(!s.isReadonlyArrayNonEmpty(t))return``;let n=s.takeRight(t,20);return`\n${(n.length<t.length?[`…`,...n]:n).join(`
2
+ `)}`}function ge(e=[]){return e.length===0?`- Unknown JSON/JSONC parsing error`:e.slice(0,3).map(e=>`- ${ne(e.error)} (offset: ${e.offset})`).join(`
3
+ `)}var _e=class extends v.TaggedError(`CliNotFound`){get message(){return`Command \`${this.command}\` not found. ${this.hint??`Please install it and try again.`}`}},O=class extends v.TaggedError(`CommandFailed`){get message(){return`Command \`${this.command}\` failed with exit code ${this.exitCode}.`}},ve=class extends v.TaggedError(`FailedToCreateDirectory`){get message(){return`Failed to create directory ${this.path?`\`${this.path}\``:`the target directory`}.${D(this.cause)}`}},ye=class extends v.TaggedError(`FailedToInstallDependency`){get message(){return`Failed to install dependencies${this.packages?.length?`: ${this.packages.join(`, `)}`:``}.${he(this.cause)}`}},be=class extends v.TaggedError(`FailedToInstallExtension`){get message(){let e=this.extension?`\`${this.extension}\``:`the target extension`;return b.isNumber(this.cause)?`Failed to install ${e}. The \`code\` CLI exited with code ${this.cause}.`:`Failed to install ${e}.${D(this.cause)}`}},xe=class extends v.TaggedError(`FailedToMergeConfig`){get message(){return`Failed to merge configuration.${D(this.cause)}`}},Se=class extends v.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:`,ge(this.errors)].join(`
4
+ `)}},Ce=class extends v.TaggedError(`FailedToReadFile`){get message(){return`Failed to read ${this.path?`\`${this.path}\``:`the target file`}.${D(this.cause)}`}},we=class extends v.TaggedError(`FailedToWriteFile`){get message(){return`Failed to write ${this.path?`\`${this.path}\``:`the target file`}.${D(this.cause)}`}},Te=class extends v.TaggedError(`FileNotFound`){get message(){return this.path?`File not found: \`${this.path}\`.`:`File not found.`}},Ee=class extends v.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: {}).`}},De=class extends v.TaggedError(`InvalidAnalyzeOptions`){get message(){return`Invalid analyze options. ${this.reason}`}},k=class extends v.TaggedError(`InvalidInitOptions`){get message(){return`Invalid init options. ${this.reason}`}},Oe=class extends v.TaggedError(`UnsupportedConfigState`){get message(){return`Unsupported config state in ${this.path?`\`${this.path}\``:`the target config file`}.${this.reason?` ${this.reason}`:``}`}},ke=class extends v.TaggedError(`NoPackageManager`){get message(){return`No package manager detected. Please run this command from a project with a lockfile.${D(this.cause)}`}};v.TaggedError(`MissingPackageVersion`);var Ae=class extends v.TaggedError(`OperationCancelled`){get message(){return`Operation cancelled.${this.reason?` Reason: ${this.reason}`:``}`}},je=class extends v.TaggedError(`PassthroughNotSupported`){get message(){return`Command \`adamantite ${this.command}\` does not invoke a single underlying CLI and cannot accept passthrough arguments.`}},Me=class extends v.TaggedError(`VscodeCliNotFound`){get message(){return`VS Code CLI (\`code\`) not found. Please install it to manage extensions.${D(this.cause)}`}};const Ne=(e,t)=>h.log(`${m(`bold`,e)} ${m(`dim`,`· adamantite (${t})`)}`),Pe=()=>[f.env.NODE_OPTIONS,`--disable-warning=MODULE_TYPELESS_PACKAGE_JSON`].filter(Boolean).join(` `),Fe=t.fn(`CommandRunner.exitCode`)(function*({args:e,command:n,cwd:r,detached:i,stderr:a=`inherit`,stdin:o=`ignore`,stdout:s=`inherit`}){return yield*t.scoped(t.gen(function*(){return yield*(yield*ee.make(n,e,{cwd:r,detached:i,env:{NODE_OPTIONS:Pe()},extendEnv:!0,stderr:a,stdin:o,stdout:s})).exitCode})).pipe(t.mapError(e=>e.reason._tag===`NotFound`?new _e({command:n}):e))});var A=class e extends g.Service()(`CommandRunner`){static make(e){let n=t.fn(`CommandRunner.run`)(function*(t){t.title!==void 0&&(yield*Ne(t.title,t.command));let n=yield*e(t);n!==a.ExitCode(0)&&(yield*new O({command:t.command,exitCode:n}))}),r=e=>e.map((e,r)=>r===0?n(e):t.andThen(h.log(``),n(e)));return{exitCode:e,run:n,runAll:t.fn(`CommandRunner.runAll`)(function*(e){let n=yield*t.all(r(e),{concurrency:1,mode:`result`});yield*t.fromResult(_.all(n))}),runUntilFailure:t.fn(`CommandRunner.runUntilFailure`)(function*(e){yield*t.all(r(e),{concurrency:1,discard:!0})})}}static layer=c.effect(this)(t.gen(function*(){let n=yield*a.ChildProcessSpawner;return e.make(e=>Fe(e).pipe(t.provideService(a.ChildProcessSpawner,n)))}))};const j=g.Reference(`adamantite/ForwardedArguments`,{defaultValue:()=>[]});function M(e){return e}const Ie=e=>S.FileSystem.pipe(t.flatMap(t=>t.makeDirectory(e,{recursive:!0})),t.mapError(t=>new ve({cause:t,path:e}))),N=e=>S.FileSystem.pipe(t.flatMap(t=>t.readFileString(e)),t.mapError(t=>new Ce({cause:t,path:e}))),P=e=>S.FileSystem.pipe(t.flatMap(t=>t.readFileString(e)),t.map(e=>y(e,u.some)),t.catch(n=>n.reason._tag===`NotFound`?t.succeedNone:t.fail(new Ce({cause:n,path:e})))),F=(e,n)=>S.FileSystem.pipe(t.flatMap(t=>t.writeFileString(e,n)),t.mapError(t=>new we({cause:t,path:e}))),I=(e,t)=>F(e,`${JSON.stringify(t,null,2)}\n`),L=(e,n)=>t.suspend(()=>{let r=[],i=te(e,r,{allowTrailingComma:!0});return r.length>0?t.fail(new Se({errors:r,path:n})):t.succeed(i)}),R=e=>b.isObject(e),Le=e=>Array.isArray(e);function Re(e){return e===`__proto__`?`["__proto__"]`:/^[A-Za-z_$][\w$]*$/.test(e)?e:JSON.stringify(e)}function ze(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 Be=(e,n)=>t.try({catch:e=>new xe({cause:e}),try:()=>ie(e,n)}),Ve=/^workspace:/,He=/^[\^~]/;function Ue(e){return e.trim().replace(Ve,``).replace(He,``)}const z=(e=f.cwd())=>t.gen(function*(){let t=(yield*C.Path).join(e,`package.json`),n=yield*N(t);return yield*L(n,t)}),We=(e,n)=>t.gen(function*(){let t=yield*C.Path;yield*I(t.join(e,`package.json`),n)});function Ge(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 Ke(e){let t=e.scripts??{};return y(re.keys(B),s.filter(e=>t[e]===B[e]))}function qe(e,t){let n=e.scripts??{};return s.filterMap(t,e=>{let t=n[e];return t!==void 0&&t!==``&&t!==B[e]?_.succeed({command:t,script:e}):_.failVoid})}const Je=/^(?:packages|"packages"|'packages')\s*:/u;function Ye(e){return e.replace(/(?:^|\s+)#.*$/u,``).trim()}function Xe(e){let t=e.replace(/^\uFEFF/u,``).split(/\r?\n/u),n=t.findIndex(e=>Je.test(e));if(n===-1)return!1;let r=Ye((t[n]??``).replace(Je,``));if(r===`[`){for(let e of t.slice(n+1)){let t=Ye(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 V=(e=f.cwd())=>t.gen(function*(){let t=yield*C.Path,n=yield*P(t.join(e,`pnpm-workspace.yaml`));if(u.isSome(n)&&Xe(n.value))return!0;let r=(yield*z(e)).workspaces;return((s.isArray(r)?r:r?.packages)?.length??0)>0});function Ze(e){return e.endsWith(`.jsonc`)?`jsonc`:e.endsWith(`.json`)?`json`:`ts`}function Qe(e,t){return s.findFirst(e.legacyConfigs,e=>Ze(e)===t)}function $e(e){let t=Qe(e,`json`),n=Qe(e,`jsonc`);return y(u.zipWith(t,n,e=>`${e}(c)`),u.orElse(()=>n),u.orElse(()=>t),u.getOrElse(()=>``))}function et(e,t,n,r){return n===null||r.length===0?[]:n.format===`ts`?[`Found both \`${t.config}\` and \`${$e(t)}\`. Adamantite will use \`${t.config}\`.`]:y(u.zipWith(Qe(t,`json`),Qe(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.`),u.toArray)}const tt=t.fn(`detectToolingConfig`)(function*(e,n,r){let i=yield*S.FileSystem,a=yield*C.Path,o=[r.config,...r.legacyConfigs].map(t=>({file:t,format:Ze(t),path:a.join(e,t)})),c=yield*t.forEach(o,e=>i.exists(e.path),{concurrency:`unbounded`}),l=o.filter((e,t)=>c[t]),d=y(s.findFirst(l,e=>e.format===`ts`),u.orElse(()=>s.findFirst(l,e=>e.format===`jsonc`)),u.orElse(()=>s.findFirst(l,e=>e.format===`json`)),u.getOrNull),f=l.filter(e=>e!==d&&e.format!==`ts`);return{active:d,legacy:f,warnings:et(n,r,d,f)}});function nt(e,t,n){let r=e.devDependencies?.[t.name]??e.dependencies?.[t.name];return r?Ue(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 rt(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 it(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??t.inspection.goal??`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 at(e,t){let n=Ke(e);return t.some(e=>n.includes(e))}function ot(e){return M({assess:(n,r)=>t.gen(function*(){let t=at(r,e.scripts)||at(r,e.monorepoOnlyScripts??[])&&(yield*V(n)),i=e.legacyFindings?.(r)??[];if(!t)return i.length>0?{applicable:!0,findings:[...i],packageActions:[],warnings:[]}:{applicable:!1,warnings:[]};let a=nt(r,e,e.purpose);return{applicable:!0,findings:[...rt(a,e.name),...i],packageActions:a,warnings:[]}}),kind:`tooling`,name:e.name,version:e.version})}function st(e){let n=[{path:e.configFiles.config,type:`config`},...e.configFiles.legacyConfigs.map(e=>({path:e,type:`legacy_config`}))],r=t=>tt(t,e.name,e.configFiles);return M({assess:(n,i)=>t.gen(function*(){let t=e.legacyScript&&at(i,[e.legacyScript.script])?[e.legacyScript.finding]:[];if(!at(i,e.scripts))return t.length>0?{applicable:!0,findings:t,packageActions:[],warnings:[]}:{applicable:!1,warnings:[]};let a=yield*r(n),o=nt(i,e,e.purpose),s={isMonorepo:yield*V(n)},c=e.configContent(s),l=a.active?.format===`ts`?e.inspectConfig(yield*N(a.active.path),s):void 0;return{applicable:!0,findings:[...rt(o,e.name),...it(a,{configContent:c,configFile:e.configFiles.config,inspection:l,toolName:e.name}),...t],packageActions:o,warnings:a.warnings}}),config:e.configFiles.config,create:n=>t.gen(function*(){let t=yield*C.Path;yield*F(t.join(n,e.configFiles.config),e.configContent({isMonorepo:yield*V(n)}))}),detect:r,files:n,kind:`tooling`,name:e.name,version:e.version})}function ct(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 lt(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 ut(e,t,n){let r=!1;return new oe({Identifier:e=>{e.start>=n.start&&e.end<=n.end&&e.name===t&&(r=!0)}}).visit(e),r}function dt(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 ut(e,t,r);if(r.name===t)return!0;let i=lt(e,r.name);return i!==null&&ut(e,t,i)}function ft(e,t){let n=se(`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=ct(n.program,t.moduleName);return r?dt(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}\`.`}}const pt={monorepo:[`sherif`]},mt={isMonorepo:!1},ht=ae.mapInput(ae.String,e=>e[0]),gt=/ignoreDependencies\s*:\s*\[[^\]]*?sherif/u,_t=/ignoreDependencies\s*:\s*(?:ignoreDependencies\.monorepo|\[[^\]]*?ignoreDependencies\.monorepo)/u,vt=/import\s[^;]*?\{[^}]*\bignoreDependencies\b[^}]*\}\s*from\s*["']adamantite\/analyze["']/u;function yt(e){return gt.test(e)||_t.test(e)&&vt.test(e)}function bt(e,t){let n=ft(e,{moduleName:`adamantite/analyze`,presetName:`Adamantite analyze`});return n.kind!==`configured`||!t.isMonorepo||yt(e)?n:{goal:"Set `ignoreDependencies: ignoreDependencies.monorepo` in `knip.config.ts`, with the named `ignoreDependencies` import from `adamantite/analyze`, and keep the other settings.",kind:`invalid`,reason:"The file must set `ignoreDependencies: ignoreDependencies.monorepo` from `adamantite/analyze`, because Knip cannot see that `adamantite analyze` runs Sherif in a monorepo."}}function xt(e){let t=(s.isArray(e)?e:[]).filter(e=>!(b.isString(e)&&pt.monorepo.includes(e)));return t.length===0?`ignoreDependencies.monorepo`:`[...ignoreDependencies.monorepo, ${t.map(e=>JSON.stringify(e)).join(`, `)}]`}function St(e={},t=mt){let{ignoreDependencies:n,...r}=e,i=t.isMonorepo?r:e,a=Object.entries(i).map(([e,t])=>e===`rules`&&R(t)?[e,[` rules: {`,` ...analyze.rules,`,...Object.entries(t).map(([e,t])=>` ${Re(e)}: ${ze(t,{continuationIndent:` `,indentation:` `})},`),` },`].join(`
6
+ `)]:[e,` ${Re(e)}: ${ze(t,{continuationIndent:` `})},`]);t.isMonorepo&&a.push([`ignoreDependencies`,` ignoreDependencies: ${xt(n)},`]);let o=s.sort(a,ht).map(([,e])=>e);return o.length===0?[`import type { KnipConfig } from "knip"`,`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = analyze`,``,`export default config`,``].join(`
7
+ `):[`import type { KnipConfig } from "knip"`,t.isMonorepo?`import analyze, { ignoreDependencies } from "adamantite/analyze"`:`import analyze from "adamantite/analyze"`,``,`const config: KnipConfig = {`,` ...analyze,`,...o,`}`,``,`export default config`,``].join(`
8
+ `)}var H=st({configContent:e=>St({},e),configFiles:{config:`knip.config.ts`,legacyConfigs:[`knip.json`,`knip.jsonc`]},inspectConfig:bt,name:`knip`,purpose:"the managed `analyze` script",scripts:[`analyze`],version:`6.32.2`});const Ct=new Set([`check:monorepo`,`fix:monorepo`]),wt=/^adamantite\s+monorepo(?:\s|$)/u,Tt=new Map([[`--fail-on-warnings`,{key:`failOnWarnings`,takesValue:!1}],[`--ignore-dependency`,{key:`ignoreDependency`,takesValue:!0}],[`--ignore-package`,{key:`ignorePackage`,takesValue:!0}],[`--ignore-rule`,{key:`ignoreRule`,takesValue:!0}],[`--no-install`,{key:`noInstall`,takesValue:!1}],[`--select`,{key:`select`,takesValue:!0}],[`-i`,{key:`ignoreDependency`,takesValue:!0}],[`-p`,{key:`ignorePackage`,takesValue:!0}],[`-r`,{key:`ignoreRule`,takesValue:!0}],[`-s`,{key:`select`,takesValue:!0}]]);function Et(e){return Object.entries(e.scripts??{}).flatMap(([e,t])=>t!==void 0&&(Ct.has(e)||wt.test(t.trim()))?[{command:t,name:e}]:[])}function Dt(e){let t=e.command.trim().split(/\s+/u),n=[];for(let[e,r]of t.entries()){let[i=r,a]=r.split(`=`,2),o=Tt.get(i);if(!o)continue;if(!o.takesValue){n.push(`Set \`sherif.${o.key}\` to \`true\` in the root \`package.json\`.`);continue}let s=a??t[e+1];s!==void 0&&n.push(o.key===`select`?`Set \`sherif.select\` to \`"${s}"\` in the root \`package.json\`.`:`Add \`"${s}"\` to the \`sherif.${o.key}\` array in the root \`package.json\`.`)}return n}function Ot(e){let t=Et(e);if(t.length===0)return[];let n=Ke(e).includes(`analyze`);return[{currentState:`Legacy monorepo scripts are present in \`package.json\`: ${t.map(({command:e,name:t})=>`\`${t}\` (\`${e}\`)`).join(`, `)}.${n?``:" The project has no managed `analyze` script."}`,goal:[...n?[]:["Adopt the managed `analyze` script with `adamantite init --non-interactive --script analyze`. It runs Sherif in a detected monorepo."],...s.dedupe(t.flatMap(e=>Dt(e))),...t.map(({name:e})=>`Remove the \`${e}\` script from \`package.json\`.`)],id:`legacy-monorepo-scripts`,integration:`sherif`,notes:["`adamantite analyze` replaces `check:monorepo`, and `adamantite analyze --only monorepo --fix` replaces `fix:monorepo`. `adamantite analyze --fix` without `--only` also lets Knip remove unused files and dependencies.","`adamantite analyze` runs Sherif without flags. Sherif reads project exceptions from the `sherif` field of the root `package.json`, with the CLI options in camelCase: `ignoreDependency`, `ignoreRule`, `ignorePackage`, `select`, `noInstall`, and `failOnWarnings`.","Doctor does not assess `AGENTS.md`. Remove the lines that mention the monorepo scripts from its Adamantite section."],title:`Legacy monorepo scripts`}]}var U=ot({legacyFindings:Ot,monorepoOnlyScripts:[`analyze`],name:`sherif`,purpose:"the managed `analyze` script in a monorepo and the managed monorepo scripts",scripts:[`check:monorepo`,`fix:monorepo`],version:`1.13.0`});const kt=[{command:U.name,fixArguments:[`--fix`],name:`monorepo`,stdin:`inherit`,strictArguments:[],title:`📦 Analyzing the monorepo`},{command:H.name,fixArguments:[`--fix`,`--allow-remove-files`],name:`unused`,stdin:`ignore`,strictArguments:[`--production`,`--strict`],title:`🧹 Analyzing unused code`}],At=d.Boolean(`fix`).pipe(d.withDefault(!1),d.withDescription(`Automatically fix issues in every stage that runs`)),jt=d.Boolean(`strict`).pipe(d.withDefault(!1),d.withDescription(`Enable strict mode for the unused stage (knip)`)),Mt=d.Literals(`only`,[`monorepo`,`unused`]).pipe(d.optional,d.withDescription("Run one stage: `monorepo` (sherif, monorepos only) or `unused` (knip). Arguments after `--` go to that stage"));var Nt=l.make(`analyze`,{fix:At,only:Mt,strict:jt}).pipe(l.withDescription(`Find monorepo issues using sherif, then unused dependencies, exports, and files using knip`),l.withExamples([{command:`adamantite analyze -- --directory packages/app`,description:`Run knip from a specific directory`},{command:`adamantite analyze --only monorepo --fix -- --select highest`,description:`Fix only the monorepo issues and use the highest version on a mismatch`}]),l.withHandler(({fix:e,only:n,strict:r})=>t.gen(function*(){let i=yield*j,a=yield*A,o=u.getOrUndefined(n),s=yield*V().pipe(t.catchTags({FailedToParseFile:()=>t.succeed(!1),FailedToReadFile:()=>t.succeed(!1)}));if(o===`monorepo`){if(r)return yield*new De({reason:"`--strict` applies to the unused stage. Remove it or `--only monorepo`."});if(!s)return yield*new De({reason:"`--only monorepo` needs a monorepo, and no monorepo was detected."})}let c=kt.filter(e=>o===void 0?e.name===`unused`||s:e.name===o),l=o??`unused`,d=c.map(t=>({args:[...e?t.fixArguments:[],...r?t.strictArguments:[],...t.name===l?i:[]],command:t.command,stdin:t.stdin,title:t.title}));yield*(e?a.runUntilFailure(d):a.runAll(d)).pipe(t.mapError(e=>e._tag===`CliNotFound`&&e.command===U.name?new _e({command:e.command,hint:"Run `adamantite update` to install it."}):e))})));const Pt=new Set([`sortImports`,`sortPackageJson`,`sortTailwindcss`]);function Ft(e){return ft(e,{moduleName:`adamantite/format`,presetName:`Adamantite format`})}function It(e){let t=e.split(`
9
+ `);return t.length===1?e.slice(1,-1).trim():t.slice(1,-1).map(e=>` ${e.trimStart()}`).join(`
10
+ `)}function Lt(e,t){let n=It(ze(t));return[` ${e}: {`,` ...format.${e},`,...n===``?[]:[n],` },`].join(`
11
+ `)}function Rt(e={}){let t=Object.entries(e).map(([e,t])=>{if(Pt.has(e)&&R(t))return Lt(e,t);let n=ze(t,{continuationIndent:` `});return` ${Re(e)}: ${n},`});return t.length===0?[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig(format)`,``].join(`
12
+ `):[`import { defineConfig } from "oxfmt"`,`import format from "adamantite/format"`,``,`export default defineConfig({`,` ...format,`,...t,`})`,``].join(`
13
+ `)}var W=st({configContent:()=>Rt(),configFiles:{config:`oxfmt.config.ts`,legacyConfigs:[`.oxfmtrc.json`,`.oxfmtrc.jsonc`]},inspectConfig:Ft,legacyScript:{finding:{currentState:"The legacy managed `format` script is present in `package.json`.",goal:["Remove the `format` script from `package.json`."],id:`legacy-format-script`,integration:`oxfmt`,notes:["The managed `check` script verifies formatting and the managed `fix` script applies it.","Doctor does not assess `AGENTS.md`. Remove the `format` line from its Adamantite section."],title:`Legacy format script`},script:`format`},name:`oxfmt`,purpose:"the managed `check` and `fix` scripts",scripts:[`check`,`fix`],version:`0.65.0`});const zt=`**/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(`,`),Bt=[`respectEslintDisableDirectives`,`typeAware`,`typeCheck`],Vt="`oxlint.config.ts` must export an object literal directly, with or without `defineConfig(...)`, for Adamantite to patch `options` safely.",Ht="`oxlint.config.ts` has an `options` property, but it is not an object literal that Adamantite can patch safely.",Ut="`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 Wt(e=[]){return e.includes(`core`)?e:[`core`,...e]}function Gt(e){return e.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase())}const Kt=ae.mapInput(ae.String,e=>e[0]);function qt(e){let t=(s.isArray(e)?e:[]).filter(e=>b.isString(e)).filter(e=>!zt.includes(e));return t.length===0?`core.ignorePatterns`:`[...core.ignorePatterns, ${t.map(e=>JSON.stringify(e)).join(`, `)}]`}function Jt(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}`}"`)],c=[...t.map(e=>Gt(e)),...n.map(e=>JSON.stringify(e))],l=b.isObject(i)?{...i}:{};l.respectEslintDisableDirectives=!0,l.typeAware=!0,l.typeCheck=!0;let u=JSON.stringify(Object.fromEntries(s.sort(Object.entries(l),Kt)),null,2),d=Object.entries(a).map(([e,t])=>[e,JSON.stringify(t,null,2)]),f=[[`extends`,`[${c.join(`, `)}]`],[`ignorePatterns`,qt(r)],[`options`,u],...d],p=s.sort(f,Kt).map(([e,t])=>` ${e}: ${t},`).join(`
9
14
  `);return[...o,``,`export default defineConfig({`,p,`})`,``].join(`
10
- `)}const xt=g.liftThrowable(e=>ae(`oxlint.config.ts`,e,{astType:`ts`,lang:`ts`,sourceType:`module`}));function St(e){return xt(e).pipe(g.flatMap(e=>e.errors.length===0?g.fromNullishOr(e.program):g.none()))}function Ct(e){let{code:t}=se(e,ce({quotes:`double`}));return t.endsWith(`
11
- `)?t:`${t}\n`}function wt(e){return e.type===`Identifier`?h(e.name,g.some):e.type===`Literal`&&_.isString(e.value)?h(e.value,g.some):g.none()}function Tt(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 Et(e){return h(e.body,c.filter(e=>e.type===`ExportDefaultDeclaration`),e=>e.length===1?c.head(e):g.none(),g.flatMap(e=>Tt(e.declaration)))}function Dt(e,t){let n=null;for(let r of e.properties){if(r.type===`SpreadElement`||r.computed)return{status:`manual`};let e=g.contains(wt(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 Ot(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 kt(){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:ft.map(e=>Ot(e)),start:0,type:`ObjectExpression`}}}function At(e,t){let n=[],r=!1;for(let e of ft){let i=Dt(t,e);if(i.status===`manual`)return{kind:`manual`,reason:ht};if(i.status===`missing`){n.push(e);continue}let a=i.property.value;if(a.type!==`Literal`||!_.isBoolean(a.value))return{kind:`manual`,reason:ht};a.value||(a.raw=`true`,a.value=!0,r=!0)}return n.length>0&&(t.properties.unshift(...n.map(e=>Ot(e))),r=!0),r?{kind:`patchable`,updatedContent:Ct(e)}:{kind:`configured`}}function jt(e){let t=St(e);if(g.isNone(t))return{kind:`manual`,reason:pt};let n=Et(t.value);if(g.isNone(n))return{kind:`manual`,reason:pt};let r=Dt(n.value,`options`);return r.status===`manual`?{kind:`manual`,reason:mt}:r.status===`missing`?(n.value.properties.unshift(kt()),{kind:`patchable`,updatedContent:Ct(t.value)}):r.property.value.type===`ObjectExpression`?At(t.value,r.property.value):{kind:`manual`,reason:mt}}const V=`oxlint.config.ts`,Mt=`.oxlintrc.json`,Nt=[{path:V,type:`config`},{path:Mt,type:`legacy_config`}],Pt={config:V,legacyConfigs:[Mt]},Ft=`1.83.0`,It=e=>Je(e,`oxlint`,Pt);var H=j({assess:(e,t)=>n.gen(function*(){let n=He(t);if(!n.includes(`check`)&&!n.includes(`fix`))return{applicable:!1,warnings:[]};let r=yield*It(e),i=Ye(t,{name:`oxlint`,version:Ft},`the managed lint scripts`),a=r.active,o;if(a?.format===`ts`){let e=jt(yield*M(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=bt({},gt());return{applicable:!0,findings:[...Xe(i,`oxlint`),...Ze(r,{configContent:s,configFile:V,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:V,create:(e,t=[])=>n.gen(function*(){let n=yield*x.Path,r=bt({},gt(t));yield*P(n.join(e,V),r)}),detect:It,files:Nt,kind:`tooling`,name:`oxlint`,update:e=>n.gen(function*(){let t=yield*b.FileSystem,n=(yield*x.Path).join(e,V);if(!(yield*t.exists(n)))return yield*new Te({path:V});let r=jt(yield*M(n));if(r.kind!==`configured`){if(r.kind===`manual`)return yield*new De({path:V,reason:r.reason});yield*P(n,r.updatedContent)}}),version:Ft});const Lt=C.File(`files`,{mustExist:!0}).pipe(C.withDescription(`Specific files to lint (optional)`),C.variadic());var Rt=l.make(`check`,{files:Lt}).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:H.name});n!==s.ExitCode(0)&&(yield*new D({command:H.name,exitCode:n}))})));const zt=[{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]}],Bt=e=>n.gen(function*(){let t=yield*k;return(yield*n.forEach(zt,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:zt.length})).filter(e=>e!==null)});var Vt=class extends m.TaggedError(`AgentSessionFailed`){};const Ht=()=>{},Ut=e=>n.acquireUseRelease(n.sync(()=>{let e=S.listeners(`SIGINT`);return S.removeAllListeners(`SIGINT`),S.on(`SIGINT`,Ht),e}),()=>e,e=>n.sync(()=>{S.removeAllListeners(`SIGINT`);for(let t of e)S.on(`SIGINT`,t)})),Wt=({agent:e,cwd:t})=>n.gen(function*(){let n=yield*k;yield*Ut(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 Vt({cause:e,reason:e._tag===`CliNotFound`?`not-found`:`spawn-failed`}))),Gt=e=>n.gen(function*(){let t=yield*(yield*k).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`))),Kt=[{name:`check`,script:`check`},{args:[`--check`],name:`format`,script:`format`},{name:`monorepo`,script:`check:monorepo`},{name:`analyze`,script:`analyze`}];function qt(e,t){let n=[];for(let r of Kt)t.includes(r.script)&&n.push({command:de(e,r.script,{args:r.args}),name:r.name});return n}function Jt(e){return Kt.some(t=>e.includes(t.script))}var U=class extends d.Service()(`DependencyInstaller`){static layer=i.succeed(this)({addDevDependencies:n.fn(`DependencyInstaller.addDevDependencies`)((e,t,r)=>n.tryPromise({catch:t=>new ye({cause:t,packages:e}),try:()=>le(e,{...r,cwd:t})}).pipe(n.asVoid)),detectPackageManager:n.fn(`DependencyInstaller.detectPackageManager`)(e=>n.tryPromise({catch:e=>new Oe({cause:e}),try:()=>ue(e)}).pipe(n.map(e=>e??null)))})};function Yt(e){return{_tag:`File`,path:e}}function Xt(e){return{_tag:`Version`,value:e}}const Zt=[`.node-version`,`.nvmrc`],Qt=w.Struct({volta:w.Struct({node:w.NonEmptyString})}),$t=w.Struct({engines:w.Struct({node:w.NonEmptyString})}),en=w.Struct({name:w.NonEmptyString,version:w.NonEmptyString});function tn(e){return e.split(`
12
- `).map(e=>e.split(`#`)[0]?.trim()??``).some(e=>/^node(?:js)?\s+\S/.test(e))}function nn(e){return w.is(en)(e)&&e.name.toLowerCase()===`node`}function rn(e){if(w.is(Qt)(e))return!0;if(_.isObject(e)&&_.isObject(e.devEngines)){let t=e.devEngines.runtime;if((Array.isArray(t)?t:[t]).some(e=>nn(e)))return!0}return w.is($t)(e)}var an=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)=>N(t.join(r,i)).pipe(n.provideService(b.FileSystem,e));return{resolve:n.fn(`NodeVersionResolver.resolve`)(function*(e){for(let t of Zt){let n=yield*r(e,t);if(g.exists(n,e=>v.isNonEmpty(e.trim())))return Yt(t)}let n=yield*r(e,`.tool-versions`);if(g.exists(n,e=>tn(e)))return Yt(`.tool-versions`);let i=yield*r(e,`package.json`);return g.isSome(i)&&rn(yield*I(i.value,t.join(e,`package.json`)))?Yt(`package.json`):Xt(`lts/*`)})}}))};const on=/^\s*node-version:\s*"?\d/m,sn=/^[>|](?:[1-9][+-]?|[+-][1-9]?)?(?:\s+#.*)?$/,cn=/\b(?:(?:bun|npm|pnpm|yarn)(?:\s+(?!run\b)\S+)*\s+run\s+check|deno(?:\s+(?!task\b)\S+)*\s+task\s+check)\b/,ln=/^(\s*)(?:-\s*)?(?:command|run):\s*(.*)$/;function un(e){let t=e.split(`
13
- `);for(let[e,n]of t.entries()){let r=ln.exec(n);if(!r)continue;let i=r[1]?.length??0,a=(r[2]??``).trim();if(cn.test(a))return!0;if(sn.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(cn.test(e))return!0}}}return!1}function dn(e){return` - name: Setup Node.js
15
+ `)}const Yt=u.liftThrowable(e=>se(`oxlint.config.ts`,e,{astType:`ts`,lang:`ts`,sourceType:`module`}));function Xt(e){return Yt(e).pipe(u.flatMap(e=>e.errors.length===0?u.fromNullishOr(e.program):u.none()))}function Zt(e){let{code:t}=ce(e,le({quotes:`double`}));return t.endsWith(`
16
+ `)?t:`${t}\n`}function Qt(e){return e.type===`Identifier`?y(e.name,u.some):e.type===`Literal`&&b.isString(e.value)?y(e.value,u.some):u.none()}function $t(e){return e.type===`ObjectExpression`?y(e,u.some):e.type!==`CallExpression`||e.callee.type!==`Identifier`||e.callee.name!==`defineConfig`?u.none():y(e.arguments.length===1?s.head(e.arguments):u.none(),u.filter(e=>e.type===`ObjectExpression`))}function en(e){return y(e.body,s.filter(e=>e.type===`ExportDefaultDeclaration`),e=>e.length===1?s.head(e):u.none(),u.flatMap(e=>$t(e.declaration)))}function tn(e,t){let n=null;for(let r of e.properties){if(r.type===`SpreadElement`||r.computed)return{status:`manual`};let e=u.contains(Qt(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 nn(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 rn(){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:Bt.map(e=>nn(e)),start:0,type:`ObjectExpression`}}}function an(e,t){let n=[],r=!1;for(let e of Bt){let i=tn(t,e);if(i.status===`manual`)return{kind:`manual`,reason:Ut};if(i.status===`missing`){n.push(e);continue}let a=i.property.value;if(a.type!==`Literal`||!b.isBoolean(a.value))return{kind:`manual`,reason:Ut};a.value||(a.raw=`true`,a.value=!0,r=!0)}return n.length>0&&(t.properties.unshift(...n.map(e=>nn(e))),r=!0),r?{kind:`patchable`,updatedContent:Zt(e)}:{kind:`configured`}}function on(e){let t=Xt(e);if(u.isNone(t))return{kind:`manual`,reason:Vt};let n=en(t.value);if(u.isNone(n))return{kind:`manual`,reason:Vt};let r=tn(n.value,`options`);return r.status===`manual`?{kind:`manual`,reason:Ht}:r.status===`missing`?(n.value.properties.unshift(rn()),{kind:`patchable`,updatedContent:Zt(t.value)}):r.property.value.type===`ObjectExpression`?an(t.value,r.property.value):{kind:`manual`,reason:Ht}}const G=`oxlint.config.ts`,sn=`.oxlintrc.json`,cn=[{path:G,type:`config`},{path:sn,type:`legacy_config`}],ln={config:G,legacyConfigs:[sn]},un=`1.83.0`,dn=e=>tt(e,`oxlint`,ln);var K=M({assess:(e,n)=>t.gen(function*(){let t=Ke(n);if(!t.includes(`check`)&&!t.includes(`fix`))return{applicable:!1,warnings:[]};let r=yield*dn(e),i=nt(n,{name:`oxlint`,version:un},`the managed lint scripts`),a=r.active,o;if(a?.format===`ts`){let e=on(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=Jt({},Wt());return{applicable:!0,findings:[...rt(i,`oxlint`),...it(r,{configContent:s,configFile:G,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:G,create:(e,n=[])=>t.gen(function*(){let t=yield*C.Path,r=Jt({},Wt(n));yield*F(t.join(e,G),r)}),detect:dn,files:cn,kind:`tooling`,name:`oxlint`,update:e=>t.gen(function*(){let t=yield*S.FileSystem,n=(yield*C.Path).join(e,G);if(!(yield*t.exists(n)))return yield*new Te({path:G});let r=on(yield*N(n));if(r.kind!==`configured`){if(r.kind===`manual`)return yield*new Oe({path:G,reason:r.reason});yield*F(n,r.updatedContent)}}),version:un});const fn=w.File(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to check (optional)`),w.variadic());var pn=l.make(`check`,{files:fn}).pipe(l.withDescription(`Check formatting, code issues, and type errors`),l.withHandler(({files:e})=>t.gen(function*(){let t=yield*j;yield*(yield*A).runAll([{args:[`--check`,...e],command:W.name,title:`✨ Checking formatting`},{args:[...e,...t],command:K.name,title:`🔍 Linting`}])})));const mn=[{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]}],hn=e=>t.gen(function*(){let n=yield*A;return(yield*t.forEach(mn,r=>n.exitCode({args:[...r.probeArguments??[`--version`]],command:r.command,cwd:e,stderr:`ignore`,stdout:`ignore`}).pipe(t.timeout(`10 seconds`),t.as(r),t.catch(()=>t.succeed(null))),{concurrency:mn.length})).filter(e=>e!==null)});var gn=class extends v.TaggedError(`AgentSessionFailed`){};const _n=()=>{},vn=e=>t.acquireUseRelease(t.sync(()=>{let e=f.listeners(`SIGINT`);return f.removeAllListeners(`SIGINT`),f.on(`SIGINT`,_n),e}),()=>e,e=>t.sync(()=>{f.removeAllListeners(`SIGINT`);for(let t of e)f.on(`SIGINT`,t)})),yn=({agent:e,cwd:n})=>t.gen(function*(){let t=yield*A;yield*vn(t.exitCode({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:n,detached:!1,stderr:`inherit`,stdin:`inherit`,stdout:`inherit`}))}).pipe(t.asVoid,t.mapError(e=>new gn({cause:e,reason:e._tag===`CliNotFound`?`not-found`:`spawn-failed`}))),bn=e=>t.gen(function*(){let t=yield*(yield*A).exitCode({args:[`diff`,`--quiet`,`HEAD`],command:`git`,cwd:e,stderr:`ignore`,stdout:`ignore`});return t===a.ExitCode(0)?`clean`:t===a.ExitCode(1)?`dirty`:`unknown`}).pipe(t.catch(()=>t.succeed(`unknown`))),xn=[{name:`check`,script:`check`},{name:`analyze`,script:`analyze`}];function Sn(e,t){let n=[];for(let r of xn)t.includes(r.script)&&n.push({command:fe(e,r.script),name:r.name});return n}function Cn(e){return xn.some(t=>e.includes(t.script))}var wn=class extends g.Service()(`DependencyInstaller`){static layer=c.succeed(this)({addDevDependencies:t.fn(`DependencyInstaller.addDevDependencies`)((e,n,r)=>t.tryPromise({catch:t=>new ye({cause:t,packages:e}),try:()=>ue(e,{...r,cwd:n})}).pipe(t.asVoid)),detectPackageManager:t.fn(`DependencyInstaller.detectPackageManager`)(e=>t.tryPromise({catch:e=>new ke({cause:e}),try:()=>de(e)}).pipe(t.map(e=>e??null)))})};function Tn(e,t){return t&&e!==`npm`}const En=(e,n)=>t.gen(function*(){let t=yield*wn,r=yield*V(e),i=yield*t.detectPackageManager(e);yield*t.addDevDependencies(n,e,{silent:!0,workspace:Tn(i?.name,r)})});function Dn(e){return{_tag:`File`,path:e}}function On(e){return{_tag:`Version`,value:e}}const kn=[`.node-version`,`.nvmrc`],An=T.Struct({volta:T.Struct({node:T.NonEmptyString})}),jn=T.Struct({engines:T.Struct({node:T.NonEmptyString})}),Mn=T.Struct({name:T.NonEmptyString,version:T.NonEmptyString});function Nn(e){return e.split(`
17
+ `).map(e=>e.split(`#`)[0]?.trim()??``).some(e=>/^node(?:js)?\s+\S/.test(e))}function Pn(e){return T.is(Mn)(e)&&e.name.toLowerCase()===`node`}function Fn(e){if(T.is(An)(e))return!0;if(b.isObject(e)&&b.isObject(e.devEngines)){let t=e.devEngines.runtime;if((Array.isArray(t)?t:[t]).some(e=>Pn(e)))return!0}return T.is(jn)(e)}var In=class extends g.Service()(`NodeVersionResolver`){static layer=c.effect(this,t.gen(function*(){let e=yield*S.FileSystem,n=yield*C.Path,r=(r,i)=>P(n.join(r,i)).pipe(t.provideService(S.FileSystem,e));return{resolve:t.fn(`NodeVersionResolver.resolve`)(function*(e){for(let t of kn){let n=yield*r(e,t);if(u.exists(n,e=>x.isNonEmpty(e.trim())))return Dn(t)}let t=yield*r(e,`.tool-versions`);if(u.exists(t,e=>Nn(e)))return Dn(`.tool-versions`);let i=yield*r(e,`package.json`);return u.isSome(i)&&Fn(yield*L(i.value,n.join(e,`package.json`)))?Dn(`package.json`):On(`lts/*`)})}}))};const Ln=/^\s*node-version:\s*"?\d/m,Rn=/^[>|](?:[1-9][+-]?|[+-][1-9]?)?(?:\s+#.*)?$/,zn=/\b(?:(?:bun|npm|pnpm|yarn)(?:\s+(?!run\b)\S+)*\s+run\s+check|deno(?:\s+(?!task\b)\S+)*\s+task\s+check)\b/,Bn=/\b(?:(?:bun|npm|pnpm|yarn)(?:\s+(?!run\b)\S+)*\s+run\s+format|deno(?:\s+(?!task\b)\S+)*\s+task\s+format)(?:\s+--)?\s+--check\b/,Vn=/\b(?:(?:bun|npm|pnpm|yarn)(?:\s+(?!run\b)\S+)*\s+run\s+(?:check|fix):monorepo|deno(?:\s+(?!task\b)\S+)*\s+task\s+(?:check|fix):monorepo|adamantite\s+monorepo)(?=\s|$)/,Hn=/^(\s*)(?:-\s*)?(?:command|run):\s*(.*)$/;function Un(e,t){let n=e.split(`
18
+ `);for(let[e,r]of n.entries()){let i=Hn.exec(r);if(!i)continue;let a=i[1]?.length??0,o=(i[2]??``).trim();if(t.test(o))return!0;if(Rn.test(o))for(let r of n.slice(e+1)){let e=r.trim();if(e.length!==0){if(r.length-r.trimStart().length<=a)break;if(t.test(e))return!0}}}return!1}function Wn(e){return` - name: Setup Node.js
14
19
  uses: actions/setup-node@v7
15
20
  with:
16
- ${e._tag===`File`?`node-version-file: "${e.path}"`:`node-version: "${e.value}"`}`}function fn(e){return{bun:`${dn(e)}
21
+ ${e._tag===`File`?`node-version-file: "${e.path}"`:`node-version: "${e.value}"`}`}function Gn(e){return{bun:`${Wn(e)}
17
22
 
18
23
  - name: Setup Bun
19
24
  uses: oven-sh/setup-bun@v2
@@ -33,22 +38,22 @@ import*as e from"@effect/platform-node/NodeRuntime";import*as t from"@effect/pla
33
38
  uses: denoland/setup-deno@v2
34
39
 
35
40
  - name: Install dependencies
36
- run: deno install --frozen`,npm:`${dn(e)}
41
+ run: deno install --frozen`,npm:`${Wn(e)}
37
42
  cache: "npm"
38
43
 
39
44
  - name: Install dependencies
40
45
  run: npm ci`,pnpm:` - name: Setup pnpm
41
46
  uses: pnpm/action-setup@v4
42
47
 
43
- ${dn(e)}
48
+ ${Wn(e)}
44
49
  cache: "pnpm"
45
50
 
46
51
  - name: Install dependencies
47
- run: pnpm install --frozen-lockfile`,yarn:`${dn(e)}
52
+ run: pnpm install --frozen-lockfile`,yarn:`${Wn(e)}
48
53
  cache: "yarn"
49
54
 
50
55
  - name: Install dependencies
51
- run: yarn install --frozen-lockfile`}}function pn({packageManager:e,scripts:t},n){let r=qt(e,t);return r.length===0?null:`${`name: adamantite
56
+ run: yarn install --frozen-lockfile`}}function Kn({packageManager:e,scripts:t},n){let r=Sn(e,t);return r.length===0?null:`${`name: adamantite
52
57
 
53
58
  on:
54
59
  push:
@@ -80,32 +85,27 @@ ${r.map(e=>` - name: ${e.name}\n command: ${e.command}`).joi
80
85
  - name: Checkout
81
86
  uses: actions/checkout@v7
82
87
 
83
- ${fn(n)[e]}
88
+ ${Gn(n)[e]}
84
89
 
85
90
  - name: Run \${{ matrix.name }}
86
- run: \${{ matrix.command }}`}\n`}const mn=[{path:`.github/workflows/adamantite.yml`,type:`ci`}],hn=(e,t)=>n.gen(function*(){let n=yield*x.Path,r=yield*an,i=n.join(e,mn[0].path),a=pn(t,yield*r.resolve(e));a&&(yield*P(i,a))});var W=j({assess:(e,t)=>n.gen(function*(){let n=(yield*x.Path).join(e,mn[0].path),r=yield*N(n);if(r._tag===`None`)return{applicable:!1,warnings:[]};let i=He(t),a=on.test(r.value),o=i.includes(`check`)&&!un(r.value);if(!a&&!o)return{applicable:!0,findings:[],packageActions:[],warnings:[]};if(!Jt(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*U).detectPackageManager(e);return s?Ve(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*Me(n.dirname(n.join(e,mn[0].path))),yield*hn(e,t)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,mn[0].path))}),files:mn,kind:`ci`,name:`github`,update:hn});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=L(t)?t.oxfmt:void 0,r=L(n)?n.initialization_options:void 0,i=L(r)?r.settings:void 0;if(!L(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!L(e)||!Ne(e.plugins)?e:Object.fromEntries([...Object.entries(e),[`plugins`,c.dedupe(e.plugins)]])}function bn(e){let t=e.languages;if(!L(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>!(e in gn.languages)||!L(t)?[e,t]:[e,Object.fromEntries(Object.entries(t).map(([e,t])=>e===`formatter`&&Ne(t)?[e,c.dedupe(t)]:e===`prettier`?[e,yn(t)]:[e,t]))]));return Object.fromEntries([...Object.entries(e),[`languages`,n]])}var K=j({assess:(e,t)=>n.gen(function*(){let t=(yield*x.Path).join(e,G[0].path),n=yield*N(t);if(n._tag===`None`)return{applicable:!1,warnings:[]};let r=yield*I(n.value,t),i=L(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*Me(t.dirname(n)),yield*F(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*M(t),r=yield*I(n,t);if(!_.isObject(r))return yield*new Ee({path:t});let i=bn(yield*Ie(gn,r));yield*F(t,i)})});const xn=new Set([`sortImports`,`sortPackageJson`,`sortTailwindcss`]);function Sn(e){return at(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(Fe(t));return[` ${e}: {`,` ...format.${e},`,...n===``?[]:[n],` },`].join(`
89
- `)}function Tn(e={}){let t=Object.entries(e).map(([e,t])=>{if(xn.has(e)&&L(t))return wn(e,t);let n=Fe(t,{continuationIndent:` `});return` ${Pe(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=et({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=$e({name:`sherif`,purpose:`the managed monorepo scripts`,scripts:[`check:monorepo`,`fix:monorepo`],version:`1.13.0`}),En=$e({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*N(t.join(e,`pnpm-workspace.yaml`));if(g.isSome(n)&&kn(n.value))return!0;let r=(yield*R(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=j({assess:(e,t)=>n.gen(function*(){let n=He(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*N(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*I(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*F(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*M(t),r=yield*I(n,t);if(!_.isObject(r))return yield*new Ee({path:t});let i=yield*Ie(jn,r),a=Object.fromEntries([...Object.entries(i),[`extends`,Nn(`extends`in r?r.extends:void 0)]]);yield*F(t,a)})});const Pn=[B,q,H,J,En,Z,W,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*R(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(`
91
+ run: \${{ matrix.command }}`}\n`}const qn={currentState:"The workflow still runs the legacy `format` script with `--check`.",goal:["Remove the workflow step or matrix entry that runs the `format` script with `--check`."],id:`legacy-format-workflow-step`,integration:`github`,notes:["The managed `check` script verifies formatting. Preserve unrelated workflow jobs and project-specific settings."],title:`Legacy format workflow step`},Jn={currentState:"The workflow still runs a legacy monorepo script or `adamantite monorepo`.",goal:["Remove the workflow step or matrix entry that runs `check:monorepo`, `fix:monorepo`, or `adamantite monorepo`.","Make the workflow run the managed `analyze` script. It runs Sherif in a detected monorepo."],id:`legacy-monorepo-workflow-step`,integration:`github`,notes:[`Preserve unrelated workflow jobs and project-specific settings.`],title:`Legacy monorepo workflow step`},Yn=[{path:`.github/workflows/adamantite.yml`,type:`ci`}],Xn=(e,n)=>t.gen(function*(){let t=yield*C.Path,r=yield*In,i=t.join(e,Yn[0].path),a=Kn(n,yield*r.resolve(e));a&&(yield*F(i,a))});var Zn=M({assess:(e,n)=>t.gen(function*(){let t=(yield*C.Path).join(e,Yn[0].path),r=yield*P(t);if(r._tag===`None`)return{applicable:!1,warnings:[]};let i=Ke(n),a=Ln.test(r.value),o=i.includes(`check`)&&!Un(r.value,zn),s=[...Un(r.value,Bn)?[qn]:[],...Un(r.value,Vn)?[Jn]:[]];if(!a&&!o)return{applicable:!0,findings:s,packageActions:[],warnings:[]};if(!Cn(i))return{applicable:!0,findings:s,packageActions:[],warnings:[`No CI-compatible managed scripts were found, so the GitHub Actions workflow cannot be regenerated.`]};let c=yield*(yield*wn).detectPackageManager(e);return c?Ge(c.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 \`${c.name}\`. Preserve unrelated workflow jobs and project-specific settings.`],title:`Outdated Adamantite workflow`},...s],packageActions:[],warnings:[]}:{applicable:!0,findings:s,packageActions:[],warnings:[`\`${c.name}\` is not a supported package manager for CI workflow generation, so the GitHub Actions workflow cannot be regenerated.`]}:{applicable:!0,findings:s,packageActions:[],warnings:[`Could not detect a package manager, so the GitHub Actions workflow cannot be regenerated.`]}}),create:(e,n)=>t.gen(function*(){let t=yield*C.Path;yield*Ie(t.dirname(t.join(e,Yn[0].path))),yield*Xn(e,n)}),detect:e=>t.gen(function*(){let t=yield*S.FileSystem,n=yield*C.Path;return yield*t.exists(n.join(e,Yn[0].path))}),files:Yn,kind:`ci`,name:`github`,update:Xn});const q=[{path:`.zed/settings.json`,type:`config`}],Qn={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 er(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 tr(e){return!R(e)||!Le(e.plugins)?e:Object.fromEntries([...Object.entries(e),[`plugins`,s.dedupe(e.plugins)]])}function nr(e){let t=e.languages;if(!R(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>!(e in Qn.languages)||!R(t)?[e,t]:[e,Object.fromEntries(Object.entries(t).map(([e,t])=>e===`formatter`&&Le(t)?[e,s.dedupe(t)]:e===`prettier`?[e,tr(t)]:[e,t]))]));return Object.fromEntries([...Object.entries(e),[`languages`,n]])}var J=M({assess:(e,n)=>t.gen(function*(){let t=(yield*C.Path).join(e,q[0].path),n=yield*P(t);if(n._tag===`None`)return{applicable:!1,warnings:[]};let r=yield*L(n.value,t),i=R(r)?er(r):[];return{applicable:!0,findings:i.length===0?[]:[{currentState:`\`${q[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:q[0].path,create:e=>t.gen(function*(){let t=yield*C.Path,n=t.join(e,q[0].path);yield*Ie(t.dirname(n)),yield*I(n,Qn)}),detect:e=>t.gen(function*(){let t=yield*S.FileSystem,n=yield*C.Path;return yield*t.exists(n.join(e,q[0].path))}),files:q,kind:`editor`,name:`zed`,update:e=>t.gen(function*(){let t=(yield*C.Path).join(e,q[0].path),n=yield*N(t),r=yield*L(n,t);if(!b.isObject(r))return yield*new Ee({path:t});let i=nr(yield*Be(Qn,r));yield*I(t,i)})}),rr=ot({name:`oxlint-tsgolint`,purpose:`the managed lint scripts`,scripts:[`check`,`fix`],version:`7.0.2001`});const Y=[{path:`tsconfig.json`,type:`config`}],X=`adamantite/typescript`,ir={extends:X},ar=["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 or(e){return b.isString(e)?e===X?e:[e,X]:s.isArray(e)?e.includes(X)?e:[...e,X]:X}var Z=M({assess:(e,n)=>t.gen(function*(){let t=Ke(n);if(!t.includes(`check`)&&!t.includes(`fix`))return{applicable:!1,warnings:[]};if(yield*V(e))return{applicable:!0,findings:[],packageActions:[],warnings:ar};let r=(yield*C.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(ir,null,2)}\n`,language:`json`},title:`Missing TypeScript configuration`}],packageActions:[],warnings:[]};let a=yield*L(i.value,r);return{applicable:!0,findings:b.isObject(a)&&(a.extends===X||s.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(ir,null,2)}\n`,language:`json`},title:`TypeScript preset is not configured`}],packageActions:[],warnings:[]}}),config:Y[0].path,create:e=>t.gen(function*(){let t=yield*C.Path;yield*I(t.join(e,Y[0].path),ir)}),detect:e=>t.gen(function*(){let t=yield*S.FileSystem,n=yield*C.Path;return yield*t.exists(n.join(e,Y[0].path))}),files:Y,kind:`workspace`,name:`tsconfig`,update:e=>t.gen(function*(){let t=(yield*C.Path).join(e,Y[0].path),n=yield*N(t),r=yield*L(n,t);if(!b.isObject(r))return yield*new Ee({path:t});let i=yield*Be(ir,r),a=Object.fromEntries([...Object.entries(i),[`extends`,or(`extends`in r?r.extends:void 0)]]);yield*I(t,a)})});const sr=[H,W,K,U,rr,Z,Zn,J],cr=t.fn(`collectApplicableAssessments`)(function*(e,n,r){return yield*t.forEach(e,e=>e.assess(n,r).pipe(t.map(t=>t.applicable?u.some({assessment:t,name:e.name}):u.none())),{concurrency:`unbounded`}).pipe(t.map(e=>s.getSomes(e)))});function lr(e,t,n){return cr(e,t,n)}const ur=t.fn(`assessProject`)(function*(e,t){let n=t??(yield*z(e)),r=yield*lr(sr,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 dr(e,t){return e.findings.length===0?fr(e.warnings,t):pr(e.findings,e.warnings,t)}function fr(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 pr(e,t,n){let r=e.map((e,t)=>{let n=e.goal.map(e=>` - ${e}`).join(`
93
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
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
95
 
96
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(()=>{T.cancel(e)}),confirm:e=>n.promise(()=>T.confirm(e)).pipe(n.filterOrFail(e=>!T.isCancel(e),()=>new ke({}))),intro:e=>n.sync(()=>{T.intro(e)}),log:{error:e=>n.sync(()=>{T.log.error(e)}),info:e=>n.sync(()=>{T.log.info(e)}),success:e=>n.sync(()=>{T.log.success(e)}),warning:e=>n.sync(()=>{T.log.warning(e)})},message:e=>n.sync(()=>{T.log.message(e,{spacing:0,withGuide:!1})}),multiselect:e=>n.promise(()=>T.multiselect(e)).pipe(n.filterOrFail(e=>!T.isCancel(e),()=>new ke({}))),note:(e,t)=>n.sync(()=>{T.note(e,t)}),outro:e=>n.sync(()=>{T.outro(e)}),select:e=>n.promise(()=>T.select(e)).pipe(n.filterOrFail(e=>!T.isCancel(e),()=>new ke({}))),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(T.spinner)};function Hn(e){let t=[`Current state\n${e.currentState}`,`Goal\n${e.goal.map(e=>`• ${e}`).join(`
97
+ `)}var mr=class extends g.Service()(`TerminalCapabilities`){static layer=c.succeed(this)({copyToClipboard:e=>t.sync(()=>{let t=Buffer.from(e).toString(`base64`);f.stdout.write(`\u001B]52;c;${t}\u0007`)}),isInteractive:t.sync(()=>f.stdin.isTTY&&f.stdout.isTTY)})},Q=class extends g.Service()(`Prompter`){static layerWithSpinner(e){return c.succeed(this)({cancel:e=>t.sync(()=>{E.cancel(e)}),confirm:e=>t.promise(()=>E.confirm(e)).pipe(t.filterOrFail(e=>!E.isCancel(e),()=>new Ae({}))),intro:e=>t.sync(()=>{E.intro(e)}),log:{error:e=>t.sync(()=>{E.log.error(e)}),info:e=>t.sync(()=>{E.log.info(e)}),success:e=>t.sync(()=>{E.log.success(e)}),warning:e=>t.sync(()=>{E.log.warning(e)})},message:e=>t.sync(()=>{E.log.message(e,{spacing:0,withGuide:!1})}),multiselect:e=>t.promise(()=>E.multiselect(e)).pipe(t.filterOrFail(e=>!E.isCancel(e),()=>new Ae({}))),note:(e,n)=>t.sync(()=>{E.note(e,n)}),outro:e=>t.sync(()=>{E.outro(e)}),select:e=>t.promise(()=>E.select(e)).pipe(t.filterOrFail(e=>!E.isCancel(e),()=>new Ae({}))),withSpinner:(r,i)=>t.acquireUseRelease(t.sync(()=>{let t=e();return t.start(i.start),t}),e=>r({message:n=>t.sync(()=>{e.message(n)})}),(e,r)=>t.sync(()=>{e.stop(n.match(r,{onFailure:()=>i.failure,onSuccess:e=>b.isFunction(i.success)?i.success(e):i.success}))}))})}static layer=this.layerWithSpinner(E.spinner)};function hr(e){let t=[`Current state\n${e.currentState}`,`Goal\n${e.goal.map(e=>`• ${e}`).join(`
98
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
99
  `)}`),t.join(`
100
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*pe.Terminal).columns,t=Wn.split(`
102
- `).reduce((e,t)=>Math.max(e,t.trim().length),0);!e||e<t||(yield*fe.info(Wn))}),Kn=`0.40.0`;var qn=l.make(`doctor`).pipe(l.withDescription(`Assess Adamantite-managed integrations in the current project`),l.withHandler(()=>n.gen(function*(){let e=S.cwd(),t=yield*Q,r=yield*Vn,i=yield*r.isInteractive;i&&(yield*Gn(),yield*t.intro(`💠 adamantite doctor`));let a=n.gen(function*(){return yield*t.outro(`⚠️ Doctor found issues.`),yield*new D({command:`doctor`,exitCode:s.ExitCode(1)})}),o=yield*R(e);if(!o.devDependencies?.adamantite&&!o.dependencies?.adamantite){let e="`adamantite` is not installed in this project. Install it before running `adamantite doctor`.";return i?(yield*t.log.warning(e),yield*t.outro(`⚠️ Doctor found issues.`)):yield*t.message(e),yield*new D({command:`doctor`,exitCode:s.ExitCode(1)})}let c=yield*Ln(e);if(i)for(let e of c.warnings)yield*t.log.warning(e);if(c.applicableIntegrations.length===0){i&&(yield*t.log.success(`No applicable integrations found.`),yield*t.outro(`✅ Doctor completed successfully!`));return}if(c.findings.length===0){i?(yield*t.log.success(`No issues found.`),yield*t.outro(`✅ Doctor completed successfully!`)):c.warnings.length>0&&(yield*t.message(Rn(c,Kn)));return}if(!i)return yield*t.message(Rn(c,Kn)),yield*new D({command:`doctor`,exitCode:s.ExitCode(1)});let l=e=>n.gen(function*(){(yield*t.confirm({initialValue:!0,message:`Copy the Markdown prompt for a coding agent?`}))&&(yield*t.message(e),yield*r.copyToClipboard(e),yield*t.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`))});yield*Un(c.findings);let u=yield*t.withSpinner(()=>Bt(e),{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(`, `)}.`});u.length===0&&(yield*t.log.info(`Doctor can hand findings off when one of these CLIs is installed: ${zt.map(e=>`\`${e.command}\``).join(`, `)}.`));let d=Rn(c,Kn),f=yield*t.select({message:`How do you want to resolve these findings?`,options:[...u.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(f===`done`)return yield*a;if(f===`copy`)return yield*t.message(d),yield*r.copyToClipboard(d),yield*t.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`),yield*a;let p=f,m=yield*Gt(e);if(m!==`clean`&&(yield*t.log.warning(m===`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*t.confirm({initialValue:!1,message:`Hand off to ${p.name} anyway?`})))||(yield*t.log.info(`Handing the terminal to ${p.name}. Exit the agent to return to Doctor.`),!(yield*Wt({agent:p,cwd:e}).pipe(n.as(!0),n.catchTag(`AgentSessionFailed`,e=>t.log.error(e.reason===`not-found`?`\`${p.command}\` was not found on PATH. Install ${p.name} or copy the prompt instead.`:`Failed to start ${p.name}: ${e.cause.message}`).pipe(n.as(!1)))))))return yield*l(d),yield*a;let h=yield*Ln(e);if(h.findings.length===0){yield*t.log.success(`All findings were resolved by ${p.name}.`),yield*t.outro(`✅ Doctor completed successfully!`);return}return yield*t.log.warning(`${h.findings.length} of ${c.findings.length} findings remain after the ${p.name} session.`),yield*Un(h.findings),yield*l(Rn(h,Kn)),yield*a}).pipe(n.catchTag(`OperationCancelled`,()=>n.gen(function*(){return yield*(yield*Q).cancel(`Doctor was cancelled. The findings remain.`),yield*new D({command:`doctor`,exitCode:s.ExitCode(1)})})))));const Jn=C.File(`files`,{mustExist:!0}).pipe(C.withDescription(`Specific files to fix (optional)`),C.variadic()),Yn=u.Boolean(`suggested`).pipe(u.withDefault(!1),u.withDescription(`Apply suggested fixes`)),Xn=u.Boolean(`dangerous`).pipe(u.withDefault(!1),u.withDescription(`Apply dangerous fixes`)),Zn=u.Boolean(`all`).pipe(u.withDefault(!1),u.withDescription(`Apply all fixes, including suggested and dangerous fixes`));var Qn=l.make(`fix`,{all:Zn,dangerous:Xn,files:Jn,suggested:Yn}).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:H.name});l!==s.ExitCode(0)&&(yield*new D({command:H.name,exitCode:l}))})));const $n=C.File(`files`,{mustExist:!0}).pipe(C.withDescription(`Specific files to format (optional)`),C.variadic()),er=u.Boolean(`check`).pipe(u.withDefault(!1),u.withDescription(`Check if files are formatted without writing`));var tr=l.make(`format`,{check:er,files:$n}).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:q.name});a!==s.ExitCode(0)&&(yield*new D({command:q.name,exitCode:a}))})));const nr=[`check`,`fix`,`format`,`check:monorepo`,`fix:monorepo`,`analyze`],rr=[`react`,`nextjs`,`vue`,`jest`,`vitest`,`node`,`antislop`],ir=[`vscode`,`zed`],ar=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 O({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 O({reason:`Monorepo scripts can only be selected in a detected monorepo.`}):n.presets.length>0&&!r?yield*new O({reason:"`--preset` requires the `check` or `fix` script."}):n.typescript&&!r?yield*new O({reason:"`--typescript` requires the `check` or `fix` script."}):n.installExtensions&&n.editors.length===0?yield*new O({reason:"`--install-extensions` requires at least one `--editor`."}):n.githubActions&&!Jt(n.scripts)?yield*new O({reason:"`--github-actions` requires a CI-compatible script."}):n.githubActions&&t.nonInteractive&&!Ve(t.packageManager)?yield*new O({reason:`\`--github-actions\` does not support the detected package manager \`${t.packageManager}\`. Use bun, deno, npm, pnpm, or yarn.`}):n}),or=u.Boolean(`non-interactive`).pipe(u.withDefault(!1),u.withDescription(`Configure without prompts; requires at least one --script`)),sr=u.Literals(`script`,nr).pipe(u.atMost(nr.length),u.withDescription(`Package script to configure; repeatable and required in non-interactive mode. Monorepo scripts require a detected monorepo`)),cr=u.Literals(`preset`,rr).pipe(u.atMost(rr.length),u.withDescription(`Oxlint preset to configure; repeatable and requires --script check or fix`)),lr=u.Literals(`editor`,ir).pipe(u.atMost(ir.length),u.withDescription(`Editor to configure; may be specified multiple times`)),ur=u.Boolean(`typescript`).pipe(u.withDefault(!1),u.withDescription(`Configure the TypeScript preset; requires --script check or fix`)),dr=u.Boolean(`install-extensions`).pipe(u.withDefault(!1),u.withDescription(`Install recommended extensions; requires at least one --editor`)),fr=u.Boolean(`github-actions`).pipe(u.withDefault(!1),u.withDescription(`Configure CI; requires a compatible script and bun, deno, npm, pnpm, or yarn`)),pr={agents:u.Boolean(`agents`).pipe(u.withDefault(!1),u.withDescription(`Add Adamantite guidance to AGENTS.md`)),editors:lr,githubActions:fr,installExtensions:dr,nonInteractive:or,overwriteScripts:u.Boolean(`overwrite-scripts`).pipe(u.withDefault(!1),u.withDescription(`Replace existing package scripts that conflict with Adamantite's managed commands`)),presets:cr,scripts:sr,typescript:ur},mr=e=>`\`${e.script}\` is currently \`${e.command}\`; Adamantite would replace it with \`${z[e.script]}\`.`,hr=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=Ue(yield*R(e),r),a=!1;if(i.length>0){for(let e of i)yield*n.log.warning(mr(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=Jt(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}}),gr=[{path:`.vscode/settings.json`,type:`config`}],_r={"[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:gr[0].path,create:e=>n.gen(function*(){let t=yield*x.Path,n=t.join(e,gr[0].path);yield*Me(t.dirname(n)),yield*F(n,_r)}),detect:e=>n.gen(function*(){let t=yield*b.FileSystem,n=yield*x.Path;return yield*t.exists(n.join(e,gr[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 be({cause:t,extension:e})));if(t!==s.ExitCode(0))return yield*new be({cause:t,extension:e})}}),files:gr,kind:`editor`,name:`vscode`,update:e=>n.gen(function*(){let t=(yield*x.Path).join(e,gr[0].path),n=yield*M(t),r=yield*I(n,t);if(!_.isObject(r))return yield*new Ee({path:t});let i=yield*Ie(_r,r);yield*F(t,i)})});const vr=`<!-- ADAMANTITE:START -->`,yr=`<!-- ADAMANTITE:END -->`;function br(e,t){let n=de(e,t),r=z[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 xr({packageManager:e,scripts:t}){let n=[`format`,`check`,`fix`,`analyze`,`check:monorepo`,`fix:monorepo`].filter(e=>t.includes(e)).map(t=>br(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[vr,``,r,``,yr,``].join(`
104
- `)}const Sr=(e,t)=>n.gen(function*(){let n=(yield*x.Path).join(e,`AGENTS.md`),r=h(yield*N(n),g.getOrElse(()=>``)),i=h(r,v.indexOf(vr)),a=h(r,v.indexOf(yr)),o=h(g.all({end:a,start:i}),g.filter(({end:e,start:t})=>t<e)),s=xr(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*P(n,a.endsWith(`
105
- `)?a:`${a}\n`),`updated`}if(g.isSome(i)||g.isSome(a))return`malformed`;let c=r.length===0||r.endsWith(`
101
+ `)}const gr=t.fn(`printFindings`)(function*(e){let t=yield*Q;for(let[n,r]of e.entries())yield*t.note(hr(r),`${n+1}. ${r.title}`)}),_r=`0.41.0`;var vr=l.make(`doctor`).pipe(l.withDescription(`Assess Adamantite-managed integrations in the current project`),l.withHandler(()=>t.gen(function*(){let e=f.cwd(),n=yield*Q,r=yield*mr,i=yield*r.isInteractive;i&&(yield*n.intro(`💠 adamantite doctor`));let o=t.gen(function*(){return yield*n.outro(`⚠️ Doctor found issues.`),yield*new O({command:`doctor`,exitCode:a.ExitCode(1)})}),s=yield*z(e);if(!s.devDependencies?.adamantite&&!s.dependencies?.adamantite){let e="`adamantite` is not installed in this project. Install it before running `adamantite doctor`.";return i?(yield*n.log.warning(e),yield*n.outro(`⚠️ Doctor found issues.`)):yield*n.message(e),yield*new O({command:`doctor`,exitCode:a.ExitCode(1)})}let c=yield*ur(e);if(i)for(let e of c.warnings)yield*n.log.warning(e);if(c.applicableIntegrations.length===0){i&&(yield*n.log.success(`No applicable integrations found.`),yield*n.outro(`✅ Doctor completed successfully!`));return}if(c.findings.length===0){i?(yield*n.log.success(`No issues found.`),yield*n.outro(`✅ Doctor completed successfully!`)):c.warnings.length>0&&(yield*n.message(dr(c,_r)));return}if(!i)return yield*n.message(dr(c,_r)),yield*new O({command:`doctor`,exitCode:a.ExitCode(1)});let l=e=>t.gen(function*(){(yield*n.confirm({initialValue:!0,message:`Copy the Markdown prompt for a coding agent?`}))&&(yield*n.message(e),yield*r.copyToClipboard(e),yield*n.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`))});yield*gr(c.findings);let u=yield*n.withSpinner(()=>hn(e),{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(`, `)}.`});u.length===0&&(yield*n.log.info(`Doctor can hand findings off when one of these CLIs is installed: ${mn.map(e=>`\`${e.command}\``).join(`, `)}.`));let d=dr(c,_r),p=yield*n.select({message:`How do you want to resolve these findings?`,options:[...u.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*n.message(d),yield*r.copyToClipboard(d),yield*n.log.success(`The Markdown prompt was printed and sent to the terminal clipboard.`),yield*o;let m=p,h=yield*bn(e);if(h!==`clean`&&(yield*n.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*n.confirm({initialValue:!1,message:`Hand off to ${m.name} anyway?`})))||(yield*n.log.info(`Handing the terminal to ${m.name}. Exit the agent to return to Doctor.`),!(yield*yn({agent:m,cwd:e}).pipe(t.as(!0),t.catchTag(`AgentSessionFailed`,e=>n.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(t.as(!1)))))))return yield*l(d),yield*o;let g=yield*ur(e);if(g.findings.length===0){yield*n.log.success(`All findings were resolved by ${m.name}.`),yield*n.outro(`✅ Doctor completed successfully!`);return}return yield*n.log.warning(`${g.findings.length} of ${c.findings.length} findings remain after the ${m.name} session.`),yield*gr(g.findings),yield*l(dr(g,_r)),yield*o}).pipe(t.catchTag(`OperationCancelled`,()=>t.gen(function*(){return yield*(yield*Q).cancel(`Doctor was cancelled. The findings remain.`),yield*new O({command:`doctor`,exitCode:a.ExitCode(1)})})))));const yr=w.File(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to fix (optional)`),w.variadic()),br=d.Boolean(`suggested`).pipe(d.withDefault(!1),d.withDescription(`Apply suggested fixes`)),xr=d.Boolean(`dangerous`).pipe(d.withDefault(!1),d.withDescription(`Apply dangerous fixes`)),Sr=d.Boolean(`all`).pipe(d.withDefault(!1),d.withDescription(`Apply all fixes, including suggested and dangerous fixes`));var Cr=l.make(`fix`,{all:Sr,dangerous:xr,files:yr,suggested:br}).pipe(l.withDescription(`Fix lint and formatting issues in code`),l.withHandler(({all:e,dangerous:n,files:r,suggested:i})=>t.gen(function*(){let t=yield*j,a=yield*A,o=s.dedupe(r),c=s.dedupe([`--fix`,...i||e?[`--fix-suggestions`]:[],...n||e?[`--fix-dangerously`]:[],...o]);yield*a.runAll([{args:[...c,...t],command:K.name,title:`🔧 Fixing lint issues`},{args:[`--write`,...o],command:W.name,title:`✨ Formatting`}])})));const wr=w.File(`files`,{mustExist:!0}).pipe(w.withDescription(`Specific files to format (optional)`),w.variadic()),Tr=d.Boolean(`check`).pipe(d.withDefault(!1),d.withDescription(`Check if files are formatted without writing`));var Er=l.make(`format`,{check:Tr,files:wr}).pipe(l.withDescription("Deprecated: use `fix` or `check`. Format files using oxfmt"),l.withHandler(({check:e,files:n})=>t.gen(function*(){let t=yield*j,r=yield*A,i=[];yield*h.error("Warning: `adamantite format` is deprecated and will be removed in the next release. Use `adamantite fix` to apply formatting and `adamantite check` to verify it."),e&&i.push(`--check`),i.push(...n,...t),yield*r.run({args:i,command:W.name})})));const Dr=' .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 ',Or=()=>t.gen(function*(){let e=yield*(yield*pe.Terminal).columns,t=Dr.split(`
102
+ `).reduce((e,t)=>Math.max(e,t.trim().length),0);!e||e<t||(yield*h.info(Dr))}),kr=[`check`,`fix`,`format`,`check:monorepo`,`fix:monorepo`,`analyze`],Ar=[`react`,`nextjs`,`vue`,`jest`,`vitest`,`node`,`antislop`],jr=[`vscode`,`zed`],Mr=t.fn(`validateInitOptions`)(function*(e,t){let n={agents:e.agents,editors:s.dedupe(e.editors),githubActions:e.githubActions,installExtensions:e.installExtensions,overwriteScripts:e.overwriteScripts,presets:s.dedupe(e.presets),scripts:s.dedupe(e.scripts),typescript:e.typescript};if(n.scripts.length===0)return yield*new k({reason:"Select at least one script with `--script <name>`."});if(n.scripts.includes(`format`))return yield*new k({reason:"The `format` script is no longer available in init. Select `check` or `fix` instead."});if(n.scripts.includes(`check:monorepo`)||n.scripts.includes(`fix:monorepo`))return yield*new k({reason:"The `check:monorepo` and `fix:monorepo` scripts are no longer available in init. Select `analyze` instead; it runs Sherif in a detected monorepo."});let r=n.scripts.includes(`check`)||n.scripts.includes(`fix`);return 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&&!Cn(n.scripts)?yield*new k({reason:"`--github-actions` requires a CI-compatible script."}):n.githubActions&&t.nonInteractive&&!Ge(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}),Nr=d.Boolean(`non-interactive`).pipe(d.withDefault(!1),d.withDescription(`Configure without prompts; requires at least one --script`)),Pr=d.Literals(`script`,kr).pipe(d.atMost(kr.length),d.withDescription(`Package script to configure; repeatable and required in non-interactive mode. The legacy format value is rejected; select check or fix instead. The legacy check:monorepo and fix:monorepo values are rejected; select analyze instead`)),Fr=d.Literals(`preset`,Ar).pipe(d.atMost(Ar.length),d.withDescription(`Oxlint preset to configure; repeatable and requires --script check or fix`)),Ir=d.Literals(`editor`,jr).pipe(d.atMost(jr.length),d.withDescription(`Editor to configure; may be specified multiple times`)),Lr=d.Boolean(`typescript`).pipe(d.withDefault(!1),d.withDescription(`Configure the TypeScript preset; requires --script check or fix`)),Rr=d.Boolean(`install-extensions`).pipe(d.withDefault(!1),d.withDescription(`Install recommended extensions; requires at least one --editor`)),zr=d.Boolean(`github-actions`).pipe(d.withDefault(!1),d.withDescription(`Configure CI; requires a compatible script and bun, deno, npm, pnpm, or yarn`)),Br={agents:d.Boolean(`agents`).pipe(d.withDefault(!1),d.withDescription(`Add Adamantite guidance to AGENTS.md`)),editors:Ir,githubActions:zr,installExtensions:Rr,nonInteractive:Nr,overwriteScripts:d.Boolean(`overwrite-scripts`).pipe(d.withDefault(!1),d.withDescription(`Replace existing package scripts that conflict with Adamantite's managed commands`)),presets:Fr,scripts:Pr,typescript:Lr},Vr=e=>`\`${e.script}\` is currently \`${e.command}\`; Adamantite would replace it with \`${B[e.script]}\`.`,Hr=t.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 - check formatting, lint issues, and type errors`,value:`check`},{hint:`recommended`,label:`fix - apply safe lint fixes and format code`,value:`fix`},{label:t?`analyze - check monorepo consistency using Sherif and find unused dependencies, exports, and files using knip`:`analyze - find unused dependencies, exports, and files using knip`,value:`analyze`}]}),i=qe(yield*z(e),r),a=!1;if(i.length>0){for(let e of i)yield*n.log.warning(Vr(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=Cn(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}}),Ur=[{path:`.vscode/settings.json`,type:`config`}],Wr={"[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:Ur[0].path,create:e=>t.gen(function*(){let t=yield*C.Path,n=t.join(e,Ur[0].path);yield*Ie(t.dirname(n)),yield*I(n,Wr)}),detect:e=>t.gen(function*(){let t=yield*S.FileSystem,n=yield*C.Path;return yield*t.exists(n.join(e,Ur[0].path))}),extension:(e=[])=>t.gen(function*(){let n=[];(e.includes(`check`)||e.includes(`fix`))&&n.push(`oxc.oxc-vscode`),e.includes(`analyze`)&&n.push(`webpro.vscode-knip`);for(let e of n)yield*(yield*A).run({args:[`--install-extension`,e],command:`code`}).pipe(t.mapError(t=>t._tag===`CliNotFound`&&t.command===`code`?new Me({cause:t}):new be({cause:t._tag===`CommandFailed`?t.exitCode:t,extension:e})))}),files:Ur,kind:`editor`,name:`vscode`,update:e=>t.gen(function*(){let t=(yield*C.Path).join(e,Ur[0].path),n=yield*N(t),r=yield*L(n,t);if(!b.isObject(r))return yield*new Ee({path:t});let i=yield*Be(Wr,r);yield*I(t,i)})});const Gr=`<!-- ADAMANTITE:START -->`,Kr=`<!-- ADAMANTITE:END -->`;function qr(e,t,n){let r=fe(e,t),i=B[t];switch(t){case`analyze`:return`- Run \`${r}\` after changing dependencies, imports, or exports.${n?` It also checks monorepo package consistency.`:``} Direct command: \`${i}\`.`;case`check`:return`- Run \`${r}\` to catch formatting, lint, and type issues. Direct command: \`${i}\`.`;case`fix`:return`- Run \`${r}\` to apply safe lint fixes and format code. Direct command: \`${i}\`.`}}function Jr({isMonorepo:e,packageManager:t,scripts:n}){let r=[`check`,`fix`,`analyze`].filter(e=>n.includes(e)).map(n=>qr(t,n,e)),i=[`## Adamantite`,``,`This project uses Adamantite for its managed formatting, linting, type checking, and dependency-analysis setup.`,``,...r.length>0?[`- Prefer the package scripts Adamantite added for this workspace.`,...r]:[],"- Run `adamantite doctor` and follow its findings to repair managed setup."].join(`
103
+ `);return[Gr,``,i,``,Kr,``].join(`
104
+ `)}const Yr=(e,n)=>t.gen(function*(){let t=(yield*C.Path).join(e,`AGENTS.md`),r=y(yield*P(t),u.getOrElse(()=>``)),i=y(r,x.indexOf(Gr)),a=y(r,x.indexOf(Kr)),o=y(u.all({end:a,start:i}),u.filter(({end:e,start:t})=>t<e)),s=Jr(n);if(u.isSome(o)){let{end:e,start:n}=o.value,i=e+23,a=`${r.slice(0,n)}${s.trimEnd()}${r.slice(i)}`;return yield*F(t,a.endsWith(`
105
+ `)?a:`${a}\n`),`updated`}if(u.isSome(i)||u.isSome(a))return`malformed`;let c=r.length===0||r.endsWith(`
106
106
 
107
107
  `)?``:r.endsWith(`
108
108
  `)?`
109
109
  `:`
110
110
 
111
- `;return yield*P(n,`${r}${c}${s}`),`updated`}),Cr=(e,t)=>n.gen(function*(){let r=yield*U;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 wr(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 Tr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*R(e),o=r.overwriteScripts?[]:Ue(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]=z[e];yield*Be(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 \`${z[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}),Er=(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`})}),Dr=(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.`}))}),Or=(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"))}),kr=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=W.files[0].path;yield*i.withSpinner(i=>n.gen(function*(){let n=yield*W.detect(e);return yield*i.message(n?`\`${a}\` found, updating...`:`Creating \`${a}\`...`),yield*n?W.update(e,{packageManager:t,scripts:r}):W.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.")}))),Ar=(e,t,r)=>n.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(()=>Sr(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.`))});var jr=l.make(`init`,pr).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*U).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*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 O({reason:"Setup flags require `--non-interactive`."});let a=e.nonInteractive?e:yield*hr(t,i),o=yield*ar(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(`${H.name}@${H.version}`,`${En.name}@${En.version}`),g&&y.push(`${q.name}@${q.version}`),v&&y.push(`${J.name}@${J.version}`),ee&&y.push(`${B.name}@${B.version}`),yield*Cr(t,y),g&&(yield*wr(t,q,q.create(t))),h&&(yield*wr(t,H,H.create(t,l))),ee&&(yield*wr(t,B,B.create(t)));let b=yield*Tr(t,s,{nonInteractive:e.nonInteractive,overwriteScripts:o.overwriteScripts});if(m&&(yield*Ar(t,r.name,b)),d&&(yield*Er(t,i)),yield*Dr(t,u),f&&(yield*Or(u,s)),p){let e=r.name;Ve(e)?yield*kr(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 Mr=u.Boolean(`fix`).pipe(u.withDefault(!1),u.withDescription(`Automatically fix issues`));var Nr=l.make(`monorepo`,{fix:Mr}).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:J.name,stdin:`inherit`});i!==s.ExitCode(0)&&(yield*new D({command:J.name,exitCode:i}))})));const Pr=[H,En,q,J,B];function Fr(e,t){return c.filterMap(Pr,n=>{if(t.has(n.name))return ne.failVoid;let r=e.devDependencies?.[n.name]??e.dependencies?.[n.name];return r&&ze(r)!==n.version?ne.succeed({currentVersion:r,name:n.name,targetVersion:n.version}):ne.failVoid})}var Ir=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*U;yield*Gn(),yield*t.intro(`💠 adamantite update`);let r=yield*R(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})),...Fr(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 Lr=[ut,Rt,Qn,tr,Nr],Rr=[ut,Rt,qn,Qn,tr,jr,Nr,Ir],zr=new Set(Rr.map(e=>e.name)),Br=new Set(Lr.map(e=>e.name)),Vr=l.make(`adamantite`).pipe(l.withDescription(`Opinionated preset package for modern TypeScript applications`),l.withSubcommands(Rr)),Hr=n.fn(`runCli`)(function*(e,t){let[r,i]=c.splitWhere(e,e=>e===`--`),a=c.drop(i,1),o=r.find(e=>zr.has(e));if(a.length>0&&o!==void 0&&!Br.has(o))return yield*new Ae({command:o});yield*l.runWith(Vr,{version:t})(r).pipe(n.provideService(A,a))}),Ur=n.gen(function*(){let e=yield*(yield*o.Stdio).args;yield*Hr(e,`0.40.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,an.layer.pipe(i.provide(t.layer)),Q.layer,k.layer,U.layer,Vn.layer)));e.runMain(Ur,{teardown:(e,t)=>{if(r.isSuccess(e)){t(Number(e.value));return}a.defaultTeardown(e,t)}});export{};
111
+ `;return yield*F(t,`${r}${c}${s}`),`updated`}),Xr=(e,n)=>t.gen(function*(){yield*(yield*Q).withSpinner(()=>En(e,n),{failure:`Failed to install dependencies.`,start:`Installing dependencies...`,success:`Dependencies installed.`})});function Zr(e,n,r){return t.gen(function*(){let i=yield*Q,a=yield*i.withSpinner(a=>t.gen(function*(){let t=yield*n.detect(e);for(let e of t.warnings)yield*i.log.warning(e);return t.active===null?(yield*a.message(`\`${n.config}\` not found, creating...`),yield*r,{created:!0,legacyConfig:null}):t.active.format===`ts`?(yield*a.message(`Found \`${n.config}\`, keeping existing config.`),{created:!1,legacyConfig:null}):(yield*a.message(`Found \`${t.active.file}\`, keeping existing config.`),{created:!1,legacyConfig:t.active.file})}),{failure:`Failed to set up ${n.name} config.`,start:`Setting up ${n.name} config...`,success:e=>e.created?`${n.name} config created successfully.`:`${n.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 ${n.name} config.`))})}const Qr=(e,n,r)=>t.gen(function*(){let i=yield*Q,a=yield*z(e),o=r.overwriteScripts?[]:qe(a,n),s=new Set(o.map(e=>e.script)),c=n.filter(e=>!s.has(e));yield*i.withSpinner(()=>t.gen(function*(){if(c.length!==0){a.scripts??={};for(let e of c)a.scripts[e]=B[e];yield*We(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 analyze -- --directory packages/app`.")),c}),$r=(e,n)=>t.gen(function*(){let r=yield*Q;if(n){yield*y(ar,t.forEach(e=>r.log.info(e)));return}yield*r.withSpinner(n=>t.gen(function*(){return(yield*Z.detect(e))?(yield*n.message(`\`${Z.config}\` found, updating...`),yield*Z.update(e),!1):(yield*n.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`})}),ei=(e,n)=>t.gen(function*(){let r=yield*Q;n.includes(`vscode`)&&(yield*r.withSpinner(n=>t.gen(function*(){let t=yield*$.detect(e);return yield*n.message(`\`${$.config}\` ${t?`found, updating`:`not found, creating`}...`),yield*t?$.update(e):$.create(e),!t}),{failure:`Failed to set up VS Code config.`,start:`Checking for \`${$.config}\`...`,success:e=>`\`${$.config}\` ${e?`created`:`updated`} with Adamantite preset.`})),n.includes(`zed`)&&(yield*r.withSpinner(n=>t.gen(function*(){let t=yield*J.detect(e);return yield*n.message(`\`${J.config}\` ${t?`found, updating`:`not found, creating`}...`),yield*t?J.update(e):J.create(e),!t}),{failure:`Failed to set up Zed config.`,start:`Checking for \`${J.config}\`...`,success:e=>`\`${J.config}\` ${e?`created`:`updated`} with Adamantite preset.`}))}),ti=(e,n)=>t.gen(function*(){let r=yield*Q,i=e.includes(`zed`),a=e.includes(`vscode`);yield*r.withSpinner(e=>t.gen(function*(){return a&&(yield*e.message(`Installing VS Code extension...`),yield*$.extension(n)),!0}),{start:`Installing editor extensions...`,success:i&&!a?`Zed extensions require manual install.`:`Editor extensions installed successfully.`}).pipe(t.catchTag(`FailedToInstallExtension`,e=>t.gen(function*(){return yield*r.log.warning(`⚠️ ${e.message}`),yield*r.log.warning(`Please install it manually after setup completes.`),!1})),t.catchTag(`VscodeCliNotFound`,()=>t.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"))}),ni=(e,n,r)=>t.gen(function*(){let i=yield*Q,a=Zn.files[0].path;yield*i.withSpinner(i=>t.gen(function*(){let t=yield*Zn.detect(e);return yield*i.message(t?`\`${a}\` found, updating...`:`Creating \`${a}\`...`),yield*t?Zn.update(e,{packageManager:n,scripts:r}):Zn.create(e,{packageManager:n,scripts:r}),!t}),{failure:`Failed to set up GitHub Actions workflow.`,start:`Setting up GitHub Actions workflow...`,success:e=>`GitHub Actions workflow ${e?`created`:`updated`} successfully.`})}).pipe(t.catchTag([`FailedToCreateDirectory`,`FailedToParseFile`,`FailedToReadFile`,`FailedToWriteFile`,`PlatformError`],e=>t.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.")}))),ri=(e,n,r,i)=>t.gen(function*(){let a=yield*Q,o=yield*a.withSpinner(()=>Yr(e,{isMonorepo:i,packageManager:n,scripts:r}),{failure:`Failed to update AGENTS.md.`,start:`Updating AGENTS.md...`,success:`AGENTS.md check complete.`}).pipe(t.catchTag([`FailedToReadFile`,`FailedToWriteFile`],e=>t.gen(function*(){return yield*a.log.warning(`Could not update AGENTS.md. ${e.message} Adamantite will continue initialization.`),`failed`})));o!==`failed`&&o===`malformed`&&(yield*a.log.warning(`Could not update AGENTS.md because Adamantite markers are incomplete. Remove the stale ADAMANTITE marker and run adamantite init again.`))});var ii=l.make(`init`,Br).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 --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 analyze`,description:`Configure analysis; in a detected monorepo it includes Sherif`}]),l.withHandler(e=>t.gen(function*(){let t=f.cwd(),n=yield*Q;yield*Or(),yield*n.intro(`💠 adamantite init`);let r=yield*(yield*wn).detectPackageManager(t);if(!r)return yield*new ke({});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*V(t);if(i&&(yield*n.log.info(`We've detected a monorepo setup in your project.`)),!e.nonInteractive&&s.some([e.scripts.length>0,e.presets.length>0,e.editors.length>0,e.typescript,e.installExtensions,e.githubActions,e.agents,e.overwriteScripts],b.isTruthy))return yield*new k({reason:"Setup flags require `--non-interactive`."});let a=e.nonInteractive?e:yield*Hr(t,i),o=yield*Mr(a,{nonInteractive:e.nonInteractive,packageManager:r.name}),c=o.scripts,l=o.presets,u=o.editors,d=o.typescript,p=o.installExtensions,m=o.githubActions,h=o.agents,g=c.includes(`check`)||c.includes(`fix`),_=c.includes(`analyze`),ee=_&&i,v=[`adamantite`];g&&v.push(`${K.name}@${K.version}`,`${rr.name}@${rr.version}`,`${W.name}@${W.version}`),ee&&v.push(`${U.name}@${U.version}`),_&&v.push(`${H.name}@${H.version}`),yield*Xr(t,v),g&&(yield*Zr(t,W,W.create(t)),yield*Zr(t,K,K.create(t,l))),_&&(yield*Zr(t,H,H.create(t)));let y=yield*Qr(t,c,{nonInteractive:e.nonInteractive,overwriteScripts:o.overwriteScripts});if(h&&(yield*ri(t,r.name,y,i)),d&&(yield*$r(t,i)),yield*ei(t,u),p&&(yield*ti(u,c)),m){let e=r.name;Ge(e)?yield*ni(t,e,c):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(t.catchTags({OperationCancelled:()=>t.gen(function*(){yield*(yield*Q).cancel(`You've cancelled the initialization process.`)})}))));const ai=d.Boolean(`fix`).pipe(d.withDefault(!1),d.withDescription(`Automatically fix issues`));function oi(e,t){return`Warning: \`adamantite monorepo\` is deprecated and will be removed in the next release. Use \`${[`adamantite analyze --only monorepo`,...e?[`--fix`]:[],...t.length>0?[`--`,...t]:[]].join(` `)}\` instead.`}var si=l.make(`monorepo`,{fix:ai}).pipe(l.withDescription("Deprecated: use `analyze`. Find and fix monorepo-specific issues using Sherif"),l.withHandler(({fix:e})=>t.gen(function*(){let t=yield*j,n=yield*A;yield*h.error(oi(e,t));let r=e?[`--fix`,...t]:[...t];yield*n.run({args:r,command:U.name,stdin:`inherit`})})));const ci=[K,rr,W,U,H];function li(e,t){return s.filterMap(ci,n=>{if(t.has(n.name))return _.failVoid;let r=e.devDependencies?.[n.name]??e.dependencies?.[n.name];return r&&Ue(r)!==n.version?_.succeed({currentVersion:r,name:n.name,targetVersion:n.version}):_.failVoid})}var ui=l.make(`update`).pipe(l.withDescription(`Update Adamantite-managed dependencies and report setup findings`),l.withHandler(()=>t.gen(function*(){let e=f.cwd(),t=yield*Q;yield*t.intro(`💠 adamantite update`);let n=yield*z(e),r=yield*ur(e,n),i=r.packageActions,a=new Set(i.map(e=>e.package)),o=[...i.map(e=>({currentVersion:e.type===`install_package`?`not installed`:e.currentVersion,name:e.package,targetVersion:e.targetVersion})),...li(n,a)];if(o.length>0){yield*t.log.info(`The following dependencies will be updated:`);for(let e of o)yield*t.log.info(` ${e.name}: ${e.currentVersion} → ${e.targetVersion}`);yield*t.withSpinner(()=>En(e,o.map(e=>`${e.name}@${e.targetVersion}`)),{failure:`Failed to update dependencies`,start:`Updating dependencies...`,success:`Dependencies updated successfully`}),yield*t.log.success(`Dependencies updated successfully.`)}let s=o.length===0?r:yield*ur(e);for(let e of s.warnings)yield*t.log.warning(e);let c=s.findings;return c.length>0&&(yield*gr(c),yield*t.log.info("Run `adamantite doctor` to get the combined Markdown repair prompt.")),o.length===0&&c.length===0?(yield*t.log.success(`No changes needed.`),`no-changes`):`success`}).pipe(t.tapError(()=>t.gen(function*(){yield*(yield*Q).outro(`❌ Update failed`)})),t.tap(e=>t.gen(function*(){yield*(yield*Q).outro(e===`no-changes`?`✅ Adamantite is already up to date.`:`✅ Update completed successfully!`)})))));const di=[Nt,pn,Cr,Er,si],fi=[Nt,pn,vr,Cr,Er,ii,si,ui],pi=new Set(fi.map(e=>e.name)),mi=new Set(di.map(e=>e.name)),hi=l.make(`adamantite`).pipe(l.withDescription(`Opinionated preset package for modern TypeScript applications`),l.withSubcommands(fi)),gi=e=>c.mergeAll(o.layer,In.layer.pipe(c.provide(o.layer)),Q.layer,e.pipe(c.provide(o.layer)),wn.layer,mr.layer),_i=t.fn(`runCli`)(function*(e,n){let[r,i]=s.splitWhere(e,e=>e===`--`),a=s.drop(i,1),o=r.find(e=>pi.has(e));if(a.length>0&&o!==void 0&&!mi.has(o))return yield*new je({command:o});yield*l.runWith(hi,{version:n})(r).pipe(t.provideService(j,a))}),vi=t.gen(function*(){let e=yield*(yield*i.Stdio).args;yield*_i(e,`0.41.0`)}).pipe(t.as(0),t.catchTag(`CommandFailed`,e=>t.succeed(e.exitCode)),t.catch(e=>t.service(Q).pipe(t.flatMap(t=>t.log.error(e.message)),t.as(a.ExitCode(1)))),t.provide(gi(A.layer)));e.runMain(vi,{teardown:(e,t)=>{if(n.isSuccess(e)){t(Number(e.value));return}r.defaultTeardown(e,t)}});export{};
@@ -1,5 +1,23 @@
1
1
  import { KnipConfiguration } from "knip";
2
2
  //#region presets/analyze.d.ts
3
+ interface SuggestedIgnoreDependencies {
4
+ monorepo: string[];
5
+ }
6
+ /**
7
+ * Suggested `ignoreDependencies` lists, grouped by the kind of project that needs them. The default
8
+ * export does not include them, because Knip prints a configuration hint for an ignore that matches
9
+ * nothing.
10
+ *
11
+ * - `monorepo`: `adamantite analyze` runs Sherif in a monorepo, and Knip has no plugin that sees that
12
+ * reference, so it reports Sherif as an unused devDependency.
13
+ *
14
+ * ```ts
15
+ * import analyze, { ignoreDependencies } from "adamantite/analyze"
16
+ *
17
+ * export default { ...analyze, ignoreDependencies: ignoreDependencies.monorepo }
18
+ * ```
19
+ */
20
+ declare const ignoreDependencies: SuggestedIgnoreDependencies;
3
21
  declare const config: KnipConfiguration;
4
22
  //#endregion
5
- export { config as default };
23
+ export { config as default, ignoreDependencies };
@@ -1,4 +1,19 @@
1
1
  //#region presets/analyze.ts
2
+ /**
3
+ * Suggested `ignoreDependencies` lists, grouped by the kind of project that needs them. The default
4
+ * export does not include them, because Knip prints a configuration hint for an ignore that matches
5
+ * nothing.
6
+ *
7
+ * - `monorepo`: `adamantite analyze` runs Sherif in a monorepo, and Knip has no plugin that sees that
8
+ * reference, so it reports Sherif as an unused devDependency.
9
+ *
10
+ * ```ts
11
+ * import analyze, { ignoreDependencies } from "adamantite/analyze"
12
+ *
13
+ * export default { ...analyze, ignoreDependencies: ignoreDependencies.monorepo }
14
+ * ```
15
+ */
16
+ const ignoreDependencies = { monorepo: ["sherif"] };
2
17
  const config = {
3
18
  ignoreExportsUsedInFile: true,
4
19
  rules: {
@@ -20,4 +35,4 @@ const config = {
20
35
  }
21
36
  };
22
37
  //#endregion
23
- export { config as default };
38
+ export { config as default, ignoreDependencies };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adamantite",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "description": "An strict and opinionated set of presets for modern TypeScript applications",
5
5
  "keywords": [
6
6
  "adamantite",
@@ -22,25 +22,26 @@ non-interactive setup. Setup flags require `--non-interactive`, and at least one
22
22
  `--script` is required:
23
23
 
24
24
  ```shell
25
- npx adamantite init --non-interactive --script check --script fix --script format --typescript --agents
25
+ npx adamantite init --non-interactive --script check --script fix --typescript --agents
26
26
  ```
27
27
 
28
28
  Repeat `--script`, `--preset`, and `--editor` for multiple values. Available values are:
29
29
 
30
- - Scripts: `check`, `fix`, `format`, `analyze`, `check:monorepo`, `fix:monorepo`
30
+ - Scripts: `check`, `fix`, `analyze`. In a detected monorepo, `analyze` also installs Sherif.
31
+ The legacy `check:monorepo` and `fix:monorepo` values are rejected.
31
32
  - Presets: `react`, `nextjs`, `vue`, `jest`, `vitest`, `node`, `antislop`; editors:
32
33
  `vscode`, `zed`
33
34
  - Optional flags: `--typescript`, `--install-extensions`, `--github-actions`, `--agents`,
34
35
  `--overwrite-scripts`
35
36
 
36
- Only select options supported by the project. Presets and TypeScript require `check` or
37
- `fix`; extension installation requires an editor; monorepo scripts require a detected
38
- monorepo; `--github-actions` requires a CI-compatible script and a supported package
39
- manager (bun, deno, npm, pnpm, or yarn). Omitted boolean flags are disabled.
37
+ Only select options supported by the project. Presets and TypeScript require `check` or `fix`;
38
+ extension installation requires an editor; `--github-actions` requires a CI-compatible script
39
+ and a supported package manager (bun, deno, npm, pnpm, or yarn). Omitted boolean flags are
40
+ disabled.
40
41
 
41
42
  Existing package scripts whose commands differ from Adamantite's are kept and reported,
42
43
  not replaced; pass `--overwrite-scripts` to replace them. Custom flags can be forwarded
43
- to the Adamantite command after `--`, e.g. `adamantite monorepo -- --ignore-dependency tailwindcss`.
44
+ to the Adamantite command after `--`, e.g. `adamantite analyze -- --directory packages/app`.
44
45
 
45
46
  ## Daily workflow
46
47
 
@@ -49,25 +50,35 @@ Use the scripts written by `init` when available. Otherwise invoke the CLI direc
49
50
  ```shell
50
51
  adamantite check
51
52
  adamantite fix
52
- adamantite format
53
- adamantite format --check
54
53
  adamantite analyze
55
- adamantite monorepo
56
54
  ```
57
55
 
58
- - Use `check` for read-only lint and type-error validation.
59
- - Use `fix` for automatic oxlint fixes. Add `--suggested`, `--dangerous`, or `--all` only
56
+ - Use `check` for read-only formatting, lint, and type-error validation.
57
+ - Use `fix` for automatic Oxlint fixes followed by Oxfmt formatting. Add `--suggested`, `--dangerous`, or `--all` only
60
58
  with explicit permission after reviewing their impact.
61
- - Use `format` to write formatting changes and `format --check` for read-only CI checks.
62
- - Use `analyze` for unused dependencies, exports, and files. `analyze --fix` may remove
63
- files, so inspect findings before using it.
64
- - Use `monorepo` to inspect workspace dependency consistency and `monorepo --fix` to fix it.
65
-
66
- To pass arguments to Knip, Oxlint, Oxfmt, or Sherif, place them after `--`:
59
+ - Do not use `format`. It is deprecated and the next release removes it. `fix` writes formatting changes and `check`
60
+ verifies formatting for read-only CI checks.
61
+ - Use `analyze` for unused dependencies, exports, and files. In a monorepo it first checks
62
+ workspace dependency consistency with Sherif. `analyze --only monorepo` or
63
+ `analyze --only unused` runs one stage. `analyze --fix` may remove files, so inspect
64
+ findings before using it. Sherif refuses to fix when `CI` is set, so in a monorepo
65
+ `analyze --fix` fails there; use `analyze --only unused --fix` for the Knip fixes.
66
+ - In a monorepo, `analyze --fix` needs a terminal when Sherif must choose between versions.
67
+ Without a terminal, set `"sherif": { "select": "highest" }` in the root `package.json`, or
68
+ use `analyze --only unused --fix` to skip Sherif.
69
+ - `analyze` runs Sherif without flags. Put Sherif exceptions in the `sherif` field of the root
70
+ `package.json` (camelCase CLI options, e.g. `"ignoreDependency": ["tailwindcss"]`).
71
+ - Do not use `monorepo`. It is deprecated and the next release removes it. Use `analyze`, or
72
+ `analyze --only monorepo` to run only Sherif.
73
+
74
+ To pass arguments to Knip, Oxlint, or Sherif, place them after `--`. For `check` and `fix` they
75
+ go to Oxlint. For `analyze` they go to Knip, or to the stage that `--only` selects, so a Sherif
76
+ flag needs `--only monorepo`. For a permanent Sherif setting, use the `sherif` field instead.
67
77
 
68
78
  ```shell
69
79
  adamantite check src -- --deny-warnings
70
80
  bun run analyze -- -- --directory packages/app
81
+ adamantite analyze --only monorepo -- --ignore-package package-a
71
82
  ```
72
83
 
73
84
  ## Diagnose and repair
@@ -102,6 +113,6 @@ findings. Follow those findings and review the resulting diff.
102
113
  - New target project: `init`, then run the configured checks.
103
114
  - Suspected drift or broken setup: run `doctor` and follow its findings.
104
115
  - Existing project upgrading Adamantite: `update`, then the doctor sequence.
105
- - Code-quality failure: choose `check`, `format --check`, `analyze`, or `monorepo` based on
106
- the failing subsystem; do not reinitialize the project.
116
+ - Code-quality failure: choose `check` or `analyze` based on the failing subsystem; do not
117
+ reinitialize the project.
107
118
  - Unknown option or behavior: run `adamantite <command> --help` before guessing.