commandmate 0.2.4 → 0.2.5

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 (68) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +8 -8
  3. package/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/cache/config.json +3 -3
  7. package/.next/cache/fetch-cache/{799a63cbfa61e2ab38626c05fe43500464c7bbd38341bdde69f5ec4b25acff68 → e7a5282a8c6f6e86940328b91498c8c8abc4b300cf449cb16e8ecd707767c12b} +1 -1
  8. package/.next/cache/webpack/client-production/0.pack +0 -0
  9. package/.next/cache/webpack/client-production/1.pack +0 -0
  10. package/.next/cache/webpack/client-production/2.pack +0 -0
  11. package/.next/cache/webpack/client-production/index.pack +0 -0
  12. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  13. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  14. package/.next/cache/webpack/server-production/0.pack +0 -0
  15. package/.next/cache/webpack/server-production/index.pack +0 -0
  16. package/.next/next-minimal-server.js.nft.json +1 -1
  17. package/.next/next-server.js.nft.json +1 -1
  18. package/.next/prerender-manifest.json +1 -1
  19. package/.next/required-server-files.json +1 -1
  20. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/app/update-check/route.js +1 -1
  22. package/.next/server/app/api/app/update-check.body +1 -1
  23. package/.next/server/app/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/worktrees/[id]/page.js +3 -3
  26. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  27. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app-paths-manifest.json +8 -8
  29. package/.next/server/chunks/2683.js +1 -1
  30. package/.next/server/chunks/5823.js +1 -1
  31. package/.next/server/functions-config-manifest.json +1 -1
  32. package/.next/server/pages/500.html +1 -1
  33. package/.next/server/server-reference-manifest.json +1 -1
  34. package/.next/static/chunks/app/worktrees/[id]/{page-9632761937a4d1ad.js → page-66b59fb8c9ee90f4.js} +1 -1
  35. package/.next/trace +5 -5
  36. package/dist/cli/commands/docs.d.ts +22 -0
  37. package/dist/cli/commands/docs.d.ts.map +1 -0
  38. package/dist/cli/commands/docs.js +96 -0
  39. package/dist/cli/commands/init.d.ts.map +1 -1
  40. package/dist/cli/commands/init.js +3 -0
  41. package/dist/cli/commands/issue.d.ts +23 -0
  42. package/dist/cli/commands/issue.d.ts.map +1 -0
  43. package/dist/cli/commands/issue.js +143 -0
  44. package/dist/cli/config/ai-integration-messages.d.ts +6 -0
  45. package/dist/cli/config/ai-integration-messages.d.ts.map +1 -0
  46. package/dist/cli/config/ai-integration-messages.js +27 -0
  47. package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
  48. package/dist/cli/config/cli-dependencies.js +6 -0
  49. package/dist/cli/config/security-messages.d.ts +3 -1
  50. package/dist/cli/config/security-messages.d.ts.map +1 -1
  51. package/dist/cli/config/security-messages.js +4 -1
  52. package/dist/cli/index.js +15 -2
  53. package/dist/cli/types/index.d.ts +23 -0
  54. package/dist/cli/types/index.d.ts.map +1 -1
  55. package/dist/cli/utils/docs-reader.d.ts +42 -0
  56. package/dist/cli/utils/docs-reader.d.ts.map +1 -0
  57. package/dist/cli/utils/docs-reader.js +155 -0
  58. package/dist/cli/utils/input-validators.d.ts +32 -0
  59. package/dist/cli/utils/input-validators.d.ts.map +1 -1
  60. package/dist/cli/utils/input-validators.js +51 -1
  61. package/dist/cli/utils/preflight.d.ts.map +1 -1
  62. package/dist/cli/utils/preflight.js +1 -0
  63. package/dist/config/github-links.d.ts +16 -0
  64. package/dist/config/github-links.d.ts.map +1 -0
  65. package/dist/config/github-links.js +22 -0
  66. package/package.json +1 -1
  67. /package/.next/static/{b3UR0y5mw3Ubf_vI5JjIN → zoVKZmyy2snskN1roYhHr}/_buildManifest.js +0 -0
  68. /package/.next/static/{b3UR0y5mw3Ubf_vI5JjIN → zoVKZmyy2snskN1roYhHr}/_ssgManifest.js +0 -0
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * DocsReader Utility
4
+ * Issue #264: Documentation retrieval for docs command
5
+ *
6
+ * [SF-003] SRP: Separated from docs command handler.
7
+ * This utility manages section mapping, path resolution, file reading, and search logic.
8
+ * The command handler (docs.ts) only handles argument parsing and output formatting.
9
+ *
10
+ * Security:
11
+ * - [SEC-SF-002] Search query length limit (MAX_SEARCH_QUERY_LENGTH = 256)
12
+ * - Path traversal prevention via SECTION_MAP whitelist
13
+ * - [SF-004] package.json anchor-based path resolution
14
+ *
15
+ * @module docs-reader
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.getAvailableSections = getAvailableSections;
52
+ exports.isValidSection = isValidSection;
53
+ exports.readSection = readSection;
54
+ exports.searchDocs = searchDocs;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ /**
58
+ * Whitelist of available documentation sections.
59
+ * [C-CONS-003] Only files listed here can be accessed via the docs command.
60
+ * Path traversal attempts are prevented by validating section names against this map.
61
+ */
62
+ const SECTION_MAP = {
63
+ 'quick-start': 'docs/user-guide/quick-start.md',
64
+ 'commands': 'docs/user-guide/commands-guide.md',
65
+ 'webapp': 'docs/user-guide/webapp-guide.md',
66
+ 'workflow-examples': 'docs/user-guide/workflow-examples.md',
67
+ 'cli-setup': 'docs/user-guide/cli-setup-guide.md',
68
+ 'agents': 'docs/user-guide/agents-guide.md',
69
+ 'architecture': 'docs/architecture.md',
70
+ 'readme': 'README.md',
71
+ };
72
+ /**
73
+ * [SEC-SF-002] Maximum search query length.
74
+ * String.prototype.includes() is used (no ReDoS risk), but this prevents
75
+ * performance degradation from extremely long queries.
76
+ */
77
+ const MAX_SEARCH_QUERY_LENGTH = 256;
78
+ /**
79
+ * Resolve the package root directory using package.json as anchor.
80
+ * [SF-004] Uses package.json location to determine root, resilient to
81
+ * compile output structure changes (instead of fragile __dirname relative paths).
82
+ */
83
+ function resolvePackageRoot() {
84
+ // From src/cli/utils/ -> 3 levels up to project root
85
+ // From dist/cli/utils/ -> 3 levels up to project root
86
+ let dir = __dirname;
87
+ for (let i = 0; i < 5; i++) {
88
+ const candidate = path.join(dir, 'package.json');
89
+ try {
90
+ fs.accessSync(candidate);
91
+ return dir;
92
+ }
93
+ catch {
94
+ dir = path.dirname(dir);
95
+ }
96
+ }
97
+ // Fallback: 3 levels up from __dirname
98
+ return path.resolve(__dirname, '..', '..', '..');
99
+ }
100
+ /**
101
+ * Get list of available documentation section names.
102
+ */
103
+ function getAvailableSections() {
104
+ return Object.keys(SECTION_MAP);
105
+ }
106
+ /**
107
+ * Check if a section name is valid (exists in the whitelist).
108
+ */
109
+ function isValidSection(section) {
110
+ return section in SECTION_MAP;
111
+ }
112
+ /**
113
+ * Read the content of a documentation section.
114
+ *
115
+ * @param section - Section name (must be in SECTION_MAP whitelist)
116
+ * @throws Error if section is invalid or file cannot be read
117
+ */
118
+ function readSection(section) {
119
+ if (!isValidSection(section)) {
120
+ throw new Error(`Invalid section: ${section}`);
121
+ }
122
+ const packageRoot = resolvePackageRoot();
123
+ const filePath = path.join(packageRoot, SECTION_MAP[section]);
124
+ return fs.readFileSync(filePath, 'utf-8');
125
+ }
126
+ /**
127
+ * Search documentation for a query string.
128
+ * Uses String.prototype.includes() for case-insensitive matching (no regex).
129
+ *
130
+ * @param query - Search query (max 256 characters)
131
+ * @throws Error if query exceeds MAX_SEARCH_QUERY_LENGTH
132
+ */
133
+ function searchDocs(query) {
134
+ if (query.length > MAX_SEARCH_QUERY_LENGTH) {
135
+ throw new Error(`Search query exceeds maximum length of ${MAX_SEARCH_QUERY_LENGTH} characters`);
136
+ }
137
+ const results = [];
138
+ const packageRoot = resolvePackageRoot();
139
+ const lowerQuery = query.toLowerCase();
140
+ for (const [section, relativePath] of Object.entries(SECTION_MAP)) {
141
+ const filePath = path.join(packageRoot, relativePath);
142
+ try {
143
+ const content = fs.readFileSync(filePath, 'utf-8');
144
+ const lines = content.split('\n');
145
+ const matches = lines.filter(line => line.toLowerCase().includes(lowerQuery));
146
+ if (matches.length > 0) {
147
+ results.push({ section, matches });
148
+ }
149
+ }
150
+ catch {
151
+ // File does not exist - skip
152
+ }
153
+ }
154
+ return results;
155
+ }
@@ -100,4 +100,36 @@ export declare function validateIssueNoResult(issueNo: unknown): IssueValidation
100
100
  * @returns true if value is a valid branch name
101
101
  */
102
102
  export declare function isValidBranchName(value: unknown): value is string;
103
+ /**
104
+ * [SEC-MF-001] Maximum issue title length (DoS prevention)
105
+ */
106
+ export declare const MAX_TITLE_LENGTH = 256;
107
+ /**
108
+ * [SEC-MF-001] Maximum issue body length (64KB, DoS prevention)
109
+ */
110
+ export declare const MAX_BODY_LENGTH = 65536;
111
+ /**
112
+ * Validate issue title length.
113
+ * [SEC-MF-001] Prevents DoS via extremely long input to gh CLI.
114
+ *
115
+ * @param title - Issue title to validate
116
+ * @returns Validation result with error message if invalid
117
+ */
118
+ export declare function validateIssueTitle(title: string): IssueValidationResult;
119
+ /**
120
+ * Validate issue body length.
121
+ * [SEC-MF-001] Prevents DoS via extremely long input to gh CLI.
122
+ *
123
+ * @param body - Issue body to validate
124
+ * @returns Validation result with error message if invalid
125
+ */
126
+ export declare function validateIssueBody(body: string): IssueValidationResult;
127
+ /**
128
+ * Sanitize a label string by removing control characters and zero-width characters.
129
+ * [SEC-SF-001] Follows env-setup.ts sanitizeInput() pattern.
130
+ *
131
+ * @param label - Label string to sanitize
132
+ * @returns Sanitized label string
133
+ */
134
+ export declare function sanitizeLabel(label: string): string;
103
135
  //# sourceMappingURL=input-validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-validators.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/input-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAsB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAY3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ3D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,MAAa,EACtB,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,IAAI,IAAI,MAAM,CAYxB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO9D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,qBAAqB,CAe7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAUjE"}
1
+ {"version":3,"file":"input-validators.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/input-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAsB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAY3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ3D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,MAAa,EACtB,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,IAAI,IAAI,MAAM,CAYxB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO9D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,qBAAqB,CAe7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAUjE;AAMD;;GAEG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAKvE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAKrE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -9,13 +9,16 @@
9
9
  * @module input-validators
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.MAX_BRANCH_NAME_LENGTH = exports.BRANCH_NAME_PATTERN = exports.MAX_ISSUE_NO = void 0;
12
+ exports.MAX_BODY_LENGTH = exports.MAX_TITLE_LENGTH = exports.MAX_BRANCH_NAME_LENGTH = exports.BRANCH_NAME_PATTERN = exports.MAX_ISSUE_NO = void 0;
13
13
  exports.validateIssueNo = validateIssueNo;
14
14
  exports.validateBranchName = validateBranchName;
15
15
  exports.validatePortNumber = validatePortNumber;
16
16
  exports.isValidIssueNo = isValidIssueNo;
17
17
  exports.validateIssueNoResult = validateIssueNoResult;
18
18
  exports.isValidBranchName = isValidBranchName;
19
+ exports.validateIssueTitle = validateIssueTitle;
20
+ exports.validateIssueBody = validateIssueBody;
21
+ exports.sanitizeLabel = sanitizeLabel;
19
22
  /**
20
23
  * Maximum allowed issue number (2^31 - 1)
21
24
  * NTH-SEC-002: Prevent integer overflow
@@ -161,3 +164,50 @@ function isValidBranchName(value) {
161
164
  return false;
162
165
  }
163
166
  }
167
+ // =============================================================================
168
+ // Issue #264: Issue command input validators
169
+ // =============================================================================
170
+ /**
171
+ * [SEC-MF-001] Maximum issue title length (DoS prevention)
172
+ */
173
+ exports.MAX_TITLE_LENGTH = 256;
174
+ /**
175
+ * [SEC-MF-001] Maximum issue body length (64KB, DoS prevention)
176
+ */
177
+ exports.MAX_BODY_LENGTH = 65536;
178
+ /**
179
+ * Validate issue title length.
180
+ * [SEC-MF-001] Prevents DoS via extremely long input to gh CLI.
181
+ *
182
+ * @param title - Issue title to validate
183
+ * @returns Validation result with error message if invalid
184
+ */
185
+ function validateIssueTitle(title) {
186
+ if (title.length > exports.MAX_TITLE_LENGTH) {
187
+ return { valid: false, error: `Title exceeds maximum length of ${exports.MAX_TITLE_LENGTH} characters` };
188
+ }
189
+ return { valid: true };
190
+ }
191
+ /**
192
+ * Validate issue body length.
193
+ * [SEC-MF-001] Prevents DoS via extremely long input to gh CLI.
194
+ *
195
+ * @param body - Issue body to validate
196
+ * @returns Validation result with error message if invalid
197
+ */
198
+ function validateIssueBody(body) {
199
+ if (body.length > exports.MAX_BODY_LENGTH) {
200
+ return { valid: false, error: `Body exceeds maximum length of ${exports.MAX_BODY_LENGTH} characters` };
201
+ }
202
+ return { valid: true };
203
+ }
204
+ /**
205
+ * Sanitize a label string by removing control characters and zero-width characters.
206
+ * [SEC-SF-001] Follows env-setup.ts sanitizeInput() pattern.
207
+ *
208
+ * @param label - Label string to sanitize
209
+ * @returns Sanitized label string
210
+ */
211
+ function sanitizeLabel(label) {
212
+ return label.replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200F\uFEFF]/g, '').trim();
213
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/preflight.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;OAGG;IACG,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6CtE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC;IAoB1C;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAW5C"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/preflight.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EAChB,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;OAGG;IACG,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6CtE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC;IAoB1C;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAY5C"}
@@ -122,6 +122,7 @@ class PreflightChecker {
122
122
  tmux: 'Install with: brew install tmux (macOS) or apt install tmux (Linux)',
123
123
  git: 'Install with: brew install git (macOS) or apt install git (Linux)',
124
124
  'Claude CLI': 'Install with: npm install -g @anthropic-ai/claude-cli',
125
+ 'gh CLI': 'Install GitHub CLI: https://cli.github.com/ or brew install gh',
125
126
  };
126
127
  return hints[name] || `Please install ${name}`;
127
128
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * GitHub URL Constants (Centralized)
3
+ * Issue #264: DRY - All GitHub URLs derived from GITHUB_REPO_BASE_URL
4
+ *
5
+ * [SEC-001] SSRF Prevention: GITHUB_API_URL is NOT included here.
6
+ * It remains hardcoded in version-checker.ts for security reasons.
7
+ */
8
+ export declare const GITHUB_REPO_BASE_URL: "https://github.com/Kewton/CommandMate";
9
+ export declare const GITHUB_ISSUES_URL: "https://github.com/Kewton/CommandMate/issues";
10
+ export declare const GITHUB_NEW_ISSUE_URL: "https://github.com/Kewton/CommandMate/issues/new";
11
+ export declare const GITHUB_BUG_REPORT_URL: "https://github.com/Kewton/CommandMate/issues/new?template=bug_report.md";
12
+ export declare const GITHUB_FEATURE_REQUEST_URL: "https://github.com/Kewton/CommandMate/issues/new?template=feature_request.md";
13
+ export declare const GITHUB_QUESTION_URL: "https://github.com/Kewton/CommandMate/issues/new?template=question.md";
14
+ export declare const GITHUB_RELEASE_URL_PREFIX: "https://github.com/Kewton/CommandMate/releases/";
15
+ export declare const GITHUB_SECURITY_GUIDE_URL: "https://github.com/Kewton/CommandMate/blob/main/docs/security-guide.md";
16
+ //# sourceMappingURL=github-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-links.d.ts","sourceRoot":"","sources":["../../src/config/github-links.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,oBAAoB,EAAG,uCAAgD,CAAC;AAGrF,eAAO,MAAM,iBAAiB,gDAA4C,CAAC;AAC3E,eAAO,MAAM,oBAAoB,oDAAgD,CAAC;AAGlF,eAAO,MAAM,qBAAqB,2EAA4D,CAAC;AAC/F,eAAO,MAAM,0BAA0B,gFAAiE,CAAC;AACzG,eAAO,MAAM,mBAAmB,yEAA0D,CAAC;AAG3F,eAAO,MAAM,yBAAyB,mDAA+C,CAAC;AAGtF,eAAO,MAAM,yBAAyB,0EAAsE,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * GitHub URL Constants (Centralized)
4
+ * Issue #264: DRY - All GitHub URLs derived from GITHUB_REPO_BASE_URL
5
+ *
6
+ * [SEC-001] SSRF Prevention: GITHUB_API_URL is NOT included here.
7
+ * It remains hardcoded in version-checker.ts for security reasons.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.GITHUB_SECURITY_GUIDE_URL = exports.GITHUB_RELEASE_URL_PREFIX = exports.GITHUB_QUESTION_URL = exports.GITHUB_FEATURE_REQUEST_URL = exports.GITHUB_BUG_REPORT_URL = exports.GITHUB_NEW_ISSUE_URL = exports.GITHUB_ISSUES_URL = exports.GITHUB_REPO_BASE_URL = void 0;
11
+ exports.GITHUB_REPO_BASE_URL = 'https://github.com/Kewton/CommandMate';
12
+ // Issue URLs
13
+ exports.GITHUB_ISSUES_URL = `${exports.GITHUB_REPO_BASE_URL}/issues`;
14
+ exports.GITHUB_NEW_ISSUE_URL = `${exports.GITHUB_REPO_BASE_URL}/issues/new`;
15
+ // Template URLs (UI: uses filename in query parameter)
16
+ exports.GITHUB_BUG_REPORT_URL = `${exports.GITHUB_NEW_ISSUE_URL}?template=bug_report.md`;
17
+ exports.GITHUB_FEATURE_REQUEST_URL = `${exports.GITHUB_NEW_ISSUE_URL}?template=feature_request.md`;
18
+ exports.GITHUB_QUESTION_URL = `${exports.GITHUB_NEW_ISSUE_URL}?template=question.md`;
19
+ // Release URL (moved from version-checker.ts, re-exported there for backward compatibility)
20
+ exports.GITHUB_RELEASE_URL_PREFIX = `${exports.GITHUB_REPO_BASE_URL}/releases/`;
21
+ // Security Guide URL (moved from security-messages.ts)
22
+ exports.GITHUB_SECURITY_GUIDE_URL = `${exports.GITHUB_REPO_BASE_URL}/blob/main/docs/security-guide.md`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Git worktree management with Claude CLI and tmux sessions",
5
5
  "repository": {
6
6
  "type": "git",