acture-codemods 1.1.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/LICENSE +190 -0
- package/README.md +85 -0
- package/dist/cli.js +957 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +746 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +309 -0
- package/dist/index.d.ts +309 -0
- package/dist/index.js +736 -0
- package/dist/index.js.map +1 -0
- package/migrations.json +37 -0
- package/package.json +62 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/codemods/wrap-handler-with-mutation.ts","../src/codemods/extract-onclick-to-command.ts","../src/codemods/redux-action-to-command.ts","../src/codemods/usestate-mutation-to-command.ts","../src/codemods/rtk-thunk-to-command.ts","../src/manifest.ts","../src/runner.ts","../src/diff.ts","../src/cli.ts"],"names":["resolveOptions","Project","SyntaxKind","DEFAULT_EVENTS","rewriteOne","ensureImport"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * `wrap-handler-with-mutation`\n *\n * Find every `onClick`, `onChange`, `onSubmit` JSX attribute whose value\n * is an expression and wrap it with `wrapMutation(...)`. Adds the import\n * if missing.\n *\n * Examples:\n * <button onClick={save}>Save</button>\n * →\n * <button onClick={wrapMutation(save)}>Save</button>\n *\n * <form onSubmit={(e) => handler(e)}>\n * →\n * <form onSubmit={wrapMutation((e) => handler(e))}>\n *\n * Idempotent: if the expression is already a call to `wrapMutation`, we\n * leave it alone.\n *\n * Conservative: we skip the attribute (and surface a note) if the\n * expression contains anything we don't know how to wrap cleanly. The\n * agent will re-attempt by hand. Specifically, we skip:\n * - Attributes that aren't `onClick` / `onChange` / `onSubmit` by\n * default (configurable via `--events`).\n * - Attribute values that aren't JsxExpression containers (literal\n * strings, etc.).\n *\n * This is the simplest of the v1.2 codemods — pure structural rewrite,\n * no type info needed (research-4 §B.5 row 4).\n */\n\nimport { Project, SyntaxKind, type Node } from 'ts-morph';\nimport type { Codemod, CodemodOptions, CodemodResult, FileChange } from '../types.js';\n\nconst DEFAULT_EVENTS = new Set(['onClick', 'onChange', 'onSubmit']);\n\ninterface ResolvedOptions {\n readonly events: ReadonlySet<string>;\n readonly importFrom: string;\n readonly importName: string;\n}\n\nfunction resolveOptions(opts: Record<string, string | undefined> | undefined): ResolvedOptions {\n const raw = opts?.['events'];\n const events = raw\n ? new Set(raw.split(',').map((s) => s.trim()).filter(Boolean))\n : DEFAULT_EVENTS;\n return {\n events,\n importFrom: opts?.['import-from'] ?? 'acture-migration',\n importName: opts?.['import-name'] ?? 'wrapMutation',\n };\n}\n\nexport const wrapHandlerWithMutation: Codemod = {\n name: 'wrap-handler-with-mutation',\n description:\n 'Wrap onClick/onChange/onSubmit handler expressions with wrapMutation(). Adds the import if missing.',\n async run(options: CodemodOptions): Promise<CodemodResult> {\n const resolved = resolveOptions(options.options);\n const project = new Project({\n useInMemoryFileSystem: false,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: false, jsx: 4 /* ReactJSX */ },\n });\n\n const fileChanges: FileChange[] = [];\n let totalChanged = 0;\n let totalSkipped = 0;\n\n for (const path of options.files) {\n const sourceFile = project.addSourceFileAtPath(path);\n const before = sourceFile.getFullText();\n const notes: string[] = [];\n let attrCount = 0;\n\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {\n const nameNode = attr.getNameNode();\n const name = nameNode.getText();\n if (!resolved.events.has(name)) return;\n\n const initializer = attr.getInitializer();\n if (!initializer || initializer.getKind() !== SyntaxKind.JsxExpression) {\n notes.push(`${path}: skipped ${name} — not a {...} expression`);\n return;\n }\n\n const expr = initializer.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();\n if (!expr) {\n notes.push(`${path}: skipped ${name} — empty expression`);\n return;\n }\n\n if (isAlreadyWrapped(expr, resolved.importName)) return;\n\n const inner = expr.getText();\n initializer.replaceWithText(`{${resolved.importName}(${inner})}`);\n attrCount++;\n });\n\n if (attrCount > 0) {\n ensureImport(sourceFile, resolved.importName, resolved.importFrom);\n }\n\n const after = sourceFile.getFullText();\n const changed = before !== after;\n if (changed) totalChanged++;\n else totalSkipped++;\n\n fileChanges.push({\n path,\n before,\n after,\n changed,\n ...(notes.length > 0 ? { notes } : {}),\n });\n\n if (changed && !options.dryRun) {\n await sourceFile.save();\n }\n project.removeSourceFile(sourceFile);\n }\n\n return {\n codemod: 'wrap-handler-with-mutation',\n version: '1.0.0',\n files: fileChanges,\n summary: {\n total: options.files.length,\n changed: totalChanged,\n skipped: totalSkipped,\n },\n };\n },\n};\n\nfunction isAlreadyWrapped(expr: Node, importName: string): boolean {\n if (expr.getKind() !== SyntaxKind.CallExpression) return false;\n const callee = expr.asKindOrThrow(SyntaxKind.CallExpression).getExpression();\n return callee.getText() === importName;\n}\n\nfunction ensureImport(\n sourceFile: ReturnType<Project['addSourceFileAtPath']>,\n importName: string,\n importFrom: string,\n): void {\n const existing = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === importFrom,\n );\n if (existing) {\n const named = existing.getNamedImports().map((n) => n.getName());\n if (!named.includes(importName)) {\n existing.addNamedImport(importName);\n }\n return;\n }\n sourceFile.addImportDeclaration({\n moduleSpecifier: importFrom,\n namedImports: [importName],\n });\n}\n","/**\n * `extract-onclick-to-command`\n *\n * Lift an inline `onClick={() => …}` (or `onSubmit`/`onChange`) into a\n * named module-level command registered with `defineCommand`, and\n * replace the JSX expression with a reference to the command's id\n * dispatched via the registry.\n *\n * Example transform (input):\n * <button onClick={() => store.save()}>Save</button>\n *\n * Example transform (output):\n * const __cmd_handleSave = defineCommand({\n * id: 'app.wrapped.handleSave',\n * title: 'Handle Save',\n * execute: () => { store.save(); return ok(undefined); },\n * });\n *\n * <button onClick={() => registry.dispatch(__cmd_handleSave.id)}>Save</button>\n *\n * **Scope (research-4 §B.5):** This codemod is intentionally narrow.\n * It handles arrow-function-with-block / arrow-function-expression\n * inline handlers that take no parameters and return nothing useful\n * (the common case for buttons). Handlers that:\n * - take parameters (e.g. event objects),\n * - return data the caller uses,\n * - close over local component state that needs to flow into params,\n * are SKIPPED with a note. The agent re-attempts those by hand —\n * conservatism over coverage is the rule (research-4 §B.6).\n *\n * Options (read from `--option key=value` on the CLI):\n * - `id-prefix` default `app.wrapped` — the prefix for\n * generated command ids.\n * - `registry-import` default `./acture/registry` — module to import\n * the `registry` symbol from.\n * - `acture-import` default `acture` — module to import\n * `defineCommand` and `ok` from.\n */\n\nimport {\n Project,\n SyntaxKind,\n type ArrowFunction,\n type JsxAttribute,\n type SourceFile,\n} from 'ts-morph';\nimport type { Codemod, CodemodOptions, CodemodResult, FileChange } from '../types.js';\n\nconst SUPPORTED_EVENTS = new Set(['onClick', 'onSubmit', 'onChange']);\n\ninterface ResolvedOptions {\n readonly idPrefix: string;\n readonly registryImport: string;\n readonly actureImport: string;\n}\n\nfunction resolveOptions(opts: Record<string, string | undefined> | undefined): ResolvedOptions {\n return {\n idPrefix: opts?.['id-prefix'] ?? 'app.wrapped',\n registryImport: opts?.['registry-import'] ?? './acture/registry',\n actureImport: opts?.['acture-import'] ?? 'acture',\n };\n}\n\nexport const extractOnClickToCommand: Codemod = {\n name: 'extract-onclick-to-command',\n description:\n 'Lift inline onClick / onSubmit / onChange arrow handlers into module-level defineCommand calls.',\n async run(options: CodemodOptions): Promise<CodemodResult> {\n const resolved = resolveOptions(options.options);\n const project = new Project({\n useInMemoryFileSystem: false,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: false, jsx: 4 /* ReactJSX */ },\n });\n\n const fileChanges: FileChange[] = [];\n let totalChanged = 0;\n let totalSkipped = 0;\n\n for (const path of options.files) {\n const sourceFile = project.addSourceFileAtPath(path);\n const before = sourceFile.getFullText();\n const notes: string[] = [];\n\n const liftedCommands: Array<{ varName: string; spec: string }> = [];\n\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {\n const lifted = liftAttribute(attr, resolved, sourceFile, liftedCommands.length, notes);\n if (lifted) liftedCommands.push(lifted);\n });\n\n if (liftedCommands.length > 0) {\n ensureImports(sourceFile, resolved);\n insertCommandDecls(sourceFile, liftedCommands);\n }\n\n const after = sourceFile.getFullText();\n const changed = before !== after;\n if (changed) totalChanged++;\n else totalSkipped++;\n\n fileChanges.push({\n path,\n before,\n after,\n changed,\n ...(notes.length > 0 ? { notes } : {}),\n });\n\n if (changed && !options.dryRun) {\n await sourceFile.save();\n }\n project.removeSourceFile(sourceFile);\n }\n\n return {\n codemod: 'extract-onclick-to-command',\n version: '1.0.0',\n files: fileChanges,\n summary: {\n total: options.files.length,\n changed: totalChanged,\n skipped: totalSkipped,\n },\n };\n },\n};\n\ninterface LiftedCommand {\n readonly varName: string;\n readonly spec: string;\n}\n\nfunction liftAttribute(\n attr: JsxAttribute,\n options: ResolvedOptions,\n sourceFile: SourceFile,\n liftedIndex: number,\n notes: string[],\n): LiftedCommand | null {\n const name = attr.getNameNode().getText();\n if (!SUPPORTED_EVENTS.has(name)) return null;\n\n const initializer = attr.getInitializer();\n if (!initializer || initializer.getKind() !== SyntaxKind.JsxExpression) return null;\n const expr = initializer.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();\n if (!expr || expr.getKind() !== SyntaxKind.ArrowFunction) return null;\n const arrow = expr.asKindOrThrow(SyntaxKind.ArrowFunction);\n\n // Conservative gate: skip arrows with parameters. Real handlers that\n // take an event need different param wiring; the agent does those.\n if (arrow.getParameters().length > 0) {\n notes.push(`${sourceFile.getFilePath()}: skipped ${name} — handler takes parameters`);\n return null;\n }\n\n const verb = deriveVerb(arrow, name);\n const varName = liftedIndex === 0 ? `__cmd_${verb}` : `__cmd_${verb}_${liftedIndex}`;\n const commandId = `${options.idPrefix}.${verb}`;\n const title = prettify(verb);\n const body = arrowBodyToExecuteBody(arrow);\n\n const spec = `const ${varName} = defineCommand({\n id: ${JSON.stringify(commandId)},\n title: ${JSON.stringify(title)},\n execute: () => {\n${body}\n return ok(undefined);\n },\n});`;\n\n // Replace the attribute's value with a registry.dispatch call.\n initializer.replaceWithText(`{() => registry.dispatch(${varName}.id)}`);\n return { varName, spec };\n}\n\nfunction deriveVerb(arrow: ArrowFunction, attrName: string): string {\n // Try to read the first identifier on the LHS of the body as the verb.\n const text = arrow.getBody().getText().trim();\n const idMatch = /^([a-zA-Z_$][\\w$]*)/.exec(text);\n const base = idMatch?.[1] ?? attrName.replace(/^on/, '').toLowerCase();\n return camelize(base);\n}\n\nfunction camelize(s: string): string {\n return s.replace(/^./, (c) => c.toLowerCase()).replace(/[^a-zA-Z0-9]/g, '');\n}\n\nfunction prettify(verb: string): string {\n return verb.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase());\n}\n\nfunction arrowBodyToExecuteBody(arrow: ArrowFunction): string {\n const body = arrow.getBody();\n if (body.getKind() === SyntaxKind.Block) {\n // Strip the outer braces, re-indent.\n const text = body.getText();\n const inner = text.slice(1, -1).trim();\n return inner\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n // Expression body: convert to statement.\n return ` ${body.getText()};`;\n}\n\nfunction ensureImports(sourceFile: SourceFile, options: ResolvedOptions): void {\n addNamedImport(sourceFile, options.actureImport, 'defineCommand');\n addNamedImport(sourceFile, options.actureImport, 'ok');\n addNamedImport(sourceFile, options.registryImport, 'registry');\n}\n\nfunction addNamedImport(sourceFile: SourceFile, from: string, name: string): void {\n const existing = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === from,\n );\n if (existing) {\n if (!existing.getNamedImports().some((n) => n.getName() === name)) {\n existing.addNamedImport(name);\n }\n return;\n }\n sourceFile.addImportDeclaration({\n moduleSpecifier: from,\n namedImports: [name],\n });\n}\n\nfunction insertCommandDecls(sourceFile: SourceFile, commands: readonly LiftedCommand[]): void {\n // Insert right after the last import.\n const imports = sourceFile.getImportDeclarations();\n const insertAfter = imports.length > 0 ? imports[imports.length - 1]!.getEnd() : 0;\n const text = '\\n\\n' + commands.map((c) => c.spec).join('\\n\\n') + '\\n';\n sourceFile.insertText(insertAfter, text);\n}\n","/**\n * `redux-action-to-command`\n *\n * Convert Redux-style `dispatch({ type: 'X', payload: ... })` call sites\n * into `registry.dispatch('X', <payload>)`. Adds the `registry` import\n * if missing.\n *\n * Example transform:\n *\n * dispatch({ type: 'cart/addItem', payload: { id, qty } });\n * →\n * registry.dispatch('cart/addItem', { id, qty });\n *\n * dispatch({ type: 'cart/clear' });\n * →\n * registry.dispatch('cart/clear');\n *\n * Structurally identical to the `azizhk/dispatch-your-reducer` gist\n * (research-4 §B.3 ref [29]). Conservative:\n * - Skip when the action argument isn't an object literal.\n * - Skip when the `type` field isn't a string literal (e.g.\n * `dispatch({ type: actionType, ... })` would need type inference).\n * - Skip when there are keys other than `type` and `payload` — those\n * usually carry Redux-internal metadata that doesn't translate.\n * - Skip when the callee identifier isn't in the configured list\n * (default: `dispatch`, configurable via `--option callees`).\n *\n * Options (from `--option key=value`):\n * - `callees` comma-separated list of dispatch-like callees.\n * Default `dispatch`. Extend with `dispatch,storeDispatch`\n * if your codebase uses multiple names.\n * - `registry-import` default `./acture/registry`. Imported as\n * `{ registry }`.\n * - `id-rewrite` one of `keep` (default), `dot` (rewrite slash to\n * dot — `cart/addItem` → `app.cart.addItem`).\n */\n\nimport { Project, SyntaxKind, type CallExpression, type SourceFile } from 'ts-morph';\nimport type { Codemod, CodemodOptions, CodemodResult, FileChange } from '../types.js';\n\ninterface ResolvedOptions {\n readonly callees: ReadonlySet<string>;\n readonly registryImport: string;\n readonly idRewrite: 'keep' | 'dot';\n}\n\nfunction resolveOptions(opts: Record<string, string | undefined> | undefined): ResolvedOptions {\n const raw = opts?.['callees'];\n const callees = raw\n ? new Set(raw.split(',').map((s) => s.trim()).filter(Boolean))\n : new Set(['dispatch']);\n const idRewrite = (opts?.['id-rewrite'] === 'dot' ? 'dot' : 'keep') as 'keep' | 'dot';\n return {\n callees,\n registryImport: opts?.['registry-import'] ?? './acture/registry',\n idRewrite,\n };\n}\n\nexport const reduxActionToCommand: Codemod = {\n name: 'redux-action-to-command',\n description:\n 'Convert dispatch({type, payload}) call sites to registry.dispatch(id, payload). Adds the registry import.',\n async run(options: CodemodOptions): Promise<CodemodResult> {\n const resolved = resolveOptions(options.options);\n const project = new Project({\n useInMemoryFileSystem: false,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: false, jsx: 4 /* ReactJSX */ },\n });\n\n const fileChanges: FileChange[] = [];\n let totalChanged = 0;\n let totalSkipped = 0;\n\n for (const path of options.files) {\n const sourceFile = project.addSourceFileAtPath(path);\n const before = sourceFile.getFullText();\n const notes: string[] = [];\n let rewriteCount = 0;\n\n sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression).forEach((call) => {\n if (rewriteOne(call, resolved, notes, path)) rewriteCount++;\n });\n\n if (rewriteCount > 0) {\n ensureRegistryImport(sourceFile, resolved.registryImport);\n }\n\n const after = sourceFile.getFullText();\n const changed = before !== after;\n if (changed) totalChanged++;\n else totalSkipped++;\n\n fileChanges.push({\n path,\n before,\n after,\n changed,\n ...(notes.length > 0 ? { notes } : {}),\n });\n\n if (changed && !options.dryRun) {\n await sourceFile.save();\n }\n project.removeSourceFile(sourceFile);\n }\n\n return {\n codemod: 'redux-action-to-command',\n version: '1.0.0',\n files: fileChanges,\n summary: {\n total: options.files.length,\n changed: totalChanged,\n skipped: totalSkipped,\n },\n };\n },\n};\n\nfunction rewriteOne(\n call: CallExpression,\n options: ResolvedOptions,\n notes: string[],\n path: string,\n): boolean {\n const callee = call.getExpression();\n if (callee.getKind() !== SyntaxKind.Identifier) return false;\n const calleeName = callee.getText();\n if (!options.callees.has(calleeName)) return false;\n\n const args = call.getArguments();\n if (args.length !== 1) return false;\n const arg = args[0]!;\n if (arg.getKind() !== SyntaxKind.ObjectLiteralExpression) return false;\n\n const obj = arg.asKindOrThrow(SyntaxKind.ObjectLiteralExpression);\n const props = obj.getProperties();\n let typeLiteral: string | null = null;\n let payloadText: string | null = null;\n let foreignKey = false;\n\n for (const p of props) {\n if (p.getKind() !== SyntaxKind.PropertyAssignment) {\n foreignKey = true;\n continue;\n }\n const pa = p.asKindOrThrow(SyntaxKind.PropertyAssignment);\n const name = pa.getName();\n if (name === 'type') {\n const init = pa.getInitializerOrThrow();\n if (init.getKind() === SyntaxKind.StringLiteral) {\n typeLiteral = init.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralText();\n } else {\n notes.push(`${path}: skipped ${calleeName}({...}) — non-literal type`);\n return false;\n }\n } else if (name === 'payload') {\n payloadText = pa.getInitializerOrThrow().getText();\n } else {\n foreignKey = true;\n }\n }\n\n if (!typeLiteral) return false;\n if (foreignKey) {\n notes.push(`${path}: skipped ${calleeName}({ type: '${typeLiteral}', ...}) — has extra keys`);\n return false;\n }\n\n const rewrittenId = options.idRewrite === 'dot' ? rewriteIdDot(typeLiteral) : typeLiteral;\n const replacement = payloadText\n ? `registry.dispatch(${JSON.stringify(rewrittenId)}, ${payloadText})`\n : `registry.dispatch(${JSON.stringify(rewrittenId)})`;\n call.replaceWithText(replacement);\n return true;\n}\n\nfunction rewriteIdDot(slashId: string): string {\n // `cart/addItem` → `app.cart.addItem`; keep any already-dotted ids.\n if (!slashId.includes('/')) return slashId;\n return 'app.' + slashId.replace(/\\//g, '.');\n}\n\nfunction ensureRegistryImport(sourceFile: SourceFile, from: string): void {\n const existing = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === from,\n );\n if (existing) {\n if (!existing.getNamedImports().some((n) => n.getName() === 'registry')) {\n existing.addNamedImport('registry');\n }\n return;\n }\n sourceFile.addImportDeclaration({\n moduleSpecifier: from,\n namedImports: ['registry'],\n });\n}\n","/**\n * `usestate-mutation-to-command`\n *\n * Wrap inline `onClick`/`onChange`/`onSubmit` arrow handlers whose body\n * is composed of useState-setter calls (`setX(...)`) with `wrapMutation`,\n * deriving a command id from the setter name. Per research-4 §B.5\n * row 3 — a targeted variant of `wrap-handler-with-mutation` that\n * specifically lifts useState mutations.\n *\n * Example:\n *\n * <button onClick={() => setCount(count + 1)}>+</button>\n * →\n * <button onClick={wrapMutation(\n * () => setCount(count + 1),\n * { id: 'app.state.setCount' },\n * )}>+</button>\n *\n * <button onClick={() => { setOpen(true); setActive('a'); }}>...</button>\n * →\n * <button onClick={wrapMutation(\n * () => { setOpen(true); setActive('a'); },\n * { id: 'app.state.setOpen' },\n * )}>...</button>\n *\n * The id is derived from the FIRST setter call in the body (if multiple\n * setters are present), with `app.state` as the default prefix.\n *\n * Why this is its own codemod (vs. the general\n * `wrap-handler-with-mutation`): the general codemod doesn't know the\n * handler's *intent*. By gating on `setX` calls we get higher-quality\n * generated ids and avoid wrapping handlers that have side effects\n * other than state mutation.\n *\n * Conservative gates (the agent re-attempts skipped handlers by hand):\n * - Body must contain at least one identifier-form CallExpression\n * whose callee matches `^set[A-Z]`.\n * - All top-level statements / expressions in the body must be one of:\n * a CallExpression of a `set*` function, or an existing\n * `wrapMutation(...)` call (idempotency). Anything else → skip.\n *\n * Options (from `--option key=value`):\n * - `id-prefix` default `app.state` — prefix for generated ids.\n * - `setter-pattern` default `^set[A-Z]` — regex for identifying\n * setter identifiers. Override if the codebase\n * uses a different convention.\n * - `events` default `onClick,onChange,onSubmit`.\n * - `import-from` default `acture-migration`.\n */\n\nimport {\n Project,\n SyntaxKind,\n type ArrowFunction,\n type JsxAttribute,\n type Node,\n} from 'ts-morph';\nimport type { Codemod, CodemodOptions, CodemodResult, FileChange } from '../types.js';\n\ninterface ResolvedOptions {\n readonly idPrefix: string;\n readonly setterPattern: RegExp;\n readonly events: ReadonlySet<string>;\n readonly importFrom: string;\n}\n\nconst DEFAULT_EVENTS = ['onClick', 'onChange', 'onSubmit'];\n\nfunction resolveOptions(opts: Record<string, string | undefined> | undefined): ResolvedOptions {\n const rawEvents = opts?.['events'];\n const events = rawEvents\n ? new Set(rawEvents.split(',').map((s) => s.trim()).filter(Boolean))\n : new Set(DEFAULT_EVENTS);\n const setterPattern = opts?.['setter-pattern']\n ? new RegExp(opts['setter-pattern']!)\n : /^set[A-Z]/;\n return {\n idPrefix: opts?.['id-prefix'] ?? 'app.state',\n setterPattern,\n events,\n importFrom: opts?.['import-from'] ?? 'acture-migration',\n };\n}\n\nexport const useStateMutationToCommand: Codemod = {\n name: 'usestate-mutation-to-command',\n description:\n 'Wrap inline handlers whose body is composed of useState setter calls with wrapMutation. Derives a command id from the setter name.',\n async run(options: CodemodOptions): Promise<CodemodResult> {\n const resolved = resolveOptions(options.options);\n const project = new Project({\n useInMemoryFileSystem: false,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: false, jsx: 4 /* ReactJSX */ },\n });\n\n const fileChanges: FileChange[] = [];\n let totalChanged = 0;\n let totalSkipped = 0;\n\n for (const path of options.files) {\n const sourceFile = project.addSourceFileAtPath(path);\n const before = sourceFile.getFullText();\n const notes: string[] = [];\n let wrapCount = 0;\n\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((attr) => {\n if (rewriteOne(attr, resolved, notes, path)) wrapCount++;\n });\n\n if (wrapCount > 0) {\n ensureImport(sourceFile, 'wrapMutation', resolved.importFrom);\n }\n\n const after = sourceFile.getFullText();\n const changed = before !== after;\n if (changed) totalChanged++;\n else totalSkipped++;\n\n fileChanges.push({\n path,\n before,\n after,\n changed,\n ...(notes.length > 0 ? { notes } : {}),\n });\n\n if (changed && !options.dryRun) {\n await sourceFile.save();\n }\n project.removeSourceFile(sourceFile);\n }\n\n return {\n codemod: 'usestate-mutation-to-command',\n version: '1.0.0',\n files: fileChanges,\n summary: {\n total: options.files.length,\n changed: totalChanged,\n skipped: totalSkipped,\n },\n };\n },\n};\n\nfunction rewriteOne(\n attr: JsxAttribute,\n options: ResolvedOptions,\n notes: string[],\n path: string,\n): boolean {\n const name = attr.getNameNode().getText();\n if (!options.events.has(name)) return false;\n\n const initializer = attr.getInitializer();\n if (!initializer || initializer.getKind() !== SyntaxKind.JsxExpression) return false;\n const expr = initializer.asKindOrThrow(SyntaxKind.JsxExpression).getExpression();\n if (!expr || expr.getKind() !== SyntaxKind.ArrowFunction) return false;\n const arrow = expr.asKindOrThrow(SyntaxKind.ArrowFunction);\n\n // Idempotent: skip if already inside a wrapMutation call.\n if (isInsideWrapMutation(arrow)) return false;\n\n const setterName = findFirstSetter(arrow, options.setterPattern);\n if (!setterName) return false;\n\n const body = arrow.getBody();\n if (!isSetterOnlyBody(body, options.setterPattern)) {\n notes.push(`${path}: skipped ${name} — body has non-setter statements`);\n return false;\n }\n\n const id = `${options.idPrefix}.${setterName}`;\n const inner = arrow.getText();\n initializer.replaceWithText(`{wrapMutation(${inner}, { id: ${JSON.stringify(id)} })}`);\n return true;\n}\n\nfunction isInsideWrapMutation(arrow: ArrowFunction): boolean {\n // Walk up: if the arrow is the first argument of a `wrapMutation(...)`\n // call, this codemod already ran (or the user wrote it by hand).\n const parent = arrow.getParent();\n if (!parent) return false;\n if (parent.getKind() !== SyntaxKind.CallExpression) return false;\n const callee = parent.asKindOrThrow(SyntaxKind.CallExpression).getExpression();\n return callee.getText() === 'wrapMutation';\n}\n\nfunction findFirstSetter(arrow: ArrowFunction, pattern: RegExp): string | null {\n const body = arrow.getBody();\n const calls = body.getDescendantsOfKind(SyntaxKind.CallExpression);\n // Include the body itself if it's a direct CallExpression (expression-body arrow).\n if (body.getKind() === SyntaxKind.CallExpression) {\n const call = body.asKindOrThrow(SyntaxKind.CallExpression);\n const callee = call.getExpression();\n if (callee.getKind() === SyntaxKind.Identifier && pattern.test(callee.getText())) {\n return callee.getText();\n }\n }\n for (const call of calls) {\n const callee = call.getExpression();\n if (callee.getKind() === SyntaxKind.Identifier && pattern.test(callee.getText())) {\n return callee.getText();\n }\n }\n return null;\n}\n\nfunction isSetterOnlyBody(body: Node, pattern: RegExp): boolean {\n if (body.getKind() === SyntaxKind.Block) {\n const block = body.asKindOrThrow(SyntaxKind.Block);\n for (const stmt of block.getStatements()) {\n if (stmt.getKind() !== SyntaxKind.ExpressionStatement) return false;\n const inner = stmt.asKindOrThrow(SyntaxKind.ExpressionStatement).getExpression();\n if (!isSetterCall(inner, pattern)) return false;\n }\n return true;\n }\n // Expression-body arrow.\n return isSetterCall(body, pattern);\n}\n\nfunction isSetterCall(node: Node, pattern: RegExp): boolean {\n if (node.getKind() !== SyntaxKind.CallExpression) return false;\n const callee = node.asKindOrThrow(SyntaxKind.CallExpression).getExpression();\n if (callee.getKind() !== SyntaxKind.Identifier) return false;\n return pattern.test(callee.getText());\n}\n\nfunction ensureImport(\n sourceFile: ReturnType<Project['addSourceFileAtPath']>,\n importName: string,\n importFrom: string,\n): void {\n const existing = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === importFrom,\n );\n if (existing) {\n if (!existing.getNamedImports().some((n) => n.getName() === importName)) {\n existing.addNamedImport(importName);\n }\n return;\n }\n sourceFile.addImportDeclaration({\n moduleSpecifier: importFrom,\n namedImports: [importName],\n });\n}\n","/**\n * `rtk-thunk-to-command`\n *\n * Convert RTK's `createAsyncThunk(id, payloadCreator)` into an acture\n * async command: `defineCommand({ id, title, execute })`. The original\n * payload creator becomes `execute`, with `return X` rewritten to\n * `return ok(X)` so the result type matches acture's `Result<R>`\n * contract.\n *\n * Example transform (input):\n *\n * export const fetchUser = createAsyncThunk(\n * 'users/fetchUser',\n * async (id: string) => {\n * const res = await fetch(`/users/${id}`);\n * return await res.json();\n * },\n * );\n *\n * Example transform (output):\n *\n * export const fetchUser = defineCommand({\n * id: 'users/fetchUser',\n * title: 'Fetch User',\n * execute: async (id: string) => {\n * const res = await fetch(`/users/${id}`);\n * return ok(await res.json());\n * },\n * });\n *\n * Research-4 §B.5 row 5. This is the type-aware codemod in the v1\n * planned set — but in practice the \"type awareness\" is minimal: we\n * just need to recognise the payload creator's signature (single arg of\n * any type), not derive its zod schema. Inferring `params` is left to\n * the user — we emit a note in `FileChange.notes` reminding them to add\n * a `params:` field if they want palette / MCP / AI surfaces to see a\n * typed parameter.\n *\n * Conservative gates (skipped with a note rather than half-transformed):\n * - Skip if `createAsyncThunk` has fewer or more than 2 arguments\n * (3rd arg is options — `extraReducers`, `condition`, `idGenerator`\n * etc. — none of which map cleanly to a defineCommand spec).\n * - Skip if the 1st arg isn't a string literal id.\n * - Skip if the 2nd arg isn't an arrow function or function expression.\n *\n * Options (from `--option key=value`):\n * - `acture-import` default `acture` — module from which to import\n * `defineCommand` and `ok`.\n * - `title-from` default `id-last-segment` — strategy for\n * deriving the title. Other value: `id` (use the\n * whole id verbatim).\n */\n\nimport {\n Project,\n SyntaxKind,\n type ArrowFunction,\n type CallExpression,\n type FunctionExpression,\n type Node,\n type SourceFile,\n} from 'ts-morph';\nimport type { Codemod, CodemodOptions, CodemodResult, FileChange } from '../types.js';\n\ninterface ResolvedOptions {\n readonly actureImport: string;\n readonly titleFrom: 'id-last-segment' | 'id';\n}\n\nfunction resolveOptions(opts: Record<string, string | undefined> | undefined): ResolvedOptions {\n return {\n actureImport: opts?.['acture-import'] ?? 'acture',\n titleFrom: (opts?.['title-from'] === 'id' ? 'id' : 'id-last-segment') as\n | 'id-last-segment'\n | 'id',\n };\n}\n\nexport const rtkThunkToCommand: Codemod = {\n name: 'rtk-thunk-to-command',\n description:\n 'Convert createAsyncThunk(id, payloadCreator) into defineCommand({id, title, execute}). Rewrites return X to return ok(X).',\n async run(options: CodemodOptions): Promise<CodemodResult> {\n const resolved = resolveOptions(options.options);\n const project = new Project({\n useInMemoryFileSystem: false,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: false, jsx: 4 /* ReactJSX */ },\n });\n\n const fileChanges: FileChange[] = [];\n let totalChanged = 0;\n let totalSkipped = 0;\n\n for (const path of options.files) {\n const sourceFile = project.addSourceFileAtPath(path);\n const before = sourceFile.getFullText();\n const notes: string[] = [];\n let rewriteCount = 0;\n\n // Pre-filter to top-level `createAsyncThunk` calls so we don't\n // walk into nodes that subsequent `replaceWithText` will\n // invalidate (the call's inner `fetch(...)` etc. would otherwise\n // get visited after their parent was replaced).\n const thunkCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => {\n const callee = call.getExpression();\n return (\n callee.getKind() === SyntaxKind.Identifier &&\n callee.getText() === 'createAsyncThunk'\n );\n });\n for (const call of thunkCalls) {\n if (call.wasForgotten()) continue;\n if (rewriteOne(call, resolved, notes, path)) rewriteCount++;\n }\n\n if (rewriteCount > 0) {\n ensureImport(sourceFile, 'defineCommand', resolved.actureImport);\n ensureImport(sourceFile, 'ok', resolved.actureImport);\n }\n\n const after = sourceFile.getFullText();\n const changed = before !== after;\n if (changed) totalChanged++;\n else totalSkipped++;\n\n fileChanges.push({\n path,\n before,\n after,\n changed,\n ...(notes.length > 0 ? { notes } : {}),\n });\n\n if (changed && !options.dryRun) {\n await sourceFile.save();\n }\n project.removeSourceFile(sourceFile);\n }\n\n return {\n codemod: 'rtk-thunk-to-command',\n version: '1.0.0',\n files: fileChanges,\n summary: {\n total: options.files.length,\n changed: totalChanged,\n skipped: totalSkipped,\n },\n };\n },\n};\n\nfunction rewriteOne(\n call: CallExpression,\n options: ResolvedOptions,\n notes: string[],\n path: string,\n): boolean {\n const callee = call.getExpression();\n if (callee.getKind() !== SyntaxKind.Identifier) return false;\n if (callee.getText() !== 'createAsyncThunk') return false;\n\n const args = call.getArguments();\n if (args.length !== 2) {\n notes.push(`${path}: skipped createAsyncThunk(...) — expected exactly 2 args`);\n return false;\n }\n\n const idArg = args[0]!;\n if (idArg.getKind() !== SyntaxKind.StringLiteral) {\n notes.push(`${path}: skipped createAsyncThunk(...) — non-literal id`);\n return false;\n }\n const id = idArg.asKindOrThrow(SyntaxKind.StringLiteral).getLiteralText();\n\n const fnArg = args[1]!;\n const fnKind = fnArg.getKind();\n if (\n fnKind !== SyntaxKind.ArrowFunction &&\n fnKind !== SyntaxKind.FunctionExpression\n ) {\n notes.push(`${path}: skipped createAsyncThunk(...) — payload creator is not a function`);\n return false;\n }\n const fn = fnArg as ArrowFunction | FunctionExpression;\n\n rewriteReturnsToOk(fn, notes, path, id);\n const executeText = fnToExecuteText(fn);\n const title = options.titleFrom === 'id' ? id : deriveTitle(id);\n\n const replacement = `defineCommand({\n id: ${JSON.stringify(id)},\n title: ${JSON.stringify(title)},\n execute: ${executeText},\n})`;\n call.replaceWithText(replacement);\n notes.push(\n `${path}: createAsyncThunk('${id}') → defineCommand. Add a params: <zod schema> if you want palette/MCP/AI to see a typed parameter.`,\n );\n return true;\n}\n\nfunction rewriteReturnsToOk(\n fn: ArrowFunction | FunctionExpression,\n notes: string[],\n path: string,\n id: string,\n): void {\n const body = fn.getBody();\n if (body.getKind() !== SyntaxKind.Block) {\n // Expression-body arrow.\n const text = body.getText();\n body.replaceWithText(`ok(${text})`);\n return;\n }\n // Block body: rewrite every top-level (or nested) `return X` to\n // `return ok(X)`. A bare `return;` becomes `return ok(undefined);`.\n let hadAnyReturn = false;\n body.getDescendantsOfKind(SyntaxKind.ReturnStatement).forEach((ret) => {\n hadAnyReturn = true;\n const expr = ret.getExpression();\n if (!expr) {\n ret.replaceWithText('return ok(undefined);');\n } else {\n ret.replaceWithText(`return ok(${expr.getText()});`);\n }\n });\n if (!hadAnyReturn) {\n // No explicit return — the function returns undefined. Append\n // `return ok(undefined);` so the execute satisfies Result<R>.\n notes.push(\n `${path}: createAsyncThunk('${id}') had no return — appended return ok(undefined);`,\n );\n body.replaceWithText(body.getText().replace(/\\}$/, '\\n return ok(undefined);\\n}'));\n }\n}\n\nfunction fnToExecuteText(fn: ArrowFunction | FunctionExpression): string {\n // Re-emit the function via getText() — it already reflects any\n // mutations we made above (return rewrites).\n return fn.getText();\n}\n\nfunction deriveTitle(id: string): string {\n const last = id.split('/').pop()?.split('.').pop() ?? id;\n return last\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/^./, (c) => c.toUpperCase());\n}\n\nfunction ensureImport(\n sourceFile: SourceFile,\n importName: string,\n importFrom: string,\n): void {\n const existing = sourceFile.getImportDeclaration(\n (d) => d.getModuleSpecifierValue() === importFrom,\n );\n if (existing) {\n if (!existing.getNamedImports().some((n) => n.getName() === importName)) {\n existing.addNamedImport(importName);\n }\n return;\n }\n sourceFile.addImportDeclaration({\n moduleSpecifier: importFrom,\n namedImports: [importName],\n });\n}\n\n// Silence \"Node imported but unused\" — ts-morph generic for some helpers.\nexport type _Node = Node;\n","/**\n * Codemod registry, Nx-style.\n *\n * Each entry pairs a codemod name with the version of acture at which\n * it was first published. The CLI uses this to:\n * - `--list` the catalog,\n * - look up a codemod by name,\n * - emit a JSON manifest for tooling (`acture-codemods --manifest`).\n *\n * Per research-4 §B.5: the v1.2 scope is two of the five planned\n * codemods. The other three (`redux-action-to-command`,\n * `usestate-mutation-to-command`, `rtk-thunk-to-command`) are tracked in\n * the manifest as `status: 'planned'` so users see what's coming.\n */\n\nimport type { Codemod } from './types.js';\nimport { wrapHandlerWithMutation } from './codemods/wrap-handler-with-mutation.js';\nimport { extractOnClickToCommand } from './codemods/extract-onclick-to-command.js';\nimport { reduxActionToCommand } from './codemods/redux-action-to-command.js';\nimport { useStateMutationToCommand } from './codemods/usestate-mutation-to-command.js';\nimport { rtkThunkToCommand } from './codemods/rtk-thunk-to-command.js';\n\nexport interface ManifestEntry {\n readonly name: string;\n readonly description: string;\n readonly status: 'shipped' | 'planned';\n readonly since?: string;\n readonly codemod?: Codemod;\n}\n\nexport const MANIFEST: readonly ManifestEntry[] = [\n {\n name: wrapHandlerWithMutation.name,\n description: wrapHandlerWithMutation.description,\n status: 'shipped',\n since: '1.0.0',\n codemod: wrapHandlerWithMutation,\n },\n {\n name: extractOnClickToCommand.name,\n description: extractOnClickToCommand.description,\n status: 'shipped',\n since: '1.0.0',\n codemod: extractOnClickToCommand,\n },\n {\n name: reduxActionToCommand.name,\n description: reduxActionToCommand.description,\n status: 'shipped',\n since: '1.1.0',\n codemod: reduxActionToCommand,\n },\n {\n name: useStateMutationToCommand.name,\n description: useStateMutationToCommand.description,\n status: 'shipped',\n since: '1.1.0',\n codemod: useStateMutationToCommand,\n },\n {\n name: rtkThunkToCommand.name,\n description: rtkThunkToCommand.description,\n status: 'shipped',\n since: '1.1.0',\n codemod: rtkThunkToCommand,\n },\n];\n\nexport function findCodemod(name: string): Codemod | undefined {\n const entry = MANIFEST.find((m) => m.name === name);\n return entry?.codemod;\n}\n\nexport function listShipped(): readonly ManifestEntry[] {\n return MANIFEST.filter((m) => m.status === 'shipped');\n}\n","/**\n * Programmatic runner used by both the CLI and library consumers.\n *\n * Looks up a codemod in the manifest, validates the options, and invokes\n * the codemod's `run`. Returns the same `CodemodResult` shape the CLI\n * emits as JSON.\n */\n\nimport { findCodemod, MANIFEST } from './manifest.js';\nimport type { CodemodOptions, CodemodResult } from './types.js';\n\nexport async function runCodemod(\n name: string,\n options: CodemodOptions,\n): Promise<CodemodResult> {\n const codemod = findCodemod(name);\n if (!codemod) {\n const known = MANIFEST.filter((m) => m.status === 'shipped')\n .map((m) => m.name)\n .join(', ');\n throw new Error(\n `Unknown codemod \"${name}\". Available: ${known || '(none shipped yet)'}`,\n );\n }\n return await codemod.run(options);\n}\n","/**\n * Minimal unified-diff producer for the CLI's text output.\n *\n * We don't depend on a diff library — agents reading our output just need\n * \"before/after blocks with a couple of context lines\" and the JSON path\n * for parsing. A real `diff` tool is one-liner away if a user wants it.\n *\n * The format is a simple two-block emission, not a true unified diff\n * patch. The CLI prints the FULL file before-and-after only when the\n * file is small (< 80 lines); for larger files it shows only the line\n * ranges that changed, with `±5` context lines, to keep terminals\n * readable. The JSON output is unaffected.\n */\n\nimport type { FileChange } from './types.js';\n\nconst CONTEXT_LINES = 5;\nconst SMALL_FILE_LIMIT = 80;\n\nexport function formatFileChangeText(change: FileChange): string {\n if (!change.changed) {\n return `--- ${change.path} (unchanged)`;\n }\n const beforeLines = change.before.split('\\n');\n const afterLines = change.after.split('\\n');\n\n if (beforeLines.length <= SMALL_FILE_LIMIT && afterLines.length <= SMALL_FILE_LIMIT) {\n return [\n `--- ${change.path} (before)`,\n ...beforeLines.map((l) => `- ${l}`),\n `+++ ${change.path} (after)`,\n ...afterLines.map((l) => `+ ${l}`),\n ].join('\\n');\n }\n\n const hunks = computeHunks(beforeLines, afterLines);\n if (hunks.length === 0) {\n return `--- ${change.path} (changed; no diff lines extracted)`;\n }\n return hunks\n .map((h) => {\n const ctxBefore = beforeLines.slice(\n Math.max(0, h.beforeStart - CONTEXT_LINES),\n h.beforeStart,\n );\n const ctxAfter = afterLines.slice(\n h.afterEnd,\n h.afterEnd + CONTEXT_LINES,\n );\n return [\n `--- ${change.path} @@ before:${h.beforeStart + 1}-${h.beforeEnd} after:${h.afterStart + 1}-${h.afterEnd}`,\n ...ctxBefore.map((l) => ` ${l}`),\n ...beforeLines.slice(h.beforeStart, h.beforeEnd).map((l) => `- ${l}`),\n ...afterLines.slice(h.afterStart, h.afterEnd).map((l) => `+ ${l}`),\n ...ctxAfter.map((l) => ` ${l}`),\n ].join('\\n');\n })\n .join('\\n\\n');\n}\n\ninterface Hunk {\n readonly beforeStart: number;\n readonly beforeEnd: number;\n readonly afterStart: number;\n readonly afterEnd: number;\n}\n\nfunction computeHunks(before: readonly string[], after: readonly string[]): Hunk[] {\n // Naive: skip common prefix and common suffix, treat the middle as a\n // single hunk. For the codemods we ship (one-line attribute edits,\n // a few inserted lines for command decls) this is enough to read.\n let prefix = 0;\n while (\n prefix < before.length &&\n prefix < after.length &&\n before[prefix] === after[prefix]\n ) {\n prefix++;\n }\n let suffix = 0;\n while (\n suffix < before.length - prefix &&\n suffix < after.length - prefix &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n ) {\n suffix++;\n }\n const beforeStart = prefix;\n const beforeEnd = before.length - suffix;\n const afterStart = prefix;\n const afterEnd = after.length - suffix;\n if (beforeStart === beforeEnd && afterStart === afterEnd) return [];\n return [{ beforeStart, beforeEnd, afterStart, afterEnd }];\n}\n","/**\n * `acture-codemods` CLI entry point.\n *\n * Synopsis:\n *\n * acture-codemods <name> --target <glob> [--dry-run] [--json]\n * [--option key=value ...]\n * acture-codemods --list\n * acture-codemods --manifest\n * acture-codemods --help\n *\n * Per research-4 §B.6 the CLI MUST support `--dry-run` and `--json` so\n * agents can read diffs before applying. The runner is conservative: a\n * file that would not change is reported as `skipped: true` rather than\n * silently passing.\n *\n * Glob expansion is intentionally minimal — we accept either an explicit\n * file list or a single directory and walk it with the standard\n * `fs.readdir` recursive option. Hosts that need fancier patterns can\n * pre-expand and pass via `--files-from`.\n */\n\nimport { readdirSync, statSync, readFileSync } from 'node:fs';\nimport { join, resolve, isAbsolute } from 'node:path';\nimport { runCodemod } from './runner.js';\nimport { MANIFEST, listShipped } from './manifest.js';\nimport { formatFileChangeText } from './diff.js';\nimport type { CodemodResult } from './types.js';\n\nexport interface CliIO {\n readonly stdout: (line: string) => void;\n readonly stderr: (line: string) => void;\n}\n\nconst DEFAULT_IO: CliIO = {\n stdout: (s) => console.log(s),\n stderr: (s) => console.error(s),\n};\n\nexport async function runCli(argv: readonly string[], io: CliIO = DEFAULT_IO): Promise<number> {\n if (argv.length === 0 || argv.includes('--help') || argv.includes('-h')) {\n io.stdout(HELP);\n return 0;\n }\n if (argv[0] === '--list') {\n for (const e of listShipped()) {\n io.stdout(`${e.name.padEnd(34)} ${e.description}`);\n }\n return 0;\n }\n if (argv[0] === '--manifest') {\n io.stdout(JSON.stringify({ codemods: MANIFEST.map(({ codemod: _c, ...rest }) => rest) }, null, 2));\n return 0;\n }\n\n const parsed = parseArgs(argv);\n if (parsed.kind === 'error') {\n io.stderr(parsed.message);\n return 2;\n }\n\n let result: CodemodResult;\n try {\n result = await runCodemod(parsed.name, {\n files: parsed.files,\n dryRun: parsed.dryRun,\n options: parsed.options,\n });\n } catch (e) {\n io.stderr((e as Error).message);\n return 2;\n }\n\n if (parsed.json) {\n io.stdout(JSON.stringify(result, null, 2));\n } else {\n io.stdout(formatTextResult(result));\n }\n return 0;\n}\n\ninterface ParsedArgs {\n readonly kind: 'ok';\n readonly name: string;\n readonly files: readonly string[];\n readonly dryRun: boolean;\n readonly json: boolean;\n readonly options: Record<string, string>;\n}\ninterface ParsedError {\n readonly kind: 'error';\n readonly message: string;\n}\n\nfunction parseArgs(argv: readonly string[]): ParsedArgs | ParsedError {\n const [name, ...rest] = argv;\n if (!name || name.startsWith('--')) {\n return { kind: 'error', message: 'Missing codemod name.\\n\\n' + HELP };\n }\n let dryRun = false;\n let json = false;\n const targets: string[] = [];\n const filesFrom: string[] = [];\n const options: Record<string, string> = {};\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i]!;\n if (arg === '--dry-run') dryRun = true;\n else if (arg === '--json') json = true;\n else if (arg === '--target') {\n const value = rest[++i];\n if (!value) return { kind: 'error', message: '--target needs a path' };\n targets.push(value);\n } else if (arg === '--files-from') {\n const value = rest[++i];\n if (!value) return { kind: 'error', message: '--files-from needs a file' };\n filesFrom.push(value);\n } else if (arg === '--option') {\n const kv = rest[++i];\n if (!kv) return { kind: 'error', message: '--option needs key=value' };\n const eq = kv.indexOf('=');\n if (eq < 0) return { kind: 'error', message: `--option must be key=value: ${kv}` };\n options[kv.slice(0, eq)] = kv.slice(eq + 1);\n } else {\n return { kind: 'error', message: `Unknown argument: ${arg}` };\n }\n }\n\n const files = collectFiles(targets, filesFrom);\n if (files.length === 0) {\n return { kind: 'error', message: 'No files matched. Use --target <path> or --files-from <list>.' };\n }\n return { kind: 'ok', name, files, dryRun, json, options };\n}\n\nfunction collectFiles(targets: readonly string[], filesFrom: readonly string[]): string[] {\n const out = new Set<string>();\n for (const t of targets) {\n const abs = isAbsolute(t) ? t : resolve(process.cwd(), t);\n walk(abs, out);\n }\n for (const list of filesFrom) {\n const abs = isAbsolute(list) ? list : resolve(process.cwd(), list);\n const lines = readFileSync(abs, 'utf-8').split('\\n').map((l) => l.trim()).filter(Boolean);\n for (const line of lines) {\n const p = isAbsolute(line) ? line : resolve(process.cwd(), line);\n out.add(p);\n }\n }\n return [...out].sort();\n}\n\nfunction walk(path: string, out: Set<string>): void {\n let stat;\n try {\n stat = statSync(path);\n } catch {\n return;\n }\n if (stat.isFile()) {\n if (isCandidateFile(path)) out.add(path);\n return;\n }\n if (!stat.isDirectory()) return;\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (entry.name === 'node_modules' || entry.name === 'dist') continue;\n walk(join(path, entry.name), out);\n }\n}\n\nfunction isCandidateFile(path: string): boolean {\n return path.endsWith('.ts') || path.endsWith('.tsx') || path.endsWith('.jsx');\n}\n\nfunction formatTextResult(result: CodemodResult): string {\n const lines: string[] = [];\n lines.push(`Codemod: ${result.codemod} (v${result.version})`);\n lines.push(\n `Files: ${result.summary.total} Changed: ${result.summary.changed} Skipped: ${result.summary.skipped}`,\n );\n lines.push('');\n for (const f of result.files) {\n lines.push(formatFileChangeText(f));\n if (f.notes && f.notes.length > 0) {\n for (const n of f.notes) lines.push(`! ${n}`);\n }\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nconst HELP = `acture-codemods — codemods for strangler-fig adoption of acture\n\nUsage:\n acture-codemods <name> --target <path> [--dry-run] [--json] [--option key=value]\n acture-codemods --list\n acture-codemods --manifest\n acture-codemods --help\n\nArguments:\n <name> Codemod name (from --list).\n --target <path> A file or a directory to walk. May be repeated.\n --files-from <file> Read a newline-delimited list of files.\n --dry-run Compute changes without writing files.\n --json Output a machine-readable JSON result.\n --option key=value Pass a per-codemod option. May be repeated.\n\nExamples:\n acture-codemods wrap-handler-with-mutation --target src/ --dry-run --json\n acture-codemods extract-onclick-to-command --target src/Button.tsx \\\\\n --option id-prefix=app.button\n`;\n\n// Direct execution path (bin entry).\nif (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (import.meta as any).url === `file://${process.argv[1]}` ||\n (typeof process !== 'undefined' && process.argv[1]?.endsWith('cli.js'))\n) {\n const argv = process.argv.slice(2);\n runCli(argv).then((code) => process.exit(code));\n}\n"]}
|