github-weekly-reporter 0.2.9 → 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.
Files changed (103) hide show
  1. package/README.md +55 -79
  2. package/dist/cli/commands/deploy.d.ts +1 -0
  3. package/dist/cli/commands/deploy.d.ts.map +1 -1
  4. package/dist/cli/commands/deploy.js +1 -1
  5. package/dist/cli/commands/deploy.js.map +1 -1
  6. package/dist/cli/commands/fetch.d.ts +11 -0
  7. package/dist/cli/commands/fetch.d.ts.map +1 -1
  8. package/dist/cli/commands/fetch.js +7 -7
  9. package/dist/cli/commands/fetch.js.map +1 -1
  10. package/dist/cli/commands/generate.d.ts +11 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +1 -5
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/render.d.ts.map +1 -1
  15. package/dist/cli/commands/render.js +14 -3
  16. package/dist/cli/commands/render.js.map +1 -1
  17. package/dist/cli/commands/setup/constants.d.ts +11 -0
  18. package/dist/cli/commands/setup/constants.d.ts.map +1 -0
  19. package/dist/cli/commands/setup/constants.js +42 -0
  20. package/dist/cli/commands/setup/constants.js.map +1 -0
  21. package/dist/cli/commands/setup/github-api.d.ts +13 -0
  22. package/dist/cli/commands/setup/github-api.d.ts.map +1 -0
  23. package/dist/cli/commands/setup/github-api.js +133 -0
  24. package/dist/cli/commands/setup/github-api.js.map +1 -0
  25. package/dist/cli/commands/setup/validate-model.d.ts +6 -0
  26. package/dist/cli/commands/setup/validate-model.d.ts.map +1 -0
  27. package/dist/cli/commands/setup/validate-model.js +74 -0
  28. package/dist/cli/commands/setup/validate-model.js.map +1 -0
  29. package/dist/cli/commands/setup/workflows.d.ts +25 -0
  30. package/dist/cli/commands/setup/workflows.d.ts.map +1 -0
  31. package/dist/cli/commands/setup/workflows.js +169 -0
  32. package/dist/cli/commands/setup/workflows.js.map +1 -0
  33. package/dist/cli/commands/setup.d.ts +2 -0
  34. package/dist/cli/commands/setup.d.ts.map +1 -1
  35. package/dist/cli/commands/setup.js +6 -410
  36. package/dist/cli/commands/setup.js.map +1 -1
  37. package/dist/cli/index.js +7 -1
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/collector/date-range.d.ts +6 -0
  40. package/dist/collector/date-range.d.ts.map +1 -1
  41. package/dist/collector/date-range.js +25 -1
  42. package/dist/collector/date-range.js.map +1 -1
  43. package/dist/collector/fetch-events.d.ts +2 -1
  44. package/dist/collector/fetch-events.d.ts.map +1 -1
  45. package/dist/collector/fetch-events.js +4 -2
  46. package/dist/collector/fetch-events.js.map +1 -1
  47. package/dist/collector/fetch-repo-prs.d.ts +1 -0
  48. package/dist/collector/fetch-repo-prs.d.ts.map +1 -1
  49. package/dist/collector/fetch-repo-prs.js +4 -2
  50. package/dist/collector/fetch-repo-prs.js.map +1 -1
  51. package/dist/deployer/index-page.d.ts +1 -1
  52. package/dist/deployer/index-page.d.ts.map +1 -1
  53. package/dist/deployer/index-page.js +14 -396
  54. package/dist/deployer/index-page.js.map +1 -1
  55. package/dist/deployer/index.d.ts +1 -0
  56. package/dist/deployer/index.d.ts.map +1 -1
  57. package/dist/deployer/index.js +2 -3
  58. package/dist/deployer/index.js.map +1 -1
  59. package/dist/deployer/week.d.ts +1 -0
  60. package/dist/deployer/week.d.ts.map +1 -1
  61. package/dist/deployer/week.js +14 -10
  62. package/dist/deployer/week.js.map +1 -1
  63. package/dist/llm/index.d.ts +2 -1
  64. package/dist/llm/index.d.ts.map +1 -1
  65. package/dist/llm/index.js +3 -3
  66. package/dist/llm/index.js.map +1 -1
  67. package/dist/llm/providers/anthropic.d.ts +1 -1
  68. package/dist/llm/providers/anthropic.d.ts.map +1 -1
  69. package/dist/llm/providers/anthropic.js +2 -1
  70. package/dist/llm/providers/anthropic.js.map +1 -1
  71. package/dist/llm/providers/grok.d.ts +1 -1
  72. package/dist/llm/providers/grok.d.ts.map +1 -1
  73. package/dist/llm/providers/grok.js +3 -2
  74. package/dist/llm/providers/grok.js.map +1 -1
  75. package/dist/llm/providers/groq.d.ts +1 -1
  76. package/dist/llm/providers/groq.d.ts.map +1 -1
  77. package/dist/llm/providers/groq.js +3 -2
  78. package/dist/llm/providers/groq.js.map +1 -1
  79. package/dist/llm/providers/openai.d.ts +1 -1
  80. package/dist/llm/providers/openai.d.ts.map +1 -1
  81. package/dist/llm/providers/openai.js +3 -2
  82. package/dist/llm/providers/openai.js.map +1 -1
  83. package/dist/llm/providers/openrouter.d.ts +1 -1
  84. package/dist/llm/providers/openrouter.d.ts.map +1 -1
  85. package/dist/llm/providers/openrouter.js +3 -2
  86. package/dist/llm/providers/openrouter.js.map +1 -1
  87. package/dist/llm/types.d.ts +2 -0
  88. package/dist/llm/types.d.ts.map +1 -1
  89. package/dist/llm/types.js +2 -1
  90. package/dist/llm/types.js.map +1 -1
  91. package/dist/renderer/index.d.ts +1 -0
  92. package/dist/renderer/index.d.ts.map +1 -1
  93. package/dist/renderer/index.js +1 -0
  94. package/dist/renderer/index.js.map +1 -1
  95. package/dist/renderer/og-image.d.ts +7 -0
  96. package/dist/renderer/og-image.d.ts.map +1 -1
  97. package/dist/renderer/og-image.js +102 -0
  98. package/dist/renderer/og-image.js.map +1 -1
  99. package/dist/renderer/themes.d.ts.map +1 -1
  100. package/dist/renderer/themes.js +0 -1
  101. package/dist/renderer/themes.js.map +1 -1
  102. package/package.json +22 -9
  103. 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,6 @@
1
+ import type { LLMProvider } from "../../../types.js";
2
+ export declare const validateModel: (provider: LLMProvider, apiKey: string, model: string) => Promise<{
3
+ valid: boolean;
4
+ error?: string;
5
+ }>;
6
+ //# sourceMappingURL=validate-model.d.ts.map
@@ -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;AAm3BpC,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,KAAG,IAmBhD,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"}