feat(harness): 用戶 CC harness(acr install-harness)+ 公開 repo 只留對外

讓「用 arcrun 開發」的用戶,他的 CC 自動載入 arcrun 防護、不退回自寫 Python。

新增 user-cc-harness(SDD: .agents/specs/user-cc-harness,本機):
- acr install-harness:冪等裝進用戶當前專案(新/舊專案皆可),acr init 末尾也順便裝
  - CLAUDE.md arcrun 區塊(標記包夾,append 不破壞既有)
  - .claude/skills/arcrun-mindset(世界觀 + 資源去哪取 acr parts/auth-recipe)
  - .claude/commands/arcrun.md(/arcrun slash command)
  - .claude/hooks/arcrun-guard.sh(python→提醒不硬擋、暴露→exit 2、每條含正路)
  - settings.json 合併 hook(不覆蓋用戶既有 hooks/設定)
- llms.txt + README「給 AI」段:第一接觸點(用戶丟連結,CC 讀了知道第一步 install-harness)
  含 CF 憑證白話照抄式引導(不對用戶講 KV/Worker/R2 術語)
- harness 素材內嵌 npm 套件(cli/harness/,files 帶上),不依賴用戶有 arcrun repo
- 實測:空目錄/冪等/既有檔合併皆通過,tsc exit 0,npm pack 含 harness 5 檔

公開 repo 清理(richblack:用戶要用不要開發 arcrun):
- git rm --cached 移除開發痕跡 + 思考過程出公開 repo(本機保留供 richblack 開發):
  .claude/CLAUDE.md/AGENTS.md/.agents/docs/DECISIONS/BACKLOG/landing/.github
- .gitignore 防回流;補 MIT LICENSE

MCP(P7)納入 install-harness/update 的接點已設計,實作待 MCP 對齊(BACKLOG 另一條線)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
uncle6me-web
2026-06-03 20:02:44 +08:00
parent 922a57fe34
commit 037cf9b6a4
139 changed files with 442 additions and 30768 deletions
-122
View File
@@ -1,122 +0,0 @@
'use client';
// Mira 首頁(Profile / KM Hub
// SDD: polaris/mira/.agents/specs/mira-app/design.md §5.2
// 這頁是 leo 的 KM 首頁,列出所有同層子頁的入口
// 河道 / Wiki 是同層子頁,不是父子關係
import Link from 'next/link';
import './mira.css';
type Entry = {
href: string;
emoji: string;
title: string;
desc: string;
status?: 'live' | 'wip' | 'planned';
};
const ENTRIES: Entry[] = [
{
href: '/mira/feed',
emoji: '🌊',
title: '河道',
desc: '時間軸式貼文流,所有 source 進來的內容都在這',
status: 'live',
},
{
href: '/mira/wiki',
emoji: '📚',
title: 'Wiki',
desc: 'leo 的個人觀點累積(Karpathy LLM Wiki 風格)',
status: 'live',
},
{
href: '/mira/plan',
emoji: '📋',
title: '計劃',
desc: 'Task 列表 + 狀態切換 + workflow 觸發',
status: 'planned',
},
{
href: '/mira/dissent',
emoji: '⚔️',
title: '異見牆',
desc: 'Triplet 列表(含 ai-idea / 矛盾標記)',
status: 'planned',
},
];
export default function MiraHubPage() {
return (
<main className="mira-app">
<div className="mira-content">
<header style={{ padding: '32px 0 24px' }}>
<h1 style={{ fontSize: 32, fontWeight: 700, color: '#fff', margin: 0 }}>
🦔 Mira
</h1>
<p style={{ color: '#888', fontSize: 15, marginTop: 6 }}>
leo KM
</p>
</header>
<div style={{ display: 'grid', gap: 12, paddingBottom: 40 }}>
{ENTRIES.map((e) => (
<EntryCard key={e.href} entry={e} />
))}
</div>
</div>
</main>
);
}
function EntryCard({ entry }: { entry: Entry }) {
const isClickable = entry.status === 'live';
const card = (
<div
style={{
padding: '18px 20px',
background: '#1a1a1a',
border: '1px solid #2a2a2a',
borderRadius: 8,
opacity: isClickable ? 1 : 0.5,
cursor: isClickable ? 'pointer' : 'not-allowed',
transition: 'border-color 0.15s',
}}
onMouseEnter={(e) => {
if (isClickable) e.currentTarget.style.borderColor = '#444';
}}
onMouseLeave={(e) => {
if (isClickable) e.currentTarget.style.borderColor = '#2a2a2a';
}}
>
<div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 6 }}>
<span style={{ fontSize: 24 }}>{entry.emoji}</span>
<span style={{ fontSize: 18, fontWeight: 600, color: '#fff' }}>
{entry.title}
</span>
{entry.status === 'planned' && (
<span
style={{
fontSize: 11,
padding: '2px 8px',
background: '#2a2a3a',
color: '#aab',
borderRadius: 3,
}}
>
</span>
)}
</div>
<div style={{ color: '#888', fontSize: 14, marginLeft: 36 }}>{entry.desc}</div>
</div>
);
return isClickable ? (
<Link href={entry.href} style={{ textDecoration: 'none' }}>
{card}
</Link>
) : (
card
);
}