@tzwzx/codesweep 1.0.1 → 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/README.md CHANGED
@@ -5,6 +5,14 @@
5
5
 
6
6
  Run lint, format, typecheck, test, and other code quality commands in one go. Configure each project with a YAML file.
7
7
 
8
+ ## Why codesweep?
9
+
10
+ Task runners like [concurrently](https://www.npmjs.com/package/concurrently) and [npm-run-all2](https://www.npmjs.com/package/npm-run-all2) are great at running commands in parallel, but multi-stage pipelines — apply fixes first, then verify everything in parallel — quickly turn into hard-to-read one-liners in `package.json`. codesweep lets you declare the whole pipeline in one YAML file, mixing sequential and parallel stages freely, and run it with a single command.
11
+
12
+ It is built for "run all quality checks in one go" moments: post-task checks for AI coding agents, pre-commit hooks, and CI. Commands in a stage fail through — one failure doesn't cancel the other checks — so you see every error in a single run.
13
+
14
+ In short: if you need build caching and dependency graphs, reach for [wireit](https://www.npmjs.com/package/wireit); if you just want to run a couple of commands in parallel, `concurrently` alone is enough; if you want a declarative, multi-stage quality-check pipeline, codesweep is for you.
15
+
8
16
  ## Requirements
9
17
 
10
18
  - Node.js >= 22 (or Bun >= 1)
@@ -27,9 +35,10 @@ After install, the `codesweep` binary is available via `npx @tzwzx/codesweep`, `
27
35
  ## CLI usage
28
36
 
29
37
  ```bash
30
- codesweep <mode> [options]
38
+ codesweep <command> [options]
31
39
  ```
32
40
 
41
+ - **`init`** — Create a starter `codesweep.yml` in the current directory. Reserved as a subcommand; see note below.
33
42
  - **mode** — Any mode defined in `codesweep.yml` (for example `check` or `fix`).
34
43
  - **`--config` / `-c <path>`** — Path to the config file (default: `./codesweep.yml`).
35
44
  - **`--help` / `-h`** — Show help.
@@ -37,6 +46,7 @@ codesweep <mode> [options]
37
46
  Examples:
38
47
 
39
48
  ```bash
49
+ codesweep init
40
50
  codesweep check
41
51
  codesweep fix
42
52
  codesweep check --config ./packages/app/codesweep.yml
@@ -46,36 +56,41 @@ Exit code `0` on success, `1` on failure. Elapsed time is printed when the run f
46
56
 
47
57
  ## Library usage
48
58
 
49
- ```ts
50
- import { codesweep } from "@tzwzx/codesweep";
59
+ codesweep can also be called programmatically: `import { codesweep } from "@tzwzx/codesweep"` and `await codesweep("check")` (optionally passing a config path as the second argument).
51
60
 
52
- await codesweep("check");
53
- await codesweep("fix", "./custom.yml");
54
- ```
61
+ ## Config: `codesweep.yml`
55
62
 
56
- You can also import helpers such as `loadConfig`, `runParallel`, and `runSequential` from the same package.
63
+ Run `init` to generate a starter `codesweep.yml` in the current directory (fails if the file already exists). This also works without installing first:
57
64
 
58
- ## Config: `codesweep.yml`
65
+ ```bash
66
+ npx @tzwzx/codesweep init
59
67
 
60
- Define one or more **modes**. Each mode is an ordered list of **stages**. Each stage is either `parallel` or `sequential`, and holds a non-empty array of shell command strings.
68
+ # or with bun
69
+ bunx @tzwzx/codesweep init
70
+ ```
61
71
 
62
- Example:
72
+ This creates:
63
73
 
64
74
  ```yaml
75
+ # codesweep configuration
76
+ # https://github.com/tzwzx/codesweep
77
+
65
78
  check:
66
- - parallel:
67
- - bun lint
68
- - bun tsc
69
- - bun test
79
+ - parallel: # Stage 1: run checks in parallel
80
+ - npm run lint
81
+ - npm run typecheck
82
+ - npm test
70
83
 
71
84
  fix:
72
- - sequential:
73
- - bun fix
74
- - parallel:
75
- - bun tsc
76
- - bun test
85
+ - sequential: # Stage 1: apply auto-fixes
86
+ - npm run fix
87
+ - parallel: # Stage 2: verify after fixing
88
+ - npm run typecheck
89
+ - npm test
77
90
  ```
78
91
 
92
+ Define one or more **modes**. Each mode is an ordered list of **stages**. Each stage is either `parallel` or `sequential`, and holds a non-empty array of shell command strings. Mode names are arbitrary — note: `"init"` is reserved as a subcommand and cannot be used as a mode name.
93
+
79
94
  ### Behavior
80
95
 
81
96
  - **Stages** run one after another (stage 2 starts after stage 1 finishes).
package/dist/cli.d.ts CHANGED
@@ -3,9 +3,10 @@
3
3
  * codesweep CLI - Run code quality checks in one command
4
4
  *
5
5
  * Usage:
6
- * codesweep <mode> [--config path]
6
+ * codesweep <command> [--config path]
7
7
  *
8
8
  * Examples:
9
+ * codesweep init # Create a starter codesweep.yml
9
10
  * codesweep check # Run quality checks
10
11
  * codesweep fix # Auto-fix then check
11
12
  * codesweep check --config ./custom.yml # Use custom config file
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
package/dist/cli.js CHANGED
@@ -3,9 +3,10 @@
3
3
  * codesweep CLI - Run code quality checks in one command
4
4
  *
5
5
  * Usage:
6
- * codesweep <mode> [--config path]
6
+ * codesweep <command> [--config path]
7
7
  *
8
8
  * Examples:
9
+ * codesweep init # Create a starter codesweep.yml
9
10
  * codesweep check # Run quality checks
10
11
  * codesweep fix # Auto-fix then check
11
12
  * codesweep check --config ./custom.yml # Use custom config file
@@ -13,14 +14,17 @@
13
14
  import process from "node:process";
14
15
  import { parseArgs } from "node:util";
15
16
  import { codesweep } from "./index.js";
17
+ import { initConfig } from "./init.js";
16
18
  const HELP_TEXT = `
17
19
  codesweep - Run code quality checks in one command 🧹
18
20
 
19
21
  Usage:
20
- codesweep <mode> [options]
22
+ codesweep <command> [options]
21
23
 
22
- Modes:
23
- Any mode defined in your codesweep.yml (e.g. check, fix, ...)
24
+ Commands:
25
+ init Create a starter codesweep.yml config file
26
+ <mode> Run a mode defined in your codesweep.yml (e.g. check, fix)
27
+ Note: "init" is reserved and cannot be used as a mode name
24
28
 
25
29
  Options:
26
30
  --config, -c <path> Path to config file (default: ./codesweep.yml)
@@ -53,7 +57,14 @@ const main = async () => {
53
57
  process.exit(1);
54
58
  }
55
59
  try {
56
- await codesweep(mode, values.config);
60
+ if (mode === "init") {
61
+ // "init" is a reserved subcommand and never runs a user-defined mode.
62
+ const createdPath = initConfig(values.config);
63
+ console.log(`Created ${createdPath}`);
64
+ }
65
+ else {
66
+ await codesweep(mode, values.config);
67
+ }
57
68
  process.exit(0);
58
69
  }
59
70
  catch (error) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,SAAS,GAAG;;;;;;;;;;;;CAYjB,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,IAAI,MAA2C,CAAC;IAChD,IAAI,WAAqB,CAAC;IAE1B,IAAI,CAAC;QACH,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACnC,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACtC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;IAE3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,wEAAwE;AACxE,uEAAuE;AACvE,IAAI,CAAC;IACH,MAAM,IAAI,EAAE,CAAC;AACf,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;CAcjB,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,IAAI,MAA2C,CAAC;IAChD,IAAI,WAAqB,CAAC;IAE1B,IAAI,CAAC;QACH,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACnC,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;aACtC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;IAE3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,sEAAsE;YACtE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,wEAAwE;AACxE,uEAAuE;AACvE,IAAI,CAAC;IACH,MAAM,IAAI,EAAE,CAAC;AACf,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ParallelStage, SequentialStage, Stage, CodesweepConfig } from "./types.js";
2
2
  export declare const isParallelStage: (stage: Stage) => stage is ParallelStage;
3
3
  export declare const isSequentialStage: (stage: Stage) => stage is SequentialStage;
4
+ export declare const resolveConfigPath: (configPath?: string) => string;
4
5
  export declare const loadConfig: (configPath?: string) => CodesweepConfig;
5
6
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIzF,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAAoC,CAAC;AAE7F,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,eAAwC,CAAC;AA2DnG,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,KAAG,eAchD,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIzF,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAAoC,CAAC;AAE7F,eAAO,MAAM,iBAAiB,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,eAAwC,CAAC;AA2DnG,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,MACsC,CAAC;AAE/F,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,KAAG,eAYhD,CAAC"}
package/dist/config.js CHANGED
@@ -47,10 +47,9 @@ const validateConfig = (config) => {
47
47
  }
48
48
  return record;
49
49
  };
50
+ export const resolveConfigPath = (configPath) => configPath ? path.resolve(configPath) : path.resolve(process.cwd(), DEFAULT_CONFIG_FILENAME);
50
51
  export const loadConfig = (configPath) => {
51
- const resolvedPath = configPath
52
- ? path.resolve(configPath)
53
- : path.resolve(process.cwd(), DEFAULT_CONFIG_FILENAME);
52
+ const resolvedPath = resolveConfigPath(configPath);
54
53
  let content;
55
54
  try {
56
55
  content = readFileSync(resolvedPath, "utf-8");
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { Mode } from "./types.js";
2
2
  export type { CodesweepConfig, Stage, ParallelStage, SequentialStage, Mode } from "./types.js";
3
3
  export { isParallelStage, isSequentialStage, loadConfig } from "./config.js";
4
+ export { initConfig } from "./init.js";
4
5
  export { runParallel, runSequential } from "./runner.js";
5
6
  /**
6
7
  * Load the config file, then run the pipeline for the given mode.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBzD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GAAU,MAAM,IAAI,EAAE,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAsB7E,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAS,IAAI,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBzD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GAAU,MAAM,IAAI,EAAE,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAsB7E,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import { performance } from "node:perf_hooks";
2
2
  import { isParallelStage, loadConfig } from "./config.js";
3
3
  import { runParallel, runSequential } from "./runner.js";
4
4
  export { isParallelStage, isSequentialStage, loadConfig } from "./config.js";
5
+ export { initConfig } from "./init.js";
5
6
  export { runParallel, runSequential } from "./runner.js";
6
7
  const MILLISECONDS_PER_SECOND = 1000;
7
8
  const formatDuration = (startTime) => ((performance.now() - startTime) / MILLISECONDS_PER_SECOND).toFixed(2);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIzD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAU,EAAE,CACnD,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,uBAAuB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAiB,EAAE,CAC/C,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAEzF,MAAM,WAAW,GAAG,KAAK,EAAE,MAAwB,EAAiB,EAAE;IACpE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,mGAAmG;QACnG,4CAA4C;QAC5C,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAU,EAAE,UAAmB,EAAiB,EAAE;IAChF,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,mDAAmD,cAAc,GAAG,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIzD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAErC,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAU,EAAE,CACnD,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,uBAAuB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAiB,EAAE,CAC/C,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAEzF,MAAM,WAAW,GAAG,KAAK,EAAE,MAAwB,EAAiB,EAAE;IACpE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,mGAAmG;QACnG,4CAA4C;QAC5C,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAU,EAAE,UAAmB,EAAiB,EAAE;IAChF,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,SAAS,IAAI,mDAAmD,cAAc,GAAG,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,YAAY,QAAQ,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Create a starter codesweep.yml config file.
3
+ *
4
+ * @param configPath - Destination path (default: `./codesweep.yml`).
5
+ * @returns The absolute path of the created file.
6
+ * @throws {Error} If a file already exists at the destination.
7
+ */
8
+ export declare const initConfig: (configPath?: string) => string;
9
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,KAAG,MAehD,CAAC"}
package/dist/init.js ADDED
@@ -0,0 +1,41 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { resolveConfigPath } from "./config.js";
3
+ const CONFIG_TEMPLATE = `# codesweep configuration
4
+ # https://github.com/tzwzx/codesweep
5
+
6
+ check:
7
+ - parallel: # Stage 1: run checks in parallel
8
+ - npm run lint
9
+ - npm run typecheck
10
+ - npm test
11
+
12
+ fix:
13
+ - sequential: # Stage 1: apply auto-fixes
14
+ - npm run fix
15
+ - parallel: # Stage 2: verify after fixing
16
+ - npm run typecheck
17
+ - npm test
18
+ `;
19
+ /**
20
+ * Create a starter codesweep.yml config file.
21
+ *
22
+ * @param configPath - Destination path (default: `./codesweep.yml`).
23
+ * @returns The absolute path of the created file.
24
+ * @throws {Error} If a file already exists at the destination.
25
+ */
26
+ export const initConfig = (configPath) => {
27
+ const resolvedPath = resolveConfigPath(configPath);
28
+ try {
29
+ // The "wx" flag fails atomically if the file already exists,
30
+ // avoiding a check-then-write race condition.
31
+ writeFileSync(resolvedPath, CONFIG_TEMPLATE, { encoding: "utf-8", flag: "wx" });
32
+ }
33
+ catch (error) {
34
+ if (error instanceof Error && "code" in error && error.code === "EEXIST") {
35
+ throw new Error(`Config file already exists: ${resolvedPath}`, { cause: error });
36
+ }
37
+ throw error;
38
+ }
39
+ return resolvedPath;
40
+ };
41
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;CAevB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAmB,EAAU,EAAE;IACxD,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,6DAA6D;QAC7D,8CAA8C;QAC9C,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,+BAA+B,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tzwzx/codesweep",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Run code quality checks in one command 🧹",
5
5
  "keywords": [
6
6
  "cli",
@@ -60,7 +60,7 @@
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/node": "26.1.0",
63
- "knip": "6.23.0",
63
+ "knip": "6.24.0",
64
64
  "oxfmt": "0.57.0",
65
65
  "oxlint": "1.72.0",
66
66
  "syncpack": "15.3.2",