Skip to content

Commit 4a89ec6

Browse files
authored
Merge pull request #1 from Lanrenbang/Svelte
feat: Implemented a monorepo structure, adding a Svelte UI library an…
2 parents a05c60b + 5e3d635 commit 4a89ec6

File tree

517 files changed

+36328
-4752
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

517 files changed

+36328
-4752
lines changed

.github/release-drafter.yml

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
name-template: 'v$RESOLVED_VERSION 🚀'
2-
tag-template: 'v$RESOLVED_VERSION'
1+
# .github/release-drafter.yml
32

3+
# 模板部分仅保留 Body 内容,$CHANGES 会自动填充变更日志
44
template: |
55
## What’s Changed
6-
76
$CHANGES
87
98
---
10-
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION
9+
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...$TAG
1110
1211
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
1312
commit-template: ' - $SUBJECT'
14-
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
13+
change-title-escapes: '\<*_&'
1514

1615
autolabeler:
1716
- label: "BREAKING CHANGE"
@@ -45,21 +44,6 @@ autolabeler:
4544
- 'go.mod'
4645
- 'go.sum'
4746

48-
version-resolver:
49-
major:
50-
labels:
51-
- 'BREAKING CHANGE'
52-
minor:
53-
labels:
54-
- 'enhancement'
55-
patch:
56-
labels:
57-
- 'documentation'
58-
- 'bug'
59-
- "fix"
60-
- "chore"
61-
default: patch
62-
6347
categories:
6448
- title: "🚨 BREAKING CHANGES 🚨"
6549
labels:
@@ -76,4 +60,3 @@ categories:
7660
labels:
7761
- "chore"
7862
- "documentation"
79-

.github/workflows/publish.yml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: Publish to npm
2+
3+
on:
4+
workflow_dispatch:
5+
inputs:
6+
package:
7+
description: 'Package to publish'
8+
required: true
9+
type: choice
10+
options:
11+
- ultra
12+
- svelte
13+
- both
14+
dry_run:
15+
description: 'Dry run (no actual publish)'
16+
required: false
17+
type: boolean
18+
default: false
19+
20+
jobs:
21+
publish:
22+
runs-on: ubuntu-latest
23+
permissions:
24+
contents: read
25+
id-token: write # 必须:用于申请 OIDC Token
26+
27+
steps:
28+
- name: Checkout
29+
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
30+
31+
- name: Setup Bun
32+
uses: oven-sh/setup-bun@b7a1c7ccf290d58743029c4f6903da283811b979 # v2.1.0
33+
with:
34+
bun-version: latest
35+
36+
- name: Setup Node.js
37+
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
38+
with:
39+
node-version: '24'
40+
registry-url: 'https://registry.npmjs.org'
41+
# setup-node 会自动检测 id-token 权限并生成 .npmrc 配置,无需手动设置 env
42+
43+
- name: Install dependencies
44+
run: bun install
45+
46+
- name: Copy shared files to packages
47+
run: |
48+
cp README.md LICENSE.md packages/ultra/
49+
cp README.md LICENSE.md packages/svelte/
50+
51+
- name: Build Ultra
52+
if: inputs.package == 'ultra' || inputs.package == 'both'
53+
run: bun run build:ultra
54+
55+
- name: Build Svelte
56+
if: inputs.package == 'svelte' || inputs.package == 'both'
57+
run: bun run build:svelte
58+
59+
# Dry Run 不需要 provenance,因为它不真正上传
60+
- name: Publish Ultra (dry run)
61+
if: (inputs.package == 'ultra' || inputs.package == 'both') && inputs.dry_run
62+
run: npm publish --access public --dry-run
63+
working-directory: packages/ultra
64+
65+
- name: Publish Svelte (dry run)
66+
if: (inputs.package == 'svelte' || inputs.package == 'both') && inputs.dry_run
67+
run: npm publish --access public --dry-run
68+
working-directory: packages/svelte
69+
70+
# 正式发布:移除 secrets 引用,添加 --provenance
71+
- name: Publish Ultra
72+
if: (inputs.package == 'ultra' || inputs.package == 'both') && !inputs.dry_run
73+
run: npm publish --access public --provenance
74+
working-directory: packages/ultra
75+
76+
- name: Publish Svelte
77+
if: (inputs.package == 'svelte' || inputs.package == 'both') && !inputs.dry_run
78+
run: npm publish --access public --provenance
79+
working-directory: packages/svelte
80+
81+
- name: Summary
82+
run: |
83+
echo "## 📦 Publish Summary" >> $GITHUB_STEP_SUMMARY
84+
echo "" >> $GITHUB_STEP_SUMMARY
85+
if [ "${{ inputs.dry_run }}" == "true" ]; then
86+
echo "🔍 **Dry run completed** - no packages were actually published" >> $GITHUB_STEP_SUMMARY
87+
else
88+
echo "✅ **Published packages:**" >> $GITHUB_STEP_SUMMARY
89+
if [ "${{ inputs.package }}" == "ultra" ] || [ "${{ inputs.package }}" == "both" ]; then
90+
echo "- @lanrenbang/basecoat-ultra" >> $GITHUB_STEP_SUMMARY
91+
fi
92+
if [ "${{ inputs.package }}" == "svelte" ] || [ "${{ inputs.package }}" == "both" ]; then
93+
echo "- @lanrenbang/basecoat-ultra-svelte" >> $GITHUB_STEP_SUMMARY
94+
fi
95+
fi

.github/workflows/release-manager.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ jobs:
3737
pull-requests: write # write for autolabeler, otherwise read
3838
runs-on: ubuntu-latest
3939
steps:
40+
# 1. 必须检出代码才能读取 package.json
41+
- name: Checkout
42+
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
43+
4044
- name: 'Determine release parameters'
4145
id: params
4246
shell: bash
@@ -80,14 +84,55 @@ jobs:
8084
echo "prerelease_id=$PRERELEASE_ID"
8185
} >> "$GITHUB_OUTPUT"
8286
87+
# 2. 核心步骤:生成日期版本号 + 提取子包版本
88+
- name: 'Prepare Release Info'
89+
id: info
90+
shell: bash
91+
run: |
92+
# 生成日期 Tag (例如: 2024.01.05.1430)
93+
DATE_TAG=$(TZ='America/Los_Angeles' date +'%Y.%m.%d.%H%M')
94+
echo "🔹 Generated Tag: $DATE_TAG"
95+
96+
# 使用 jq 提取 package.json 中的版本号
97+
V_ULTRA=$(jq -r .version packages/ultra/package.json)
98+
V_SVELTE=$(jq -r .version packages/svelte/package.json)
99+
V_CLI=$(jq -r .version packages/cli/package.json)
100+
101+
# 构建 Markdown 表格
102+
VERSION_TABLE="### 📦 Core Packages Versions
103+
| Package | Version |
104+
| :--- | :--- |
105+
| **ultra** | \`v$V_ULTRA\` |
106+
| **svelte** | \`v$V_SVELTE\` |
107+
| **cli** | \`v$V_CLI\` |
108+
"
109+
110+
# 处理多行文本输出到 GITHUB_OUTPUT
111+
echo "date_tag=$DATE_TAG" >> $GITHUB_OUTPUT
112+
113+
echo "versions<<EOF" >> $GITHUB_OUTPUT
114+
echo "$VERSION_TABLE" >> $GITHUB_OUTPUT
115+
echo "EOF" >> $GITHUB_OUTPUT
116+
117+
# 3. 运行 Release Drafter
83118
- name: 'Run Release Draft'
84119
uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0
85120
with:
86121
# https://github.com/release-drafter/release-drafter/issues/1125
87122
commitish: ${{ github.event.repository.default_branch }}
123+
124+
# 动态控制发布状态
88125
publish: ${{ steps.params.outputs.publish }}
89126
prerelease: ${{ steps.params.outputs.prerelease }}
90127
prerelease-identifier: ${{ steps.params.outputs.prerelease_id }}
128+
129+
# 【关键】强制使用日期作为 Tag 和标题,覆盖自动语义化计算
130+
tag: ${{ steps.info.outputs.date_tag }}
131+
name: "🚀 Release ${{ steps.info.outputs.date_tag }}"
132+
133+
# 【关键】将包版本表格注入到 Release Body 的头部
134+
header: ${{ steps.info.outputs.versions }}
135+
91136
env:
92137
# GITHUB_TOKEN cannot trigger a new workflow.
93138
GITHUB_TOKEN: ${{ steps.params.outputs.publish == 'true' && secrets.BOT_PAT || secrets.GITHUB_TOKEN }}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
name: Upstream Sync Check
2+
3+
on:
4+
schedule:
5+
# Check every Monday at 9:00 UTC
6+
- cron: '0 9 * * 1'
7+
workflow_dispatch: # Allow manual trigger
8+
9+
jobs:
10+
check-upstream:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
16+
with:
17+
fetch-depth: 0
18+
19+
- name: Setup Bun
20+
uses: oven-sh/setup-bun@b7a1c7ccf290d58743029c4f6903da283811b979 # v2.1.0
21+
with:
22+
bun-version: latest
23+
24+
- name: Install dependencies
25+
run: bun install
26+
27+
- name: Add upstream remote
28+
run: |
29+
git remote add upstream https://github.com/hunvreus/basecoat.git
30+
git fetch upstream --tags
31+
32+
# Create tracking branch if not exists
33+
git branch upstream/tracking upstream/main 2>/dev/null || \
34+
git branch -f upstream/tracking upstream/main
35+
36+
- name: Check for updates
37+
id: check
38+
run: |
39+
# Get current tracking commit (from last sync)
40+
TRACKING_COMMIT=$(git rev-parse upstream/tracking 2>/dev/null || echo "")
41+
UPSTREAM_COMMIT=$(git rev-parse upstream/main)
42+
43+
if [ -z "$TRACKING_COMMIT" ]; then
44+
echo "First run, setting baseline"
45+
NEW_COMMITS=0
46+
else
47+
NEW_COMMITS=$(git rev-list --count ${TRACKING_COMMIT}..${UPSTREAM_COMMIT} 2>/dev/null || echo "0")
48+
fi
49+
50+
echo "new_commits=$NEW_COMMITS" >> $GITHUB_OUTPUT
51+
echo "upstream_commit=$UPSTREAM_COMMIT" >> $GITHUB_OUTPUT
52+
53+
# Get upstream version tag
54+
UPSTREAM_TAG=$(git describe --tags --exact-match upstream/main 2>/dev/null || \
55+
git describe --tags --always upstream/main)
56+
echo "upstream_tag=$UPSTREAM_TAG" >> $GITHUB_OUTPUT
57+
58+
if [ "$NEW_COMMITS" -gt "0" ]; then
59+
echo "Found $NEW_COMMITS new commit(s)"
60+
git log --oneline ${TRACKING_COMMIT}..${UPSTREAM_COMMIT} > upstream-changes.txt
61+
62+
# Run diff analysis from packages/ultra
63+
cd packages/ultra
64+
bun run upstream:diff || true
65+
fi
66+
67+
- name: Upload analysis artifacts
68+
if: steps.check.outputs.new_commits > 0
69+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
70+
with:
71+
name: upstream-analysis
72+
path: |
73+
packages/ultra/upstream-analysis/UPSTREAM_DIFF.md
74+
packages/ultra/upstream-analysis/patches/
75+
packages/ultra/upstream-analysis/latest-analysis.json
76+
retention-days: 30
77+
78+
- name: Create Issue if updates found
79+
if: steps.check.outputs.new_commits > 0
80+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
81+
with:
82+
script: |
83+
const fs = require('fs');
84+
85+
let changes = '';
86+
try {
87+
changes = fs.readFileSync('upstream-changes.txt', 'utf8');
88+
} catch (e) {
89+
changes = 'Could not read changes';
90+
}
91+
92+
let diffReport = '';
93+
try {
94+
diffReport = fs.readFileSync('packages/ultra/upstream-analysis/UPSTREAM_DIFF.md', 'utf8');
95+
// Truncate if too long
96+
if (diffReport.length > 50000) {
97+
diffReport = diffReport.substring(0, 50000) + '\n\n... (truncated)';
98+
}
99+
} catch (e) {
100+
diffReport = 'Diff report not available';
101+
}
102+
103+
const newCommits = '${{ steps.check.outputs.new_commits }}';
104+
const upstreamTag = '${{ steps.check.outputs.upstream_tag }}';
105+
106+
// Check for existing open issue
107+
const existingIssues = await github.rest.issues.listForRepo({
108+
owner: context.repo.owner,
109+
repo: context.repo.repo,
110+
labels: 'upstream-sync',
111+
state: 'open'
112+
});
113+
114+
if (existingIssues.data.length > 0) {
115+
// Update existing issue
116+
await github.rest.issues.createComment({
117+
owner: context.repo.owner,
118+
repo: context.repo.repo,
119+
issue_number: existingIssues.data[0].number,
120+
body: `## Update: ${new Date().toISOString()}\n\nUpstream now at **${upstreamTag}** with ${newCommits} new commit(s).\n\n### New Commits:\n\`\`\`\n${changes}\n\`\`\`\n\n<details>\n<summary>Full Diff Report</summary>\n\n${diffReport}\n\n</details>`
121+
});
122+
} else {
123+
// Create new issue
124+
await github.rest.issues.create({
125+
owner: context.repo.owner,
126+
repo: context.repo.repo,
127+
title: `🔄 Upstream Basecoat updated to ${upstreamTag}`,
128+
body: `## Upstream Repository Update\n\nThe upstream [basecoat](https://github.com/hunvreus/basecoat) repository has **${newCommits}** new commit(s).\n\n### Version\n- **Tag**: ${upstreamTag}\n- **Commit**: ${{ steps.check.outputs.upstream_commit }}\n\n### New Commits\n\`\`\`\n${changes}\n\`\`\`\n\n### Diff Analysis\n\n<details>\n<summary>Click to expand full diff report</summary>\n\n${diffReport}\n\n</details>\n\n### Next Steps\n\n1. Download the analysis artifacts from this workflow run\n2. Review the patches in \`upstream-analysis/patches/\`\n3. Run locally:\n \`\`\`bash\n bun run upstream:sync\n bun run upstream:diff\n \`\`\`\n4. Cherry-pick or manually apply relevant changes\n5. Update \`UPSTREAM.md\` with sync status\n6. Close this issue when done`,
129+
labels: ['upstream-sync']
130+
});
131+
}

.gitignore

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
3434
# Finder (MacOS) folder config
3535
.DS_Store
3636

37-
references
38-
patches
39-
.gemini
40-
WIP.md
37+
# Copied files for npm publish (generated by publish scripts)
38+
packages/*/README.md
39+
packages/*/LICENSE.md

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"kiroAgent.configureMCP": "Enabled"
3+
}

0 commit comments

Comments
 (0)