Repository: JoshuaKGoldberg/create-typescript-app (ts)

Issue:
🐛 Bug: Add options.bin to ESLint allowDefaultProject
### Bug Report Checklist

- [X] I have tried restarting my IDE and the issue persists.
- [X] I have pulled the latest `main` branch of the repository.
- [X] I have [searched for related issues](https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=is%3Aissue) and found none that matched my issue.

### Expected

If someone specifies a `bin` entry in their `package.json` that isn't in `src/`, then it will need to use `parserOptions.projectService.allowDefaultProject` to be linted. It should be mentioned alongside `"*.config.*s"` in the generated `eslint.config.js`

### Actual

Nothing does that right now:

https://github.com/JoshuaKGoldberg/create-typescript-app/blob/aaf2d6536de8a2ff862c132cad5e2351a9ebe923/src/steps/writing/creation/createESLintConfig.ts#L83

https://github.com/JoshuaKGoldberg/create-typescript-app/blob/b180d182713dea5dc1f995a8b2a7731a757455c0/src/next/blocks/blockESLint.ts#L104

### Additional Info

Prototyped in #1839.

💖 

Pull request description:
fix: include options.bin in ESLint allowDefaultProject
## PR Checklist

- [x] Addresses an existing open issue: fixes #1846
- [x] That issue was marked as [`status: accepting prs`](https://github.com/JoshuaKGoldberg/create-typescript-app/issues?q=is%3Aopen+is%3Aissue+label%3A%22status%3A+accepting+prs%22)
- [x] Steps in [CONTRIBUTING.md](https://github.com/JoshuaKGoldberg/create-typescript-app/blob/main/.github/CONTRIBUTING.md) were taken

## Overview

💖 

Patch:
diff --git a/README.md b/README.md
index efc7f1e..de519ca 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
 <h1 align="center">Create TypeScript App</h1>
 
-<p align="center">Quickstart-friendly TypeScript template with comprehensive, configurable, opinionated tooling. 🎁</p>
+<p align="center">
+  Quickstart-friendly TypeScript template with comprehensive, configurable, opinionated tooling.
+  🎁
+</p>
 
 <p align="center">
 	<!-- prettier-ignore-start -->
diff --git a/src/next/blocks/blockESLint.ts b/src/next/blocks/blockESLint.ts
index 65990ab..ed3a141 100644
--- a/src/next/blocks/blockESLint.ts
+++ b/src/next/blocks/blockESLint.ts
@@ -103,7 +103,9 @@ export const blockESLint = base.createBlock({
 				languageOptions: {
 					parserOptions: {
 						projectService: {
-							allowDefaultProject: ["*.config.*s"],
+							allowDefaultProject: Array.from(
+								new Set(["*.config.*s", options.bin].filter(Boolean).sort()),
+							),
 						},
 						tsconfigRootDir: "import.meta.dirname",
 					},
diff --git a/src/steps/writing/creation/createESLintConfig.ts b/src/steps/writing/creation/createESLintConfig.ts
index a7891d5..b7b3195 100644
--- a/src/steps/writing/creation/createESLintConfig.ts
+++ b/src/steps/writing/creation/createESLintConfig.ts
@@ -80,7 +80,7 @@ export default tseslint.config(
 		files: ["**/*.js", "**/*.ts"],
 		languageOptions: {
 			parserOptions: {
-				projectService: { allowDefaultProject: ["*.config.*s"] },
+				projectService: { allowDefaultProject: ${JSON.stringify(["*.config.*s", options.bin].filter(Boolean).sort())} },
 				tsconfigRootDir: import.meta.dirname
 			},
 		},${


Test patch:
diff --git a/src/next/blocks/blockESLint.test.ts b/src/next/blocks/blockESLint.test.ts
index de6ba66..87e5098 100644
--- a/src/next/blocks/blockESLint.test.ts
+++ b/src/next/blocks/blockESLint.test.ts
@@ -436,4 +436,138 @@ describe("blockESLint", () => {
 			}
 		`);
 	});
+
+	test("with options.bin", () => {
+		const creation = testBlock(blockESLint, {
+			options: {
+				...optionsBase,
+				bin: "bin/index.js",
+			},
+		});
+
+		expect(creation).toMatchInlineSnapshot(`
+			{
+			  "addons": [
+			    {
+			      "addons": {
+			        "words": [
+			          "tseslint",
+			        ],
+			      },
+			      "block": [Function],
+			    },
+			    {
+			      "addons": {
+			        "sections": {
+			          "Linting": {
+			            "contents": {
+			              "after": [
+			                "
+			For example, ESLint can be run with \`--fix\` to auto-fix some lint rule complaints:
+
+			\`\`\`shell
+			pnpm run lint --fix
+			\`\`\`
+			",
+			              ],
+			              "before": "
+			This package includes several forms of linting to enforce consistent code quality and styling.
+			Each should be shown in VS Code, and can be run manually on the command-line:
+			",
+			              "items": [
+			                "- \`pnpm lint\` ([ESLint](https://eslint.org) with [typescript-eslint](https://typescript-eslint.io)): Lints JavaScript and TypeScript source files",
+			              ],
+			              "plural": "Read the individual documentation for each linter to understand how it can be configured and used best.",
+			            },
+			          },
+			        },
+			      },
+			      "block": [Function],
+			    },
+			    {
+			      "addons": {
+			        "jobs": [
+			          {
+			            "name": "Lint",
+			            "steps": [
+			              {
+			                "run": "pnpm build",
+			              },
+			              {
+			                "run": "pnpm lint",
+			              },
+			            ],
+			          },
+			        ],
+			      },
+			      "block": [Function],
+			    },
+			    {
+			      "addons": {
+			        "properties": {
+			          "devDependencies": {
+			            "@eslint/js": "9.17.0",
+			            "@types/node": "22.10.2",
+			            "eslint": "9.17.0",
+			            "typescript-eslint": "8.19.0",
+			          },
+			          "scripts": {
+			            "lint": "eslint . --max-warnings 0",
+			          },
+			        },
+			      },
+			      "block": [Function],
+			    },
+			    {
+			      "addons": {
+			        "extensions": [
+			          "dbaeumer.vscode-eslint",
+			        ],
+			        "settings": {
+			          "editor.codeActionsOnSave": {
+			            "source.fixAll.eslint": "explicit",
+			          },
+			          "eslint.probe": [
+			            "javascript",
+			            "javascriptreact",
+			            "json",
+			            "jsonc",
+			            "markdown",
+			            "typescript",
+			            "typescriptreact",
+			            "yaml",
+			          ],
+			          "eslint.rules.customizations": [
+			            {
+			              "rule": "*",
+			              "severity": "warn",
+			            },
+			          ],
+			        },
+			      },
+			      "block": [Function],
+			    },
+			  ],
+			  "files": {
+			    "eslint.config.js": "import eslint from "@eslint/js";
+			import tseslint from "typescript-eslint";
+
+			export default tseslint.config(
+				{ ignores: ["lib", "node_modules", "pnpm-lock.yaml"] },
+				{ linterOptions: {"reportUnusedDisableDirectives":"error"} },
+				eslint.configs.recommended,
+				{ extends: [tseslint.configs.strictTypeChecked, tseslint.configs.stylisticTypeChecked], files: ["**/*.js", "**/*.ts"], languageOptions: {"parserOptions":{"projectService":{"allowDefaultProject":["*.config.*s","bin/index.js"]},"tsconfigRootDir":import.meta.dirname}}, }
+			);",
+			  },
+			  "scripts": [
+			    {
+			      "commands": [
+			        "pnpm lint --fix",
+			      ],
+			      "phase": 3,
+			    },
+			  ],
+			}
+		`);
+	});
 });
diff --git a/src/steps/writing/creation/index.test.ts b/src/steps/writing/creation/index.test.ts
index 5dd7e9b..80b2c88 100644
--- a/src/steps/writing/creation/index.test.ts
+++ b/src/steps/writing/creation/index.test.ts
@@ -180,7 +180,7 @@ const optionsBaseline: Options = {
 	access: "public",
 	author: "Test Author",
 	base: "everything",
-	bin: "bin/test.js",
+	bin: "bin/index.js",
 	description: "Test Description",
 	directory: "test-directory",
 	email: { github: "github@example.com", npm: "npm@example.com" },