chaffjs 0.3.0 → 0.5.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.
Files changed (147) hide show
  1. package/dist/adapter-load.d.ts +5 -0
  2. package/dist/adapter-load.d.ts.map +1 -1
  3. package/dist/adapter-load.js +39 -3
  4. package/dist/adapter-load.js.map +1 -1
  5. package/dist/backends/anthropic.d.ts +2 -2
  6. package/dist/backends/anthropic.d.ts.map +1 -1
  7. package/dist/backends/anthropic.js +1 -1
  8. package/dist/backends/anthropic.js.map +1 -1
  9. package/dist/backends/openai.d.ts +2 -1
  10. package/dist/backends/openai.d.ts.map +1 -1
  11. package/dist/backends/types.d.ts +0 -1
  12. package/dist/backends/types.d.ts.map +1 -1
  13. package/dist/backends/types.js +1 -1
  14. package/dist/backends/types.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +24 -4
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/eval.js +2 -2
  19. package/dist/commands/eval.js.map +1 -1
  20. package/dist/commands/test.js +3 -3
  21. package/dist/commands/test.js.map +1 -1
  22. package/dist/config/load.d.ts +4 -3
  23. package/dist/config/load.d.ts.map +1 -1
  24. package/dist/config/load.js +7 -1
  25. package/dist/config/load.js.map +1 -1
  26. package/dist/detectors/en-shape.d.ts.map +1 -1
  27. package/dist/detectors/en-shape.js +4 -2
  28. package/dist/detectors/en-shape.js.map +1 -1
  29. package/dist/detectors/heading-echo.d.ts.map +1 -1
  30. package/dist/detectors/heading-echo.js +25 -2
  31. package/dist/detectors/heading-echo.js.map +1 -1
  32. package/dist/detectors/index.d.ts.map +1 -1
  33. package/dist/detectors/index.js +8 -2
  34. package/dist/detectors/index.js.map +1 -1
  35. package/dist/detectors/lexicon.d.ts +1 -0
  36. package/dist/detectors/lexicon.d.ts.map +1 -1
  37. package/dist/detectors/lexicon.js +41 -0
  38. package/dist/detectors/lexicon.js.map +1 -1
  39. package/dist/detectors/signals.d.ts +1 -0
  40. package/dist/detectors/signals.d.ts.map +1 -1
  41. package/dist/detectors/signals.js +42 -10
  42. package/dist/detectors/signals.js.map +1 -1
  43. package/dist/detectors/team.d.ts +17 -0
  44. package/dist/detectors/team.d.ts.map +1 -0
  45. package/dist/detectors/team.js +87 -0
  46. package/dist/detectors/team.js.map +1 -0
  47. package/dist/document.d.ts +11 -1
  48. package/dist/document.d.ts.map +1 -1
  49. package/dist/document.js +17 -3
  50. package/dist/document.js.map +1 -1
  51. package/dist/eval.d.ts.map +1 -1
  52. package/dist/eval.js +15 -1
  53. package/dist/eval.js.map +1 -1
  54. package/dist/files.d.ts +0 -10
  55. package/dist/files.d.ts.map +1 -1
  56. package/dist/files.js +1 -1
  57. package/dist/files.js.map +1 -1
  58. package/dist/levels.d.ts +0 -1
  59. package/dist/levels.d.ts.map +1 -1
  60. package/dist/levels.js +1 -1
  61. package/dist/levels.js.map +1 -1
  62. package/dist/mask.d.ts.map +1 -1
  63. package/dist/mask.js +8 -1
  64. package/dist/mask.js.map +1 -1
  65. package/dist/measure.d.ts +0 -1
  66. package/dist/measure.d.ts.map +1 -1
  67. package/dist/measure.js +1 -1
  68. package/dist/measure.js.map +1 -1
  69. package/dist/plugin.d.ts +10 -1
  70. package/dist/plugin.d.ts.map +1 -1
  71. package/dist/position.d.ts +6 -1
  72. package/dist/position.d.ts.map +1 -1
  73. package/dist/position.js +12 -2
  74. package/dist/position.js.map +1 -1
  75. package/dist/render/rules-json.d.ts +1 -2
  76. package/dist/render/rules-json.d.ts.map +1 -1
  77. package/dist/render/rules-json.js +0 -1
  78. package/dist/render/rules-json.js.map +1 -1
  79. package/dist/render/sarif.d.ts +10 -0
  80. package/dist/render/sarif.d.ts.map +1 -0
  81. package/dist/render/sarif.js +65 -0
  82. package/dist/render/sarif.js.map +1 -0
  83. package/dist/render/semantic.d.ts +0 -1
  84. package/dist/render/semantic.d.ts.map +1 -1
  85. package/dist/render/semantic.js +1 -1
  86. package/dist/render/semantic.js.map +1 -1
  87. package/dist/render/text.d.ts +0 -1
  88. package/dist/render/text.d.ts.map +1 -1
  89. package/dist/render/text.js +1 -1
  90. package/dist/render/text.js.map +1 -1
  91. package/dist/rule-load.d.ts.map +1 -1
  92. package/dist/rule-load.js +15 -2
  93. package/dist/rule-load.js.map +1 -1
  94. package/dist/run-semantic.d.ts.map +1 -1
  95. package/dist/run-semantic.js +15 -4
  96. package/dist/run-semantic.js.map +1 -1
  97. package/dist/run.d.ts.map +1 -1
  98. package/dist/run.js +44 -4
  99. package/dist/run.js.map +1 -1
  100. package/dist/version.d.ts +2 -0
  101. package/dist/version.d.ts.map +1 -0
  102. package/dist/version.js +11 -0
  103. package/dist/version.js.map +1 -0
  104. package/package.json +3 -3
  105. package/rules/ai-generated-composite.yaml +36 -0
  106. package/rules/concrete-evidence-density.yaml +1 -1
  107. package/rules/contraction-consistency.yaml +28 -0
  108. package/rules/internal-jargon.yaml +27 -0
  109. package/rules/max-paragraph-length.yaml +1 -1
  110. package/rules/ngram-repetition.yaml +1 -1
  111. package/rules/no-doubled-joshi.yaml +1 -1
  112. package/rules/no-em-dash.yaml +32 -0
  113. package/rules/no-nakaguro-parallel.yaml +1 -1
  114. package/rules/preamble-length.yaml +1 -1
  115. package/rules/proper-noun-density.yaml +26 -0
  116. package/rules/required-sections.yaml +26 -0
  117. package/rules/taigen-dome-in-prose.yaml +1 -1
  118. package/src/adapter-load.ts +40 -2
  119. package/src/backends/anthropic.ts +2 -2
  120. package/src/backends/openai.ts +1 -1
  121. package/src/backends/types.ts +1 -1
  122. package/src/cli.ts +35 -5
  123. package/src/commands/eval.ts +2 -2
  124. package/src/commands/test.ts +3 -3
  125. package/src/config/load.ts +12 -1
  126. package/src/detectors/en-shape.ts +4 -2
  127. package/src/detectors/heading-echo.ts +29 -3
  128. package/src/detectors/index.ts +8 -2
  129. package/src/detectors/lexicon.ts +41 -0
  130. package/src/detectors/signals.ts +43 -10
  131. package/src/detectors/team.ts +90 -0
  132. package/src/document.ts +25 -3
  133. package/src/eval.ts +13 -1
  134. package/src/files.ts +1 -1
  135. package/src/levels.ts +1 -1
  136. package/src/mask.ts +8 -1
  137. package/src/measure.ts +1 -1
  138. package/src/plugin.ts +10 -2
  139. package/src/position.ts +11 -2
  140. package/src/render/rules-json.ts +1 -3
  141. package/src/render/sarif.ts +103 -0
  142. package/src/render/semantic.ts +1 -1
  143. package/src/render/text.ts +1 -1
  144. package/src/rule-load.ts +14 -2
  145. package/src/run-semantic.ts +14 -4
  146. package/src/run.ts +42 -3
  147. package/src/version.ts +14 -0
@@ -4,7 +4,11 @@ import { FILTERS } from "./semantic.js";
4
4
  import { narrow } from "./look-at.js";
5
5
  import { localized } from "./render/text.js";
6
6
  import { lineStarts, placeOf } from "./position.js";
7
- const filterFor = (name) => FILTERS[name ?? "whole-document"] ?? FILTERS["whole-document"] ?? (() => []);
7
+ /**
8
+ * 知らない絞り込みを文書全体に落とさない。spec §14 は「絞り込みを持たない L4 rule は
9
+ * 登録できない」と決めている。落とすと、**書いていない範囲が黙って LLM に送られる**。
10
+ */
11
+ const filterFor = (name) => FILTERS[name ?? "whole-document"];
8
12
  const SEVERITY_BY_VALUE = ["info", "info", "warning", "error"];
9
13
  const severityFromLevel = (rule, level) => {
10
14
  if (level === "off")
@@ -18,6 +22,10 @@ const builtInJobs = (doc, rules, settings, genre) => rules
18
22
  const rubric = rule.what_to_check === undefined ? undefined : localized(rule.what_to_check, doc.language);
19
23
  if (rubric === undefined || rubric.length === 0)
20
24
  return [];
25
+ // 絞り込みが無い rule は動かさない。黙って落とさず、下の skipped に出す。
26
+ const filter = filterFor(rule.how_to_find);
27
+ if (filter === undefined)
28
+ return [];
21
29
  return [
22
30
  {
23
31
  rule: rule.id,
@@ -25,7 +33,7 @@ const builtInJobs = (doc, rules, settings, genre) => rules
25
33
  rubric,
26
34
  howToFix: localized(rule.how_to_fix, doc.language),
27
35
  severity: severityFromLevel(rule, settings[rule.id] ?? "normal"),
28
- candidates: filterFor(rule.how_to_find)(doc),
36
+ candidates: filter(doc),
29
37
  },
30
38
  ];
31
39
  });
@@ -33,7 +41,7 @@ const userJobs = (doc, checks, genre) => checks
33
41
  .filter((check) => check.level !== "off" && check.use_for.some((target) => genre.startsWith(target)))
34
42
  .map((check) => {
35
43
  // look_at の括弧の中を取り出して絞り込む。取り出せなければ文書全体。spec §14。
36
- const { candidates, narrowing } = narrow(doc, check.look_at, filterFor("whole-document"));
44
+ const { candidates, narrowing } = narrow(doc, check.look_at, FILTERS["whole-document"] ?? (() => []));
37
45
  return {
38
46
  rule: check.id,
39
47
  name: check.name,
@@ -65,7 +73,10 @@ export const planSemantic = (doc, rules, checks, settings, genre) => [...builtIn
65
73
  export const runSemantic = async (doc, rules, checks, settings, genre, options) => {
66
74
  const jobs = planSemantic(doc, rules, checks, settings, genre);
67
75
  const starts = lineStarts(doc.source);
68
- const skipped = jobs.filter((job) => job.candidates.length === 0).map((job) => ({ rule: job.rule, why: "見るところが無かったため" }));
76
+ const unfiltered = rules
77
+ .filter((rule) => rule.layer === "L4" && rule.use_for.some((target) => genre.startsWith(target)) && filterFor(rule.how_to_find) === undefined)
78
+ .map((rule) => ({ rule: rule.id, why: `絞り込み ${rule.how_to_find} が無いため(文書全体は送りません)` }));
79
+ const skipped = [...jobs.filter((job) => job.candidates.length === 0).map((job) => ({ rule: job.rule, why: "見るところが無かったため" })), ...unfiltered];
69
80
  const live = jobs.filter((job) => job.candidates.length > 0);
70
81
  const answers = await Promise.all(live.flatMap((job) => job.candidates.map(async (candidate) => {
71
82
  const verdict = await ask({ rule: job.rule, rubric: job.rubric, candidate: candidate.text, language: doc.language }, options);
@@ -1 +1 @@
1
- {"version":3,"file":"run-semantic.js","sourceRoot":"","sources":["../src/run-semantic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-semantic.js","sourceRoot":"","sources":["../src/run-semantic.ts"],"names":[],"mappings":"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"}
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG/F,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AA8BvD;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,YAKtI,CAAC;AAQH,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,KAAG,SAoCzI,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG/F,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAwCvD;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,YAKtI,CAAC;AA+BH,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,KAAG,SA0CzI,CAAC"}
package/dist/run.js CHANGED
@@ -19,14 +19,24 @@ const has = (capabilities, need) => {
19
19
  return capabilities.lemma;
20
20
  return false;
21
21
  };
22
+ /**
23
+ * 宣言だけでなく、実際に token が来ているかも見る。
24
+ *
25
+ * `capabilities.pos: true` と言いながら token を返さないアダプタでも、rule は
26
+ * `sentence.tokens ?? []` を見るので**例外にならず、指摘 0 件で終わる**。
27
+ * 0 件は「問題なし」と見分けがつかない。
28
+ */
29
+ const hasTokens = (doc) => doc.sentences.length === 0 || doc.sentences.some((sentence) => sentence.tokens !== undefined);
22
30
  /** 要求を満たさない rule は動かせない。満たさないまま動かすと「指摘 0 件」が保証に見える。 */
23
31
  const unmet = (rule, doc) => {
24
32
  if (rule.languages !== undefined && !rule.languages.includes(doc.language))
25
33
  return `${doc.language} 向けの rule ではないため`;
26
34
  const missing = rule.requires.find((need) => !has(doc.capabilities, need));
27
- if (missing === undefined)
28
- return undefined;
29
- return `この言語では${CAPABILITY_NAME[missing] ?? missing}が使えないため`;
35
+ if (missing !== undefined)
36
+ return `この言語では${CAPABILITY_NAME[missing] ?? missing}が使えないため`;
37
+ if (rule.requires.length > 0 && !hasTokens(doc))
38
+ return "アダプタが品詞を返さなかったため";
39
+ return undefined;
30
40
  };
31
41
  const forGenre = (rules, genre) => rules.filter((rule) => rule.use_for.some((target) => genre.startsWith(target)));
32
42
  /**
@@ -44,6 +54,29 @@ const place = (starts, finding) => {
44
54
  const at = placeOf(starts, typeof offset === "number" ? offset : 0);
45
55
  return { ...finding, line: at.line, column: at.column };
46
56
  };
57
+ /**
58
+ * 複合シグナル。他の rule の結果を読むので、detector の形には収まらない。run の二段目。spec §20.2。
59
+ *
60
+ * 1 本ずつでは何も言えないものが揃ったときだけ、1 件にまとめて出す。
61
+ * 元の指摘は消さない。`padded-intro` のように単独でも正しい指摘が混ざっており、
62
+ * まとめるために消すと本物の指摘が見えなくなる。
63
+ */
64
+ const compositeOf = (rule, found, limit, starts) => {
65
+ const fired = rule.from.filter((id) => found.some((finding) => finding.rule === id));
66
+ if (fired.length < limit)
67
+ return [];
68
+ const first = found.find((finding) => fired.includes(finding.rule));
69
+ return [
70
+ place(starts, {
71
+ rule: rule.id,
72
+ severity: rule.severity,
73
+ line: 0,
74
+ column: 0,
75
+ quote: first?.quote ?? "",
76
+ values: { word: fired.join("、"), count: fired.length, limit, offset: first === undefined ? 0 : Number(first.values["offset"] ?? 0) },
77
+ }),
78
+ ];
79
+ };
47
80
  export const runRules = (doc, rules, settings, experimental, genre) => {
48
81
  const starts = lineStarts(doc.source);
49
82
  const applicable = forGenre(rules, genre);
@@ -63,6 +96,9 @@ export const runRules = (doc, rules, settings, experimental, genre) => {
63
96
  const why = rule.status === "experimental" && settings[rule.id] === undefined ? "まだ試験中のため" : "設定で止めているため";
64
97
  return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why }] };
65
98
  }
99
+ // 複合シグナルは二段目で扱う。一段目では「検出器が無い」と言わせない。
100
+ if (rule.from.length > 0)
101
+ return acc;
66
102
  const detector = DETECTORS[rule.how_to_find];
67
103
  if (detector === undefined)
68
104
  return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: `検出器 ${rule.how_to_find} がないため` }] };
@@ -78,6 +114,10 @@ export const runRules = (doc, rules, settings, experimental, genre) => {
78
114
  const found = detector(doc, options).map((finding) => place(starts, { ...finding, rule: rule.id, severity: rule.severity }));
79
115
  return { findings: [...acc.findings, ...found], skipped: acc.skipped };
80
116
  }, { findings: [], skipped: [] });
81
- return { ...outcome, findings: [...outcome.findings].sort((left, right) => left.line - right.line), forcedExperimental: forced };
117
+ const composites = applicable
118
+ .filter((rule) => rule.from.length > 0 && levelFor(rule, settings, experimental) !== "off")
119
+ .flatMap((rule) => compositeOf(rule, outcome.findings, resolve(rule, levelFor(rule, settings, experimental), genre).limit, starts));
120
+ const all = [...outcome.findings, ...composites];
121
+ return { ...outcome, findings: [...all].sort((left, right) => left.line - right.line), forcedExperimental: forced };
82
122
  };
83
123
  //# sourceMappingURL=run.js.map
package/dist/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,QAAwD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ /**
5
+ * 版は manifest から読む。定数に書くと、上げ忘れたまま古い版を名乗るものが出る。
6
+ * SARIF の tool.version がそれで、指摘を出していない版に指摘が紐づく。
7
+ */
8
+ const MANIFEST = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
9
+ const versionOf = (raw) => typeof raw === "object" && raw !== null && "version" in raw && typeof raw.version === "string" ? raw.version : "0.0.0";
10
+ export const VERSION = versionOf(JSON.parse(readFileSync(MANIFEST, "utf8")));
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAErF,MAAM,SAAS,GAAG,CAAC,GAAY,EAAU,EAAE,CACzC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAEzH,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaffjs",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Prose validation harness. Finds what is hard to read, and never rewrites it for you.",
5
5
  "keywords": [
6
6
  "chaff",
@@ -52,8 +52,8 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@anthropic-ai/sdk": "^0.125.0",
55
- "@chaffjs/lang-en": "0.3.0",
56
- "@chaffjs/lang-ja": "0.3.0",
55
+ "@chaffjs/lang-en": "0.5.0",
56
+ "@chaffjs/lang-ja": "0.5.0",
57
57
  "mdast-util-from-markdown": "^2.0.3",
58
58
  "mdast-util-frontmatter": "^2.0.1",
59
59
  "mdast-util-gfm-table": "^2.0.0",
@@ -0,0 +1,36 @@
1
+ id: ai-generated-composite
2
+ layer: L1
3
+ status: experimental
4
+ how_to_find: composite
5
+ severity: warning
6
+
7
+ # 単独では何も言えない signal。揃ったときだけ意味がある。spec §20.2。
8
+ from:
9
+ - ai-tell
10
+ - rule-of-three
11
+ - section-length-uniformity
12
+ - sentence-rhythm
13
+ - padded-intro
14
+ - closing-cliche
15
+ - no-em-dash
16
+
17
+ name:
18
+ ja: 生成文の特徴がそろっている
19
+ en: Several signals of generated text together
20
+
21
+ why:
22
+ ja: ここに挙げた特徴は、どれも 1 つでは普通の文章に出ます。同じ文書で 3 つ以上そろったときだけ意味を持ちます。**これでも「AI が書いた」とは言えません。** 読み直す場所の目印です。
23
+ en: Each of these appears in ordinary writing on its own. Only three or more in one document mean anything. **Even then it does not say the text was generated.** It marks a place to reread.
24
+
25
+ message:
26
+ ja: 「{word}」が同じ文書にそろっています({count} 種、{limit} 種から)
27
+ en: '"{word}" occur together in this document ({count} signals, {limit} needed)'
28
+
29
+ how_to_fix:
30
+ ja: 自分が書きたかったことが残っているか、通して読み直してください。個々の指摘を 1 つずつ直すより、段落ごと書き直すほうが早いことがあります。
31
+ en: Read it through and check your own point is still there. Rewriting a paragraph is often faster than fixing each finding.
32
+
33
+ # 何種そろったら出すか。spec §20.2 は 3。
34
+ levels: { strict: 2, normal: 3, relaxed: 5 }
35
+
36
+ use_for: [blog, business]
@@ -1,6 +1,6 @@
1
1
  id: concrete-evidence-density
2
2
  layer: L1
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: concrete-evidence
5
5
  severity: info
6
6
 
@@ -0,0 +1,28 @@
1
+ id: contraction-consistency
2
+ layer: L2
3
+ status: experimental
4
+ how_to_find: contraction-mix
5
+ word_list: contraction
6
+ languages: [en]
7
+ severity: info
8
+
9
+ name:
10
+ ja: 短縮形の使いかたが揃っていない
11
+ en: Contraction use is inconsistent
12
+
13
+ why:
14
+ ja: 短縮形を使うかどうかは文体の選択で、どちらが正しいかは決めません。1 つの文書で混ざっていると、読み手は文ごとに距離感を測り直すことになります。
15
+ en: Whether to use contractions is a choice of register, and neither is wrong. Mixed within one document, the reader re-measures the distance sentence by sentence.
16
+
17
+ message:
18
+ ja: 「{matched}」だけ他と書きかたが違います(そういう書きかたが {count} 種)
19
+ en: '"{matched}" is written differently from the rest of the document'
20
+
21
+ how_to_fix:
22
+ ja: 多いほうに揃えてください。
23
+ en: Match the majority.
24
+
25
+ # 少数派が何種までなら「混在」と見るか。これを超えたら混在ではなく、そういう文体。
26
+ levels: { strict: 4, normal: 2, relaxed: 1 }
27
+
28
+ use_for: [blog, business, technical]
@@ -0,0 +1,27 @@
1
+ id: internal-jargon
2
+ layer: L2
3
+ status: experimental
4
+ how_to_find: internal-jargon
5
+ word_list: internal-jargon
6
+ severity: warning
7
+
8
+ name:
9
+ ja: 社内でしか通じない言葉
10
+ en: Words that only work inside
11
+
12
+ why:
13
+ ja: 社内で通じる言葉は、外の人にも半年後の自分にも通じません。何が社内用語かはチームごとに違うので、chaff.yaml の jargon に自分で並べてください。並べていなければ何も言いません。
14
+ en: A word that works inside one team does not work outside it, or six months later. Which words those are differs by team, so list them under `jargon` in chaff.yaml. With nothing listed, this rule says nothing.
15
+
16
+ message:
17
+ ja: 「{matched}」は社内でしか通じないかもしれません(そういう語が {count} 箇所)
18
+ en: '"{matched}" may only work inside ({count} such words)'
19
+
20
+ how_to_fix:
21
+ ja: 初出のところで普通の言葉に言い換えるか、括弧で説明を添えてください。jargon には辞書形(握る)でも語幹(巻き取)でも書けますが、複合動詞は語幹のほうが確実です。
22
+ en: Use ordinary words, or explain it in brackets at first use. Entries can be dictionary forms or stems; for compound verbs a stem is safer.
23
+
24
+ # チームが並べた語なので、1 つでも指摘する。並べた時点で「使わない」と決めている。
25
+ levels: { strict: 1, normal: 1, relaxed: 3 }
26
+
27
+ use_for: [business, blog, technical]
@@ -1,6 +1,6 @@
1
1
  id: max-paragraph-length
2
2
  layer: L1
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: paragraph-length
5
5
  severity: warning
6
6
 
@@ -1,6 +1,6 @@
1
1
  id: ngram-repetition
2
2
  layer: L1
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: ngram-repetition
5
5
  severity: info
6
6
 
@@ -1,6 +1,6 @@
1
1
  id: no-doubled-joshi
2
2
  layer: L3
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: doubled-particle
5
5
  word_list: nesting-particle
6
6
  requires: [pos]
@@ -0,0 +1,32 @@
1
+ id: no-em-dash
2
+ layer: L1
3
+ status: experimental
4
+ how_to_find: dash-density
5
+
6
+ # 記号の許容度は言語で違う。英語では正当な用法が多く、日本語の組版では扱いが難しい。spec §12.4。
7
+ severity:
8
+ ja: warning
9
+ en: info
10
+
11
+ name:
12
+ ja: ダッシュが多い
13
+ en: Too many dashes
14
+
15
+ why:
16
+ ja: 日本語の組版でダッシュは扱いが難しく、環境によって長さも見えかたも変わります。読点や括弧で書けることが多いです。
17
+ en: In English a dash is a legitimate tool, and a heavy hand with it is also one of the better-known marks of generated text. On its own it says little; it counts toward the composite signal.
18
+
19
+ message:
20
+ ja: 1000 字あたり {density} 個のダッシュがあります({limit} 個まで)
21
+ en: "{density} dashes per 1000 words (limit {limit})"
22
+
23
+ how_to_fix:
24
+ ja: 読点か括弧に置き換えてください。挟み込みなら括弧、言い換えなら読点が読みやすいです。
25
+ en: A comma or a pair of brackets usually reads better.
26
+
27
+ # 1000 あたりの個数。英語は許容度が高いので緩い。
28
+ levels:
29
+ ja: { strict: 1, normal: 3, relaxed: 8 }
30
+ en: { strict: 3, normal: 8, relaxed: 20 }
31
+
32
+ use_for: [blog, business, technical]
@@ -1,6 +1,6 @@
1
1
  id: no-nakaguro-parallel
2
2
  layer: L3
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: middle-dot
5
5
  languages: [ja]
6
6
  severity: info
@@ -1,6 +1,6 @@
1
1
  id: preamble-length
2
2
  layer: L1
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: preamble-length
5
5
  severity: info
6
6
 
@@ -0,0 +1,26 @@
1
+ id: proper-noun-density
2
+ layer: L3
3
+ status: experimental
4
+ how_to_find: proper-noun-density
5
+ requires: [pos]
6
+ severity: info
7
+
8
+ name:
9
+ ja: 固有名詞が多い
10
+ en: Too many proper nouns
11
+
12
+ why:
13
+ ja: 製品名・社名・人名が続くと、それを知らない読者は文の骨組みを見失います。知っている人には読めるので、書いた本人には気づきにくいところです。
14
+ en: A run of product, company and person names hides the shape of the sentence from anyone who does not already know them. It reads fine to the person who wrote it.
15
+
16
+ message:
17
+ ja: 1000 語あたり {density} 個の固有名詞があります({limit} 個まで)
18
+ en: "{density} proper nouns per 1000 words (limit {limit})"
19
+
20
+ how_to_fix:
21
+ ja: 2 度目からは「その製品」「そのチーム」のように受けてください。初出で何者かを一言添えると、知らない人も読めます。
22
+ en: After first use, refer back to it. One phrase saying what it is lets a stranger keep reading.
23
+
24
+ levels: { strict: 20, normal: 40, relaxed: 80 }
25
+
26
+ use_for: [blog, business, technical]
@@ -0,0 +1,26 @@
1
+ id: required-sections
2
+ layer: L1
3
+ status: experimental
4
+ how_to_find: required-sections
5
+ severity: error
6
+
7
+ name:
8
+ ja: 必要な見出しが無い
9
+ en: A required heading is missing
10
+
11
+ why:
12
+ ja: 「提案書にはリスクの節がある」のような取り決めは、組織ごとに違います。chaff は必須の見出しを持たず、chaff.yaml の required_sections に書かれた取り決めを守れているかだけを見ます。書いていなければ何も言いません。
13
+ en: '"A proposal has a risk section" is a decision each team makes. chaff holds no list of its own; it only checks the one written under `required_sections` in chaff.yaml. With nothing written, this rule says nothing.'
14
+
15
+ message:
16
+ ja: 「{word}」の見出しがありません
17
+ en: 'No heading for "{word}"'
18
+
19
+ how_to_fix:
20
+ ja: その見出しを足してください。要らないと思うなら、chaff.yaml の required_sections から外すのが筋です。
21
+ en: Add the heading. If it is not needed, the honest fix is to remove it from `required_sections`.
22
+
23
+ # 何個足りなければ指摘するか。1 は「1 つでも足りなければ」。
24
+ levels: { strict: 1, normal: 1, relaxed: 2 }
25
+
26
+ use_for: [business, blog, technical]
@@ -1,6 +1,6 @@
1
1
  id: taigen-dome-in-prose
2
2
  layer: L3
3
- status: experimental
3
+ status: stable
4
4
  how_to_find: noun-ending
5
5
  requires: [pos]
6
6
  languages: [ja]
@@ -2,10 +2,47 @@ import type { LanguageAdapter } from "./plugin.ts";
2
2
 
3
3
  const ADAPTER_PACKAGE: Readonly<Record<string, string>> = { ja: "@chaffjs/lang-ja", en: "@chaffjs/lang-en" };
4
4
 
5
+ /** core が読める契約の版。合わないアダプタは、動かしてから壊れるより先に断る。 */
6
+ const API_VERSION = 1;
7
+
8
+ const isCapabilities = (value: unknown): boolean => {
9
+ if (typeof value !== "object" || value === null) return false;
10
+ const record: Record<string, unknown> = { ...value };
11
+ const unit = record["lengthUnit"];
12
+ return (
13
+ record["sentenceSplit"] === true && (unit === "char" || unit === "word") && ["wordSplit", "pos", "lemma"].every((name) => typeof record[name] === "boolean")
14
+ );
15
+ };
16
+
17
+ /**
18
+ * 形だけを見る。中身が正しいかは動かさないと分からないが、**形が違うものを通すと
19
+ * 指摘 0 件で終わる**。0 件は「問題なし」と見分けがつかない。
20
+ */
5
21
  const isAdapter = (value: unknown): value is LanguageAdapter => {
6
22
  if (typeof value !== "object" || value === null) return false;
7
23
  const record: Record<string, unknown> = { ...value };
8
- return record["kind"] === "language" && typeof record["id"] === "string" && typeof record["segment"] === "function";
24
+ return (
25
+ record["kind"] === "language" &&
26
+ typeof record["id"] === "string" &&
27
+ record["id"] !== "" &&
28
+ record["apiVersion"] === API_VERSION &&
29
+ typeof record["segment"] === "function" &&
30
+ typeof record["detect"] === "function" &&
31
+ isCapabilities(record["capabilities"])
32
+ );
33
+ };
34
+
35
+ /**
36
+ * 形が違うときに、どこが違うのかを返す。満たしていれば undefined。
37
+ * 「読めません」だけでは、アダプタを書いた人が直せない。
38
+ */
39
+ export const checkAdapter = (value: unknown): string | undefined => {
40
+ if (isAdapter(value)) return undefined;
41
+ if (typeof value !== "object" || value === null) return "object ではありません";
42
+ const record: Record<string, unknown> = { ...value };
43
+ if (record["apiVersion"] !== API_VERSION) return `apiVersion が ${String(record["apiVersion"])} です(core は ${String(API_VERSION)})`;
44
+ if (!isCapabilities(record["capabilities"])) return "capabilities の形が違います";
45
+ return "kind / id / segment / detect のどれかがありません";
9
46
  };
10
47
 
11
48
  const pickExport = (module: object): unknown => {
@@ -26,6 +63,7 @@ export const loadAdapter = async (language: string): Promise<LanguageAdapter> =>
26
63
  const module: unknown = await import(specifier);
27
64
  if (typeof module !== "object" || module === null) throw new Error(`${specifier} did not export a module`);
28
65
  const candidate = pickExport(module);
29
- if (!isAdapter(candidate)) throw new Error(`${specifier} does not export a LanguageAdapter`);
66
+ const broken = checkAdapter(candidate);
67
+ if (broken !== undefined || !isAdapter(candidate)) throw new Error(`${specifier} が LanguageAdapter を export していません: ${broken ?? ""}`);
30
68
  return candidate;
31
69
  };
@@ -5,7 +5,7 @@ import Anthropic from "@anthropic-ai/sdk";
5
5
  import { toFailure } from "./types.ts";
6
6
  import type { Failure, Judge, Prompt } from "./types.ts";
7
7
 
8
- export type AnthropicResponse = { readonly content: readonly { readonly type: string; readonly text?: string | undefined }[] };
8
+ type AnthropicResponse = { readonly content: readonly { readonly type: string; readonly text?: string | undefined }[] };
9
9
 
10
10
  /** judge が使うのは messages.create だけ。最小の面だけを要求する。テストで差し替えられる。 */
11
11
  export type AnthropicClient = { readonly messages: { readonly create: (params: Anthropic.MessageCreateParamsNonStreaming) => Promise<AnthropicResponse> } };
@@ -26,7 +26,7 @@ export const DEFAULT_MODEL = "claude-opus-5";
26
26
  */
27
27
  const ENV_KEYS = ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_IDENTITY_TOKEN", "ANTHROPIC_IDENTITY_TOKEN_FILE"];
28
28
 
29
- export const configDir = (): string => process.env["ANTHROPIC_CONFIG_DIR"] ?? join(homedir(), ".config", "anthropic");
29
+ const configDir = (): string => process.env["ANTHROPIC_CONFIG_DIR"] ?? join(homedir(), ".config", "anthropic");
30
30
 
31
31
  export const hasCredentials = (profileDir: string = configDir()): boolean =>
32
32
  ENV_KEYS.some((name) => (process.env[name] ?? "").length > 0) || existsSync(profileDir);
@@ -2,7 +2,7 @@ import OpenAI from "openai";
2
2
  import { toFailure } from "./types.ts";
3
3
  import type { Failure, Judge, Prompt } from "./types.ts";
4
4
 
5
- export type OpenAIResponse = { readonly choices: readonly { readonly message: { readonly content: string | null } }[] };
5
+ type OpenAIResponse = { readonly choices: readonly { readonly message: { readonly content: string | null } }[] };
6
6
 
7
7
  /** judge が使うのは chat.completions.create だけ。最小の面だけを要求する。 */
8
8
  export type OpenAIClient = {
@@ -12,7 +12,7 @@ export type Judge = (prompt: Prompt) => Promise<string>;
12
12
 
13
13
  export type BackendName = "anthropic" | "openai";
14
14
 
15
- export const BACKENDS: readonly BackendName[] = ["anthropic", "openai"];
15
+ const BACKENDS: readonly BackendName[] = ["anthropic", "openai"];
16
16
 
17
17
  export const isBackend = (value: unknown): value is BackendName => BACKENDS.some((name) => name === value);
18
18