pasika 0.3.5 → 0.3.6

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/dist/cli/index.js CHANGED
@@ -3099,31 +3099,6 @@ var repeatedStructureRule = {
3099
3099
  }
3100
3100
  };
3101
3101
 
3102
- // eslint/pasika/rules/no-eslint-disable.ts
3103
- var noEslintDisableRule = {
3104
- meta: {
3105
- schema: [],
3106
- type: "problem",
3107
- docs: {
3108
- description: "Forbid eslint-disable directives."
3109
- }
3110
- },
3111
- create(context) {
3112
- return {
3113
- Program() {
3114
- for (const comment of context.sourceCode.getAllComments()) {
3115
- if (!comment.value.includes("eslint-disable")) continue;
3116
- if (!comment.loc) continue;
3117
- context.report({
3118
- loc: comment.loc,
3119
- message: "Do not use eslint-disable directives; fix the reported violation instead."
3120
- });
3121
- }
3122
- }
3123
- };
3124
- }
3125
- };
3126
-
3127
3102
  // eslint/pasika/rules/zod-schema-validation.ts
3128
3103
  var NON_SCHEMA_OBJECTS = /* @__PURE__ */ new Set(["JSON", "Date", "Number"]);
3129
3104
  var SCHEMA_METHODS = /* @__PURE__ */ new Set(["safeParse", "parse", "assert"]);
@@ -4716,43 +4691,8 @@ var cssRules = {
4716
4691
  "global-css-location": globalCssLocationRule
4717
4692
  };
4718
4693
 
4719
- // eslint/pasika/rules/json/no-cache-flag.ts
4720
- function memberName(member) {
4721
- return member.name.type === "String" ? member.name.value : member.name.name;
4722
- }
4723
- var noCacheFlagRule = {
4724
- meta: {
4725
- schema: [],
4726
- type: "problem",
4727
- docs: {
4728
- description: "Require lint scripts to not pass ESLint's --cache flag."
4729
- }
4730
- },
4731
- create(context) {
4732
- return {
4733
- Document(node) {
4734
- const root = node.body;
4735
- if (root.type !== "Object") return;
4736
- const scripts = root.members.find((member) => memberName(member) === "scripts");
4737
- if (scripts?.value.type !== "Object") return;
4738
- for (const member of scripts.value.members) {
4739
- const name = memberName(member);
4740
- if (name !== "lint" && name !== "fix") continue;
4741
- if (member.value.type !== "String") continue;
4742
- if (member.value.value.includes("--cache")) {
4743
- context.report({
4744
- node: member,
4745
- message: "Lint scripts must not pass ESLint's --cache flag because cross-file rules require every file in the run."
4746
- });
4747
- }
4748
- }
4749
- }
4750
- };
4751
- }
4752
- };
4753
-
4754
4694
  // eslint/pasika/rules/json/no-vulyk-dependency.ts
4755
- function memberName2(member) {
4695
+ function memberName(member) {
4756
4696
  return member.name.type === "String" ? member.name.value : member.name.name;
4757
4697
  }
4758
4698
  var noVulykDependencyRule = {
@@ -4769,9 +4709,9 @@ var noVulykDependencyRule = {
4769
4709
  const root = node.body;
4770
4710
  if (root.type !== "Object") return;
4771
4711
  for (const key of ["dependencies", "devDependencies"]) {
4772
- const section = root.members.find((member) => memberName2(member) === key);
4712
+ const section = root.members.find((member) => memberName(member) === key);
4773
4713
  if (section?.value.type !== "Object") continue;
4774
- const vulyk = section.value.members.find((member) => memberName2(member) === "vulyk");
4714
+ const vulyk = section.value.members.find((member) => memberName(member) === "vulyk");
4775
4715
  if (vulyk) {
4776
4716
  context.report({
4777
4717
  node: vulyk,
@@ -4786,7 +4726,6 @@ var noVulykDependencyRule = {
4786
4726
 
4787
4727
  // eslint/pasika/rules/json/index.ts
4788
4728
  var jsonRules = {
4789
- "no-cache-flag": noCacheFlagRule,
4790
4729
  "no-vulyk-dependency": noVulykDependencyRule
4791
4730
  };
4792
4731
 
@@ -4829,7 +4768,6 @@ var pasikaRules = {
4829
4768
  "locale-key-shape": localeKeyShapeRule,
4830
4769
  "shared-style-dedup": sharedStyleDedupRule,
4831
4770
  "repeated-structure": repeatedStructureRule,
4832
- "no-eslint-disable": noEslintDisableRule,
4833
4771
  "zod-schema-validation": zodSchemaValidationRule,
4834
4772
  "source-under-src": sourceUnderSrcRule
4835
4773
  };
@@ -5079,31 +5017,29 @@ function checkConfigBaseline(cwd) {
5079
5017
  }
5080
5018
  function checkManagedFiles(cwd) {
5081
5019
  const findings = [];
5082
- const vulykDir = path39.join(cwd, ".vulyk");
5083
- if (!fs4.existsSync(vulykDir)) return findings;
5084
- const manifestPath = path39.join(vulykDir, "manifest.json");
5085
- if (!fs4.existsSync(manifestPath)) return findings;
5020
+ const configPath = path39.join(cwd, "vulyk.config.ts");
5021
+ if (!fs4.existsSync(configPath)) return findings;
5022
+ const lockPath = path39.join(cwd, "vulyk.lock.json");
5023
+ if (!fs4.existsSync(lockPath)) return findings;
5086
5024
  try {
5087
- const manifestEntrySchema = z.looseObject({
5088
- targets: z.array(z.string()).optional()
5089
- });
5090
- const manifestSchema = z.record(z.string(), manifestEntrySchema);
5091
- const result = manifestSchema.safeParse(JSON.parse(fs4.readFileSync(manifestPath, "utf8")));
5092
- if (!result.success) return findings;
5093
- for (const [, entry] of Object.entries(result.data)) {
5094
- const targets = entry.targets ?? [];
5095
- for (const target of targets) {
5096
- const targetPath = path39.join(cwd, target);
5097
- if (fs4.existsSync(targetPath)) {
5098
- const stat = fs4.statSync(targetPath);
5099
- const vulykStat = fs4.statSync(manifestPath);
5100
- if (stat.mtimeMs > vulykStat.mtimeMs + 1e3) {
5101
- findings.push({
5102
- check: "managed-file-edit",
5103
- message: `File "${target}" appears to have been edited after vulyk wrote it. Use vulyk commands to update managed files.`,
5104
- severity: "warning"
5105
- });
5106
- }
5025
+ const configMtime = fs4.statSync(configPath).mtimeMs;
5026
+ const lockMtime = fs4.statSync(lockPath).mtimeMs;
5027
+ const referenceMtime = Math.max(configMtime, lockMtime);
5028
+ const defaultOutputDirs = ["docs/external"];
5029
+ for (const dir of defaultOutputDirs) {
5030
+ const dirPath = path39.join(cwd, dir);
5031
+ if (!fs4.existsSync(dirPath)) continue;
5032
+ const entries = fs4.readdirSync(dirPath, { withFileTypes: true });
5033
+ for (const entry of entries) {
5034
+ if (!entry.isFile()) continue;
5035
+ const filePath = path39.join(dirPath, entry.name);
5036
+ const stat = fs4.statSync(filePath);
5037
+ if (stat.mtimeMs > referenceMtime + 1e3) {
5038
+ findings.push({
5039
+ check: "managed-file-edit",
5040
+ message: `File "${dir}/${entry.name}" appears to have been edited after vulyk wrote it. Use vulyk commands to update managed files.`,
5041
+ severity: "warning"
5042
+ });
5107
5043
  }
5108
5044
  }
5109
5045
  }
@@ -5170,7 +5106,7 @@ function collectTestTitles(rulesDir) {
5170
5106
  const titlePattern = /\b(?:describe|test|it)\(\s*(?:"(?<double>(?:[^"\\]|\\.)*)"|'(?<single>(?:[^'\\]|\\.)*)')/g;
5171
5107
  for (const match of body.matchAll(titlePattern)) {
5172
5108
  const title = match.groups?.double ?? match.groups?.single ?? "";
5173
- titles.add(title.replaceAll('\\\\"', '"').replaceAll("\\\\'", "'"));
5109
+ titles.add(title.replaceAll("`", "").replaceAll('\\\\"', '"').replaceAll("\\\\'", "'"));
5174
5110
  }
5175
5111
  }
5176
5112
  };
@@ -115,7 +115,6 @@ declare const cssRules: {
115
115
  };
116
116
 
117
117
  declare const jsonRules: {
118
- "no-cache-flag": _eslint_json.JSONRuleDefinition;
119
118
  "no-vulyk-dependency": _eslint_json.JSONRuleDefinition;
120
119
  };
121
120
 
@@ -168,7 +167,6 @@ declare const pasikaRules: {
168
167
  "locale-key-shape": eslint.Rule.RuleModule;
169
168
  "shared-style-dedup": eslint.Rule.RuleModule;
170
169
  "repeated-structure": eslint.Rule.RuleModule;
171
- "no-eslint-disable": eslint.Rule.RuleModule;
172
170
  "zod-schema-validation": eslint.Rule.RuleModule;
173
171
  "source-under-src": eslint.Rule.RuleModule;
174
172
  };
@@ -3087,31 +3087,6 @@ var repeatedStructureRule = {
3087
3087
  }
3088
3088
  };
3089
3089
 
3090
- // eslint/pasika/rules/no-eslint-disable.ts
3091
- var noEslintDisableRule = {
3092
- meta: {
3093
- schema: [],
3094
- type: "problem",
3095
- docs: {
3096
- description: "Forbid eslint-disable directives."
3097
- }
3098
- },
3099
- create(context) {
3100
- return {
3101
- Program() {
3102
- for (const comment of context.sourceCode.getAllComments()) {
3103
- if (!comment.value.includes("eslint-disable")) continue;
3104
- if (!comment.loc) continue;
3105
- context.report({
3106
- loc: comment.loc,
3107
- message: "Do not use eslint-disable directives; fix the reported violation instead."
3108
- });
3109
- }
3110
- }
3111
- };
3112
- }
3113
- };
3114
-
3115
3090
  // eslint/pasika/rules/zod-schema-validation.ts
3116
3091
  var NON_SCHEMA_OBJECTS = /* @__PURE__ */ new Set(["JSON", "Date", "Number"]);
3117
3092
  var SCHEMA_METHODS = /* @__PURE__ */ new Set(["safeParse", "parse", "assert"]);
@@ -4704,43 +4679,8 @@ var cssRules = {
4704
4679
  "global-css-location": globalCssLocationRule
4705
4680
  };
4706
4681
 
4707
- // eslint/pasika/rules/json/no-cache-flag.ts
4708
- function memberName(member) {
4709
- return member.name.type === "String" ? member.name.value : member.name.name;
4710
- }
4711
- var noCacheFlagRule = {
4712
- meta: {
4713
- schema: [],
4714
- type: "problem",
4715
- docs: {
4716
- description: "Require lint scripts to not pass ESLint's --cache flag."
4717
- }
4718
- },
4719
- create(context) {
4720
- return {
4721
- Document(node) {
4722
- const root = node.body;
4723
- if (root.type !== "Object") return;
4724
- const scripts = root.members.find((member) => memberName(member) === "scripts");
4725
- if (scripts?.value.type !== "Object") return;
4726
- for (const member of scripts.value.members) {
4727
- const name = memberName(member);
4728
- if (name !== "lint" && name !== "fix") continue;
4729
- if (member.value.type !== "String") continue;
4730
- if (member.value.value.includes("--cache")) {
4731
- context.report({
4732
- node: member,
4733
- message: "Lint scripts must not pass ESLint's --cache flag because cross-file rules require every file in the run."
4734
- });
4735
- }
4736
- }
4737
- }
4738
- };
4739
- }
4740
- };
4741
-
4742
4682
  // eslint/pasika/rules/json/no-vulyk-dependency.ts
4743
- function memberName2(member) {
4683
+ function memberName(member) {
4744
4684
  return member.name.type === "String" ? member.name.value : member.name.name;
4745
4685
  }
4746
4686
  var noVulykDependencyRule = {
@@ -4757,9 +4697,9 @@ var noVulykDependencyRule = {
4757
4697
  const root = node.body;
4758
4698
  if (root.type !== "Object") return;
4759
4699
  for (const key of ["dependencies", "devDependencies"]) {
4760
- const section = root.members.find((member) => memberName2(member) === key);
4700
+ const section = root.members.find((member) => memberName(member) === key);
4761
4701
  if (section?.value.type !== "Object") continue;
4762
- const vulyk = section.value.members.find((member) => memberName2(member) === "vulyk");
4702
+ const vulyk = section.value.members.find((member) => memberName(member) === "vulyk");
4763
4703
  if (vulyk) {
4764
4704
  context.report({
4765
4705
  node: vulyk,
@@ -4774,7 +4714,6 @@ var noVulykDependencyRule = {
4774
4714
 
4775
4715
  // eslint/pasika/rules/json/index.ts
4776
4716
  var jsonRules = {
4777
- "no-cache-flag": noCacheFlagRule,
4778
4717
  "no-vulyk-dependency": noVulykDependencyRule
4779
4718
  };
4780
4719
 
@@ -4817,7 +4756,6 @@ var pasikaRules = {
4817
4756
  "locale-key-shape": localeKeyShapeRule,
4818
4757
  "shared-style-dedup": sharedStyleDedupRule,
4819
4758
  "repeated-structure": repeatedStructureRule,
4820
- "no-eslint-disable": noEslintDisableRule,
4821
4759
  "zod-schema-validation": zodSchemaValidationRule,
4822
4760
  "source-under-src": sourceUnderSrcRule
4823
4761
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pasika",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "Reusable agent setup package",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,9 +27,14 @@
27
27
  "fix": "eslint . --fix",
28
28
  "lint": "eslint .",
29
29
  "prepack": "npm run build",
30
+ "prepare": "husky",
30
31
  "test": "node --import tsx --test 'eslint/**/*.test.ts' 'enforcement/**/*.test.ts'",
31
32
  "typecheck": "tsc --noEmit"
32
33
  },
34
+ "lint-staged": {
35
+ "!(*.ts|*.mts|*.cts|*.tsx|*.js|*.cjs|*.mjs|*.jsx)": "prettier --write --ignore-unknown",
36
+ "*.ts|*.mts|*.cts|*.tsx|*.js|*.cjs|*.mjs|*.jsx": "npx eslint --fix"
37
+ },
33
38
  "dependencies": {
34
39
  "commander": "^12.1.0",
35
40
  "zod": "^4.4.3"
@@ -46,7 +51,9 @@
46
51
  "@typescript-eslint/parser": "^8.68.0",
47
52
  "@typescript-eslint/utils": "^8.68.0",
48
53
  "eslint": "^10.9.1",
54
+ "husky": "^9.1.7",
49
55
  "jiti": "^2.7.0",
56
+ "lint-staged": "^16.4.0",
50
57
  "prettier": "^3.8.1",
51
58
  "tsup": "^8.5.1",
52
59
  "tsx": "^4.23.12",