oh-my-claudecode 0.2.4 → 0.2.7

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 (89) hide show
  1. package/README.md +103 -4
  2. package/commands/necronomicon-bind.md +45 -82
  3. package/dist/agents/builtin-agents.d.ts.map +1 -1
  4. package/dist/agents/builtin-agents.js +8 -0
  5. package/dist/agents/builtin-agents.js.map +1 -1
  6. package/dist/agents/cthulhu.d.ts.map +1 -1
  7. package/dist/agents/cthulhu.js +11 -0
  8. package/dist/agents/cthulhu.js.map +1 -1
  9. package/dist/agents/dagon.d.ts.map +1 -1
  10. package/dist/agents/dagon.js +13 -0
  11. package/dist/agents/dagon.js.map +1 -1
  12. package/dist/agents/nodens-advanced.d.ts +182 -0
  13. package/dist/agents/nodens-advanced.d.ts.map +1 -0
  14. package/dist/agents/nodens-advanced.js +297 -0
  15. package/dist/agents/nodens-advanced.js.map +1 -0
  16. package/dist/agents/nodens.d.ts +42 -0
  17. package/dist/agents/nodens.d.ts.map +1 -0
  18. package/dist/agents/nodens.js +147 -0
  19. package/dist/agents/nodens.js.map +1 -0
  20. package/dist/agents/shoggoth.d.ts.map +1 -1
  21. package/dist/agents/shoggoth.js +11 -1
  22. package/dist/agents/shoggoth.js.map +1 -1
  23. package/dist/cli/bind.d.ts +24 -0
  24. package/dist/cli/bind.d.ts.map +1 -1
  25. package/dist/cli/bind.js +92 -25
  26. package/dist/cli/bind.js.map +1 -1
  27. package/dist/cli/doctor.d.ts.map +1 -1
  28. package/dist/cli/doctor.js +7 -5
  29. package/dist/cli/doctor.js.map +1 -1
  30. package/dist/cli/index.js +54 -4
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/version.d.ts +2 -0
  33. package/dist/cli/version.d.ts.map +1 -0
  34. package/dist/cli/version.js +28 -0
  35. package/dist/cli/version.js.map +1 -0
  36. package/dist/config/schema.d.ts +648 -17
  37. package/dist/config/schema.d.ts.map +1 -1
  38. package/dist/config/schema.js +21 -2
  39. package/dist/config/schema.js.map +1 -1
  40. package/dist/features/web-research-background/advanced-patterns.d.ts +44 -0
  41. package/dist/features/web-research-background/advanced-patterns.d.ts.map +1 -0
  42. package/dist/features/web-research-background/advanced-patterns.js +139 -0
  43. package/dist/features/web-research-background/advanced-patterns.js.map +1 -0
  44. package/dist/features/web-research-background/index.d.ts +73 -0
  45. package/dist/features/web-research-background/index.d.ts.map +1 -0
  46. package/dist/features/web-research-background/index.js +131 -0
  47. package/dist/features/web-research-background/index.js.map +1 -0
  48. package/dist/features/yith-archive/functions/opencode-import.d.ts.map +1 -1
  49. package/dist/features/yith-archive/functions/opencode-import.js +129 -90
  50. package/dist/features/yith-archive/functions/opencode-import.js.map +1 -1
  51. package/dist/features/yith-archive/index.d.ts +8 -0
  52. package/dist/features/yith-archive/index.d.ts.map +1 -1
  53. package/dist/features/yith-archive/index.js +1 -0
  54. package/dist/features/yith-archive/index.js.map +1 -1
  55. package/dist/features/yith-archive/types.d.ts +15 -0
  56. package/dist/features/yith-archive/types.d.ts.map +1 -1
  57. package/dist/hooks/design-detector-hook.d.ts +12 -0
  58. package/dist/hooks/design-detector-hook.d.ts.map +1 -0
  59. package/dist/hooks/design-detector-hook.js +42 -0
  60. package/dist/hooks/design-detector-hook.js.map +1 -0
  61. package/dist/hooks/design-detector.d.ts +47 -0
  62. package/dist/hooks/design-detector.d.ts.map +1 -0
  63. package/dist/hooks/design-detector.js +251 -0
  64. package/dist/hooks/design-detector.js.map +1 -0
  65. package/dist/hooks/index.d.ts +3 -0
  66. package/dist/hooks/index.d.ts.map +1 -1
  67. package/dist/hooks/index.js +27 -0
  68. package/dist/hooks/index.js.map +1 -1
  69. package/dist/hooks/web-research-detector.d.ts +58 -0
  70. package/dist/hooks/web-research-detector.d.ts.map +1 -0
  71. package/dist/hooks/web-research-detector.js +205 -0
  72. package/dist/hooks/web-research-detector.js.map +1 -0
  73. package/dist/hooks/web-research-hook.d.ts +12 -0
  74. package/dist/hooks/web-research-hook.d.ts.map +1 -0
  75. package/dist/hooks/web-research-hook.js +43 -0
  76. package/dist/hooks/web-research-hook.js.map +1 -0
  77. package/dist/hooks/yith-capture.d.ts +35 -0
  78. package/dist/hooks/yith-capture.d.ts.map +1 -0
  79. package/dist/hooks/yith-capture.js +113 -0
  80. package/dist/hooks/yith-capture.js.map +1 -0
  81. package/dist/linters/type-safety-ast.d.ts +108 -0
  82. package/dist/linters/type-safety-ast.d.ts.map +1 -0
  83. package/dist/linters/type-safety-ast.js +293 -0
  84. package/dist/linters/type-safety-ast.js.map +1 -0
  85. package/dist/linters/type-safety-linter.d.ts +66 -0
  86. package/dist/linters/type-safety-linter.d.ts.map +1 -0
  87. package/dist/linters/type-safety-linter.js +317 -0
  88. package/dist/linters/type-safety-linter.js.map +1 -0
  89. package/package.json +1 -1
@@ -0,0 +1,66 @@
1
+ /**
2
+ * TypeScript Type Safety Linter
3
+ *
4
+ * Enforces type safety rules via regex patterns.
5
+ * Core rules:
6
+ * 1. TS_ANY_TYPE - ban 'any' type (exception: @ts-safety:allow-any)
7
+ * 2. TS_UNSAFE_CAST - ban unsafe casts like 'as any', 'as unknown' (exception: @ts-safety:allow-cast)
8
+ * 3. TS_IGNORE_WITHOUT_REASON - @ts-ignore must have comment
9
+ * 4. MISSING_RETURN_TYPE - function must have return type (exception: arrow functions with implicit returns)
10
+ * 5. MISSING_PROMISE_TYPE - Promise must have type parameter (exception: Promise<void>)
11
+ */
12
+ /**
13
+ * Rule identifiers
14
+ */
15
+ export declare enum TypeSafetyRuleId {
16
+ TS_ANY_TYPE = "TS_ANY_TYPE",
17
+ TS_UNSAFE_CAST = "TS_UNSAFE_CAST",
18
+ TS_IGNORE_WITHOUT_REASON = "TS_IGNORE_WITHOUT_REASON",
19
+ MISSING_RETURN_TYPE = "MISSING_RETURN_TYPE",
20
+ MISSING_PROMISE_TYPE = "MISSING_PROMISE_TYPE"
21
+ }
22
+ /**
23
+ * Severity levels for linting issues
24
+ */
25
+ export declare enum TypeSafetySeverity {
26
+ ERROR = "error",
27
+ WARN = "warn",
28
+ INFO = "info"
29
+ }
30
+ /**
31
+ * A type safety issue found by the linter
32
+ */
33
+ export interface TypeSafetyIssue {
34
+ ruleId: TypeSafetyRuleId;
35
+ message: string;
36
+ line: number;
37
+ column: number;
38
+ severity: TypeSafetySeverity;
39
+ fix?: string;
40
+ }
41
+ /**
42
+ * Configuration for a type safety rule
43
+ */
44
+ export interface TypeSafetyRule {
45
+ id: TypeSafetyRuleId;
46
+ enabled: boolean;
47
+ severity: TypeSafetySeverity;
48
+ description: string;
49
+ }
50
+ /**
51
+ * Linter configuration
52
+ */
53
+ export interface TypeSafetyLinterConfig {
54
+ enabled: boolean;
55
+ rules?: Record<TypeSafetyRuleId, TypeSafetySeverity>;
56
+ ignore_patterns?: string[];
57
+ }
58
+ /**
59
+ * Lints a TypeScript file for type safety issues.
60
+ *
61
+ * @param filePath - Path to the TypeScript file
62
+ * @param config - Linter configuration
63
+ * @returns Array of issues found
64
+ */
65
+ export declare function lintFile(filePath: string, config?: TypeSafetyLinterConfig): TypeSafetyIssue[];
66
+ //# sourceMappingURL=type-safety-linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-safety-linter.d.ts","sourceRoot":"","sources":["../../src/linters/type-safety-linter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH;;GAEG;AACH,oBAAY,gBAAgB;IAC1B,WAAW,gBAAgB;IAC3B,cAAc,mBAAmB;IACjC,wBAAwB,6BAA6B;IACrD,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;CAC9C;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC5B,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,gBAAgB,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;IACpD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAsCD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB,GAAG,eAAe,EAAE,CAgD7F"}
@@ -0,0 +1,317 @@
1
+ /**
2
+ * TypeScript Type Safety Linter
3
+ *
4
+ * Enforces type safety rules via regex patterns.
5
+ * Core rules:
6
+ * 1. TS_ANY_TYPE - ban 'any' type (exception: @ts-safety:allow-any)
7
+ * 2. TS_UNSAFE_CAST - ban unsafe casts like 'as any', 'as unknown' (exception: @ts-safety:allow-cast)
8
+ * 3. TS_IGNORE_WITHOUT_REASON - @ts-ignore must have comment
9
+ * 4. MISSING_RETURN_TYPE - function must have return type (exception: arrow functions with implicit returns)
10
+ * 5. MISSING_PROMISE_TYPE - Promise must have type parameter (exception: Promise<void>)
11
+ */
12
+ import * as fs from "fs";
13
+ /**
14
+ * Rule identifiers
15
+ */
16
+ export var TypeSafetyRuleId;
17
+ (function (TypeSafetyRuleId) {
18
+ TypeSafetyRuleId["TS_ANY_TYPE"] = "TS_ANY_TYPE";
19
+ TypeSafetyRuleId["TS_UNSAFE_CAST"] = "TS_UNSAFE_CAST";
20
+ TypeSafetyRuleId["TS_IGNORE_WITHOUT_REASON"] = "TS_IGNORE_WITHOUT_REASON";
21
+ TypeSafetyRuleId["MISSING_RETURN_TYPE"] = "MISSING_RETURN_TYPE";
22
+ TypeSafetyRuleId["MISSING_PROMISE_TYPE"] = "MISSING_PROMISE_TYPE";
23
+ })(TypeSafetyRuleId || (TypeSafetyRuleId = {}));
24
+ /**
25
+ * Severity levels for linting issues
26
+ */
27
+ export var TypeSafetySeverity;
28
+ (function (TypeSafetySeverity) {
29
+ TypeSafetySeverity["ERROR"] = "error";
30
+ TypeSafetySeverity["WARN"] = "warn";
31
+ TypeSafetySeverity["INFO"] = "info";
32
+ })(TypeSafetySeverity || (TypeSafetySeverity = {}));
33
+ /**
34
+ * Core linting rules with patterns and detection logic
35
+ */
36
+ const DEFAULT_RULES = [
37
+ {
38
+ id: TypeSafetyRuleId.TS_ANY_TYPE,
39
+ enabled: true,
40
+ severity: TypeSafetySeverity.ERROR,
41
+ description: "Disallow 'any' type without @ts-safety:allow-any comment",
42
+ },
43
+ {
44
+ id: TypeSafetyRuleId.TS_UNSAFE_CAST,
45
+ enabled: true,
46
+ severity: TypeSafetySeverity.ERROR,
47
+ description: "Disallow unsafe casts (as any, as unknown, as Record<...>)",
48
+ },
49
+ {
50
+ id: TypeSafetyRuleId.TS_IGNORE_WITHOUT_REASON,
51
+ enabled: true,
52
+ severity: TypeSafetySeverity.WARN,
53
+ description: "@ts-ignore must have a reason comment",
54
+ },
55
+ {
56
+ id: TypeSafetyRuleId.MISSING_RETURN_TYPE,
57
+ enabled: true,
58
+ severity: TypeSafetySeverity.WARN,
59
+ description: "Function must have explicit return type",
60
+ },
61
+ {
62
+ id: TypeSafetyRuleId.MISSING_PROMISE_TYPE,
63
+ enabled: true,
64
+ severity: TypeSafetySeverity.WARN,
65
+ description: "Promise must have type parameter",
66
+ },
67
+ ];
68
+ /**
69
+ * Lints a TypeScript file for type safety issues.
70
+ *
71
+ * @param filePath - Path to the TypeScript file
72
+ * @param config - Linter configuration
73
+ * @returns Array of issues found
74
+ */
75
+ export function lintFile(filePath, config) {
76
+ if (!fs.existsSync(filePath)) {
77
+ return [];
78
+ }
79
+ const content = fs.readFileSync(filePath, "utf-8");
80
+ const lines = content.split("\n");
81
+ const issues = [];
82
+ const enabledRules = getEnabledRules(config);
83
+ // Check each line for issues
84
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
85
+ const line = lines[lineIndex];
86
+ const lineNumber = lineIndex + 1;
87
+ // Rule: TS_ANY_TYPE
88
+ if (enabledRules.has(TypeSafetyRuleId.TS_ANY_TYPE)) {
89
+ const anyIssues = checkAnyType(line, lineNumber, lines);
90
+ issues.push(...anyIssues);
91
+ }
92
+ // Rule: TS_UNSAFE_CAST
93
+ if (enabledRules.has(TypeSafetyRuleId.TS_UNSAFE_CAST)) {
94
+ const castIssues = checkUnsafeCast(line, lineNumber, lines);
95
+ issues.push(...castIssues);
96
+ }
97
+ // Rule: TS_IGNORE_WITHOUT_REASON
98
+ if (enabledRules.has(TypeSafetyRuleId.TS_IGNORE_WITHOUT_REASON)) {
99
+ const ignoreIssues = checkTsIgnore(line, lineNumber);
100
+ issues.push(...ignoreIssues);
101
+ }
102
+ // Rule: MISSING_RETURN_TYPE
103
+ if (enabledRules.has(TypeSafetyRuleId.MISSING_RETURN_TYPE)) {
104
+ const returnTypeIssues = checkMissingReturnType(line, lineNumber, lines, lineIndex);
105
+ issues.push(...returnTypeIssues);
106
+ }
107
+ // Rule: MISSING_PROMISE_TYPE
108
+ if (enabledRules.has(TypeSafetyRuleId.MISSING_PROMISE_TYPE)) {
109
+ const promiseIssues = checkPromiseType(line, lineNumber);
110
+ issues.push(...promiseIssues);
111
+ }
112
+ }
113
+ return issues;
114
+ }
115
+ /**
116
+ * Gets enabled rules from configuration
117
+ * If no config provided, defaults to all rules enabled
118
+ */
119
+ function getEnabledRules(config) {
120
+ const enabled = new Set();
121
+ // If explicitly disabled, return empty set
122
+ if (config && config.enabled === false) {
123
+ return enabled;
124
+ }
125
+ // Default to enabling all rules if:
126
+ // - No config provided, OR
127
+ // - Config is enabled (or not explicitly disabled)
128
+ if (!config || config.enabled === true || config.enabled === undefined) {
129
+ if (config?.rules) {
130
+ Object.entries(config.rules).forEach(([ruleId]) => {
131
+ enabled.add(ruleId);
132
+ });
133
+ }
134
+ else {
135
+ // Use defaults - enable all rules by default
136
+ DEFAULT_RULES.forEach(rule => {
137
+ enabled.add(rule.id);
138
+ });
139
+ }
140
+ }
141
+ return enabled;
142
+ }
143
+ /**
144
+ * Checks for 'any' type usage without allowlist comment
145
+ */
146
+ function checkAnyType(line, lineNumber, lines) {
147
+ const issues = [];
148
+ // Skip if line has allowlist comment
149
+ if (line.includes("@ts-safety:allow-any")) {
150
+ return issues;
151
+ }
152
+ // Skip if previous line has allowlist comment
153
+ if (lines && lineNumber > 1 && lines[lineNumber - 2]?.includes("@ts-safety:allow-any")) {
154
+ return issues;
155
+ }
156
+ // Skip comments and strings
157
+ if (line.trim().startsWith("//") || line.trim().startsWith("*")) {
158
+ return issues;
159
+ }
160
+ // Pattern: 'any' as a standalone type
161
+ // Matches: : any, <any>, (any), [any], = any, as any
162
+ // But NOT: "any" (in strings), "anything", "anyway"
163
+ const anyPatterns = [
164
+ /:\s*any\b/, // ": any"
165
+ /\bany\s*[,})\];=]/, // "any," "any}" "any)"
166
+ /\bany\s*$/, // "any" at end of line
167
+ ];
168
+ for (const pattern of anyPatterns) {
169
+ const match = pattern.exec(line);
170
+ if (match) {
171
+ const column = match.index + 1;
172
+ issues.push({
173
+ ruleId: TypeSafetyRuleId.TS_ANY_TYPE,
174
+ message: "Use of 'any' type is not allowed. Use specific type or @ts-safety:allow-any comment",
175
+ line: lineNumber,
176
+ column,
177
+ severity: TypeSafetySeverity.ERROR,
178
+ fix: "Replace 'any' with a specific type (e.g., unknown, Record<string, any>, etc.)",
179
+ });
180
+ }
181
+ }
182
+ return issues;
183
+ }
184
+ /**
185
+ * Checks for unsafe casts (as any, as unknown, as Record<...>)
186
+ */
187
+ function checkUnsafeCast(line, lineNumber, lines) {
188
+ const issues = [];
189
+ // Skip if line has allowlist comment
190
+ if (line.includes("@ts-safety:allow-cast")) {
191
+ return issues;
192
+ }
193
+ // Skip if previous line has allowlist comment
194
+ if (lines && lineNumber > 1 && lines[lineNumber - 2]?.includes("@ts-safety:allow-cast")) {
195
+ return issues;
196
+ }
197
+ // Skip comments
198
+ if (line.trim().startsWith("//") || line.trim().startsWith("*")) {
199
+ return issues;
200
+ }
201
+ // Pattern: "as any", "as unknown", "as Record<...>"
202
+ const castPatterns = [
203
+ { pattern: /\bas\s+any\b/, description: "unsafe cast 'as any'" },
204
+ { pattern: /\bas\s+unknown\b/, description: "unsafe cast 'as unknown'" },
205
+ { pattern: /\bas\s+Record</, description: "unsafe cast 'as Record<...>'" },
206
+ { pattern: /\bas\s+\{\}/, description: "unsafe cast 'as {}'" },
207
+ ];
208
+ for (const { pattern, description } of castPatterns) {
209
+ const match = pattern.exec(line);
210
+ if (match) {
211
+ const column = match.index + 1;
212
+ issues.push({
213
+ ruleId: TypeSafetyRuleId.TS_UNSAFE_CAST,
214
+ message: `Found ${description}. This bypasses type safety. Use specific type or @ts-safety:allow-cast`,
215
+ line: lineNumber,
216
+ column,
217
+ severity: TypeSafetySeverity.ERROR,
218
+ fix: `Replace '${match[0]}' with a specific type or add @ts-safety:allow-cast comment`,
219
+ });
220
+ }
221
+ }
222
+ return issues;
223
+ }
224
+ /**
225
+ * Checks that @ts-ignore has a reason comment
226
+ */
227
+ function checkTsIgnore(line, lineNumber) {
228
+ const issues = [];
229
+ // Pattern: @ts-ignore followed by reason comment or not
230
+ const ignorePattern = /@ts-ignore/;
231
+ if (!ignorePattern.test(line)) {
232
+ return issues;
233
+ }
234
+ // Check if there's a reason comment after @ts-ignore
235
+ const reasonPattern = /@ts-ignore\s*(?:\/\/|$)/;
236
+ if (reasonPattern.test(line)) {
237
+ // No reason provided
238
+ issues.push({
239
+ ruleId: TypeSafetyRuleId.TS_IGNORE_WITHOUT_REASON,
240
+ message: "@ts-ignore must have a reason comment (e.g., @ts-ignore - reason here)",
241
+ line: lineNumber,
242
+ column: line.indexOf("@ts-ignore") + 1,
243
+ severity: TypeSafetySeverity.WARN,
244
+ fix: "Add a reason comment after @ts-ignore (e.g., @ts-ignore - complex type from library)",
245
+ });
246
+ }
247
+ return issues;
248
+ }
249
+ /**
250
+ * Checks for functions without return type annotations
251
+ */
252
+ function checkMissingReturnType(line, lineNumber, lines, lineIndex) {
253
+ const issues = [];
254
+ // Skip comments and strings
255
+ if (line.trim().startsWith("//") || line.trim().startsWith("*")) {
256
+ return issues;
257
+ }
258
+ // Skip private/protected/property functions (TypeScript handles these)
259
+ if (/private|protected|readonly|\bget\s+|\bset\s+/.test(line)) {
260
+ return issues;
261
+ }
262
+ // Patterns:
263
+ // - "function foo() {" - missing return type
264
+ // - "public foo() {" - missing return type
265
+ // - "foo(): ReturnType" - has return type (OK)
266
+ // - "async foo()" - async functions should have return type
267
+ // - Arrow functions with {} block - should have return type
268
+ // - Constructor, getters/setters - skip
269
+ const functionPattern = /(?:async\s+)?(?:function\s+\w+|(?:public|protected)?\s*\w+)\s*\([^)]*\)\s*(?!:|\{)/;
270
+ if (functionPattern.test(line) && !line.includes("=>") && !line.includes(":")) {
271
+ // This might be a function declaration without return type
272
+ // Double-check it's actually a function
273
+ if (/^\s*((?:async\s+)?(?:public\s+)?function|(?:async\s+)?\w+\s*\()/.test(line)) {
274
+ issues.push({
275
+ ruleId: TypeSafetyRuleId.MISSING_RETURN_TYPE,
276
+ message: "Function missing explicit return type annotation",
277
+ line: lineNumber,
278
+ column: 1,
279
+ severity: TypeSafetySeverity.WARN,
280
+ fix: "Add return type annotation: function name(): ReturnType { ... }",
281
+ });
282
+ }
283
+ }
284
+ return issues;
285
+ }
286
+ /**
287
+ * Checks for Promise without type parameter
288
+ */
289
+ function checkPromiseType(line, lineNumber) {
290
+ const issues = [];
291
+ // Skip comments
292
+ if (line.trim().startsWith("//") || line.trim().startsWith("*")) {
293
+ return issues;
294
+ }
295
+ // Pattern: Promise<...> vs Promise without parameter
296
+ // "Promise<T>" is OK
297
+ // "Promise<unknown>" or "Promise<any>" should be flagged
298
+ // "Promise" without any type parameter is an issue
299
+ // This is a simplified check - looks for Promise without brackets
300
+ const promiseWithoutTypePattern = /\bPromise\b(?!\s*<)/;
301
+ if (promiseWithoutTypePattern.test(line)) {
302
+ // Make sure it's not in a comment or string
303
+ const match = promiseWithoutTypePattern.exec(line);
304
+ if (match && !line.substring(0, match.index).includes("//")) {
305
+ issues.push({
306
+ ruleId: TypeSafetyRuleId.MISSING_PROMISE_TYPE,
307
+ message: "Promise must have type parameter (e.g., Promise<void>, Promise<string>)",
308
+ line: lineNumber,
309
+ column: match.index + 1,
310
+ severity: TypeSafetySeverity.WARN,
311
+ fix: "Add type parameter: Promise<ReturnType>",
312
+ });
313
+ }
314
+ }
315
+ return issues;
316
+ }
317
+ //# sourceMappingURL=type-safety-linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-safety-linter.js","sourceRoot":"","sources":["../../src/linters/type-safety-linter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-claudecode",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "description": "Cthulhu-themed agentic harness for Claude Code — 11 Elder God agents, lifecycle hooks, skill system, and multi-tier orchestration.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",