create-np-skills 1.0.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 (137) hide show
  1. package/assets/skills/np-archive/SKILL.md +164 -0
  2. package/assets/skills/np-correct/SKILL.md +381 -0
  3. package/assets/skills/np-extract/SKILL.md +262 -0
  4. package/assets/skills/np-polish/SKILL.md +116 -0
  5. package/assets/skills/np-process/SKILL.md +140 -0
  6. package/assets/skills/np-synthesize/SKILL.md +152 -0
  7. package/assets/toolkit/dist/__tests__/disambiguate.test.d.ts +1 -0
  8. package/assets/toolkit/dist/__tests__/disambiguate.test.js +44 -0
  9. package/assets/toolkit/dist/__tests__/disambiguate.test.js.map +1 -0
  10. package/assets/toolkit/dist/__tests__/graph-validate.test.d.ts +1 -0
  11. package/assets/toolkit/dist/__tests__/graph-validate.test.js +99 -0
  12. package/assets/toolkit/dist/__tests__/graph-validate.test.js.map +1 -0
  13. package/assets/toolkit/dist/__tests__/hmm-smooth.test.d.ts +1 -0
  14. package/assets/toolkit/dist/__tests__/hmm-smooth.test.js +54 -0
  15. package/assets/toolkit/dist/__tests__/hmm-smooth.test.js.map +1 -0
  16. package/assets/toolkit/dist/src/disambiguate.d.ts +19 -0
  17. package/assets/toolkit/dist/src/disambiguate.js +187 -0
  18. package/assets/toolkit/dist/src/disambiguate.js.map +1 -0
  19. package/assets/toolkit/dist/src/graph-validate.d.ts +70 -0
  20. package/assets/toolkit/dist/src/graph-validate.js +217 -0
  21. package/assets/toolkit/dist/src/graph-validate.js.map +1 -0
  22. package/assets/toolkit/dist/src/hmm-smooth.d.ts +41 -0
  23. package/assets/toolkit/dist/src/hmm-smooth.js +173 -0
  24. package/assets/toolkit/dist/src/hmm-smooth.js.map +1 -0
  25. package/assets/toolkit/dist/src/tokenizer.d.ts +19 -0
  26. package/assets/toolkit/dist/src/tokenizer.js +70 -0
  27. package/assets/toolkit/dist/src/tokenizer.js.map +1 -0
  28. package/assets/toolkit/package.json +21 -0
  29. package/dist/bin/cli.d.ts +2 -0
  30. package/dist/bin/cli.js +7 -0
  31. package/dist/bin/cli.js.map +1 -0
  32. package/dist/src/commands/add.d.ts +3 -0
  33. package/dist/src/commands/add.js +52 -0
  34. package/dist/src/commands/add.js.map +1 -0
  35. package/dist/src/commands/init.d.ts +4 -0
  36. package/dist/src/commands/init.js +85 -0
  37. package/dist/src/commands/init.js.map +1 -0
  38. package/dist/src/commands/list.d.ts +3 -0
  39. package/dist/src/commands/list.js +26 -0
  40. package/dist/src/commands/list.js.map +1 -0
  41. package/dist/src/commands/remove.d.ts +4 -0
  42. package/dist/src/commands/remove.js +35 -0
  43. package/dist/src/commands/remove.js.map +1 -0
  44. package/dist/src/commands/status.d.ts +3 -0
  45. package/dist/src/commands/status.js +30 -0
  46. package/dist/src/commands/status.js.map +1 -0
  47. package/dist/src/index.d.ts +1 -0
  48. package/dist/src/index.js +52 -0
  49. package/dist/src/index.js.map +1 -0
  50. package/dist/src/installer/config.d.ts +9 -0
  51. package/dist/src/installer/config.js +44 -0
  52. package/dist/src/installer/config.js.map +1 -0
  53. package/dist/src/installer/skills.d.ts +9 -0
  54. package/dist/src/installer/skills.js +74 -0
  55. package/dist/src/installer/skills.js.map +1 -0
  56. package/dist/src/installer/toolkit.d.ts +4 -0
  57. package/dist/src/installer/toolkit.js +35 -0
  58. package/dist/src/installer/toolkit.js.map +1 -0
  59. package/dist/src/platforms/aider.d.ts +2 -0
  60. package/dist/src/platforms/aider.js +22 -0
  61. package/dist/src/platforms/aider.js.map +1 -0
  62. package/dist/src/platforms/all-platforms.d.ts +4 -0
  63. package/dist/src/platforms/all-platforms.js +28 -0
  64. package/dist/src/platforms/all-platforms.js.map +1 -0
  65. package/dist/src/platforms/amazon-q.d.ts +1 -0
  66. package/dist/src/platforms/amazon-q.js +3 -0
  67. package/dist/src/platforms/amazon-q.js.map +1 -0
  68. package/dist/src/platforms/antigravity.d.ts +1 -0
  69. package/dist/src/platforms/antigravity.js +3 -0
  70. package/dist/src/platforms/antigravity.js.map +1 -0
  71. package/dist/src/platforms/claude-code.d.ts +1 -0
  72. package/dist/src/platforms/claude-code.js +3 -0
  73. package/dist/src/platforms/claude-code.js.map +1 -0
  74. package/dist/src/platforms/cline.d.ts +1 -0
  75. package/dist/src/platforms/cline.js +15 -0
  76. package/dist/src/platforms/cline.js.map +1 -0
  77. package/dist/src/platforms/codex.d.ts +1 -0
  78. package/dist/src/platforms/codex.js +3 -0
  79. package/dist/src/platforms/codex.js.map +1 -0
  80. package/dist/src/platforms/copilot-cli.d.ts +1 -0
  81. package/dist/src/platforms/copilot-cli.js +3 -0
  82. package/dist/src/platforms/copilot-cli.js.map +1 -0
  83. package/dist/src/platforms/cursor.d.ts +2 -0
  84. package/dist/src/platforms/cursor.js +19 -0
  85. package/dist/src/platforms/cursor.js.map +1 -0
  86. package/dist/src/platforms/gemini-cli.d.ts +1 -0
  87. package/dist/src/platforms/gemini-cli.js +3 -0
  88. package/dist/src/platforms/gemini-cli.js.map +1 -0
  89. package/dist/src/platforms/hermes.d.ts +1 -0
  90. package/dist/src/platforms/hermes.js +3 -0
  91. package/dist/src/platforms/hermes.js.map +1 -0
  92. package/dist/src/platforms/opencode.d.ts +1 -0
  93. package/dist/src/platforms/opencode.js +3 -0
  94. package/dist/src/platforms/opencode.js.map +1 -0
  95. package/dist/src/platforms/reasonix.d.ts +1 -0
  96. package/dist/src/platforms/reasonix.js +3 -0
  97. package/dist/src/platforms/reasonix.js.map +1 -0
  98. package/dist/src/platforms/registry.d.ts +3 -0
  99. package/dist/src/platforms/registry.js +44 -0
  100. package/dist/src/platforms/registry.js.map +1 -0
  101. package/dist/src/platforms/windsurf.d.ts +2 -0
  102. package/dist/src/platforms/windsurf.js +19 -0
  103. package/dist/src/platforms/windsurf.js.map +1 -0
  104. package/dist/src/types.d.ts +34 -0
  105. package/dist/src/types.js +13 -0
  106. package/dist/src/types.js.map +1 -0
  107. package/dist/src/utils/fs.d.ts +8 -0
  108. package/dist/src/utils/fs.js +37 -0
  109. package/dist/src/utils/fs.js.map +1 -0
  110. package/dist/src/utils/logger.d.ts +11 -0
  111. package/dist/src/utils/logger.js +22 -0
  112. package/dist/src/utils/logger.js.map +1 -0
  113. package/dist/src/utils/shell.d.ts +6 -0
  114. package/dist/src/utils/shell.js +34 -0
  115. package/dist/src/utils/shell.js.map +1 -0
  116. package/dist/src/verify.d.ts +12 -0
  117. package/dist/src/verify.js +56 -0
  118. package/dist/src/verify.js.map +1 -0
  119. package/dist/src/wizard/confirm.d.ts +5 -0
  120. package/dist/src/wizard/confirm.js +23 -0
  121. package/dist/src/wizard/confirm.js.map +1 -0
  122. package/dist/src/wizard/detect.d.ts +8 -0
  123. package/dist/src/wizard/detect.js +31 -0
  124. package/dist/src/wizard/detect.js.map +1 -0
  125. package/dist/src/wizard/select-location.d.ts +1 -0
  126. package/dist/src/wizard/select-location.js +20 -0
  127. package/dist/src/wizard/select-location.js.map +1 -0
  128. package/dist/src/wizard/select-platforms.d.ts +1 -0
  129. package/dist/src/wizard/select-platforms.js +26 -0
  130. package/dist/src/wizard/select-platforms.js.map +1 -0
  131. package/dist/src/wizard/select-skills.d.ts +1 -0
  132. package/dist/src/wizard/select-skills.js +22 -0
  133. package/dist/src/wizard/select-skills.js.map +1 -0
  134. package/dist/src/wizard/welcome.d.ts +1 -0
  135. package/dist/src/wizard/welcome.js +6 -0
  136. package/dist/src/wizard/welcome.js.map +1 -0
  137. package/package.json +35 -0
@@ -0,0 +1,44 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { disambiguate } from '../src/disambiguate';
3
+ describe('disambiguate', () => {
4
+ it('should flag potential homophone errors', () => {
5
+ const input = [
6
+ '他打了一个结实的结。',
7
+ '把平遥你底层操作系统装上了。',
8
+ ].join('\n');
9
+ const result = disambiguate(input);
10
+ expect(result.flags).toBeInstanceOf(Array);
11
+ expect(result.flags.length).toBeGreaterThan(0);
12
+ });
13
+ it('should include line number and context for each flag', () => {
14
+ const input = '他今年已经八十八了,身体还很结实。';
15
+ const result = disambiguate(input);
16
+ for (const flag of result.flags) {
17
+ expect(flag).toHaveProperty('line');
18
+ expect(flag).toHaveProperty('original');
19
+ expect(flag).toHaveProperty('reason');
20
+ expect(flag).toHaveProperty('context');
21
+ }
22
+ });
23
+ it('should detect word boundary ambiguities', () => {
24
+ const input = '他说的好不如做的好。';
25
+ const result = disambiguate(input);
26
+ const boundaryFlags = result.flags.filter(f => f.type === 'boundary');
27
+ expect(boundaryFlags.length).toBeGreaterThan(0);
28
+ });
29
+ it('should detect repeated words with different meanings', () => {
30
+ const input = '过程的本质不在过程里,在过程之外。';
31
+ const result = disambiguate(input);
32
+ const semanticFlags = result.flags.filter(f => f.type === 'polysemy');
33
+ expect(semanticFlags.length).toBeGreaterThan(0);
34
+ });
35
+ it('should return empty flags for clean input', () => {
36
+ const input = '今天天气很好,我们一起去公园散步。';
37
+ const result = disambiguate(input);
38
+ // Clean, unambiguous text may still have minor flags
39
+ // but should not have critical ones
40
+ const criticalFlags = result.flags.filter(f => f.confidence === 'high');
41
+ expect(criticalFlags.length).toBe(0);
42
+ });
43
+ });
44
+ //# sourceMappingURL=disambiguate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguate.test.js","sourceRoot":"","sources":["../../__tests__/disambiguate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG;YACZ,YAAY;YACZ,gBAAgB;SACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,qDAAqD;QACrD,oCAAoC;QACpC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;QACxE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateOntology } from '../src/graph-validate';
3
+ const sampleGraph = {
4
+ nodes: [
5
+ { id: '抽象过程', type: 'concept' },
6
+ { id: 'SS模型', type: 'concept' },
7
+ { id: '刻意训练', type: 'method' },
8
+ ],
9
+ edges: [
10
+ { from: '抽象过程', to: 'SS模型', relation: 'is-implemented-by' },
11
+ { from: '刻意训练', to: '抽象过程', relation: 'depends-on' },
12
+ ],
13
+ };
14
+ const sampleDict = {
15
+ concepts: [
16
+ { name: '抽象过程', definition: '从现象中提取结构的过程' },
17
+ { name: 'SS模型', definition: 'Structure + Sequence 双重含义' },
18
+ { name: '刻意训练', definition: '有目标、有反馈的重复练习' },
19
+ ],
20
+ };
21
+ const sampleFramework = {
22
+ relations: [
23
+ { from: '抽象过程', to: 'SS模型', type: 'is-implemented-by' },
24
+ { from: '刻意训练', to: '抽象过程', type: 'depends-on' },
25
+ { from: '刻意训练', to: '神经可塑性', type: 'triggers' },
26
+ ],
27
+ };
28
+ describe('validateOntology', () => {
29
+ it('should detect missing nodes (completeness)', () => {
30
+ const result = validateOntology(sampleGraph, sampleDict, sampleFramework);
31
+ const missingNodeGap = result.gaps.find(g => g.dimension === 'completeness' && g.detail.includes('神经可塑性'));
32
+ expect(missingNodeGap).toBeDefined();
33
+ });
34
+ it('should pass when graph is complete', () => {
35
+ const completeGraph = {
36
+ nodes: [
37
+ { id: '抽象过程', type: 'concept' },
38
+ { id: 'SS模型', type: 'concept' },
39
+ { id: '刻意训练', type: 'method' },
40
+ { id: '神经可塑性', type: 'concept' },
41
+ ],
42
+ edges: [
43
+ { from: '抽象过程', to: 'SS模型', relation: 'is-implemented-by' },
44
+ { from: '刻意训练', to: '抽象过程', relation: 'depends-on' },
45
+ { from: '刻意训练', to: '神经可塑性', relation: 'triggers' },
46
+ ],
47
+ };
48
+ const completeDict = {
49
+ concepts: [
50
+ { name: '抽象过程', definition: '从现象中提取结构的过程' },
51
+ { name: 'SS模型', definition: 'Structure + Sequence 双重含义' },
52
+ { name: '刻意训练', definition: '有目标、有反馈的重复练习' },
53
+ { name: '神经可塑性', definition: '大脑通过经验改变结构的能力' },
54
+ ],
55
+ };
56
+ const result = validateOntology(completeGraph, completeDict, sampleFramework);
57
+ expect(result.score).toBe(1);
58
+ });
59
+ it('should detect contradictory edges (consistency)', () => {
60
+ const graphWithContradiction = {
61
+ nodes: [
62
+ { id: 'A', type: 'concept' },
63
+ { id: 'B', type: 'concept' },
64
+ ],
65
+ edges: [
66
+ { from: 'A', to: 'B', relation: 'is-a' },
67
+ { from: 'B', to: 'A', relation: 'is-a' },
68
+ ],
69
+ };
70
+ const dict = { concepts: [{ name: 'A', definition: '...' }, { name: 'B', definition: '...' }] };
71
+ const framework = { relations: [] };
72
+ const result = validateOntology(graphWithContradiction, dict, framework);
73
+ const contradictionGap = result.gaps.find(g => g.dimension === 'consistency');
74
+ expect(contradictionGap).toBeDefined();
75
+ });
76
+ it('should detect nodes without source trace (traceability)', () => {
77
+ const graphWithOrphan = {
78
+ nodes: [
79
+ { id: '抽象过程', type: 'concept' },
80
+ { id: '凭空概念', type: 'concept' },
81
+ ],
82
+ edges: [],
83
+ };
84
+ const result = validateOntology(graphWithOrphan, sampleDict, sampleFramework);
85
+ const traceGap = result.gaps.find(g => g.dimension === 'traceability' && g.detail.includes('凭空概念'));
86
+ expect(traceGap).toBeDefined();
87
+ });
88
+ it('should compute a composite score with all 5 dimensions', () => {
89
+ const result = validateOntology(sampleGraph, sampleDict, sampleFramework);
90
+ expect(result.score).toBeGreaterThan(0);
91
+ expect(result.score).toBeLessThanOrEqual(1);
92
+ expect(result.dimensions).toHaveProperty('completeness');
93
+ expect(result.dimensions).toHaveProperty('consistency');
94
+ expect(result.dimensions).toHaveProperty('correctness');
95
+ expect(result.dimensions).toHaveProperty('clarity');
96
+ expect(result.dimensions).toHaveProperty('traceability');
97
+ });
98
+ });
99
+ //# sourceMappingURL=graph-validate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-validate.test.js","sourceRoot":"","sources":["../../__tests__/graph-validate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { analyzeCoherence, analyzeNgram, analyzeWordFrequency } from '../src/hmm-smooth';
3
+ describe('analyzeCoherence', () => {
4
+ it('should score highly coherent text higher than fragmented text', () => {
5
+ // Coherent sentences share tokens like "他", "了", "。"
6
+ const coherent = ['他慢慢走进了房间。', '他轻轻关上了门。'];
7
+ // Fragmented sentences only share punctuation
8
+ const fragmented = ['今天。天气。很好。', '我们。一起。去。公园。'];
9
+ const score1 = analyzeCoherence(coherent);
10
+ const score2 = analyzeCoherence(fragmented);
11
+ expect(score1.average).toBeGreaterThan(score2.average);
12
+ });
13
+ it('should handle empty input', () => {
14
+ const result = analyzeCoherence([]);
15
+ expect(result.average).toBe(0);
16
+ expect(result.scores).toEqual([]);
17
+ });
18
+ });
19
+ describe('analyzeNgram', () => {
20
+ it('should detect repeated n-grams', () => {
21
+ // With jieba: "学习。" → ["学习", "。"] — last token "。"
22
+ // Next sentence: "学习很重要" → ["学习", "很", "重要"]
23
+ // Transition: "。|学习" appears in both pairs
24
+ const sentences = ['他喜欢学习。', '学习很重要。', '她也爱学习。', '学习很快乐。'];
25
+ const result = analyzeNgram(sentences, 1);
26
+ expect(result.transitions).toBeInstanceOf(Array);
27
+ // When n=1, last token of odd sentences = "。", first of even = "学习"
28
+ // So transition "。|学习" repeats
29
+ expect(result.repeatedNgrams.length).toBeGreaterThan(0);
30
+ });
31
+ it('should flag low transition diversity', () => {
32
+ // 4 sentences where n=2 transitions are all the same
33
+ const sentences = ['他说这是对的。', '他说那是错的。', '他说这是对的。', '他说那是错的。'];
34
+ const result = analyzeNgram(sentences, 2);
35
+ expect(result.diversityScore).toBeLessThan(0.5);
36
+ });
37
+ });
38
+ describe('analyzeWordFrequency', () => {
39
+ it('should flag overused words', () => {
40
+ const text = '这个东西很好。这个东西很大。这个东西很贵。';
41
+ const result = analyzeWordFrequency(text);
42
+ expect(result.overused.length).toBeGreaterThan(0);
43
+ const wordItem = result.overused.find(w => w.word === '这个');
44
+ expect(wordItem).toBeDefined();
45
+ });
46
+ it('should report sentence length distribution', () => {
47
+ const text = '短句。这是一个中等长度的句子需要更多词。又短。这是一个非常长的句子,里面有很多丰富的内容需要详细表达,包括各种错综复杂的修饰语和各种详细说明文字。';
48
+ const result = analyzeWordFrequency(text);
49
+ expect(result.distribution.short).toBeGreaterThan(0);
50
+ expect(result.distribution.medium).toBeGreaterThan(0);
51
+ expect(result.distribution.long).toBeGreaterThan(0);
52
+ });
53
+ });
54
+ //# sourceMappingURL=hmm-smooth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmm-smooth.test.js","sourceRoot":"","sources":["../../__tests__/hmm-smooth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Multi-language ambiguity detection for note-processing pipeline. */
2
+ import { type Language } from './tokenizer.js';
3
+ export interface AmbiguityFlag {
4
+ line: number;
5
+ original: string;
6
+ reason: string;
7
+ context: string;
8
+ type: 'homophone' | 'boundary' | 'polysemy' | 'coreference';
9
+ confidence: 'high' | 'medium' | 'low';
10
+ }
11
+ export interface DisambiguateResult {
12
+ flags: AmbiguityFlag[];
13
+ stats: {
14
+ totalLines: number;
15
+ totalTokens: number;
16
+ flaggedLines: number;
17
+ };
18
+ }
19
+ export declare function disambiguate(text: string, language?: Language | null): DisambiguateResult;
@@ -0,0 +1,187 @@
1
+ /** Multi-language ambiguity detection for note-processing pipeline. */
2
+ import { getTokenizer, detectLanguage } from './tokenizer.js';
3
+ // ── Chinese Ambiguity Patterns ──
4
+ const CN_HOMOPHONE_PATTERNS = [
5
+ { pattern: /平[台摇遥姚]/g, description: '可能应为"平台"' },
6
+ { pattern: /[的在得]地/g, description: '"的地得"混淆' },
7
+ { pattern: /[它他她]/g, description: '代词指代需确认' },
8
+ { pattern: /[做作]/g, description: '"做/作"混淆' },
9
+ ];
10
+ const CN_POLYSEMOUS_WORDS = new Set([
11
+ '过程', '本质', '抽象', '压缩', '展开',
12
+ '环境', '结构', '模型', '系统', '关系',
13
+ '结果', '方向', '方法', '特点', '作用',
14
+ ]);
15
+ // ── English Ambiguity Patterns ──
16
+ const EN_HOMOPHONE_MAP = new Map([
17
+ ['there', 'their/they\'re'],
18
+ ['their', 'there/they\'re'],
19
+ ['theyre', 'their/there'],
20
+ ['its', 'it\'s'],
21
+ ['your', 'you\'re'],
22
+ ['youre', 'your'],
23
+ ['affect', 'effect'],
24
+ ['effect', 'affect'],
25
+ ['lead', 'led/lead (metal)'],
26
+ ['then', 'than'],
27
+ ['than', 'then'],
28
+ ['accept', 'except'],
29
+ ['except', 'accept'],
30
+ ['lose', 'loose'],
31
+ ['loose', 'lose'],
32
+ ]);
33
+ const EN_POLYSEMOUS_WORDS = new Set([
34
+ 'set', 'run', 'stand', 'break', 'light', 'point', 'way',
35
+ 'line', 'time', 'state', 'right', 'left', 'back', 'head',
36
+ 'field', 'model', 'system', 'process', 'function', 'class',
37
+ ]);
38
+ const CONTEXT_WINDOW = 5;
39
+ // ── Main Entry ──
40
+ export function disambiguate(text, language) {
41
+ const lang = language ?? (text.length > 0 ? undefined : 'en');
42
+ const rawLines = text.split('\n');
43
+ const lines = rawLines.map((l, idx) => ({ text: l, num: idx + 1 })).filter(l => l.text.trim());
44
+ const detectedLang = language ?? detectLanguageFromLines(lines);
45
+ const tokenizer = getTokenizer(detectedLang);
46
+ const flags = [];
47
+ let totalTokens = 0;
48
+ runChecks(lines, tokenizer, flags, { totalTokens }, detectedLang);
49
+ return {
50
+ flags,
51
+ stats: {
52
+ totalLines: lines.length,
53
+ totalTokens,
54
+ flaggedLines: new Set(flags.map(f => f.line)).size,
55
+ },
56
+ };
57
+ }
58
+ function detectLanguageFromLines(lines) {
59
+ if (lines.length === 0)
60
+ return 'en';
61
+ return detectLanguage(lines.map(l => l.text).join('\n'));
62
+ }
63
+ function runChecks(lines, tokenizer, flags, acc, language) {
64
+ const lang = language ?? 'en';
65
+ const wordCounts = new Map();
66
+ for (const line of lines) {
67
+ const lineNum = line.num;
68
+ // Tokenize
69
+ const tokens = tokenizer.tokenize(line.text);
70
+ acc.totalTokens += tokens.length;
71
+ if (lang === 'zh') {
72
+ checkHomophoneRegex(line, flags, lineNum);
73
+ checkBoundary(tokens, line, flags, lineNum);
74
+ collectPolysemy(tokens, wordCounts, lineNum, CN_POLYSEMOUS_WORDS);
75
+ }
76
+ else {
77
+ checkEnglishHomophones(tokens, line, flags, lineNum);
78
+ checkPunctuationBoundary(line, flags, lineNum);
79
+ collectPolysemy(tokens, wordCounts, lineNum, EN_POLYSEMOUS_WORDS);
80
+ }
81
+ }
82
+ // Generate cross-line polysemy flags
83
+ for (const [word, occurrences] of wordCounts) {
84
+ if (occurrences.length > 1) {
85
+ flags.push({
86
+ line: occurrences[0],
87
+ original: word,
88
+ reason: lang === 'zh'
89
+ ? `多义词"${word}"在本文中出现 ${occurrences.length} 次,含义是否一致?`
90
+ : `Polysemous word "${word}" appears ${occurrences.length} times — meanings consistent?`,
91
+ context: lang === 'zh' ? `行 ${occurrences.join(', ')}` : `lines ${occurrences.join(', ')}`,
92
+ type: 'polysemy',
93
+ confidence: 'low',
94
+ });
95
+ }
96
+ }
97
+ }
98
+ // ── Chinese Checks ──
99
+ function checkHomophoneRegex(line, flags, lineNum) {
100
+ for (const { pattern, description } of CN_HOMOPHONE_PATTERNS) {
101
+ pattern.lastIndex = 0;
102
+ let match;
103
+ while ((match = pattern.exec(line.text)) !== null) {
104
+ const start = Math.max(0, match.index - CONTEXT_WINDOW);
105
+ const end = Math.min(line.text.length, match.index + match[0].length + CONTEXT_WINDOW);
106
+ flags.push({
107
+ line: lineNum,
108
+ original: match[0],
109
+ reason: description,
110
+ context: (start > 0 ? '…' : '') + line.text.slice(start, end) + (end < line.text.length ? '…' : ''),
111
+ type: 'homophone',
112
+ confidence: 'medium',
113
+ });
114
+ }
115
+ }
116
+ }
117
+ function checkBoundary(tokens, line, flags, lineNum) {
118
+ const shortSeq = [];
119
+ for (const token of tokens) {
120
+ if (token.length === 1 && /[一-鿿]/.test(token)) {
121
+ shortSeq.push(token);
122
+ }
123
+ else {
124
+ if (shortSeq.length >= 3) {
125
+ flags.push({
126
+ line: lineNum,
127
+ original: shortSeq.join(''),
128
+ reason: `连续 ${shortSeq.length} 个单字词,可能存在分词边界问题`,
129
+ context: line.text.slice(0, 80),
130
+ type: 'boundary',
131
+ confidence: 'medium',
132
+ });
133
+ }
134
+ shortSeq.length = 0;
135
+ }
136
+ }
137
+ if (shortSeq.length >= 3) {
138
+ flags.push({
139
+ line: lineNum,
140
+ original: shortSeq.join(''),
141
+ reason: `连续 ${shortSeq.length} 个单字词,可能存在分词边界问题`,
142
+ context: line.text.slice(0, 80),
143
+ type: 'boundary',
144
+ confidence: 'medium',
145
+ });
146
+ }
147
+ }
148
+ // ── English Checks ──
149
+ function checkEnglishHomophones(tokens, line, flags, lineNum) {
150
+ for (const token of tokens) {
151
+ const lower = token.toLowerCase().replace(/[^a-z]/g, '');
152
+ if (EN_HOMOPHONE_MAP.has(lower)) {
153
+ flags.push({
154
+ line: lineNum,
155
+ original: token,
156
+ reason: `Potential homophone: "${token}" — did you mean ${EN_HOMOPHONE_MAP.get(lower)}?`,
157
+ context: line.text.slice(0, 120),
158
+ type: 'homophone',
159
+ confidence: 'medium',
160
+ });
161
+ }
162
+ }
163
+ }
164
+ function checkPunctuationBoundary(line, flags, lineNum) {
165
+ // Flag multiple punctuation marks
166
+ if (/[!?]{2,}/.test(line.text) || /\.{3,}/.test(line.text)) {
167
+ flags.push({
168
+ line: lineNum,
169
+ original: line.text.match(/[!?.]{2,}/)?.[0] ?? '',
170
+ reason: 'Unusual punctuation repetition — consider normalizing',
171
+ context: line.text.slice(0, 120),
172
+ type: 'boundary',
173
+ confidence: 'low',
174
+ });
175
+ }
176
+ }
177
+ // ── Shared ──
178
+ function collectPolysemy(tokens, wordCounts, lineNum, wordSet) {
179
+ for (const token of tokens) {
180
+ if (wordSet.has(token)) {
181
+ if (!wordCounts.has(token))
182
+ wordCounts.set(token, []);
183
+ wordCounts.get(token).push(lineNum);
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=disambiguate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguate.js","sourceRoot":"","sources":["../../src/disambiguate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * graph-validate.ts
3
+ *
4
+ * Ontology validation tool — validates a knowledge graph against 5 ontology
5
+ * dimensions: completeness, consistency, correctness, clarity, traceability.
6
+ *
7
+ * This is a pure TypeScript tool with NO external dependencies.
8
+ * It handles quantifiable checks only; semantic judgment is left to
9
+ * downstream LLM-based validators (P4-C).
10
+ *
11
+ * Scoring: each dimension 0–1, composite = average of 5 dimensions.
12
+ */
13
+ export interface GraphNode {
14
+ id: string;
15
+ type: string;
16
+ }
17
+ export interface GraphEdge {
18
+ from: string;
19
+ to: string;
20
+ relation: string;
21
+ }
22
+ export interface Graph {
23
+ nodes: GraphNode[];
24
+ edges: GraphEdge[];
25
+ }
26
+ export interface ConceptEntry {
27
+ name: string;
28
+ definition: string;
29
+ }
30
+ export interface ConceptDictionary {
31
+ concepts: ConceptEntry[];
32
+ }
33
+ export interface FrameworkRelation {
34
+ from: string;
35
+ to: string;
36
+ type: string;
37
+ }
38
+ export interface Framework {
39
+ relations: FrameworkRelation[];
40
+ }
41
+ export interface OntologyGap {
42
+ dimension: 'completeness' | 'consistency' | 'correctness' | 'clarity' | 'traceability';
43
+ severity: 'critical' | 'warning' | 'info';
44
+ detail: string;
45
+ autoFixable: boolean;
46
+ fixDescription?: string;
47
+ }
48
+ export interface DimensionScores {
49
+ completeness: number;
50
+ consistency: number;
51
+ correctness: number;
52
+ clarity: number;
53
+ traceability: number;
54
+ }
55
+ export interface ValidateResult {
56
+ score: number;
57
+ dimensions: DimensionScores;
58
+ gaps: OntologyGap[];
59
+ summary: string;
60
+ }
61
+ /**
62
+ * Validate a knowledge graph against a concept dictionary and a reference
63
+ * framework.
64
+ *
65
+ * @param graph The knowledge graph to validate.
66
+ * @param conceptDict The canonical concept dictionary.
67
+ * @param framework The reference framework (expected relations).
68
+ * @returns A `ValidateResult` with composite score, dimension scores, gaps, and summary.
69
+ */
70
+ export declare function validateOntology(graph: Graph, conceptDict: ConceptDictionary, framework: Framework): ValidateResult;