codingbuddy 2.1.0 → 2.2.1

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 (157) hide show
  1. package/README.md +62 -0
  2. package/dist/src/agent/agent-prompt.builder.js +6 -0
  3. package/dist/src/agent/agent-prompt.builder.js.map +1 -1
  4. package/dist/src/analyzer/analyzer.module.js +3 -2
  5. package/dist/src/analyzer/analyzer.module.js.map +1 -1
  6. package/dist/src/analyzer/config.analyzer.js +11 -3
  7. package/dist/src/analyzer/config.analyzer.js.map +1 -1
  8. package/dist/src/analyzer/conventions.analyzer.d.ts +20 -0
  9. package/dist/src/analyzer/conventions.analyzer.js +395 -0
  10. package/dist/src/analyzer/conventions.analyzer.js.map +1 -0
  11. package/dist/src/analyzer/conventions.schemas.d.ts +76 -0
  12. package/dist/src/analyzer/conventions.schemas.js +71 -0
  13. package/dist/src/analyzer/conventions.schemas.js.map +1 -0
  14. package/dist/src/analyzer/conventions.types.d.ts +81 -0
  15. package/dist/src/analyzer/conventions.types.js +33 -0
  16. package/dist/src/analyzer/conventions.types.js.map +1 -0
  17. package/dist/src/checklist/checklist.types.d.ts +1 -1
  18. package/dist/src/checklist/checklist.types.js +1 -0
  19. package/dist/src/checklist/checklist.types.js.map +1 -1
  20. package/dist/src/cli/cli.js +5 -0
  21. package/dist/src/cli/cli.js.map +1 -1
  22. package/dist/src/cli/cli.types.d.ts +1 -0
  23. package/dist/src/cli/init/init.command.js +29 -52
  24. package/dist/src/cli/init/init.command.js.map +1 -1
  25. package/dist/src/cli/init/init.wizard.d.ts +22 -0
  26. package/dist/src/cli/init/init.wizard.js +277 -0
  27. package/dist/src/cli/init/init.wizard.js.map +1 -0
  28. package/dist/src/cli/init/prompts/architecture-prompt.d.ts +16 -0
  29. package/dist/src/cli/init/prompts/architecture-prompt.js +66 -0
  30. package/dist/src/cli/init/prompts/architecture-prompt.js.map +1 -0
  31. package/dist/src/cli/init/prompts/basic-prompt.d.ts +13 -0
  32. package/dist/src/cli/init/prompts/basic-prompt.js +53 -0
  33. package/dist/src/cli/init/prompts/basic-prompt.js.map +1 -0
  34. package/dist/src/cli/init/prompts/conventions-prompt.d.ts +19 -0
  35. package/dist/src/cli/init/prompts/conventions-prompt.js +74 -0
  36. package/dist/src/cli/init/prompts/conventions-prompt.js.map +1 -0
  37. package/dist/src/cli/init/prompts/index.d.ts +10 -0
  38. package/dist/src/cli/init/prompts/index.js +27 -1
  39. package/dist/src/cli/init/prompts/index.js.map +1 -1
  40. package/dist/src/cli/init/prompts/language-prompt.d.ts +1 -1
  41. package/dist/src/cli/init/prompts/model-prompt.js +2 -2
  42. package/dist/src/cli/init/prompts/model-prompt.js.map +1 -1
  43. package/dist/src/cli/init/prompts/tech-stack-prompt.d.ts +22 -0
  44. package/dist/src/cli/init/prompts/tech-stack-prompt.js +68 -0
  45. package/dist/src/cli/init/prompts/tech-stack-prompt.js.map +1 -0
  46. package/dist/src/cli/init/prompts/test-strategy-prompt.d.ts +19 -0
  47. package/dist/src/cli/init/prompts/test-strategy-prompt.js +75 -0
  48. package/dist/src/cli/init/prompts/test-strategy-prompt.js.map +1 -0
  49. package/dist/src/cli/init/summary/index.d.ts +2 -0
  50. package/dist/src/cli/init/summary/index.js +9 -0
  51. package/dist/src/cli/init/summary/index.js.map +1 -0
  52. package/dist/src/cli/init/summary/summary.prompt.d.ts +7 -0
  53. package/dist/src/cli/init/summary/summary.prompt.js +22 -0
  54. package/dist/src/cli/init/summary/summary.prompt.js.map +1 -0
  55. package/dist/src/cli/init/summary/summary.renderer.d.ts +32 -0
  56. package/dist/src/cli/init/summary/summary.renderer.js +41 -0
  57. package/dist/src/cli/init/summary/summary.renderer.js.map +1 -0
  58. package/dist/src/cli/init/templates/config-renderer.d.ts +42 -0
  59. package/dist/src/cli/init/templates/config-renderer.js +247 -0
  60. package/dist/src/cli/init/templates/config-renderer.js.map +1 -0
  61. package/dist/src/cli/init/templates/index.d.ts +1 -0
  62. package/dist/src/cli/init/templates/index.js +5 -1
  63. package/dist/src/cli/init/templates/index.js.map +1 -1
  64. package/dist/src/cli/utils/console.js +26 -7
  65. package/dist/src/cli/utils/console.js.map +1 -1
  66. package/dist/src/config/config.loader.d.ts +3 -0
  67. package/dist/src/config/config.loader.js +54 -0
  68. package/dist/src/config/config.loader.js.map +1 -1
  69. package/dist/src/config/config.schema.d.ts +7 -0
  70. package/dist/src/config/config.schema.js +5 -1
  71. package/dist/src/config/config.schema.js.map +1 -1
  72. package/dist/src/config/config.service.d.ts +1 -0
  73. package/dist/src/config/config.service.js +26 -1
  74. package/dist/src/config/config.service.js.map +1 -1
  75. package/dist/src/keyword/auto-executor.d.ts +17 -0
  76. package/dist/src/keyword/auto-executor.js +80 -0
  77. package/dist/src/keyword/auto-executor.js.map +1 -0
  78. package/dist/src/keyword/auto-executor.types.d.ts +44 -0
  79. package/dist/src/keyword/auto-executor.types.js +7 -0
  80. package/dist/src/keyword/auto-executor.types.js.map +1 -0
  81. package/dist/src/keyword/auto-formatter.d.ts +8 -0
  82. package/dist/src/keyword/auto-formatter.js +79 -0
  83. package/dist/src/keyword/auto-formatter.js.map +1 -0
  84. package/dist/src/keyword/auto-prompt-builder.d.ts +6 -0
  85. package/dist/src/keyword/auto-prompt-builder.js +47 -0
  86. package/dist/src/keyword/auto-prompt-builder.js.map +1 -0
  87. package/dist/src/keyword/index.d.ts +9 -0
  88. package/dist/src/keyword/index.js +28 -0
  89. package/dist/src/keyword/index.js.map +1 -0
  90. package/dist/src/keyword/keyword.module.js +11 -1
  91. package/dist/src/keyword/keyword.module.js.map +1 -1
  92. package/dist/src/keyword/keyword.service.d.ts +9 -2
  93. package/dist/src/keyword/keyword.service.js +108 -44
  94. package/dist/src/keyword/keyword.service.js.map +1 -1
  95. package/dist/src/keyword/keyword.types.d.ts +11 -8
  96. package/dist/src/keyword/keyword.types.js +22 -12
  97. package/dist/src/keyword/keyword.types.js.map +1 -1
  98. package/dist/src/keyword/primary-agent-resolver.js +4 -4
  99. package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
  100. package/dist/src/keyword/rule-filter.js +1 -0
  101. package/dist/src/keyword/rule-filter.js.map +1 -1
  102. package/dist/src/main.js +12 -4
  103. package/dist/src/main.js.map +1 -1
  104. package/dist/src/mcp/handlers/abstract-handler.d.ts +8 -0
  105. package/dist/src/mcp/handlers/abstract-handler.js +19 -0
  106. package/dist/src/mcp/handlers/abstract-handler.js.map +1 -0
  107. package/dist/src/mcp/handlers/agent.handler.d.ts +6 -4
  108. package/dist/src/mcp/handlers/agent.handler.js +8 -15
  109. package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
  110. package/dist/src/mcp/handlers/checklist-context.handler.d.ts +6 -4
  111. package/dist/src/mcp/handlers/checklist-context.handler.js +8 -12
  112. package/dist/src/mcp/handlers/checklist-context.handler.js.map +1 -1
  113. package/dist/src/mcp/handlers/config.handler.d.ts +6 -4
  114. package/dist/src/mcp/handlers/config.handler.js +12 -20
  115. package/dist/src/mcp/handlers/config.handler.js.map +1 -1
  116. package/dist/src/mcp/handlers/conventions.handler.d.ts +12 -0
  117. package/dist/src/mcp/handlers/conventions.handler.js +73 -0
  118. package/dist/src/mcp/handlers/conventions.handler.js.map +1 -0
  119. package/dist/src/mcp/handlers/index.d.ts +1 -0
  120. package/dist/src/mcp/handlers/index.js +3 -1
  121. package/dist/src/mcp/handlers/index.js.map +1 -1
  122. package/dist/src/mcp/handlers/mode.handler.d.ts +6 -5
  123. package/dist/src/mcp/handlers/mode.handler.js +6 -13
  124. package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
  125. package/dist/src/mcp/handlers/rules.handler.d.ts +6 -4
  126. package/dist/src/mcp/handlers/rules.handler.js +8 -12
  127. package/dist/src/mcp/handlers/rules.handler.js.map +1 -1
  128. package/dist/src/mcp/handlers/skill.handler.d.ts +6 -4
  129. package/dist/src/mcp/handlers/skill.handler.js +8 -12
  130. package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
  131. package/dist/src/mcp/mcp-serverless.js +5 -0
  132. package/dist/src/mcp/mcp-serverless.js.map +1 -1
  133. package/dist/src/mcp/mcp.module.js +1 -0
  134. package/dist/src/mcp/mcp.module.js.map +1 -1
  135. package/dist/src/mcp/mcp.service.d.ts +0 -1
  136. package/dist/src/mcp/mcp.service.js +2 -5
  137. package/dist/src/mcp/mcp.service.js.map +1 -1
  138. package/dist/src/model/model.constants.js.map +1 -1
  139. package/dist/src/model/model.resolver.js +8 -0
  140. package/dist/src/model/model.resolver.js.map +1 -1
  141. package/dist/src/shared/async.utils.d.ts +8 -0
  142. package/dist/src/shared/async.utils.js +18 -0
  143. package/dist/src/shared/async.utils.js.map +1 -0
  144. package/dist/src/shared/file.utils.d.ts +38 -2
  145. package/dist/src/shared/file.utils.js +104 -3
  146. package/dist/src/shared/file.utils.js.map +1 -1
  147. package/dist/src/shared/format.utils.d.ts +1 -0
  148. package/dist/src/shared/format.utils.js +19 -0
  149. package/dist/src/shared/format.utils.js.map +1 -0
  150. package/dist/src/shared/lru-cache.d.ts +21 -0
  151. package/dist/src/shared/lru-cache.js +70 -0
  152. package/dist/src/shared/lru-cache.js.map +1 -0
  153. package/dist/src/shared/validation.constants.d.ts +31 -0
  154. package/dist/src/shared/validation.constants.js +82 -8
  155. package/dist/src/shared/validation.constants.js.map +1 -1
  156. package/dist/tsconfig.build.tsbuildinfo +1 -1
  157. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.utils.js","sourceRoot":"","sources":["../../../src/shared/format.utils.ts"],"names":[],"mappings":";;AAeA,kCAmBC;AAnBD,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEjC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,IAAI,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,IAAI,IAAI,IAAI,CAAC;QACb,SAAS,EAAE,CAAC;IACd,CAAC;IAID,MAAM,SAAS,GACb,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE5E,OAAO,GAAG,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface CacheEntry<T> {
2
+ value: T;
3
+ timestamp: number;
4
+ mtimes?: Map<string, number>;
5
+ }
6
+ export interface LRUCacheOptions {
7
+ maxSize?: number;
8
+ ttl?: number;
9
+ }
10
+ export declare class LRUCache<K, V> {
11
+ private cache;
12
+ private readonly maxSize;
13
+ private readonly ttl;
14
+ constructor(options?: LRUCacheOptions);
15
+ get(key: K, currentMtimes?: Map<string, number>): V | undefined;
16
+ set(key: K, value: V, mtimes?: Map<string, number>): void;
17
+ has(key: K, currentMtimes?: Map<string, number>): boolean;
18
+ clear(): void;
19
+ size(): number;
20
+ private haveMtimesChanged;
21
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LRUCache = void 0;
4
+ class LRUCache {
5
+ constructor(options = {}) {
6
+ this.cache = new Map();
7
+ this.maxSize = options.maxSize ?? 10;
8
+ this.ttl = options.ttl ?? 5 * 60 * 1000;
9
+ }
10
+ get(key, currentMtimes) {
11
+ const entry = this.cache.get(key);
12
+ if (!entry) {
13
+ return undefined;
14
+ }
15
+ const now = Date.now();
16
+ if (now - entry.timestamp > this.ttl) {
17
+ this.cache.delete(key);
18
+ return undefined;
19
+ }
20
+ if (currentMtimes && entry.mtimes) {
21
+ const mtimesChanged = this.haveMtimesChanged(entry.mtimes, currentMtimes);
22
+ if (mtimesChanged) {
23
+ this.cache.delete(key);
24
+ return undefined;
25
+ }
26
+ }
27
+ this.cache.delete(key);
28
+ this.cache.set(key, entry);
29
+ return entry.value;
30
+ }
31
+ set(key, value, mtimes) {
32
+ this.cache.delete(key);
33
+ if (this.cache.size >= this.maxSize) {
34
+ const firstKey = this.cache.keys().next().value;
35
+ if (firstKey !== undefined) {
36
+ this.cache.delete(firstKey);
37
+ }
38
+ }
39
+ this.cache.set(key, {
40
+ value,
41
+ timestamp: Date.now(),
42
+ mtimes,
43
+ });
44
+ }
45
+ has(key, currentMtimes) {
46
+ return this.get(key, currentMtimes) !== undefined;
47
+ }
48
+ clear() {
49
+ this.cache.clear();
50
+ }
51
+ size() {
52
+ return this.cache.size;
53
+ }
54
+ haveMtimesChanged(oldMtimes, newMtimes) {
55
+ for (const [filePath, newMtime] of newMtimes) {
56
+ const oldMtime = oldMtimes.get(filePath);
57
+ if (oldMtime !== newMtime) {
58
+ return true;
59
+ }
60
+ }
61
+ for (const filePath of oldMtimes.keys()) {
62
+ if (!newMtimes.has(filePath)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ }
69
+ exports.LRUCache = LRUCache;
70
+ //# sourceMappingURL=lru-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lru-cache.js","sourceRoot":"","sources":["../../../src/shared/lru-cache.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ export declare const MAX_CONFIG_FILE_SIZE: number;
1
2
  export declare const MAX_QUERY_LENGTH = 1000;
2
3
  export declare const MAX_PROMPT_LENGTH = 10000;
3
4
  export declare const MAX_AGENT_NAME_LENGTH = 100;
@@ -6,6 +7,23 @@ export interface ValidationResult {
6
7
  valid: boolean;
7
8
  error?: string;
8
9
  }
10
+ export interface ParseResult<T> {
11
+ success: boolean;
12
+ value?: T;
13
+ error?: string;
14
+ }
15
+ export interface AccessibleErrorResponse {
16
+ code: string;
17
+ userMessage: string;
18
+ technicalMessage: string;
19
+ accessibilityHints?: {
20
+ role: 'alert' | 'status';
21
+ live?: 'assertive' | 'polite';
22
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
23
+ announce?: boolean;
24
+ };
25
+ suggestions?: string[];
26
+ }
9
27
  export declare function validateQuery(query: string): ValidationResult;
10
28
  export declare function validatePrompt(prompt: string): ValidationResult;
11
29
  export declare function validateAgentName(name: string): ValidationResult;
@@ -19,3 +37,16 @@ export declare function extractRequiredString(args: Record<string, unknown> | un
19
37
  export declare function extractOptionalString(args: Record<string, unknown> | undefined, paramName: string): string | undefined;
20
38
  export declare function extractStringArray(args: Record<string, unknown> | undefined, paramName: string): string[] | undefined;
21
39
  export declare function extractMode(args: Record<string, unknown> | undefined, paramName?: string): ValidMode | null;
40
+ declare const VALID_INDENT_STYLES: readonly ["space", "tab"];
41
+ type IndentStyle = (typeof VALID_INDENT_STYLES)[number];
42
+ declare const VALID_END_OF_LINE: readonly ["lf", "cr", "crlf"];
43
+ type EndOfLine = (typeof VALID_END_OF_LINE)[number];
44
+ declare const VALID_CHARSETS: readonly ["utf-8", "utf-16be", "utf-16le", "latin1"];
45
+ type Charset = (typeof VALID_CHARSETS)[number];
46
+ export declare function isIndentStyle(value: unknown): value is IndentStyle;
47
+ export declare function isEndOfLine(value: unknown): value is EndOfLine;
48
+ export declare function isCharset(value: unknown): value is Charset;
49
+ export declare function parseIndentSize(value: string): ParseResult<number>;
50
+ export declare function parseTabWidth(value: string): ParseResult<number>;
51
+ export declare function parseMaxLineLength(value: string): ParseResult<number>;
52
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VALID_MODES = exports.AGENT_NAME_PATTERN = exports.MAX_AGENT_NAME_LENGTH = exports.MAX_PROMPT_LENGTH = exports.MAX_QUERY_LENGTH = void 0;
3
+ exports.VALID_MODES = exports.AGENT_NAME_PATTERN = exports.MAX_AGENT_NAME_LENGTH = exports.MAX_PROMPT_LENGTH = exports.MAX_QUERY_LENGTH = exports.MAX_CONFIG_FILE_SIZE = void 0;
4
4
  exports.validateQuery = validateQuery;
5
5
  exports.validatePrompt = validatePrompt;
6
6
  exports.validateAgentName = validateAgentName;
@@ -12,48 +12,64 @@ exports.extractRequiredString = extractRequiredString;
12
12
  exports.extractOptionalString = extractOptionalString;
13
13
  exports.extractStringArray = extractStringArray;
14
14
  exports.extractMode = extractMode;
15
+ exports.isIndentStyle = isIndentStyle;
16
+ exports.isEndOfLine = isEndOfLine;
17
+ exports.isCharset = isCharset;
18
+ exports.parseIndentSize = parseIndentSize;
19
+ exports.parseTabWidth = parseTabWidth;
20
+ exports.parseMaxLineLength = parseMaxLineLength;
21
+ exports.MAX_CONFIG_FILE_SIZE = 1024 * 1024;
15
22
  exports.MAX_QUERY_LENGTH = 1000;
16
23
  exports.MAX_PROMPT_LENGTH = 10000;
17
24
  exports.MAX_AGENT_NAME_LENGTH = 100;
18
25
  exports.AGENT_NAME_PATTERN = /^[a-z0-9-]+$/;
19
26
  function validateQuery(query) {
20
27
  if (!query || query.trim().length === 0) {
21
- return { valid: false, error: 'Query cannot be empty' };
28
+ return {
29
+ valid: false,
30
+ error: 'Query cannot be empty. Please provide a search term. Example: "authentication flow"',
31
+ };
22
32
  }
23
33
  if (query.length > exports.MAX_QUERY_LENGTH) {
24
34
  return {
25
35
  valid: false,
26
- error: `Query exceeds maximum length of ${exports.MAX_QUERY_LENGTH} characters`,
36
+ error: `Query exceeds maximum length of ${exports.MAX_QUERY_LENGTH} characters. Please shorten your query.`,
27
37
  };
28
38
  }
29
39
  return { valid: true };
30
40
  }
31
41
  function validatePrompt(prompt) {
32
42
  if (!prompt || prompt.trim().length === 0) {
33
- return { valid: false, error: 'Prompt cannot be empty' };
43
+ return {
44
+ valid: false,
45
+ error: 'Prompt cannot be empty. Please provide a task description. Example: "PLAN design authentication flow"',
46
+ };
34
47
  }
35
48
  if (prompt.length > exports.MAX_PROMPT_LENGTH) {
36
49
  return {
37
50
  valid: false,
38
- error: `Prompt exceeds maximum length of ${exports.MAX_PROMPT_LENGTH} characters`,
51
+ error: `Prompt exceeds maximum length of ${exports.MAX_PROMPT_LENGTH} characters. Please shorten your prompt.`,
39
52
  };
40
53
  }
41
54
  return { valid: true };
42
55
  }
43
56
  function validateAgentName(name) {
44
57
  if (!name || name.trim().length === 0) {
45
- return { valid: false, error: 'Agent name cannot be empty' };
58
+ return {
59
+ valid: false,
60
+ error: 'Agent name cannot be empty. Please provide an agent name. Example: "frontend-developer"',
61
+ };
46
62
  }
47
63
  if (name.length > exports.MAX_AGENT_NAME_LENGTH) {
48
64
  return {
49
65
  valid: false,
50
- error: `Agent name exceeds maximum length of ${exports.MAX_AGENT_NAME_LENGTH} characters`,
66
+ error: `Agent name exceeds maximum length of ${exports.MAX_AGENT_NAME_LENGTH} characters. Please use a shorter name.`,
51
67
  };
52
68
  }
53
69
  if (!exports.AGENT_NAME_PATTERN.test(name)) {
54
70
  return {
55
71
  valid: false,
56
- error: 'Agent name must contain only lowercase letters, numbers, and hyphens',
72
+ error: 'Agent name must contain only lowercase letters, numbers, and hyphens. Example: "frontend-developer" or "code-reviewer"',
57
73
  };
58
74
  }
59
75
  return { valid: true };
@@ -91,4 +107,62 @@ function extractMode(args, paramName = 'mode') {
91
107
  const value = args?.[paramName];
92
108
  return isValidMode(value) ? value : null;
93
109
  }
110
+ const VALID_INDENT_STYLES = ['space', 'tab'];
111
+ const VALID_END_OF_LINE = ['lf', 'cr', 'crlf'];
112
+ const VALID_CHARSETS = ['utf-8', 'utf-16be', 'utf-16le', 'latin1'];
113
+ function isIndentStyle(value) {
114
+ return (typeof value === 'string' &&
115
+ VALID_INDENT_STYLES.includes(value));
116
+ }
117
+ function isEndOfLine(value) {
118
+ return (typeof value === 'string' && VALID_END_OF_LINE.includes(value));
119
+ }
120
+ function isCharset(value) {
121
+ return typeof value === 'string' && VALID_CHARSETS.includes(value);
122
+ }
123
+ function parseIndentSize(value) {
124
+ if (value.includes('.')) {
125
+ return {
126
+ success: false,
127
+ error: 'Indent size must be an integer, decimals are not allowed',
128
+ };
129
+ }
130
+ const parsed = parseInt(value, 10);
131
+ if (isNaN(parsed) || parsed < 1 || !Number.isInteger(parsed)) {
132
+ return {
133
+ success: false,
134
+ error: 'Indent size must be a positive integer (>= 1)',
135
+ };
136
+ }
137
+ return { success: true, value: parsed };
138
+ }
139
+ function parseTabWidth(value) {
140
+ if (value.includes('.')) {
141
+ return {
142
+ success: false,
143
+ error: 'Tab width must be an integer, decimals are not allowed',
144
+ };
145
+ }
146
+ const parsed = parseInt(value, 10);
147
+ if (isNaN(parsed) || parsed < 1 || !Number.isInteger(parsed)) {
148
+ return {
149
+ success: false,
150
+ error: 'Tab width must be a positive integer (>= 1)',
151
+ };
152
+ }
153
+ return { success: true, value: parsed };
154
+ }
155
+ function parseMaxLineLength(value) {
156
+ if (value === 'off') {
157
+ return { success: true };
158
+ }
159
+ const parsed = parseInt(value, 10);
160
+ if (isNaN(parsed) || parsed < 1 || !Number.isInteger(parsed)) {
161
+ return {
162
+ success: false,
163
+ error: 'Max line length must be a positive integer (>= 1) or "off"',
164
+ };
165
+ }
166
+ return { success: true, value: parsed };
167
+ }
94
168
  //# sourceMappingURL=validation.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.constants.js","sourceRoot":"","sources":["../../../src/shared/validation.constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.constants.js","sourceRoot":"","sources":["../../../src/shared/validation.constants.ts"],"names":[],"mappings":"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"}