gh-inari 0.1.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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/artifact.d.ts +82 -0
- package/dist/artifact.js +472 -0
- package/dist/artifact.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.js +395 -0
- package/dist/cli.js.map +1 -0
- package/dist/contract/index.d.ts +4 -0
- package/dist/contract/index.js +5 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/ir.d.ts +178 -0
- package/dist/contract/ir.js +1071 -0
- package/dist/contract/ir.js.map +1 -0
- package/dist/contract/issue-form.d.ts +38 -0
- package/dist/contract/issue-form.js +662 -0
- package/dist/contract/issue-form.js.map +1 -0
- package/dist/contract/schema.d.ts +48 -0
- package/dist/contract/schema.js +162 -0
- package/dist/contract/schema.js.map +1 -0
- package/dist/contract/validation.d.ts +24 -0
- package/dist/contract/validation.js +212 -0
- package/dist/contract/validation.js.map +1 -0
- package/dist/github/adapter.d.ts +48 -0
- package/dist/github/adapter.js +463 -0
- package/dist/github/adapter.js.map +1 -0
- package/dist/github/errors.d.ts +43 -0
- package/dist/github/errors.js +65 -0
- package/dist/github/errors.js.map +1 -0
- package/dist/github/index.d.ts +4 -0
- package/dist/github/index.js +5 -0
- package/dist/github/index.js.map +1 -0
- package/dist/github/transport.d.ts +19 -0
- package/dist/github/transport.js +54 -0
- package/dist/github/transport.js.map +1 -0
- package/dist/github/types.d.ts +62 -0
- package/dist/github/types.js +16 -0
- package/dist/github/types.js.map +1 -0
- package/dist/github.d.ts +1 -0
- package/dist/github.js +2 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/pr-policy.d.ts +39 -0
- package/dist/pr-policy.js +313 -0
- package/dist/pr-policy.js.map +1 -0
- package/dist/pull-request-template.d.ts +42 -0
- package/dist/pull-request-template.js +481 -0
- package/dist/pull-request-template.js.map +1 -0
- package/dist/template-discovery.d.ts +68 -0
- package/dist/template-discovery.js +431 -0
- package/dist/template-discovery.js.map +1 -0
- package/gh-inari +18 -0
- package/package.json +92 -0
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
import { lstat, readdir } from "node:fs/promises";
|
|
2
|
+
import { lstatSync, readdirSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
const GITHUB_DIRECTORY = ".github";
|
|
6
|
+
const ISSUE_TEMPLATE_DIRECTORY = "ISSUE_TEMPLATE";
|
|
7
|
+
const PULL_REQUEST_TEMPLATE_DIRECTORY = "PULL_REQUEST_TEMPLATE";
|
|
8
|
+
const DEFAULT_PULL_REQUEST_TEMPLATE = "PULL_REQUEST_TEMPLATE.md";
|
|
9
|
+
const CONFIG_TEMPLATE_NAMES = new Set(["config.yml", "config.yaml"]);
|
|
10
|
+
const ISSUE_TEMPLATE_EXTENSIONS = new Set([".md", ".yml", ".yaml"]);
|
|
11
|
+
const PULL_REQUEST_TEMPLATE_EXTENSIONS = new Set([".md"]);
|
|
12
|
+
export class TemplateDiscoveryError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
details;
|
|
15
|
+
constructor(code, message, details = {}, options) {
|
|
16
|
+
super(message, options);
|
|
17
|
+
this.name = "TemplateDiscoveryError";
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.details = details;
|
|
20
|
+
}
|
|
21
|
+
toJSON() {
|
|
22
|
+
return { code: this.code, message: this.message, details: this.details };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class TemplateFilesystemError extends TemplateDiscoveryError {
|
|
26
|
+
constructor(message, details = {}, cause) {
|
|
27
|
+
super("TEMPLATE_FILESYSTEM_MALFORMED", message, details, { cause });
|
|
28
|
+
this.name = "TemplateFilesystemError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class TemplateNotFoundError extends TemplateDiscoveryError {
|
|
32
|
+
constructor(selector, candidates) {
|
|
33
|
+
super("TEMPLATE_NOT_FOUND", `No repository-native template matches ${selectorLabel(selector)}.`, {
|
|
34
|
+
selector,
|
|
35
|
+
candidates,
|
|
36
|
+
});
|
|
37
|
+
this.name = "TemplateNotFoundError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class TemplateSelectionAmbiguousError extends TemplateDiscoveryError {
|
|
41
|
+
constructor(selector, candidates) {
|
|
42
|
+
super("TEMPLATE_SELECTION_AMBIGUOUS", `Template selection is ambiguous for ${selectorLabel(selector)}.`, {
|
|
43
|
+
selector,
|
|
44
|
+
candidates,
|
|
45
|
+
});
|
|
46
|
+
this.name = "TemplateSelectionAmbiguousError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class TemplateNameConflictError extends TemplateDiscoveryError {
|
|
50
|
+
constructor(selector, candidates) {
|
|
51
|
+
super("TEMPLATE_NAME_CONFLICT", `Template name ${selectorLabel(selector)} identifies multiple repository-native templates.`, { selector, candidates });
|
|
52
|
+
this.name = "TemplateNameConflictError";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class InvalidTemplateSelectorError extends TemplateDiscoveryError {
|
|
56
|
+
constructor(selector) {
|
|
57
|
+
super("INVALID_TEMPLATE_SELECTOR", "Template selector must contain a non-empty id, type, kind, name, or path.", {
|
|
58
|
+
selector: isTemplateSelectorValue(selector) ? selector : undefined,
|
|
59
|
+
});
|
|
60
|
+
this.name = "InvalidTemplateSelectorError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Discover only the repository-native paths GitHub uses for the MVP.
|
|
65
|
+
* Template contents are intentionally not read; parsing belongs to later layers.
|
|
66
|
+
*/
|
|
67
|
+
export async function discoverTemplates(repositoryRoot = process.cwd()) {
|
|
68
|
+
const root = resolveRepositoryRoot(repositoryRoot);
|
|
69
|
+
await assertDirectory(root, "repository root");
|
|
70
|
+
const githubPath = path.join(root, GITHUB_DIRECTORY);
|
|
71
|
+
if (!(await optionalDirectory(githubPath)))
|
|
72
|
+
return emptyDiscovery(root);
|
|
73
|
+
const [issueTemplates, pullRequestTemplates] = await Promise.all([
|
|
74
|
+
discoverIssueTemplates(root),
|
|
75
|
+
discoverPullRequestTemplates(root),
|
|
76
|
+
]);
|
|
77
|
+
return createDiscoveryResult(root, [...issueTemplates, ...pullRequestTemplates]);
|
|
78
|
+
}
|
|
79
|
+
/** Synchronous counterpart for callers that already operate synchronously. */
|
|
80
|
+
export function discoverTemplatesSync(repositoryRoot = process.cwd()) {
|
|
81
|
+
const root = resolveRepositoryRoot(repositoryRoot);
|
|
82
|
+
assertDirectorySync(root, "repository root");
|
|
83
|
+
const githubPath = path.join(root, GITHUB_DIRECTORY);
|
|
84
|
+
if (!optionalDirectorySync(githubPath))
|
|
85
|
+
return emptyDiscovery(root);
|
|
86
|
+
const issueTemplates = discoverIssueTemplatesSync(root);
|
|
87
|
+
const pullRequestTemplates = discoverPullRequestTemplatesSync(root);
|
|
88
|
+
return createDiscoveryResult(root, [...issueTemplates, ...pullRequestTemplates]);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Select one identity. A string first means an exact ID or path, then a name;
|
|
92
|
+
* name selection is case-insensitive and fails closed when it is not unique.
|
|
93
|
+
*/
|
|
94
|
+
export function selectTemplate(discovery, selector) {
|
|
95
|
+
return selectFromCandidates(discovery.templates, selector);
|
|
96
|
+
}
|
|
97
|
+
export function selectIssueTemplate(discovery, selector) {
|
|
98
|
+
return selectFromCandidates(discovery.issueTemplates, selector);
|
|
99
|
+
}
|
|
100
|
+
export function selectPullRequestTemplate(discovery, selector) {
|
|
101
|
+
return selectFromCandidates(discovery.pullRequestTemplates, selector);
|
|
102
|
+
}
|
|
103
|
+
function resolveRepositoryRoot(repositoryRoot) {
|
|
104
|
+
const root = typeof repositoryRoot === "string" ? repositoryRoot : fileURLToPath(repositoryRoot);
|
|
105
|
+
return path.resolve(root);
|
|
106
|
+
}
|
|
107
|
+
async function discoverIssueTemplates(repositoryRoot) {
|
|
108
|
+
const directory = path.join(repositoryRoot, GITHUB_DIRECTORY, ISSUE_TEMPLATE_DIRECTORY);
|
|
109
|
+
if (!(await optionalDirectory(directory)))
|
|
110
|
+
return [];
|
|
111
|
+
const entries = await readDirectory(directory);
|
|
112
|
+
return collectDirectoryTemplates(repositoryRoot, directory, entries, "issue");
|
|
113
|
+
}
|
|
114
|
+
function discoverIssueTemplatesSync(repositoryRoot) {
|
|
115
|
+
const directory = path.join(repositoryRoot, GITHUB_DIRECTORY, ISSUE_TEMPLATE_DIRECTORY);
|
|
116
|
+
if (!optionalDirectorySync(directory))
|
|
117
|
+
return [];
|
|
118
|
+
const entries = readDirectorySync(directory);
|
|
119
|
+
return collectDirectoryTemplates(repositoryRoot, directory, entries, "issue");
|
|
120
|
+
}
|
|
121
|
+
async function discoverPullRequestTemplates(repositoryRoot) {
|
|
122
|
+
const githubPath = path.join(repositoryRoot, GITHUB_DIRECTORY);
|
|
123
|
+
const templates = [];
|
|
124
|
+
const defaultPath = path.join(githubPath, DEFAULT_PULL_REQUEST_TEMPLATE);
|
|
125
|
+
if (await optionalRegularFile(defaultPath)) {
|
|
126
|
+
templates.push(createIdentity(repositoryRoot, defaultPath, "pull-request-default"));
|
|
127
|
+
}
|
|
128
|
+
const directory = path.join(githubPath, PULL_REQUEST_TEMPLATE_DIRECTORY);
|
|
129
|
+
if (await optionalDirectory(directory)) {
|
|
130
|
+
const entries = await readDirectory(directory);
|
|
131
|
+
templates.push(...collectDirectoryTemplates(repositoryRoot, directory, entries, "pull-request"));
|
|
132
|
+
}
|
|
133
|
+
return templates;
|
|
134
|
+
}
|
|
135
|
+
function discoverPullRequestTemplatesSync(repositoryRoot) {
|
|
136
|
+
const githubPath = path.join(repositoryRoot, GITHUB_DIRECTORY);
|
|
137
|
+
const templates = [];
|
|
138
|
+
const defaultPath = path.join(githubPath, DEFAULT_PULL_REQUEST_TEMPLATE);
|
|
139
|
+
if (optionalRegularFileSync(defaultPath)) {
|
|
140
|
+
templates.push(createIdentity(repositoryRoot, defaultPath, "pull-request-default"));
|
|
141
|
+
}
|
|
142
|
+
const directory = path.join(githubPath, PULL_REQUEST_TEMPLATE_DIRECTORY);
|
|
143
|
+
if (optionalDirectorySync(directory)) {
|
|
144
|
+
const entries = readDirectorySync(directory);
|
|
145
|
+
templates.push(...collectDirectoryTemplates(repositoryRoot, directory, entries, "pull-request"));
|
|
146
|
+
}
|
|
147
|
+
return templates;
|
|
148
|
+
}
|
|
149
|
+
function collectDirectoryTemplates(repositoryRoot, directory, entries, kind) {
|
|
150
|
+
const templates = [];
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
const entryPath = path.join(directory, entry.name);
|
|
153
|
+
if (!entry.isFile()) {
|
|
154
|
+
throw new TemplateFilesystemError(`Template location contains a non-regular entry: ${entryPath}.`, {
|
|
155
|
+
path: entryPath,
|
|
156
|
+
reason: entry.isDirectory() ? "nested directory" : "symbolic link or special file",
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const candidate = kind === "issue" ? classifyIssueTemplate(entry.name) : classifyPullRequestTemplate(entry.name);
|
|
160
|
+
if (candidate === undefined)
|
|
161
|
+
continue;
|
|
162
|
+
templates.push(createIdentity(repositoryRoot, entryPath, candidate.type));
|
|
163
|
+
}
|
|
164
|
+
return templates;
|
|
165
|
+
}
|
|
166
|
+
function classifyIssueTemplate(fileName) {
|
|
167
|
+
if (CONFIG_TEMPLATE_NAMES.has(fileName.toLowerCase()))
|
|
168
|
+
return undefined;
|
|
169
|
+
const extension = normalizedExtension(fileName);
|
|
170
|
+
if (!ISSUE_TEMPLATE_EXTENSIONS.has(extension))
|
|
171
|
+
return undefined;
|
|
172
|
+
if (extension === ".md")
|
|
173
|
+
return { type: "issue-markdown" };
|
|
174
|
+
return { type: "issue-form" };
|
|
175
|
+
}
|
|
176
|
+
function classifyPullRequestTemplate(fileName) {
|
|
177
|
+
return normalizedExtension(fileName) === ".md" ? { type: "pull-request" } : undefined;
|
|
178
|
+
}
|
|
179
|
+
function normalizedExtension(fileName) {
|
|
180
|
+
return path.extname(fileName).toLowerCase();
|
|
181
|
+
}
|
|
182
|
+
function createIdentity(repositoryRoot, absolutePath, type) {
|
|
183
|
+
const relativePath = toRepositoryPath(repositoryRoot, absolutePath);
|
|
184
|
+
const fileName = path.basename(absolutePath);
|
|
185
|
+
const extension = path.extname(fileName);
|
|
186
|
+
const name = type === "pull-request-default" ? "default" : fileName.slice(0, -extension.length);
|
|
187
|
+
if (name.trim().length === 0) {
|
|
188
|
+
throw new TemplateFilesystemError(`Template filename has no selectable name: ${absolutePath}.`, {
|
|
189
|
+
path: absolutePath,
|
|
190
|
+
reason: "empty template name",
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const identity = {
|
|
194
|
+
id: `${type}:${relativePath}`,
|
|
195
|
+
type,
|
|
196
|
+
kind: type.startsWith("issue") ? "issue" : "pull-request",
|
|
197
|
+
name,
|
|
198
|
+
path: relativePath,
|
|
199
|
+
};
|
|
200
|
+
return Object.freeze(identity);
|
|
201
|
+
}
|
|
202
|
+
function toRepositoryPath(repositoryRoot, absolutePath) {
|
|
203
|
+
return path.relative(repositoryRoot, absolutePath).split(path.sep).join("/");
|
|
204
|
+
}
|
|
205
|
+
function createDiscoveryResult(repositoryRoot, templates) {
|
|
206
|
+
const sortedTemplates = [...templates].sort((left, right) => compareStrings(left.id, right.id));
|
|
207
|
+
assertUniqueIds(sortedTemplates);
|
|
208
|
+
const issueTemplates = sortedTemplates.filter((template) => template.kind === "issue");
|
|
209
|
+
const pullRequestTemplates = sortedTemplates.filter((template) => template.kind === "pull-request");
|
|
210
|
+
return Object.freeze({
|
|
211
|
+
repositoryRoot,
|
|
212
|
+
templates: Object.freeze(sortedTemplates),
|
|
213
|
+
issueTemplates: Object.freeze(issueTemplates),
|
|
214
|
+
pullRequestTemplates: Object.freeze(pullRequestTemplates),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function assertUniqueIds(templates) {
|
|
218
|
+
for (let index = 1; index < templates.length; index += 1) {
|
|
219
|
+
if (templates[index - 1]?.id === templates[index]?.id) {
|
|
220
|
+
const duplicate = templates[index];
|
|
221
|
+
throw new TemplateDiscoveryError("TEMPLATE_ID_CONFLICT", `Repository-native template identity is duplicated: ${duplicate?.id ?? "unknown"}.`, { candidates: duplicate === undefined ? [] : [duplicate] });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function emptyDiscovery(repositoryRoot) {
|
|
226
|
+
return createDiscoveryResult(repositoryRoot, []);
|
|
227
|
+
}
|
|
228
|
+
function selectFromCandidates(candidates, selector) {
|
|
229
|
+
if (selector === undefined)
|
|
230
|
+
return resolveSelection(candidates, selector, false);
|
|
231
|
+
if (typeof selector === "string") {
|
|
232
|
+
if (selector.trim().length === 0)
|
|
233
|
+
throw new InvalidTemplateSelectorError(selector);
|
|
234
|
+
const exactIdMatches = candidates.filter((candidate) => candidate.id === selector);
|
|
235
|
+
if (exactIdMatches.length > 0)
|
|
236
|
+
return resolveSelection(exactIdMatches, selector, false);
|
|
237
|
+
const exactPathMatches = candidates.filter((candidate) => candidate.path === selector);
|
|
238
|
+
if (exactPathMatches.length > 0)
|
|
239
|
+
return resolveSelection(exactPathMatches, selector, false);
|
|
240
|
+
const nameMatches = candidates.filter((candidate) => sameName(candidate.name, selector));
|
|
241
|
+
return resolveSelection(nameMatches, selector, true);
|
|
242
|
+
}
|
|
243
|
+
if (!isTemplateSelectorValue(selector))
|
|
244
|
+
throw new InvalidTemplateSelectorError(selector);
|
|
245
|
+
const entries = Object.entries(selector).filter(([, value]) => value !== undefined);
|
|
246
|
+
if (entries.length === 0)
|
|
247
|
+
throw new InvalidTemplateSelectorError(selector);
|
|
248
|
+
const matches = candidates.filter((candidate) => matchesSelector(candidate, selector));
|
|
249
|
+
return resolveSelection(matches, selector, "name" in selector && selector.name !== undefined);
|
|
250
|
+
}
|
|
251
|
+
function matchesSelector(candidate, selector) {
|
|
252
|
+
if (selector.id !== undefined && candidate.id !== selector.id)
|
|
253
|
+
return false;
|
|
254
|
+
if (selector.type !== undefined && candidate.type !== selector.type)
|
|
255
|
+
return false;
|
|
256
|
+
if (selector.kind !== undefined && candidate.kind !== selector.kind)
|
|
257
|
+
return false;
|
|
258
|
+
if (selector.name !== undefined && !sameName(candidate.name, selector.name))
|
|
259
|
+
return false;
|
|
260
|
+
if (selector.path !== undefined && candidate.path !== selector.path)
|
|
261
|
+
return false;
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
function resolveSelection(candidates, selector, selectedByName) {
|
|
265
|
+
if (candidates.length === 0)
|
|
266
|
+
throw new TemplateNotFoundError(selector, candidates);
|
|
267
|
+
if (candidates.length === 1)
|
|
268
|
+
return candidates[0];
|
|
269
|
+
if (selectedByName)
|
|
270
|
+
throw new TemplateNameConflictError(selector, candidates);
|
|
271
|
+
throw new TemplateSelectionAmbiguousError(selector, candidates);
|
|
272
|
+
}
|
|
273
|
+
function sameName(left, right) {
|
|
274
|
+
return canonicalName(left) === canonicalName(right);
|
|
275
|
+
}
|
|
276
|
+
function canonicalName(name) {
|
|
277
|
+
return name.normalize("NFC").toLocaleLowerCase("en-US");
|
|
278
|
+
}
|
|
279
|
+
function selectorLabel(selector) {
|
|
280
|
+
if (selector === undefined)
|
|
281
|
+
return "the default selection";
|
|
282
|
+
if (typeof selector === "string")
|
|
283
|
+
return JSON.stringify(selector);
|
|
284
|
+
const value = selector.id ?? selector.path ?? selector.name ?? selector.type ?? selector.kind;
|
|
285
|
+
return value === undefined ? "the requested selector" : JSON.stringify(value);
|
|
286
|
+
}
|
|
287
|
+
const TEMPLATE_SELECTOR_KEYS = new Set(["id", "type", "kind", "name", "path"]);
|
|
288
|
+
function isTemplateSelectorValue(value) {
|
|
289
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
290
|
+
return false;
|
|
291
|
+
const entries = Object.entries(value).filter(([, option]) => option !== undefined);
|
|
292
|
+
return (entries.length > 0 &&
|
|
293
|
+
entries.every(([key, option]) => TEMPLATE_SELECTOR_KEYS.has(key) && typeof option === "string" && option.trim().length > 0));
|
|
294
|
+
}
|
|
295
|
+
function compareStrings(left, right) {
|
|
296
|
+
if (left < right)
|
|
297
|
+
return -1;
|
|
298
|
+
if (left > right)
|
|
299
|
+
return 1;
|
|
300
|
+
return 0;
|
|
301
|
+
}
|
|
302
|
+
async function optionalDirectory(directory) {
|
|
303
|
+
const stats = await optionalStats(directory);
|
|
304
|
+
if (stats === undefined)
|
|
305
|
+
return false;
|
|
306
|
+
if (!stats.isDirectory()) {
|
|
307
|
+
throw new TemplateFilesystemError(`Expected a directory at ${directory}.`, {
|
|
308
|
+
path: directory,
|
|
309
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a directory",
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
function optionalDirectorySync(directory) {
|
|
315
|
+
const stats = optionalStatsSync(directory);
|
|
316
|
+
if (stats === undefined)
|
|
317
|
+
return false;
|
|
318
|
+
if (!stats.isDirectory()) {
|
|
319
|
+
throw new TemplateFilesystemError(`Expected a directory at ${directory}.`, {
|
|
320
|
+
path: directory,
|
|
321
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a directory",
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
async function optionalRegularFile(filePath) {
|
|
327
|
+
const stats = await optionalStats(filePath);
|
|
328
|
+
if (stats === undefined)
|
|
329
|
+
return false;
|
|
330
|
+
if (!stats.isFile()) {
|
|
331
|
+
throw new TemplateFilesystemError(`Expected a regular file at ${filePath}.`, {
|
|
332
|
+
path: filePath,
|
|
333
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a regular file",
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
function optionalRegularFileSync(filePath) {
|
|
339
|
+
const stats = optionalStatsSync(filePath);
|
|
340
|
+
if (stats === undefined)
|
|
341
|
+
return false;
|
|
342
|
+
if (!stats.isFile()) {
|
|
343
|
+
throw new TemplateFilesystemError(`Expected a regular file at ${filePath}.`, {
|
|
344
|
+
path: filePath,
|
|
345
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a regular file",
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
async function optionalStats(targetPath) {
|
|
351
|
+
try {
|
|
352
|
+
return await lstat(targetPath);
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
356
|
+
return undefined;
|
|
357
|
+
throw new TemplateFilesystemError(`Cannot inspect repository-native template path: ${targetPath}.`, {
|
|
358
|
+
path: targetPath,
|
|
359
|
+
reason: "filesystem access error",
|
|
360
|
+
}, error);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function optionalStatsSync(targetPath) {
|
|
364
|
+
try {
|
|
365
|
+
return lstatSync(targetPath);
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
369
|
+
return undefined;
|
|
370
|
+
throw new TemplateFilesystemError(`Cannot inspect repository-native template path: ${targetPath}.`, {
|
|
371
|
+
path: targetPath,
|
|
372
|
+
reason: "filesystem access error",
|
|
373
|
+
}, error);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
async function assertDirectory(directory, label) {
|
|
377
|
+
const stats = await optionalStats(directory);
|
|
378
|
+
if (stats === undefined) {
|
|
379
|
+
throw new TemplateFilesystemError(`Expected ${label} to exist at ${directory}.`, {
|
|
380
|
+
path: directory,
|
|
381
|
+
reason: "missing",
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
if (!stats.isDirectory()) {
|
|
385
|
+
throw new TemplateFilesystemError(`Expected ${label} to be a directory at ${directory}.`, {
|
|
386
|
+
path: directory,
|
|
387
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a directory",
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
function assertDirectorySync(directory, label) {
|
|
392
|
+
const stats = optionalStatsSync(directory);
|
|
393
|
+
if (stats === undefined) {
|
|
394
|
+
throw new TemplateFilesystemError(`Expected ${label} to exist at ${directory}.`, {
|
|
395
|
+
path: directory,
|
|
396
|
+
reason: "missing",
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
if (!stats.isDirectory()) {
|
|
400
|
+
throw new TemplateFilesystemError(`Expected ${label} to be a directory at ${directory}.`, {
|
|
401
|
+
path: directory,
|
|
402
|
+
reason: stats.isSymbolicLink() ? "symbolic link" : "not a directory",
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async function readDirectory(directory) {
|
|
407
|
+
try {
|
|
408
|
+
return await readdir(directory, { withFileTypes: true });
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
throw new TemplateFilesystemError(`Cannot read repository-native template directory: ${directory}.`, {
|
|
412
|
+
path: directory,
|
|
413
|
+
reason: "filesystem access error",
|
|
414
|
+
}, error);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function readDirectorySync(directory) {
|
|
418
|
+
try {
|
|
419
|
+
return readdirSync(directory, { withFileTypes: true });
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
throw new TemplateFilesystemError(`Cannot read repository-native template directory: ${directory}.`, {
|
|
423
|
+
path: directory,
|
|
424
|
+
reason: "filesystem access error",
|
|
425
|
+
}, error);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
function isNodeError(error) {
|
|
429
|
+
return error instanceof Error && "code" in error;
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=template-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-discovery.js","sourceRoot":"","sources":["../src/template-discovery.ts"],"names":[],"mappings":"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"}
|
package/gh-inari
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
|
|
6
|
+
const launcherPath = realpathSync(fileURLToPath(import.meta.url));
|
|
7
|
+
const cliPath = path.join(path.dirname(launcherPath), "dist", "index.js");
|
|
8
|
+
try {
|
|
9
|
+
const { runCli } = await import(pathToFileURL(cliPath).href);
|
|
10
|
+
process.exitCode = await runCli(process.argv.slice(2));
|
|
11
|
+
} catch (error) {
|
|
12
|
+
if (error instanceof Error && error.code === "ERR_MODULE_NOT_FOUND") {
|
|
13
|
+
console.error("gh-inari: module not found. Please build the package (npm run build) or reinstall it.");
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
} else {
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gh-inari",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A deterministic GitHub CLI extension for compiling, validating, rendering, and creating repository-governed Issues and pull requests.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"gh-inari": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./contract": {
|
|
15
|
+
"types": "./dist/contract/index.d.ts",
|
|
16
|
+
"import": "./dist/contract/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./pull-request-template": {
|
|
19
|
+
"types": "./dist/pull-request-template.d.ts",
|
|
20
|
+
"import": "./dist/pull-request-template.js"
|
|
21
|
+
},
|
|
22
|
+
"./artifact": {
|
|
23
|
+
"types": "./dist/artifact.d.ts",
|
|
24
|
+
"import": "./dist/artifact.js"
|
|
25
|
+
},
|
|
26
|
+
"./pr-policy": {
|
|
27
|
+
"types": "./dist/pr-policy.d.ts",
|
|
28
|
+
"import": "./dist/pr-policy.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"gh-inari",
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
],
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && node scripts/chmod-bin.mjs",
|
|
39
|
+
"start": "node dist/index.js",
|
|
40
|
+
"test": "node --test --import tsx \"src/*.test.ts\" \"src/**/*.test.ts\" \"scripts/**/*.test.mjs\"",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"lint": "eslint 'src/**/*.ts' 'scripts/**/*.mjs' 'eslint.config.mjs'",
|
|
43
|
+
"format": "prettier --write .",
|
|
44
|
+
"format:check": "prettier --check .",
|
|
45
|
+
"smoke-test": "node scripts/smoke-test.mjs",
|
|
46
|
+
"test:package": "pnpm run build && node scripts/run-package-suite.mjs",
|
|
47
|
+
"governance:actions": "node scripts/validate-actions.mjs",
|
|
48
|
+
"verify": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm test && pnpm run governance:actions && pnpm run test:package",
|
|
49
|
+
"prepack": "pnpm run build",
|
|
50
|
+
"prepublishOnly": "pnpm run typecheck && pnpm test"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"yaml": "^2.9.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^26.1.2",
|
|
57
|
+
"eslint": "10.8.1",
|
|
58
|
+
"prettier": "3.9.6",
|
|
59
|
+
"tsx": "^4.19.4",
|
|
60
|
+
"typescript": "^6.0.3",
|
|
61
|
+
"typescript-eslint": "8.66.0"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=22.13"
|
|
65
|
+
},
|
|
66
|
+
"packageManager": "pnpm@11.18.0",
|
|
67
|
+
"publishConfig": {
|
|
68
|
+
"access": "public",
|
|
69
|
+
"registry": "https://registry.npmjs.org/"
|
|
70
|
+
},
|
|
71
|
+
"license": "MIT",
|
|
72
|
+
"repository": {
|
|
73
|
+
"type": "git",
|
|
74
|
+
"url": "git+https://github.com/yohn-jp/inari.git"
|
|
75
|
+
},
|
|
76
|
+
"homepage": "https://github.com/yohn-jp/inari#readme",
|
|
77
|
+
"bugs": {
|
|
78
|
+
"url": "https://github.com/yohn-jp/inari/issues"
|
|
79
|
+
},
|
|
80
|
+
"keywords": [
|
|
81
|
+
"github",
|
|
82
|
+
"gh",
|
|
83
|
+
"cli",
|
|
84
|
+
"issue",
|
|
85
|
+
"pull-request",
|
|
86
|
+
"templates",
|
|
87
|
+
"governance",
|
|
88
|
+
"repository-governance"
|
|
89
|
+
],
|
|
90
|
+
"main": "dist/index.js",
|
|
91
|
+
"author": ""
|
|
92
|
+
}
|