普通视图
9天5板金牛化工:近期甲醇等化工品国际供给形势可能发生变化,短期价格呈震荡走势
韩国将于13日起实施燃油价格上限
科大讯飞版“龙虾”AstronClaw上线
机构今日买入御银股份等6股,卖出动力新科1.54亿元
步长制药:全资子公司山东丹红拟与鸿育医药签署技术转让与科研合作合同
澳大利亚临时放宽国内燃油质量标准以应对供应短缺
【笔记】xxx 技术分享文档模板
纯模板,下次需要直接贴给 AI 然后替换内容就行
skills 技术分享文档
一、项目概述
1.1 项目定位
skills 是团队为 Claude Code 打造的通用技能工具集,通过 npm 包的形式进行分发和管理,旨在提升团队开发效率和代码质量。
-
包名:
skills - 仓库: gitlab.example.com/team/skills
- Registry: npm.example.com/
- 当前版本: 1.0.1
1.2 核心价值
- 知识共享: 将团队最佳实践封装为可复用的技能
- 效率提升: 自动化重复性工作流程
- 规范统一: 确保团队操作流程一致性
- 降低门槛: 新成员快速上手团队工作方式
二、技术架构
2.1 整体架构
skills
├── bin/
│ └── cli.js # CLI 工具入口
├── skills/ # 技能定义(自动触发或 /调用)
│ ├── brainstorming/
│ ├── merge-to-test/
│ ├── merge-to-develop/
│ └── requirement-to-spec/
├── commands/ # 命令定义(/调用)
│ └── create-branch.md
├── agents/ # 自定义 Agent 定义
└── rules/ # 全局规则约束
2.2 Claude Code 资源类型映射
| 类型 | 安装路径 | 触发方式 | 文件扩展 | 是否嵌套 |
|---|---|---|---|---|
skills |
~/.claude/skills/ |
自动或 /skill-name
|
无 | 是 |
commands |
~/.claude/commands/ |
/command-name |
.md |
否 |
agents |
~/.claude/agents/ |
Agent 定义 | .md |
否 |
rules |
~/.claude/rules/ |
全局应用 | .md |
否 |
三、CLI 工具设计
3.1 核心功能
CLI 工具提供了完整的资源生命周期管理:
# 查看可用资源
skills list
skills list skills
# 查看已安装资源
skills installed
skills installed commands
# 安装资源
skills install --all # 安装所有
skills install skills brainstorming # 安装单个
# 更新资源
skills update --all
skills update commands create-branch
# 卸载资源
skills remove skills brainstorming
3.2 技术实现要点
1. 路径解析
const CLAUDE_HOME = path.join(os.homedir(), '.claude')
const TYPES = {
skills: { src: 'skills', dest: path.join(CLAUDE_HOME, 'skills'), nested: true, ext: '' },
commands: { src: 'commands', dest: path.join(CLAUDE_HOME, 'commands'), nested: false, ext: '.md' },
agents: { src: 'agents', dest: path.join(CLAUDE_HOME, 'agents'), nested: false, ext: '.md' },
rules: { src: 'rules', dest: path.join(CLAUDE_HOME, 'rules'), nested: false, ext: '.md' },
}
2. 嵌套目录处理 Skills 需要递归复制整个目录,而其他类型仅需复制单个文件:
if (TYPES[type].nested) {
fs.cpSync(src, dest, { recursive: true, force: true })
} else {
fs.copyFileSync(src, dest)
}
3. 更新策略 更新时仅更新已安装的资源,跳过不存在的资源并给出警告:
const installed = listInstalled(type)
const available = new Set(listAvailable(type))
installed.forEach(name => {
if (available.has(name)) { installOne(type, name); count++ }
else console.warn(` ! [${type}] "${name}" 不在包中,跳过`)
})
四、核心技能详解
4.1 brainstorming - 创意设计助手
使用场景: 在进行任何创造性工作之前(创建功能、构建组件、修改行为)
工作流程:
- 理解上下文: 检查项目状态(文件、文档、最近提交)
- 逐步提问: 每次只问一个问题,避免信息过载
- 方案探索: 提出 2-3 种方案并说明权衡
- 分段展示: 每段 200-300 字,逐步验证设计
-
文档输出: 将确认的设计写入
docs/plans/YYYY-MM-DD-<topic>-design.md
关键原则:
- 一次只问一个问题
- 优先使用多选题而非开放题
- YAGNI 原则:移除不必要的功能
- 始终提供多种方案
4.2 merge-to-test - 自动合并到测试环境
触发条件: 用户说"推送代码"、"可以推送"、"push"时
保护分支检测:
const protectedBranches = ['master', 'test', 'develop', 'release/*']
// 如果当前分支是保护分支,则不触发
合并流程:
branch=$(git rev-parse --abbrev-ref HEAD) && \
git checkout test && \
git pull && \
git merge $branch && \
git push && \
git checkout $branch
级联触发: 成功合并到 test 后,自动触发 merge-to-develop 询问是否部署到开发环境
4.3 merge-to-develop - 合并到开发环境
触发方式:
- 由
merge-to-test成功后自动触发 - 用户主动请求:"Merge to develop environment"、"Deploy to develop"
工作流程: 与 merge-to-test 类似,目标分支为 develop
部署完成摘要:
部署完成:
✅ 测试环境 (test)
✅ 开发环境 (develop)
4.4 requirement-to-spec - 需求转技术规格
核心功能: 通过自然对话收集需求信息,然后调用 /openspec:proposal 生成详细技术规格
分支保护检查 (关键安全机制):
// Step 0: 检查当前分支
branch=$(git branch --show-current)
if [[ "$branch" == "master" || "$branch" == "test" || "$branch" == "develop" ]]; then
// 显示警告并询问是否切换分支
fi
信息收集流程:
- 需求名称(可直接从项目管理系统复制)
- 简要描述(做什么、预期什么结果)
- 技术变更点
- 影响范围(文件或模块)
- 接口信息(如有)
- 出入参(如有)
格式化输出:
/openspec:proposal 这里有个新需求需要创建提案:【<需求名称>】
简单描述:<做什么,要什么结果>
具体需求:<技术变更点>
影响范围:<文件或模块路径>
接口:<如果有则填写,没有则用占位符>
出入参:<如果有则填写,没有则用 {} 占位>
五、核心命令详解
5.1 create-branch - AI 辅助分支创建
功能: 从项目管理系统 Story 创建功能分支,AI 自动翻译分支名
分支命名规范: feat/<username>/<concise-english-name>-<storyID>
核心功能:
- 信息提取: 从项目管理系统 URL 提取 storyID
- AI 翻译: 将中文标题翻译为简洁的英文分支名(3-4 词)
-
用户名获取: 从
git config user.name自动获取 - 创建模式选择: 支持普通分支和 Worktree 两种模式
Worktree 模式特殊处理:
- 路径格式:
<main-branch-parent>/<project>.worktrees/<branch-type>/<username>/<branch-name> - 共享 node_modules: 通过符号链接避免重复安装依赖
- Windows 符号链接:
powershell -Command "cmd /c 'mklink /D <target> <source>'" - 可选复制
route-dev.js文件
AI 翻译规则:
- 使用小写连字符格式(如
scrm-auto-tag) - 移除冗余词汇("功能"、"优化"等)
- 保留重要缩写(SCRM、CRM等)
- 保持简洁,聚焦核心功能
执行流程:
# 1. 更新 master(必须)
git checkout master
git pull origin master
# 2. 创建分支
git checkout -b feat/<username>/<english-name>-<storyID>
# 3. Worktree 模式额外操作
git worktree add <worktree-path> -b <branch-name>
# 创建 node_modules 符号链接
# 可选复制 route-dev.js
六、集成与协作
6.1 技能间的协作
/create-branch
↓
/requirement-to-spec (分支保护检查)
↓
/openspec:proposal (生成技术规格)
↓
[开发实现]
↓
git push
↓
merge-to-test (自动触发)
↓ (成功后)
merge-to-develop (自动触发)
6.2 安全机制
- 分支保护: 所有涉及代码修改的技能都会检查当前分支
- 用户确认: 关键操作前都需要用户确认
- 错误处理: 提供清晰的错误信息和恢复指导
- 状态回滚: 合并失败时自动切换回原分支
七、最佳实践
7.1 发布流程
# 1. 更新版本号
npm version patch/minor/major
# 2. 发布到内部 npm
npm publish --registry http://npm.example.com/
# 3. 用户更新
npx --registry http://npm.example.com/ @company/skills update --all
7.2 本地开发
# 链接到全局
npm link
# 测试命令
skills list
skills install --all
skills installed
7.3 扩展开发指南
新增 Skill:
- 创建
skills/<skill-name>/SKILL.md或Skill.md - 编写 frontmatter 元数据
- 编写技能逻辑文档
- 更新版本号并发布
新增 Command:
- 创建
commands/<command-name>.md - 编写命令说明文档
- 更新版本号并发布
Skill Frontmatter 模板:
---
name: skill-name
description: 简短描述
category: 分类(可选)
tags: [tag1, tag2](可选)
---
八、常见问题
Q1: 如何调试技能执行过程?
A: Claude Code 会在执行过程中显示详细的日志输出,包括每个步骤的执行情况和结果。
Q2: Worktree 模式下符号链接创建失败?
A: Windows 需要管理员权限或开启开发者模式才能创建符号链接。可以:
- 以管理员身份运行终端
- 或启用 Windows 开发者模式
Q3: 如何自定义分支命名规则?
A: 修改 commands/create-branch.md 中的分支格式定义,然后更新发布。
Q4: 技能执行失败如何回滚?
A: 大多数技能都有内置的错误处理和状态恢复机制,会自动切换回原分支。
九、未来规划
- 更多技能: 持续添加团队常用的开发技能
- 配置化: 支持团队自定义配置(如分支命名规则)
- 测试覆盖: 为 CLI 工具添加自动化测试
- 文档完善: 提供更详细的使用示例和视频教程
- 性能优化: 优化安装和更新速度
十、总结
skills 通过以下方式提升开发效率:
- 标准化流程: 将团队最佳实践封装为可复用的技能
- 自动化操作: 减少重复性手工操作
- 智能辅助: AI 翻译、需求整理等智能功能
- 安全保护: 分支保护检查等安全机制
- 易于扩展: 清晰的架构便于添加新技能
通过这套工具集,新成员可以快速融入团队工作方式,老成员可以专注于核心业务逻辑,从而整体提升团队的开发效率和代码质量。
版权声明:
本文版权属于作者 林小帅,未经授权不得转载及二次修改。
转载或合作请在下方留言及联系方式。
德国莱茵集团推出400亿美元投资计划,拟大举投资美国市场
真爱美家:探迹远擎不存在未来12个月内对公司资产和业务进行出售、合并的计划,公司不涉及人工智能业务
上期所调整黄金等期货相关合约涨跌停板幅度和交易保证金比例
恺英网络:董事长金锋拟不低于1.5亿元增持公司股份
网易智企举办“龙虾总动员”活动,发布企业级平台ClawHive
欧睿国际:追觅扫地机全球高端销量第一
天力锂能:股东安徽高新投新材料产业基金拟减持不超3%股份
里程碑4 - 基于Vue3完成动态组件库建设
一、目标
在之前的过程中,基于DSL完成了列表页面的领域模型搭建和页面的动态开发,接下来我们是要根据列表页展示的按钮,完成详情的 动态增改查 功能
二、配置项展示
1. xxxOption(字段级配置)
这部分设置的是某个字段在某个页面中的表现方式,用来控制每个字段如何渲染,比如是要隐藏或是禁用。
其中新增、修改页面的控件类型comType是必须要进行配置的,用于后续数据填写;而查看详情页面可以添加控件组件comType,和新增、修改采用同一种样式展示、也可以不配置控件组件,自定义展示样式。
以下是代码用例:
xxxPageOption: {
...elComponentConfig, // 标准 el-component配置
comType: "", // 控件类型 input/select/input-number
visible: true, // 是否展示,默认为true
disabled: false, // 是否禁用,默认为false
default: "", // 默认值
enumList: [], // 枚举列表,comType === select时生效
},
2. componentConfig(组件级配置)
这部分配置是用来控制页面的行为;根据之前按钮配置的eventKey和eventOption中的comName来决定展示哪个页面
适合用来控制一些页面属性
// 动态组件 相关配置
componentConfig: {
xxxPage: {
title: '', // 表单标题
saveBtnText: '', // 保存按钮文案
mainKey: '', // 表单主键,用于唯一标识要修改的数据对象,修改和查看必须进行配置
},
// ... 支持用户动态扩展
}
3. 两者之间的结构关系
Schema
├─ properties (字段级)
│ ├─ field1
│ │ ├─ xxxPageOneOption
│ │ ├─ xxxPageTwoOption
│ │ └─ xxxPageThreeOption
│ └─ field2
│
componentConfig (页面级)
├─ xxxPageOne
├─ xxxPageTwo
└─ xxxPageThree
三、与代码配置页面的比对
| 代码配置页面 | DSL领域模型生成 | |
|---|---|---|
| 开发方式 | 写代码 | 写配置 |
| 页面数量 | 一个页面一套代码 | 一个组件根据配置可以生成多个页面 |
| 样式风格 | 难以统一 | 容易保持一致 |
-
DSL的核心优势
一个schema可以生成,达到页面生成自动化,且UI样式统一,降低重复代码
四、最终DSL架构
经过不断的完善和扩展,我们最终的DSL架构样式为:
schema: {
properties: {
key: {
...schema,
label: '',
type: '',
searchOption: {
},
tableOption: {
},
xxxPageOneOption: {
},
xxxPageTwoOption: {
},
}
},
required: ["key"],
}
searchConfig: {},
tableConfig: {},
component: {
xxxPageOne: {
},
xxxPageTwo: {
},
},
五、总结
为解决前端代码开发过程中遇到的 页面重复度高、大量CRUD页面结构相似,每个页面独立完成导致的后续高维护成本和扩展困难等问题,我们从手写每个页面代码 转变为 使用DSL配置描述页面结构。
在开发过程中,通过领域模型model和衍生出的各类project配置,结合统一的schema配置描述页面结构,动态生成页面。从而达到将重复代码沉淀下来,让我们有更多的精力去完成定制化需求。
六、开发过程中遇到的😅事情
vue动态组件 + ref 收集方式
-
修改前的写法
<component v-for='item in List" :ref="handleSearchComList"/> const searchComList = ref([]); const handleSearchComList = (el) => { searchComList.value.push(el); } -
错误的修改
<component v-for="item in list" :ref="searchComList"/> const searchComList = ref([]);因为我定义的是 searchComList = ref([]),vue会认为这是一个ref对象,然后尝试
searchComList.value = el;这样会导致 过程中每次ref都会覆盖,不会push,所以在我打印的时候看到的是空的 -
正确的修改
<component v-for="item in list" ref="searchComList"/> const searchComList = ref([]); -
情况比对
写法 是否可用 原因 :ref="schemaComList" 不可用 :ref="XXX"动态ref,是js表达式绑定,vue会理解为 XXX.value = el,会被覆盖,在最后组件更新或卸载的时候,打印出来的结果就是空数组或者null :ref="handleSearchComList" + handleSearchComList() 可用 定义的handleSearchComList是函数,vue会执行这段函数,会在函数中进行push ref="searchComList" + v-for 可用 ref="XXX" 静态ref,XXX只是一个字符串key,vue会在挂载后自动做 XXX.value = 组件实例;如果是v-for,vue会自动收集 XXX.value = [实例1,实例2...]
告别表单“黄油色”:如何优雅地重置 Chrome 自动填充样式
在前端开发与 UI 还原的过程中,我们经常会遇到一个破坏设计美感的“顽疾”:当用户使用 Chrome 或其他 Webkit 内核浏览器自动填充账号密码时,输入框会被强制渲染上一层淡蓝色或淡黄色的背景。
对于追求完美视觉体验的项目来说,这种突兀的颜色往往会破坏整体的 UI 色调。今天我们就来聊聊,为什么会出现这个问题,以及如何优雅地解决它。
🔍 为什么常规的 background-color 无法覆盖?
当浏览器触发自动填充时,会给 <input> 元素自动加上一个 :-webkit-autofill 伪类。在这个伪类的用户代理样式表(User Agent Stylesheet)中,浏览器使用了 !important 来强制设置背景色和字体颜色。
正因为它的优先级极高,我们在 CSS 中常规编写的 background-color 和 color 属性都会失效。
🛠️ 解决方案大盘点
要对付这个高优先级的默认样式,我们需要采取一些“曲线救国”的 CSS 技巧。以下是目前业内最常用的三种解决方案:
# 方案一:内阴影遮挡法(最通用,适用于纯色背景)
这是目前最主流且兼容性最好的做法。既然背景色改不掉,我们就用一堵“厚厚的墙”把它挡住。利用极其宽大的内部阴影(inset),我们可以完美遮挡住浏览器默认的背景色。
/* 针对 Webkit 浏览器的自动填充样式重置 */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
/* 1. 使用足够大的内阴影来覆盖背景色,把 #ffffff 替换成你输入框原本的背景色 */
-webkit-box-shadow: 0 0 0px 1000px #ffffff inset !important;
/* 2. 由于常规的 color 属性也会失效,需要用这个属性修改文字颜色 */
-webkit-text-fill-color: #333333 !important;
/* 3. 保留光标的正常颜色 */
caret-color: #333333;
}
# 方案二:过渡延迟法(适用于透明背景输入框)
如果你设计的输入框是没有背景色的(即透明背景),那么方案一的纯色阴影就不适用了。这时,我们可以利用 CSS 的 transition 属性,给背景色的变化加上一个极长的延迟时间。
这样一来,即使浏览器想变色,也要等上好几个小时,在视觉上就等同于保持了透明。
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
/* 将背景色的过渡时间设置为一个极大的值(如 5000秒),让变色无限延后 */
transition: background-color 5000s ease-in-out 0s;
/* 依然可以自定义文字颜色 */
-webkit-text-fill-color: #333333 !important;
}
# 方案三:直接禁用自动填充(视业务场景而定)
如果你开发的系统对安全性要求极高,或者明确不需要浏览器记住密码(例如银行系统的动态验证码输入框),可以直接在 HTML 层面关闭它。
<input type="text" name="username" autocomplete="off">
<input type="password" name="password" autocomplete="new-password">
注意: 禁用自动填充会牺牲一部分用户便利性,在常规的登录注册页面中不建议滥用。通常推荐使用前两种 CSS 方案来兼顾用户体验与 UI 美观。
💡 总结
处理 :-webkit-autofill 是前端页面切图时的经典问题。遇到纯色背景,首选 box-shadow 内阴影覆盖;遇到透明背景,使用 transition 延迟生效;遇到特殊安全场景,再考虑 autocomplete="off"。掌握这三招,足以应对绝大多数表单样式重置的需求。