clover-hackathon 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.
Files changed (52) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +82 -0
  3. package/dist/cli/commands.d.ts +18 -0
  4. package/dist/cli/commands.js +474 -0
  5. package/dist/cli/commands.js.map +1 -0
  6. package/dist/cli/index.d.ts +1 -0
  7. package/dist/cli/index.js +205 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/core/agent.d.ts +27 -0
  10. package/dist/core/agent.js +108 -0
  11. package/dist/core/agent.js.map +1 -0
  12. package/dist/core/permissions.d.ts +9 -0
  13. package/dist/core/permissions.js +45 -0
  14. package/dist/core/permissions.js.map +1 -0
  15. package/dist/core/session.d.ts +7 -0
  16. package/dist/core/session.js +42 -0
  17. package/dist/core/session.js.map +1 -0
  18. package/dist/core/tools.d.ts +7 -0
  19. package/dist/core/tools.js +216 -0
  20. package/dist/core/tools.js.map +1 -0
  21. package/dist/hackathon/workflows.d.ts +13 -0
  22. package/dist/hackathon/workflows.js +132 -0
  23. package/dist/hackathon/workflows.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +8 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/models/provider.d.ts +26 -0
  28. package/dist/models/provider.js +347 -0
  29. package/dist/models/provider.js.map +1 -0
  30. package/dist/types.d.ts +131 -0
  31. package/dist/types.js +3 -0
  32. package/dist/types.js.map +1 -0
  33. package/dist/utils/config.d.ts +15 -0
  34. package/dist/utils/config.js +93 -0
  35. package/dist/utils/config.js.map +1 -0
  36. package/dist/utils/cost.d.ts +16 -0
  37. package/dist/utils/cost.js +48 -0
  38. package/dist/utils/cost.js.map +1 -0
  39. package/dist/utils/input.d.ts +4 -0
  40. package/dist/utils/input.js +37 -0
  41. package/dist/utils/input.js.map +1 -0
  42. package/dist/utils/logger.d.ts +6 -0
  43. package/dist/utils/logger.js +33 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/pet.d.ts +9 -0
  46. package/dist/utils/pet.js +74 -0
  47. package/dist/utils/pet.js.map +1 -0
  48. package/package.json +53 -0
  49. package/src/templates/pitch.md +30 -0
  50. package/src/templates/readme.md +36 -0
  51. package/src/templates/submission.md +40 -0
  52. package/src/templates/timeline.md +28 -0
@@ -0,0 +1,48 @@
1
+ // Token 成本估算(单价按各厂商公开定价,单位:美元 / 1M tokens)
2
+ // 仅用于预算提醒,实际以账单为准;价格可随时在 PRICING 表调整。
3
+ // 常见模型定价(美元 / 百万 token),新模型按需补充
4
+ export const PRICING = {
5
+ // OpenAI
6
+ "gpt-4o": { inputPerM: 2.5, outputPerM: 10 },
7
+ "gpt-4o-mini": { inputPerM: 0.15, outputPerM: 0.6 },
8
+ "gpt-4.1": { inputPerM: 2, outputPerM: 8 },
9
+ "gpt-4.1-mini": { inputPerM: 0.4, outputPerM: 1.6 },
10
+ "o3": { inputPerM: 2, outputPerM: 8 },
11
+ "o4-mini": { inputPerM: 1.1, outputPerM: 4.4 },
12
+ // Anthropic
13
+ "claude-sonnet-4-5": { inputPerM: 3, outputPerM: 15 },
14
+ "claude-opus-4-1": { inputPerM: 15, outputPerM: 75 },
15
+ "claude-haiku-4-5": { inputPerM: 1, outputPerM: 5 },
16
+ // Google
17
+ "gemini-2.5-pro": { inputPerM: 1.25, outputPerM: 10 },
18
+ "gemini-2.5-flash": { inputPerM: 0.3, outputPerM: 2.5 },
19
+ // 本地/兼容接口默认按 0 计
20
+ "ollama": { inputPerM: 0, outputPerM: 0 },
21
+ };
22
+ /** 未收录模型时按此价格估算(保守偏高) */
23
+ const FALLBACK = { inputPerM: 3, outputPerM: 15 };
24
+ export function estimateCostUsd(usage, model) {
25
+ const price = PRICING[model] ?? FALLBACK;
26
+ return (usage.inputTokens * price.inputPerM + usage.outputTokens * price.outputPerM) / 1_000_000;
27
+ }
28
+ export function formatUsd(value) {
29
+ if (value < 0.01)
30
+ return "$" + value.toFixed(4);
31
+ return "$" + value.toFixed(2);
32
+ }
33
+ export function checkBudget(totalUsd, limitUsd) {
34
+ const ratio = limitUsd > 0 ? totalUsd / limitUsd : 0;
35
+ return {
36
+ totalUsd,
37
+ limitUsd,
38
+ ratio,
39
+ nearLimit: limitUsd > 0 && ratio >= 0.8,
40
+ };
41
+ }
42
+ export function addUsage(a, b) {
43
+ return {
44
+ inputTokens: a.inputTokens + b.inputTokens,
45
+ outputTokens: a.outputTokens + b.outputTokens,
46
+ };
47
+ }
48
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/utils/cost.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC;AAStC,gCAAgC;AAChC,MAAM,CAAC,MAAM,OAAO,GAA+B;IACjD,SAAS;IACT,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;IAC5C,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;IACnD,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;IAC1C,cAAc,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;IACnD,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;IACrC,SAAS,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;IAC9C,YAAY;IACZ,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;IACrD,iBAAiB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACpD,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;IACnD,SAAS;IACT,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;IACrD,kBAAkB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;IACvD,iBAAiB;IACjB,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;CAC1C,CAAC;AAEF,yBAAyB;AACzB,MAAM,QAAQ,GAAe,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAE9D,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAE,KAAa;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;AACnG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AASD,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAgB;IAC5D,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,SAAS,EAAE,QAAQ,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAY,EAAE,CAAY;IACjD,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;QAC1C,YAAY,EAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** 读取一行输入;空输入时返回 fallback */
2
+ export declare function askInput(question: string, fallback?: string): Promise<string>;
3
+ /** 读取 y/n 确认,默认拒绝 */
4
+ export declare function askYesNo(question: string): Promise<boolean>;
@@ -0,0 +1,37 @@
1
+ // 统一输入:单个 readline 接口 + 行队列 + 等待者模式
2
+ // 兼容交互式终端与管道快速输入;全局只建一个 readline,避免多模块抢 stdin 互相吞行。
3
+ import readline from "node:readline";
4
+ let sharedRl = null;
5
+ const lineQueue = [];
6
+ const lineWaiters = [];
7
+ function initRl() {
8
+ if (sharedRl)
9
+ return;
10
+ sharedRl = readline.createInterface({ input: process.stdin, output: process.stdout });
11
+ sharedRl.on("line", (line) => {
12
+ const waiter = lineWaiters.shift();
13
+ if (waiter)
14
+ waiter(line);
15
+ else
16
+ lineQueue.push(line);
17
+ });
18
+ }
19
+ /** 读取一行输入;空输入时返回 fallback */
20
+ export function askInput(question, fallback = "") {
21
+ initRl();
22
+ process.stdout.write(question + (fallback ? " (默认 " + fallback + ") " : " "));
23
+ return new Promise((resolve) => {
24
+ const deliver = (line) => resolve(line.trim() || fallback);
25
+ const queued = lineQueue.shift();
26
+ if (queued !== undefined)
27
+ deliver(queued);
28
+ else
29
+ lineWaiters.push(deliver);
30
+ });
31
+ }
32
+ /** 读取 y/n 确认,默认拒绝 */
33
+ export async function askYesNo(question) {
34
+ const answer = (await askInput(question + " (y/n) ", "n")).trim().toLowerCase();
35
+ return answer === "y" || answer === "yes";
36
+ }
37
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,oDAAoD;AAEpD,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAC/C,MAAM,SAAS,GAAa,EAAE,CAAC;AAC/B,MAAM,WAAW,GAAkC,EAAE,CAAC;AAEtD,SAAS,MAAM;IACb,IAAI,QAAQ;QAAE,OAAO;IACrB,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC;;YACpB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,QAAQ,GAAG,EAAE;IACtD,MAAM,EAAE,CAAC;IACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;YACrC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChF,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function info(text: string): void;
2
+ export declare function note(text: string): void;
3
+ export declare function warn(text: string): void;
4
+ export declare function error(text: string): void;
5
+ export declare function ask(text: string): void;
6
+ export declare function banner(text: string): void;
@@ -0,0 +1,33 @@
1
+ // 极简终端日志(无第三方依赖)
2
+ const COLORS = {
3
+ reset: "\x1b[0m",
4
+ dim: "\x1b[2m",
5
+ green: "\x1b[32m",
6
+ yellow: "\x1b[33m",
7
+ red: "\x1b[31m",
8
+ cyan: "\x1b[36m",
9
+ };
10
+ function color(text, code) {
11
+ if (process.env.NO_COLOR)
12
+ return text;
13
+ return code + text + COLORS.reset;
14
+ }
15
+ export function info(text) {
16
+ console.log(color(text, COLORS.green));
17
+ }
18
+ export function note(text) {
19
+ console.log(color(text, COLORS.dim));
20
+ }
21
+ export function warn(text) {
22
+ console.log(color("⚠ " + text, COLORS.yellow));
23
+ }
24
+ export function error(text) {
25
+ console.error(color("✖ " + text, COLORS.red));
26
+ }
27
+ export function ask(text) {
28
+ console.log(color("? " + text, COLORS.cyan));
29
+ }
30
+ export function banner(text) {
31
+ console.log(color("🍀 " + text, COLORS.cyan));
32
+ }
33
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAEjB,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;CACR,CAAC;AAEX,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface PetArt {
2
+ name: string;
3
+ caption: string;
4
+ lines: string[];
5
+ }
6
+ export declare const PETS: PetArt[];
7
+ export declare function randomPet(): PetArt;
8
+ export declare function findPet(name: string): PetArt | undefined;
9
+ export declare function renderPet(pet: PetArt): string;
@@ -0,0 +1,74 @@
1
+ // 三叶草小宠物:颜文字风吉祥物(圆脸 + 豆豆眼 + ω 嘴)
2
+ // 每场会话随机一个姿态出场,陪用户跑完整场黑客松。
3
+ export const PETS = [
4
+ {
5
+ name: "idle",
6
+ caption: "Clover 在等你发号施令 🍀",
7
+ lines: [
8
+ " /\\_/\\",
9
+ " ( ◕ ◕ )",
10
+ " > ω <",
11
+ " U U",
12
+ ],
13
+ },
14
+ {
15
+ name: "happy",
16
+ caption: "检查全过!今天也是幸运三叶草 ✨",
17
+ lines: [
18
+ " /\\_/\\ *",
19
+ " ( ⌣ ⌣ )",
20
+ " > ω <",
21
+ " U U",
22
+ ],
23
+ },
24
+ {
25
+ name: "sleepy",
26
+ caption: "zZ… 别急,Clover 随时待命",
27
+ lines: [
28
+ " /\\_/\\",
29
+ " ( ⌒ ⌒ ) z",
30
+ " > ω <",
31
+ " U U",
32
+ ],
33
+ },
34
+ {
35
+ name: "busy",
36
+ caption: "Clover 正在干活,稍等…",
37
+ lines: [
38
+ " /\\_/\\",
39
+ " ( ◉ ◉ )",
40
+ " > ω < %",
41
+ " U U",
42
+ ],
43
+ },
44
+ {
45
+ name: "sad",
46
+ caption: "啊哦,出了点小问题,再试一次?",
47
+ lines: [
48
+ " /\\_/\\",
49
+ " ( ; ; )",
50
+ " > ⌢ <",
51
+ " U U",
52
+ ],
53
+ },
54
+ {
55
+ name: "think",
56
+ caption: "Clover 正在思考…",
57
+ lines: [
58
+ " /\\_/\\",
59
+ " ( o o ) ?",
60
+ " > · <",
61
+ " U U",
62
+ ],
63
+ },
64
+ ];
65
+ export function randomPet() {
66
+ return PETS[Math.floor(Math.random() * PETS.length)] ?? PETS[0];
67
+ }
68
+ export function findPet(name) {
69
+ return PETS.find((p) => p.name === name);
70
+ }
71
+ export function renderPet(pet) {
72
+ return pet.lines.join("\n");
73
+ }
74
+ //# sourceMappingURL=pet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pet.js","sourceRoot":"","sources":["../../src/utils/pet.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,2BAA2B;AAQ3B,MAAM,CAAC,MAAM,IAAI,GAAa;IAC5B;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE;YACL,YAAY;YACZ,aAAa;YACb,UAAU;YACV,UAAU;SACX;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE;YACL,gBAAgB;YAChB,aAAa;YACb,UAAU;YACV,UAAU;SACX;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,oBAAoB;QAC7B,KAAK,EAAE;YACL,YAAY;YACZ,gBAAgB;YAChB,UAAU;YACV,UAAU;SACX;KACF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE;YACL,YAAY;YACZ,aAAa;YACb,cAAc;YACd,UAAU;SACX;KACF;IACD;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE;YACL,YAAY;YACZ,aAAa;YACb,UAAU;YACV,UAAU;SACX;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE;YACL,YAAY;YACZ,gBAAgB;YAChB,UAAU;YACV,UAAU;SACX;KACF;CACF,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "clover-hackathon",
3
+ "version": "0.1.0",
4
+ "description": "Clover(三叶草)— 专为黑客松比赛设计的命令行 AI Agent",
5
+ "keywords": [
6
+ "hackathon",
7
+ "agent",
8
+ "cli",
9
+ "ai",
10
+ "clover"
11
+ ],
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "bin": {
15
+ "clover": "dist/index.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src/templates",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "engines": {
24
+ "node": ">=20"
25
+ },
26
+ "scripts": {
27
+ "dev": "tsx src/index.ts",
28
+ "build": "tsc -p tsconfig.json",
29
+ "typecheck": "tsc --noEmit",
30
+ "start": "node dist/index.js",
31
+ "test": "node --test",
32
+ "prepublishOnly": "npm run typecheck && npm run build"
33
+ },
34
+ "dependencies": {
35
+ "commander": "^12.1.0",
36
+ "dotenv": "^16.4.5",
37
+ "zod": "^3.23.8"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^22.5.0",
41
+ "tsx": "^4.19.0",
42
+ "typescript": "^5.6.0"
43
+ },
44
+ "author": "QundaiCai314",
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/QundaiCai314/clover-hack.git"
48
+ },
49
+ "homepage": "https://github.com/QundaiCai314/clover-hack",
50
+ "bugs": {
51
+ "url": "https://github.com/QundaiCai314/clover-hack/issues"
52
+ }
53
+ }
@@ -0,0 +1,30 @@
1
+ # {{name}} — 3 分钟 Pitch 稿
2
+
3
+ ## 开场钩子(15 秒)
4
+
5
+ <!-- 一句话抓住注意力:数据冲击 / 反常识 / 故事 -->
6
+
7
+ ## 问题与痛点(30 秒)
8
+
9
+ <!-- 谁、在什么场景、遇到了什么痛 -->
10
+
11
+ ## 解决方案与 Demo 亮点(90 秒)
12
+
13
+ <!-- 讲清核心机制,按演示顺序列出 2-3 个亮点 -->
14
+
15
+ ## 市场与独特价值(30 秒)
16
+
17
+ <!-- 市场规模一句话 + 与竞品的差异 -->
18
+
19
+ ## 收尾 Call to Action(15 秒)
20
+
21
+ <!-- 希望评委记住什么、后续计划 -->
22
+
23
+ ## 评委可能问的 5 个问题
24
+
25
+ 1.
26
+ 2.
27
+ 3.
28
+ 4.
29
+ 5.
30
+
@@ -0,0 +1,36 @@
1
+ # {{name}}
2
+
3
+ > 黑客松参赛项目
4
+
5
+ ## 一句话简介
6
+
7
+ <!-- 用一句话说明这个项目解决什么问题 -->
8
+
9
+ ## 演示
10
+
11
+ <!-- 贴 demo 视频/GIF 链接,或本地 demo.mp4 -->
12
+
13
+ ## 技术栈
14
+
15
+ -
16
+
17
+ ## 快速开始
18
+
19
+ ```bash
20
+ # 安装依赖
21
+ # 启动项目
22
+ ```
23
+
24
+ ## 功能亮点
25
+
26
+ -
27
+
28
+ ## 灵感来源
29
+
30
+ <!-- 为什么做这个、解决谁的什么问题 -->
31
+
32
+ ## 链接
33
+
34
+ - 比赛:[{{url}}]({{url}})
35
+ - 提交截止:{{deadline}}
36
+
@@ -0,0 +1,40 @@
1
+ # {{name}} — 提交说明
2
+
3
+ ## 项目名称
4
+
5
+ {{name}}
6
+
7
+ ## 项目简介
8
+
9
+ <!-- 150 字以内,说清楚做什么、给谁用、为什么特别 -->
10
+
11
+ ## 赛道/主题
12
+
13
+ <!-- 参赛赛道或主题 -->
14
+
15
+ ## 技术栈
16
+
17
+ <!-- 语言/框架/服务 -->
18
+
19
+ ## 演示方式
20
+
21
+ - Demo 视频:<!-- 链接 -->
22
+ - 在线体验:<!-- 链接(如有) -->
23
+ - 本地运行:<!-- 启动步骤 -->
24
+
25
+ ## 亮点
26
+
27
+ 1.
28
+ 2.
29
+ 3.
30
+
31
+ ## 团队与分工
32
+
33
+ <!-- 单人:个人简介即可 -->
34
+
35
+ ## 开源地址
36
+
37
+ <!-- GitHub 仓库链接 -->
38
+
39
+ > 比赛链接:{{url}} · 截止:{{deadline}}
40
+
@@ -0,0 +1,28 @@
1
+ # {{name}} — 时间线规划(共 {{duration}} 小时)
2
+
3
+ ## 阶段 1:热身与赛题(第 0-2 小时)
4
+
5
+ - [ ] 解析赛题、整理评分标准
6
+ - [ ] 生成 5 个点子并评估
7
+ - [ ] 选定点子,输出 MVP 计划
8
+
9
+ ## 阶段 2:MVP 核心(第 2-12 小时)
10
+
11
+ - [ ] 搭好项目骨架与 CI
12
+ - [ ] 完成 P0 功能 1
13
+ - [ ] 完成 P0 功能 2
14
+
15
+ ## 阶段 3:打磨(第 12-36 小时)
16
+
17
+ - [ ] 完成 P1 功能
18
+ - [ ] 修 bug、补边界情况
19
+ - [ ] 性能/体验优化
20
+
21
+ ## 阶段 4:演示准备(最后 6 小时)
22
+
23
+ - [ ] 录制 demo 视频
24
+ - [ ] 写 README 与提交说明
25
+ - [ ] 排练 Pitch
26
+ - [ ] 提交检查清单全过一遍
27
+ - [ ] 提交!🍀
28
+