github-weekly-reporter 0.3.0 → 0.3.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.
- package/README.md +53 -79
- package/dist/cli/commands/deploy.d.ts +1 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -1
- package/dist/cli/commands/deploy.js +1 -1
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/fetch.d.ts +11 -0
- package/dist/cli/commands/fetch.d.ts.map +1 -1
- package/dist/cli/commands/fetch.js +7 -7
- package/dist/cli/commands/fetch.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +11 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +1 -5
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/render.js +1 -1
- package/dist/cli/commands/render.js.map +1 -1
- package/dist/cli/commands/setup/constants.d.ts +11 -0
- package/dist/cli/commands/setup/constants.d.ts.map +1 -0
- package/dist/cli/commands/setup/constants.js +42 -0
- package/dist/cli/commands/setup/constants.js.map +1 -0
- package/dist/cli/commands/setup/github-api.d.ts +13 -0
- package/dist/cli/commands/setup/github-api.d.ts.map +1 -0
- package/dist/cli/commands/setup/github-api.js +133 -0
- package/dist/cli/commands/setup/github-api.js.map +1 -0
- package/dist/cli/commands/setup/validate-model.d.ts +6 -0
- package/dist/cli/commands/setup/validate-model.d.ts.map +1 -0
- package/dist/cli/commands/setup/validate-model.js +74 -0
- package/dist/cli/commands/setup/validate-model.js.map +1 -0
- package/dist/cli/commands/setup/workflows.d.ts +25 -0
- package/dist/cli/commands/setup/workflows.d.ts.map +1 -0
- package/dist/cli/commands/setup/workflows.js +169 -0
- package/dist/cli/commands/setup/workflows.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +2 -0
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +6 -410
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +7 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/collector/date-range.d.ts +6 -0
- package/dist/collector/date-range.d.ts.map +1 -1
- package/dist/collector/date-range.js +25 -1
- package/dist/collector/date-range.js.map +1 -1
- package/dist/collector/fetch-events.d.ts +2 -1
- package/dist/collector/fetch-events.d.ts.map +1 -1
- package/dist/collector/fetch-events.js +4 -2
- package/dist/collector/fetch-events.js.map +1 -1
- package/dist/collector/fetch-repo-prs.d.ts +1 -0
- package/dist/collector/fetch-repo-prs.d.ts.map +1 -1
- package/dist/collector/fetch-repo-prs.js +4 -2
- package/dist/collector/fetch-repo-prs.js.map +1 -1
- package/dist/deployer/index-page.d.ts.map +1 -1
- package/dist/deployer/index-page.js +5 -404
- package/dist/deployer/index-page.js.map +1 -1
- package/dist/deployer/index.d.ts +1 -0
- package/dist/deployer/index.d.ts.map +1 -1
- package/dist/deployer/index.js +2 -3
- package/dist/deployer/index.js.map +1 -1
- package/dist/deployer/week.d.ts +1 -0
- package/dist/deployer/week.d.ts.map +1 -1
- package/dist/deployer/week.js +14 -10
- package/dist/deployer/week.js.map +1 -1
- package/dist/llm/index.d.ts +2 -1
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +3 -3
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -1
- package/dist/llm/providers/anthropic.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.js +2 -1
- package/dist/llm/providers/anthropic.js.map +1 -1
- package/dist/llm/providers/grok.d.ts +1 -1
- package/dist/llm/providers/grok.d.ts.map +1 -1
- package/dist/llm/providers/grok.js +3 -2
- package/dist/llm/providers/grok.js.map +1 -1
- package/dist/llm/providers/groq.d.ts +1 -1
- package/dist/llm/providers/groq.d.ts.map +1 -1
- package/dist/llm/providers/groq.js +3 -2
- package/dist/llm/providers/groq.js.map +1 -1
- package/dist/llm/providers/openai.d.ts +1 -1
- package/dist/llm/providers/openai.d.ts.map +1 -1
- package/dist/llm/providers/openai.js +3 -2
- package/dist/llm/providers/openai.js.map +1 -1
- package/dist/llm/providers/openrouter.d.ts +1 -1
- package/dist/llm/providers/openrouter.d.ts.map +1 -1
- package/dist/llm/providers/openrouter.js +3 -2
- package/dist/llm/providers/openrouter.js.map +1 -1
- package/dist/llm/types.d.ts +2 -0
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +2 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/renderer/index.d.ts +1 -0
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +1 -0
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/themes.d.ts.map +1 -1
- package/dist/renderer/themes.js +0 -1
- package/dist/renderer/themes.js.map +1 -1
- package/package.json +22 -9
- package/src/renderer/templates/index-page.hbs +403 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// GitHub API helpers and repository management
|
|
2
|
+
const ghHeaders = (token) => ({
|
|
3
|
+
Authorization: `Bearer ${token}`,
|
|
4
|
+
Accept: "application/vnd.github+json",
|
|
5
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
6
|
+
"Content-Type": "application/json",
|
|
7
|
+
});
|
|
8
|
+
const ghFetch = async (token, method, path, body) => fetch(`https://api.github.com${path}`, {
|
|
9
|
+
method,
|
|
10
|
+
headers: ghHeaders(token),
|
|
11
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
12
|
+
});
|
|
13
|
+
export const ghGet = (token, path) => ghFetch(token, "GET", path);
|
|
14
|
+
export const ghPost = (token, path, body) => ghFetch(token, "POST", path, body);
|
|
15
|
+
export const ghPut = (token, path, body) => ghFetch(token, "PUT", path, body);
|
|
16
|
+
// ── Token validation ─────────────────────────────────────────
|
|
17
|
+
export const validateToken = async (token) => {
|
|
18
|
+
const res = await ghGet(token, "/user");
|
|
19
|
+
if (res.status === 401) {
|
|
20
|
+
throw new Error("Invalid or expired token.\n\n" +
|
|
21
|
+
" Create a token at: https://github.com/settings/tokens\n\n" +
|
|
22
|
+
" Classic PAT scopes needed: repo, workflow\n" +
|
|
23
|
+
" Fine-grained PAT:\n" +
|
|
24
|
+
" Repository access: All repositories\n" +
|
|
25
|
+
" Permissions: Actions, Administration, Contents,\n" +
|
|
26
|
+
" Pages, Secrets, Workflows (all Read & Write)");
|
|
27
|
+
}
|
|
28
|
+
if (!res.ok)
|
|
29
|
+
throw new Error(`GitHub API error: ${res.status}`);
|
|
30
|
+
const { login } = (await res.json());
|
|
31
|
+
const scopeHeader = res.headers.get("x-oauth-scopes");
|
|
32
|
+
// Fine-grained tokens do not return x-oauth-scopes header.
|
|
33
|
+
// We cannot validate permissions upfront, so we validate lazily
|
|
34
|
+
// when each API call is made and provide clear error messages.
|
|
35
|
+
if (scopeHeader === null) {
|
|
36
|
+
return { login, tokenType: "fine-grained" };
|
|
37
|
+
}
|
|
38
|
+
// Classic PAT: validate scopes
|
|
39
|
+
const scopes = scopeHeader.split(",").map((s) => s.trim());
|
|
40
|
+
const missing = ["repo", "workflow"].filter((s) => !scopes.includes(s));
|
|
41
|
+
if (missing.length > 0) {
|
|
42
|
+
throw new Error(`Token is missing required scopes: ${missing.join(", ")}\n\n` +
|
|
43
|
+
" Create a new token at: https://github.com/settings/tokens/new?scopes=repo,workflow\n" +
|
|
44
|
+
" Required scopes: repo, workflow");
|
|
45
|
+
}
|
|
46
|
+
return { login, tokenType: "classic" };
|
|
47
|
+
};
|
|
48
|
+
// ── Secret encryption (sealed box via libsodium) ────────────
|
|
49
|
+
export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
50
|
+
export const setRepoSecret = async (token, repo, name, value) => {
|
|
51
|
+
const { default: _sodium } = await import("libsodium-wrappers");
|
|
52
|
+
await _sodium.ready;
|
|
53
|
+
// Retry up to 3 times with backoff (new repos may need time to propagate)
|
|
54
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
55
|
+
const keyRes = await ghGet(token, `/repos/${repo}/actions/secrets/public-key`);
|
|
56
|
+
if (!keyRes.ok) {
|
|
57
|
+
if (attempt < 2) {
|
|
58
|
+
await sleep(3000 * (attempt + 1));
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const { key, key_id } = (await keyRes.json());
|
|
64
|
+
const keyBytes = _sodium.from_base64(key, _sodium.base64_variants.ORIGINAL);
|
|
65
|
+
const encrypted = _sodium.crypto_box_seal(new TextEncoder().encode(value), keyBytes);
|
|
66
|
+
const encryptedB64 = _sodium.to_base64(encrypted, _sodium.base64_variants.ORIGINAL);
|
|
67
|
+
const res = await ghPut(token, `/repos/${repo}/actions/secrets/${name}`, {
|
|
68
|
+
encrypted_value: encryptedB64,
|
|
69
|
+
key_id,
|
|
70
|
+
});
|
|
71
|
+
if (res.ok)
|
|
72
|
+
return true;
|
|
73
|
+
const body = await res.text().catch(() => "");
|
|
74
|
+
console.log(` Attempt ${attempt + 1}/3 failed: ${res.status} ${body.slice(0, 200)}`);
|
|
75
|
+
if (attempt < 2) {
|
|
76
|
+
await sleep(3000 * (attempt + 1));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
};
|
|
83
|
+
// ── Repository management ────────────────────────────────────
|
|
84
|
+
export const ensureRepo = async (token, fullRepo) => {
|
|
85
|
+
const res = await ghGet(token, `/repos/${fullRepo}`);
|
|
86
|
+
if (res.ok)
|
|
87
|
+
return false;
|
|
88
|
+
const [owner, name] = fullRepo.split("/");
|
|
89
|
+
const { login } = (await (await ghGet(token, "/user")).json());
|
|
90
|
+
const createRes = owner === login
|
|
91
|
+
? await ghPost(token, "/user/repos", {
|
|
92
|
+
name,
|
|
93
|
+
auto_init: true,
|
|
94
|
+
private: false,
|
|
95
|
+
description: "Weekly GitHub activity reports",
|
|
96
|
+
})
|
|
97
|
+
: await ghPost(token, `/orgs/${owner}/repos`, {
|
|
98
|
+
name,
|
|
99
|
+
auto_init: true,
|
|
100
|
+
private: false,
|
|
101
|
+
description: "Weekly GitHub activity reports",
|
|
102
|
+
});
|
|
103
|
+
if (!createRes.ok) {
|
|
104
|
+
const body = await createRes.text();
|
|
105
|
+
throw new Error(`Failed to create ${fullRepo}: ${createRes.status}\n ${body}`);
|
|
106
|
+
}
|
|
107
|
+
// Wait for repo to be ready
|
|
108
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
export const addFileToRepo = async (token, repo, path, content, message) => {
|
|
112
|
+
const existing = await ghGet(token, `/repos/${repo}/contents/${path}`);
|
|
113
|
+
const sha = existing.ok
|
|
114
|
+
? (await existing.json()).sha
|
|
115
|
+
: undefined;
|
|
116
|
+
const res = await ghPut(token, `/repos/${repo}/contents/${path}`, {
|
|
117
|
+
message,
|
|
118
|
+
content: btoa(unescape(encodeURIComponent(content))),
|
|
119
|
+
...(sha ? { sha } : {}),
|
|
120
|
+
});
|
|
121
|
+
if (!res.ok) {
|
|
122
|
+
throw new Error(`Failed to add ${path}: ${res.status}`);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
export const enablePages = async (token, repo) => {
|
|
126
|
+
// Enable Pages from main branch, /output directory (may already be enabled)
|
|
127
|
+
await ghPost(token, `/repos/${repo}/pages`, {
|
|
128
|
+
source: { branch: "gh-pages", path: "/" },
|
|
129
|
+
});
|
|
130
|
+
const [owner, name] = repo.split("/");
|
|
131
|
+
return `https://${owner}.github.io/${name}`;
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=github-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup/github-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-model.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup/validate-model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,aAAa,GACxB,UAAU,WAAW,EACrB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2E5C,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Validate model by making a minimal API call
|
|
2
|
+
export const validateModel = async (provider, apiKey, model) => {
|
|
3
|
+
const openaiCompatible = (baseURL) => fetch(`${baseURL}/chat/completions`, {
|
|
4
|
+
method: "POST",
|
|
5
|
+
headers: {
|
|
6
|
+
Authorization: `Bearer ${apiKey}`,
|
|
7
|
+
"Content-Type": "application/json",
|
|
8
|
+
},
|
|
9
|
+
body: JSON.stringify({
|
|
10
|
+
model,
|
|
11
|
+
messages: [{ role: "user", content: "hi" }],
|
|
12
|
+
max_tokens: 1,
|
|
13
|
+
}),
|
|
14
|
+
});
|
|
15
|
+
try {
|
|
16
|
+
let res;
|
|
17
|
+
switch (provider) {
|
|
18
|
+
case "openai":
|
|
19
|
+
res = await openaiCompatible("https://api.openai.com/v1");
|
|
20
|
+
break;
|
|
21
|
+
case "groq":
|
|
22
|
+
res = await openaiCompatible("https://api.groq.com/openai/v1");
|
|
23
|
+
break;
|
|
24
|
+
case "openrouter":
|
|
25
|
+
res = await openaiCompatible("https://openrouter.ai/api/v1");
|
|
26
|
+
break;
|
|
27
|
+
case "grok":
|
|
28
|
+
res = await openaiCompatible("https://api.x.ai/v1");
|
|
29
|
+
break;
|
|
30
|
+
case "anthropic":
|
|
31
|
+
res = await fetch("https://api.anthropic.com/v1/messages", {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"x-api-key": apiKey,
|
|
35
|
+
"anthropic-version": "2023-06-01",
|
|
36
|
+
"Content-Type": "application/json",
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify({
|
|
39
|
+
model,
|
|
40
|
+
messages: [{ role: "user", content: "hi" }],
|
|
41
|
+
max_tokens: 1,
|
|
42
|
+
}),
|
|
43
|
+
});
|
|
44
|
+
break;
|
|
45
|
+
case "gemini":
|
|
46
|
+
res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`, {
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: { "Content-Type": "application/json" },
|
|
49
|
+
body: JSON.stringify({
|
|
50
|
+
contents: [{ parts: [{ text: "hi" }] }],
|
|
51
|
+
generationConfig: { maxOutputTokens: 1 },
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
break;
|
|
55
|
+
default:
|
|
56
|
+
return { valid: true };
|
|
57
|
+
}
|
|
58
|
+
if (res.ok)
|
|
59
|
+
return { valid: true };
|
|
60
|
+
const body = await res.text();
|
|
61
|
+
// 404 or "model not found" means wrong model name
|
|
62
|
+
if (res.status === 404 || body.toLowerCase().includes("model")) {
|
|
63
|
+
return { valid: false, error: `Model "${model}" not found (${res.status})` };
|
|
64
|
+
}
|
|
65
|
+
// Rate limit or other non-model errors are fine (model exists)
|
|
66
|
+
if (res.status === 429)
|
|
67
|
+
return { valid: true };
|
|
68
|
+
return { valid: false, error: `API error: ${res.status} ${body.slice(0, 200)}` };
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
return { valid: false, error: `Connection error: ${e instanceof Error ? e.message : String(e)}` };
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=validate-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-model.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup/validate-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LLMProvider, Language } from "../../../types.js";
|
|
2
|
+
export declare const LLM_SECRET_NAMES: Record<string, string>;
|
|
3
|
+
export declare const midnightCronUTC: (timezone: string) => string;
|
|
4
|
+
export type WorkflowOpts = {
|
|
5
|
+
username: string;
|
|
6
|
+
language: Language;
|
|
7
|
+
timezone: string;
|
|
8
|
+
siteTitle: string;
|
|
9
|
+
llmProvider?: LLMProvider;
|
|
10
|
+
llmModel?: string;
|
|
11
|
+
llmSecretName?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const buildDailyWorkflow: (opts: WorkflowOpts) => string;
|
|
14
|
+
export declare const buildWeeklyWorkflow: (opts: WorkflowOpts) => string;
|
|
15
|
+
export declare const buildReadme: (opts: {
|
|
16
|
+
siteTitle: string;
|
|
17
|
+
username: string;
|
|
18
|
+
repo: string;
|
|
19
|
+
pagesUrl: string;
|
|
20
|
+
language: Language;
|
|
21
|
+
timezone: string;
|
|
22
|
+
llmProvider?: LLMProvider;
|
|
23
|
+
llmModel?: string;
|
|
24
|
+
}) => string;
|
|
25
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup/workflows.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI/D,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOnD,CAAC;AAeF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,MAclD,CAAC;AAIF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,YAAY,KAAG,MA8BvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,YAAY,KAAG,MAoDxD,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,MAAM;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,KAAG,MAwDH,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Workflow YAML templates and README generation
|
|
2
|
+
// ── Constants ────────────────────────────────────────────────
|
|
3
|
+
export const LLM_SECRET_NAMES = {
|
|
4
|
+
openai: "OPENAI_API_KEY",
|
|
5
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
6
|
+
gemini: "GEMINI_API_KEY",
|
|
7
|
+
openrouter: "OPENROUTER_API_KEY",
|
|
8
|
+
groq: "GROQ_API_KEY",
|
|
9
|
+
grok: "GROK_API_KEY",
|
|
10
|
+
};
|
|
11
|
+
const LLM_API_KEY_INPUT_NAMES = {
|
|
12
|
+
openai: "openai-api-key",
|
|
13
|
+
anthropic: "anthropic-api-key",
|
|
14
|
+
gemini: "gemini-api-key",
|
|
15
|
+
openrouter: "openrouter-api-key",
|
|
16
|
+
groq: "groq-api-key",
|
|
17
|
+
grok: "grok-api-key",
|
|
18
|
+
};
|
|
19
|
+
// ── Cron calculation from timezone ───────────────────────────
|
|
20
|
+
// Daily fetch should run at midnight in the user's timezone.
|
|
21
|
+
// GitHub Actions cron is always UTC, so we calculate the offset.
|
|
22
|
+
export const midnightCronUTC = (timezone) => {
|
|
23
|
+
const now = new Date();
|
|
24
|
+
const utcMidnight = new Date(now.toLocaleString("en-US", { timeZone: "UTC" }));
|
|
25
|
+
const localMidnight = new Date(now.toLocaleString("en-US", { timeZone: timezone }));
|
|
26
|
+
const offsetMinutes = Math.round((utcMidnight.getTime() - localMidnight.getTime()) / 60000);
|
|
27
|
+
const utcHour = ((offsetMinutes / 60 + 24) % 24) | 0;
|
|
28
|
+
const utcMinute = ((offsetMinutes % 60) + 60) % 60;
|
|
29
|
+
return `${utcMinute} ${utcHour} * * *`;
|
|
30
|
+
};
|
|
31
|
+
export const buildDailyWorkflow = (opts) => {
|
|
32
|
+
const cron = midnightCronUTC(opts.timezone);
|
|
33
|
+
return `# Generated by: github-weekly-reporter setup
|
|
34
|
+
# Docs: https://github.com/deariary/github-weekly-reporter
|
|
35
|
+
|
|
36
|
+
name: Daily Fetch
|
|
37
|
+
|
|
38
|
+
on:
|
|
39
|
+
schedule:
|
|
40
|
+
- cron: '${cron}' # midnight ${opts.timezone}
|
|
41
|
+
workflow_dispatch:
|
|
42
|
+
|
|
43
|
+
permissions:
|
|
44
|
+
contents: write
|
|
45
|
+
|
|
46
|
+
jobs:
|
|
47
|
+
daily:
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v4
|
|
51
|
+
|
|
52
|
+
- uses: deariary/github-weekly-reporter@main
|
|
53
|
+
with:
|
|
54
|
+
github-token: \${{ secrets.GH_PAT }}
|
|
55
|
+
username: '${opts.username}'
|
|
56
|
+
mode: 'daily'
|
|
57
|
+
language: '${opts.language}'
|
|
58
|
+
timezone: '${opts.timezone}'
|
|
59
|
+
`;
|
|
60
|
+
};
|
|
61
|
+
export const buildWeeklyWorkflow = (opts) => {
|
|
62
|
+
// Run 1 hour after daily fetch, Monday only
|
|
63
|
+
const dailyCron = midnightCronUTC(opts.timezone);
|
|
64
|
+
const [minute, hour] = dailyCron.split(" ").map(Number);
|
|
65
|
+
const weeklyHour = (hour + 1) % 24;
|
|
66
|
+
const weeklyCron = `${minute} ${weeklyHour} * * 1`;
|
|
67
|
+
const llmInputs = opts.llmProvider && opts.llmModel && opts.llmSecretName
|
|
68
|
+
? ` llm-provider: '${opts.llmProvider}'
|
|
69
|
+
llm-model: '${opts.llmModel}'
|
|
70
|
+
${LLM_API_KEY_INPUT_NAMES[opts.llmProvider]}: \${{ secrets.${opts.llmSecretName} }}`
|
|
71
|
+
: "";
|
|
72
|
+
return `# Generated by: github-weekly-reporter setup
|
|
73
|
+
# Docs: https://github.com/deariary/github-weekly-reporter
|
|
74
|
+
|
|
75
|
+
name: Weekly Report
|
|
76
|
+
|
|
77
|
+
on:
|
|
78
|
+
schedule:
|
|
79
|
+
- cron: '${weeklyCron}' # Monday, 1 hour after daily fetch (${opts.timezone})
|
|
80
|
+
workflow_dispatch:
|
|
81
|
+
inputs:
|
|
82
|
+
date:
|
|
83
|
+
description: 'Target date (YYYY-MM-DD, default: today)'
|
|
84
|
+
required: false
|
|
85
|
+
type: string
|
|
86
|
+
|
|
87
|
+
permissions:
|
|
88
|
+
contents: write
|
|
89
|
+
pages: write
|
|
90
|
+
|
|
91
|
+
env:
|
|
92
|
+
SITE_TITLE: '${opts.siteTitle}'
|
|
93
|
+
|
|
94
|
+
jobs:
|
|
95
|
+
weekly:
|
|
96
|
+
runs-on: ubuntu-latest
|
|
97
|
+
steps:
|
|
98
|
+
- uses: actions/checkout@v4
|
|
99
|
+
|
|
100
|
+
- uses: deariary/github-weekly-reporter@main
|
|
101
|
+
with:
|
|
102
|
+
github-token: \${{ secrets.GH_PAT }}
|
|
103
|
+
username: '${opts.username}'
|
|
104
|
+
mode: 'weekly'
|
|
105
|
+
language: '${opts.language}'
|
|
106
|
+
timezone: '${opts.timezone}'
|
|
107
|
+
date: \${{ inputs.date }}
|
|
108
|
+
${llmInputs}
|
|
109
|
+
`;
|
|
110
|
+
};
|
|
111
|
+
// ── README template ──────────────────────────────────────────
|
|
112
|
+
export const buildReadme = (opts) => `# ${opts.siteTitle}
|
|
113
|
+
|
|
114
|
+
Weekly GitHub activity reports for [@${opts.username}](https://github.com/${opts.username}), powered by [github-weekly-reporter](https://github.com/deariary/github-weekly-reporter).
|
|
115
|
+
|
|
116
|
+
## Live Reports
|
|
117
|
+
|
|
118
|
+
${opts.pagesUrl}
|
|
119
|
+
|
|
120
|
+
## How It Works
|
|
121
|
+
|
|
122
|
+
1. **Daily** (automatic): A scheduled workflow collects your GitHub events at midnight (${opts.timezone}).
|
|
123
|
+
2. **Weekly** (manual): Trigger the workflow with \`mode: weekly\` from the [Actions tab](https://github.com/${opts.repo}/actions) to generate a full report${opts.llmProvider ? " with AI narrative" : ""}.
|
|
124
|
+
3. The report is deployed to GitHub Pages automatically.
|
|
125
|
+
|
|
126
|
+
## Configuration
|
|
127
|
+
|
|
128
|
+
Edit \`.github/workflows/weekly-report.yml\` to change:
|
|
129
|
+
|
|
130
|
+
| Setting | Current | Description |
|
|
131
|
+
|---------|---------|-------------|
|
|
132
|
+
| \`username\` | \`${opts.username}\` | GitHub user to report on |
|
|
133
|
+
| \`language\` | \`${opts.language}\` | Report language (en, ja, zh-CN, zh-TW, ko, es, fr, de, pt, ru) |
|
|
134
|
+
| \`timezone\` | \`${opts.timezone}\` | IANA timezone for date calculations |
|
|
135
|
+
| \`SITE_TITLE\` | \`${opts.siteTitle}\` | Site title in the header and hero |
|
|
136
|
+
${opts.llmProvider ? `| \`llm-provider\` | \`${opts.llmProvider}\` | LLM provider for AI narrative |\n| \`llm-model\` | \`${opts.llmModel}\` | Model name |\n` : ""}
|
|
137
|
+
## Base URL
|
|
138
|
+
|
|
139
|
+
The report's canonical URL, OG images, and sitemap are generated using \`BASE_URL\`.
|
|
140
|
+
By default this is derived automatically from the repository name:
|
|
141
|
+
|
|
142
|
+
\`\`\`
|
|
143
|
+
https://${opts.repo.split("/")[0]}.github.io/${opts.repo.split("/")[1]}
|
|
144
|
+
\`\`\`
|
|
145
|
+
|
|
146
|
+
If you use a **custom domain**, add \`BASE_URL\` to the workflow env:
|
|
147
|
+
|
|
148
|
+
\`\`\`yaml
|
|
149
|
+
env:
|
|
150
|
+
SITE_TITLE: '${opts.siteTitle}'
|
|
151
|
+
BASE_URL: 'https://your-custom-domain.com'
|
|
152
|
+
\`\`\`
|
|
153
|
+
|
|
154
|
+
Then configure the custom domain in **Settings > Pages > Custom domain**.
|
|
155
|
+
|
|
156
|
+
## Changing the LLM API Key
|
|
157
|
+
|
|
158
|
+
1. Go to **Settings > Secrets and variables > Actions**
|
|
159
|
+
2. Update the \`${opts.llmProvider ? LLM_SECRET_NAMES[opts.llmProvider] : "LLM_API_KEY"}\` secret
|
|
160
|
+
|
|
161
|
+
## Manual Report Generation
|
|
162
|
+
|
|
163
|
+
Go to [Actions](https://github.com/${opts.repo}/actions), click **Weekly Report**, then **Run workflow** with \`mode: weekly\`.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
Supported by [deariary](https://deariary.com)
|
|
168
|
+
`;
|
|
169
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
export { midnightCronUTC, buildDailyWorkflow, buildWeeklyWorkflow } from "./setup/workflows.js";
|
|
3
|
+
export type { WorkflowOpts } from "./setup/workflows.js";
|
|
2
4
|
export declare const registerSetup: (program: Command) => void;
|
|
3
5
|
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChG,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAkWzD,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,IAmBhD,CAAC"}
|