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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +8 -8
- package/.next/app-path-routes-manifest.json +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/fetch-cache/{799a63cbfa61e2ab38626c05fe43500464c7bbd38341bdde69f5ec4b25acff68 → e7a5282a8c6f6e86940328b91498c8c8abc4b300cf449cb16e8ecd707767c12b} +1 -1
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/app/update-check/route.js +1 -1
- package/.next/server/app/api/app/update-check.body +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/page.js +3 -3
- package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +8 -8
- package/.next/server/chunks/2683.js +1 -1
- package/.next/server/chunks/5823.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/worktrees/[id]/{page-9632761937a4d1ad.js → page-66b59fb8c9ee90f4.js} +1 -1
- package/.next/trace +5 -5
- package/dist/cli/commands/docs.d.ts +22 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +96 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -0
- package/dist/cli/commands/issue.d.ts +23 -0
- package/dist/cli/commands/issue.d.ts.map +1 -0
- package/dist/cli/commands/issue.js +143 -0
- package/dist/cli/config/ai-integration-messages.d.ts +6 -0
- package/dist/cli/config/ai-integration-messages.d.ts.map +1 -0
- package/dist/cli/config/ai-integration-messages.js +27 -0
- package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
- package/dist/cli/config/cli-dependencies.js +6 -0
- package/dist/cli/config/security-messages.d.ts +3 -1
- package/dist/cli/config/security-messages.d.ts.map +1 -1
- package/dist/cli/config/security-messages.js +4 -1
- package/dist/cli/index.js +15 -2
- package/dist/cli/types/index.d.ts +23 -0
- package/dist/cli/types/index.d.ts.map +1 -1
- package/dist/cli/utils/docs-reader.d.ts +42 -0
- package/dist/cli/utils/docs-reader.d.ts.map +1 -0
- package/dist/cli/utils/docs-reader.js +155 -0
- package/dist/cli/utils/input-validators.d.ts +32 -0
- package/dist/cli/utils/input-validators.d.ts.map +1 -1
- package/dist/cli/utils/input-validators.js +51 -1
- package/dist/cli/utils/preflight.d.ts.map +1 -1
- package/dist/cli/utils/preflight.js +1 -0
- package/dist/config/github-links.d.ts +16 -0
- package/dist/config/github-links.d.ts.map +1 -0
- package/dist/config/github-links.js +22 -0
- package/package.json +1 -1
- /package/.next/static/{b3UR0y5mw3Ubf_vI5JjIN → zoVKZmyy2snskN1roYhHr}/_buildManifest.js +0 -0
- /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;
|
|
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
|
File without changes
|
|
File without changes
|