Skill: npccxx/internship-daily-reflection (version 1.0.0)

--- name: internship-daily-reflection description: 将实习中的零散记录、聊天片段和任务笔记整理成可直接粘贴的中文日报或进展汇报。适用于写日报、整理今天任务、发给导师或 leader 的进展同步，以及填写“计划阶段、汇报阶段、进展状态、进展情况、问题及原因”等固定字段。 homepage: https://clawhub.com metadata: { "openclaw": { "emoji": "📝" } } --- # Internship Daily Reflection ## 适用场景 当用户需要以下内容时，使用本技能： - 日报、站会更新、实习进展同步 - 将零散聊天记录/笔记整理成结构化汇报 - 准备发给导师、leader 的当日进展说明 - 填写带固定字段的汇报系统（如“进展情况/问题及原因”） ## 工作流程 1. 先识别输入材料：任务清单、聊天片段、提交记录、学习笔记。 2. 提取事实并去重：做了什么、进度如何、问题是什么、原因是什么。 3. 优先输出“汇报系统字段版”，保证可以直接粘贴。 4. 若关键信息缺失，先追问再输出。 ## 缺失信息追问 当以下信息缺失时，最多追问 4 个关键问题： - 计划阶段（例如：4月2周）和汇报阶段（例如：周一）是什么？ - 进展状态是“正常推进 / 推进滞后 / 已完成”中的哪一个？ - 进展情况里最关键的 2-4 个事实是什么？ - 是否存在“问题及原因”？如果有，分别是什么？ 如果用户不补充，明确标注“待补充”，不要编造事实。 ## 输出要求 - 默认语言：中文 - 风格：复盘成长型（不止描述结果，也说明问题与改进） - 语气：专业、清晰、可直接转发给导师或 leader - 优先使用可验证表述（避免夸张、避免空话） - 当用户明确说“填系统/表单”时，只输出字段内容，不附加长解释 ## 固定输出模板（汇报系统字段版） 优先按以下结构输出，字段名与系统保持一致： ```markdown 汇报单位：<默认沿用用户提供；未知则写“待补充”> 计划阶段：<如 4月2周> 汇报阶段：<如 周一> 进展状态：<正常推进/推进滞后/已完成> 进展情况： 1) <任务或子目标>：<动作>，<结果/产出>。 2) <任务或子目标>：<动作>，<结果/产出>。 3) <如有明日安排，可写下一步>。 问题及原因： - <问题1>：<原因>；<当前影响/处理状态>。 - <问题2>：<原因>；<当前影响/处理状态>。 （可选）汇报附件： - <文件名或链接；无则写“无”> ``` ## 备用输出模板（聊天汇报版） 如果用户明确不要字段版，再使用这个结构： ```markdown # 实习日报（YYYY-MM-DD） ## 1) 今日完成事项 ## 2) 项目进度 ## 3) 问题与阻塞 ## 4) 解决方案与尝试 ## 5) 时间投入 ## 6) 明日计划 ``` ## 针对智能体/OpenClaw/Skill 学习的增强规则 如果内容涉及智能体、OpenClaw、Skill 学习，补充一段简短学习复盘： - 今日新概念：学到了什么 - 实操进展：完成了哪一步部署/配置/调试 - 卡点与原因：环境、配置、依赖或理解问题 - 明日突破点：下一步最关键动作 将该段优先合并到“进展情况”与“问题及原因”中，避免字段过多导致无法粘贴表单。 ## 示例触发语 - “帮我把今天实习内容整理成日报” - “我笔记很乱，整理成能发给导师的进展更新” - “这是我今天做的 openclaw 学习记录，帮我总结” - “按汇报系统格式帮我生成：计划阶段、汇报阶段、进展状态、进展情况、问题及原因”

path: assets/template.md
content: # 实习日报模板

> 用于快速填写，再交给 skill 整理润色。

## 基础信息

- 日期：
- 姓名/角色（可选）：
- 汇报对象（导师/leader，可选）：

## 今日完成事项

- 事项1：
  - 结果：
  - 产出链接/文件（可选）：
- 事项2：
  - 结果：
  - 产出链接/文件（可选）：

## 项目进度

- 当前阶段：
- 相比昨日推进：
- 里程碑状态（按期/风险）：

## 问题与阻塞

- 问题1：
  - 影响：
  - 当前状态：
- 问题2：
  - 影响：
  - 当前状态：

## 解决方案与尝试

- 针对问题1：
- 针对问题2：

## 时间投入

- 任务A： 小时
- 任务B： 小时
- 合计： 小时

## 明日计划

- [ ] 任务1（预期产出）
- [ ] 任务2（预期产出）
- 需要协助：有 / 无（如有，写明需要谁提供什么）

## 学习复盘（智能体方向，可选）

- 今日新概念：
- 实操进展：
- 卡点与原因：
- 明日突破点：


path: index.js
content: function today() {
  const d = new Date();
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, "0");
  const day = String(d.getDate()).padStart(2, "0");
  return `${y}-${m}-${day}`;
}

function toLines(value) {
  if (!value) return [];
  if (Array.isArray(value)) return value.map(String).map((s) => s.trim()).filter(Boolean);
  return String(value)
    .split(/\r?\n/)
    .map((s) => s.trim())
    .filter(Boolean);
}

function pick(lines, keywords) {
  return lines.filter((line) => keywords.some((k) => line.includes(k)));
}

function renderFallbackReport(input = {}) {
  const date = input.date || today();
  const lines = toLines(input.notes || input.raw_notes || input.text);
  const done = pick(lines, ["完成", "已做", "实现", "学习", "搭建", "整理", "修复"]);
  const issues = pick(lines, ["问题", "阻塞", "卡点", "报错", "失败"]);
  const plan = pick(lines, ["明天", "计划", "下一步", "待做"]);
  const time = pick(lines, ["小时", "h", "min", "分钟"]);

  const safeDone = done.length ? done : ["待补充：今日完成事项"];
  const safeIssues = issues.length ? issues : ["暂无明确阻塞（或待补充）"];
  const safePlan = plan.length ? plan : ["待补充：明日计划"];
  const safeTime = time.length ? time : ["待补充：时间投入"];

  return [
    `# 实习日报（${date}）`,
    "",
    "## 1) 今日完成事项",
    ...safeDone.map((x) => `- ${x}`),
    "",
    "## 2) 项目进度",
    "- 当前所在阶段：待补充",
    "- 相比昨日的推进：待补充",
    "- 里程碑状态（按期/风险）：待补充",
    "",
    "## 3) 问题与阻塞",
    ...safeIssues.map((x) => `- ${x}`),
    "",
    "## 4) 解决方案与尝试",
    "- 已采取动作：待补充",
    "- 下一步验证：待补充",
    "",
    "## 5) 时间投入",
    ...safeTime.map((x) => `- ${x}`),
    "",
    "## 6) 明日计划",
    ...safePlan.map((x) => `- [ ] ${x.replace(/^[-\[\]\s]*/, "")}`),
    "- 需要协助：待补充",
  ].join("\n");
}

function buildPrompt(input = {}) {
  const date = input.date || today();
  const notes = input.notes || input.raw_notes || input.text || "";
  return `
你是一个中文实习日报整理助手。请把用户的零散记录整理成结构化日报，风格专业、可直接发给导师。

要求：
1) 不编造事实；缺失信息标注“待补充”
2) 必须包含以下模块：
- 1) 今日完成事项
- 2) 项目进度
- 3) 问题与阻塞
- 4) 解决方案与尝试
- 5) 时间投入
- 6) 明日计划
3) 如果内容涉及智能体/OpenClaw/Skill学习，补充“7) 学习复盘（智能体方向）”
4) 日期使用：${date}

用户原始记录：
${notes}
`.trim();
}

async function run(input = {}, context = {}) {
  // Try to use runtime model client first (for OpenClaw / qwen environments).
  const prompt = buildPrompt(input);
  const model = context.model || context.llm || null;

  if (model && typeof model.generate === "function") {
    const res = await model.generate({
      prompt,
      temperature: 0.2
    });
    if (res && typeof res.text === "string" && res.text.trim()) {
      return { output: res.text.trim() };
    }
  }

  if (model && typeof model.complete === "function") {
    const text = await model.complete(prompt, { temperature: 0.2 });
    if (typeof text === "string" && text.trim()) {
      return { output: text.trim() };
    }
  }

  // Fallback when runtime model API shape is unknown.
  return { output: renderFallbackReport(input) };
}

module.exports = {
  run
};

if (require.main === module) {
  const demo = {
    notes: [
      "今天完成了 OpenClaw skill 目录搭建和 SKILL.md 编写",
      "遇到路径问题，后来迁移到项目目录",
      "花费约2小时",
      "明天计划做首次发布并补充示例"
    ]
  };
  run(demo, {})
    .then((res) => console.log(res.output))
    .catch((err) => {
      console.error(err);
      process.exit(1);
    });
}


path: package.json
content: {
  "name": "internship-daily-reflection",
  "version": "0.1.0",
  "description": "OpenClaw skill for organizing internship daily notes into structured Chinese reports.",
  "main": "index.js",
  "type": "commonjs",
  "license": "MIT",
  "scripts": {
    "start": "node index.js",
    "test": "node -e \"const s=require('./index'); console.log(typeof s.run==='function'?'ok':'fail')\""
  }
}


path: references/examples.md
content: # Examples

## 示例 1：零散笔记转日报

### 输入

- 上午看了 OpenClaw 的 skill 机制文档，整理了触发逻辑
- 下午把 internship-daily-reflection 的 SKILL.md 写完并放到项目目录
- 花了 1.5 小时排查路径问题（全局目录和项目目录冲突）
- 目前问题：还不太清楚发布页面里 description 怎么写更容易被检索
- 明天计划：补 2 个样例，尝试第一次发布

### 期望输出特征

- 输出为中文，结构完整（完成事项、进度、问题、解决、时间、明日计划）
- 明确写出路径问题的影响和当前处理结果
- 明日计划可执行，且包含具体产出

## 示例 2：给导师的进展同步

### 输入

- 今天主要在学习 OpenClaw skill 发布流程
- 已完成：基础版 skill 目录搭建、SKILL.md 编写、项目内路径迁移
- 仍在推进：准备发布材料（示例和模板）
- 阻塞：对标签和描述词不确定
- 预计明天完成首次发布

### 期望输出特征

- 语气专业，可直接转发给导师或 leader
- 尽量量化投入时间和完成度
- 阻塞项应带下一步方案

## 示例 3：信息缺失时的处理

### 输入

- 今天改了技能
- 遇到一些问题
- 明天继续

### 期望输出特征

- 不编造细节
- 主动追问最多 3 个关键问题（任务、耗时、阻塞）
- 对未补充内容标注“待补充”


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)