@limenet-ch/baseline 2.12.1 → 2.12.2

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
@@ -83,9 +83,9 @@ npm install --save-dev @limenet-ch/baseline
83
83
 
84
84
  ```bash
85
85
  npx baseline check # report issues
86
- npx baseline check --fix # apply safe fixes, then report what is left
86
+ npx baseline check --fix # apply safe fixes and install/update the skills, then report what is left
87
87
  npx baseline periodic # walk through expired periodic checks
88
- npx baseline install-skills # copy the packaged skills into .claude/skills/
88
+ npx baseline install-skills # copy the packaged skills into .claude/skills/ without running the checks
89
89
  ```
90
90
 
91
91
  Wire it into the `ci-lint` npm script so CI and the Claude Stop hook both run it — npm has no
package/js/dist/bin.js CHANGED
@@ -12,7 +12,7 @@ Usage:
12
12
  baseline install-skills [--force] [--cwd <path>]
13
13
 
14
14
  Options:
15
- --fix Repair what can be repaired, then re-verify
15
+ --fix Repair what can be repaired, install/update the skills, then re-verify
16
16
  --verbose Show passing checks too
17
17
  --force Overwrite skills that are already installed
18
18
  --cwd Project root to inspect (default: the current directory)
@@ -0,0 +1,11 @@
1
+ import { type CheckResult, FixableCheck } from './check.js';
2
+ /**
3
+ * npm-only: the Laravel runner has no counterpart because Laravel Boost
4
+ * discovers and publishes resources/boost/skills/ itself. A JS project has
5
+ * nothing like Boost, so without this check it silently goes without the skills
6
+ * — or keeps the ones from whichever version first ran install-skills.
7
+ */
8
+ export declare class HasInstalledSkillsCheck extends FixableCheck {
9
+ static readonly checkName = "hasInstalledSkills";
10
+ fix(dry?: boolean): CheckResult;
11
+ }
@@ -0,0 +1,32 @@
1
+ import { packagedSkills } from '../commands/install-skills.js';
2
+ import { FixableCheck } from './check.js';
3
+ /**
4
+ * npm-only: the Laravel runner has no counterpart because Laravel Boost
5
+ * discovers and publishes resources/boost/skills/ itself. A JS project has
6
+ * nothing like Boost, so without this check it silently goes without the skills
7
+ * — or keeps the ones from whichever version first ran install-skills.
8
+ */
9
+ export class HasInstalledSkillsCheck extends FixableCheck {
10
+ static checkName = 'hasInstalledSkills';
11
+ fix(dry = false) {
12
+ let result = 'pass';
13
+ for (const skill of packagedSkills()) {
14
+ const installed = this.project.read(skill.target);
15
+ if (installed === skill.contents) {
16
+ continue;
17
+ }
18
+ // The skills belong to the package, like the canonical .editorconfig:
19
+ // a local edit is drift, and an upgrade overwrites it.
20
+ this.comment(installed === null
21
+ ? `Skill missing: Create ${skill.target} by running "npx baseline install-skills"`
22
+ : `Skill outdated: ${skill.target} differs from the version shipped with @limenet-ch/baseline — run "npx baseline install-skills --force"`);
23
+ if (dry) {
24
+ result = 'fail';
25
+ continue;
26
+ }
27
+ this.project.write(skill.target, skill.contents);
28
+ }
29
+ return dry ? result : this.fix(true);
30
+ }
31
+ }
32
+ //# sourceMappingURL=has-installed-skills-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"has-installed-skills-check.js","sourceRoot":"","sources":["../../src/checks/has-installed-skills-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAoB,YAAY,EAAE,MAAM,YAAY,CAAA;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,YAAY;IACrD,MAAM,CAAmB,SAAS,GAAG,oBAAoB,CAAA;IAEzD,GAAG,CAAC,GAAG,GAAG,KAAK;QACX,IAAI,MAAM,GAAgB,MAAM,CAAA;QAEhC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAEjD,IAAI,SAAS,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC/B,SAAQ;YACZ,CAAC;YAED,sEAAsE;YACtE,uDAAuD;YACvD,IAAI,CAAC,OAAO,CACR,SAAS,KAAK,IAAI;gBACd,CAAC,CAAC,yBAAyB,KAAK,CAAC,MAAM,2CAA2C;gBAClF,CAAC,CAAC,mBAAmB,KAAK,CAAC,MAAM,yGAAyG,CACjJ,CAAA;YAED,IAAI,GAAG,EAAE,CAAC;gBACN,MAAM,GAAG,MAAM,CAAA;gBAEf,SAAQ;YACZ,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACpD,CAAC;QAED,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;CACJ"}
@@ -2,11 +2,19 @@ import { CommentCollector, icon, isError, isFixable } from '../checks/check.js';
2
2
  import { isPeriodic } from '../checks/periodic-check.js';
3
3
  import { createChecks } from '../checks/registry.js';
4
4
  import { excludedChecks } from '../state.js';
5
+ import { syncSkills } from './install-skills.js';
5
6
  /** Runs every registered check and returns the process exit code. */
6
7
  export function runCheck(project, options) {
7
8
  const comments = new CommentCollector();
8
9
  const excluded = excludedChecks(project);
9
10
  let errors = 0;
11
+ // Not a check: there is nothing to decide, only files to keep current. Laravel
12
+ // Boost does the same for the PHP runner on boost:update.
13
+ if (options.fix) {
14
+ for (const target of syncSkills(project)) {
15
+ console.log(`🔧 Skill installed: ${target}`);
16
+ }
17
+ }
10
18
  for (const check of createChecks(project, comments)) {
11
19
  // A periodic check that does not apply yields no result at all, matching
12
20
  // the PHP runner rather than counting as a pass.
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,25 @@ import type { Project } from '../project.js';
10
10
  * vitest and in the published package.
11
11
  */
12
12
  export declare function skillsDirectory(): string;
13
+ export interface PackagedSkill {
14
+ name: string;
15
+ target: string;
16
+ contents: string;
17
+ }
18
+ /**
19
+ * Every skill this package ships, with the path it is installed to. Shared by
20
+ * the install-skills command and hasInstalledSkills, so the two can never
21
+ * disagree about what "installed" means.
22
+ */
23
+ export declare function packagedSkills(): PackagedSkill[];
24
+ /**
25
+ * Brings .claude/skills/ in line with the packaged skills and returns the paths
26
+ * it wrote. Run by `check --fix`, so upgrading the package and fixing is enough
27
+ * to pick up new and changed skills. The skills belong to the package, like the
28
+ * canonical .editorconfig: a local edit is drift and gets overwritten. Skills the
29
+ * package does not ship are left alone.
30
+ */
31
+ export declare function syncSkills(project: Project): string[];
13
32
  export interface InstallSkillsOptions {
14
33
  force: boolean;
15
34
  }
@@ -14,6 +14,43 @@ import { fileURLToPath } from 'node:url';
14
14
  export function skillsDirectory() {
15
15
  return join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'skills');
16
16
  }
17
+ /**
18
+ * Every skill this package ships, with the path it is installed to. Shared by
19
+ * the install-skills command and hasInstalledSkills, so the two can never
20
+ * disagree about what "installed" means.
21
+ */
22
+ export function packagedSkills() {
23
+ const source = skillsDirectory();
24
+ if (!existsSync(source)) {
25
+ return [];
26
+ }
27
+ return readdirSync(source)
28
+ .sort()
29
+ .filter((name) => existsSync(join(source, name, 'SKILL.md')))
30
+ .map((name) => ({
31
+ name,
32
+ target: `.claude/skills/${name}/SKILL.md`,
33
+ contents: readFileSync(join(source, name, 'SKILL.md'), 'utf8'),
34
+ }));
35
+ }
36
+ /**
37
+ * Brings .claude/skills/ in line with the packaged skills and returns the paths
38
+ * it wrote. Run by `check --fix`, so upgrading the package and fixing is enough
39
+ * to pick up new and changed skills. The skills belong to the package, like the
40
+ * canonical .editorconfig: a local edit is drift and gets overwritten. Skills the
41
+ * package does not ship are left alone.
42
+ */
43
+ export function syncSkills(project) {
44
+ const written = [];
45
+ for (const skill of packagedSkills()) {
46
+ if (project.read(skill.target) === skill.contents) {
47
+ continue;
48
+ }
49
+ project.write(skill.target, skill.contents);
50
+ written.push(skill.target);
51
+ }
52
+ return written;
53
+ }
17
54
  export function runInstallSkills(project, options) {
18
55
  const source = skillsDirectory();
19
56
  if (!existsSync(source)) {
@@ -22,19 +59,14 @@ export function runInstallSkills(project, options) {
22
59
  }
23
60
  let installed = 0;
24
61
  let skipped = 0;
25
- for (const skill of readdirSync(source).sort()) {
26
- const file = join(source, skill, 'SKILL.md');
27
- if (!existsSync(file)) {
28
- continue;
29
- }
30
- const target = `.claude/skills/${skill}/SKILL.md`;
31
- if (project.exists(target) && !options.force) {
32
- console.log(`⏭ ${skill} (already installed — pass --force to overwrite)`);
62
+ for (const skill of packagedSkills()) {
63
+ if (project.exists(skill.target) && !options.force) {
64
+ console.log(`⏭ ${skill.name} (already installed — pass --force to overwrite)`);
33
65
  skipped += 1;
34
66
  continue;
35
67
  }
36
- project.write(target, readFileSync(file, 'utf8'));
37
- console.log(`✅ ${skill} → ${target}`);
68
+ project.write(skill.target, skill.contents);
69
+ console.log(`✅ ${skill.name} → ${skill.target}`);
38
70
  installed += 1;
39
71
  }
40
72
  if (installed === 0 && skipped === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/commands/install-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGxC;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC9E,CAAC;AAMD,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,OAA6B;IAC5E,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAEhC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,GAAG,CAAC,CAAA;QAEvD,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAE5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,SAAQ;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,KAAK,WAAW,CAAA;QAEjD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,kDAAkD,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAC,CAAA;YAEZ,SAAQ;QACZ,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,MAAM,EAAE,CAAC,CAAA;QACrC,SAAS,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAE1C,OAAO,CAAC,CAAA;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,wBAAwB,OAAO,kBAAkB,CAAC,CAAA;IAE5E,OAAO,CAAC,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/commands/install-skills.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,31 @@ Run the lint suite and fix every issue before considering the update complete:
75
75
  npm run ci-lint
76
76
  ```
77
77
 
78
+ ### 6. Record the run (last)
79
+
80
+ Once `ci-lint` passes, mark the `updatesDependencies` periodic check as done so it stops prompting
81
+ for the next 30 days. `baseline periodic` asks for confirmation interactively, so write the
82
+ timestamp into `.baseline.json` at the project root directly instead. Get the current time in the
83
+ format the runner writes:
84
+
85
+ ```bash
86
+ node -e "console.log(new Date().toISOString())"
87
+ ```
88
+
89
+ Set it as `periodic.updatesDependencies`, creating the `periodic` object (or the file) if it does
90
+ not exist yet, and leave every other key untouched:
91
+
92
+ ```json
93
+ {
94
+ "periodic": {
95
+ "updatesDependencies": "2026-01-31T09:15:00.000Z"
96
+ }
97
+ }
98
+ ```
99
+
100
+ Skip this step if the update was abandoned or `ci-lint` still fails — the date records a completed
101
+ update, not an attempted one.
102
+
78
103
  ## What to report
79
104
 
80
105
  Produce a written summary:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@limenet-ch/baseline",
3
- "version": "2.12.1",
3
+ "version": "2.12.2",
4
4
  "description": "A highly opinionated baseline for JS/TS projects.",
5
5
  "keywords": [
6
6
  "baseline",