feat: 品牌替换 + 启动优化 + AGENTS.md 模板定制

- 品牌替换:OpenCode/opencode → AirCoding/aircoding(16+ 文件)
- Logo ASCII art:修复 left/right 行数不匹配导致的启动崩溃
- 启动诊断:添加 OPENCODE_PRINT_TIMING 计时探针
- dev 模式默认 --pure 跳过外部插件加载
- AGENTS.md 模板:追加 AirCoding 多 Agent 专项段落
- architect prompt + plugin:强化 AGENTS.md 产出验证
This commit is contained in:
airlongdian
2026-06-14 09:31:29 +08:00
commit e2fd375a1c
5757 changed files with 1170016 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
import { test, expect, describe } from "bun:test"
import { McpOAuthProvider, OAUTH_CALLBACK_PORT, OAUTH_CALLBACK_PATH } from "../../src/mcp/oauth-provider"
import type { McpAuth } from "../../src/mcp/auth"
// Stub auth — only synchronous getters are exercised in these tests
const stubAuth = {} as McpAuth.Interface
const makeProvider = (config: ConstructorParameters<typeof McpOAuthProvider>[2]) =>
new McpOAuthProvider("test-server", "https://mcp.example.com/mcp", config, { onRedirect: async () => {} }, stubAuth)
describe("McpOAuthProvider.redirectUrl", () => {
test("defaults to 127.0.0.1:19876/mcp/oauth/callback", () => {
const provider = makeProvider({})
expect(provider.redirectUrl).toBe(`http://127.0.0.1:${OAUTH_CALLBACK_PORT}${OAUTH_CALLBACK_PATH}`)
})
test("uses callbackPort when set", () => {
const provider = makeProvider({ callbackPort: 6620 })
expect(provider.redirectUrl).toBe(`http://127.0.0.1:6620${OAUTH_CALLBACK_PATH}`)
})
test("redirectUri takes precedence over callbackPort", () => {
const provider = makeProvider({
callbackPort: 6620,
redirectUri: "http://127.0.0.1:9999/custom/callback",
})
expect(provider.redirectUrl).toBe("http://127.0.0.1:9999/custom/callback")
})
test("uses explicit redirectUri when set without callbackPort", () => {
const provider = makeProvider({ redirectUri: "http://127.0.0.1:8080/oauth/callback" })
expect(provider.redirectUrl).toBe("http://127.0.0.1:8080/oauth/callback")
})
})
describe("McpOAuthProvider.clientMetadata", () => {
test("includes redirect_uris from redirectUrl", () => {
const provider = makeProvider({ callbackPort: 6620 })
expect(provider.clientMetadata.redirect_uris).toEqual([`http://127.0.0.1:6620${OAUTH_CALLBACK_PATH}`])
})
test("includes scope when set in config", () => {
const provider = makeProvider({ scope: "openid offline_access" })
expect(provider.clientMetadata.scope).toBe("openid offline_access")
})
test("omits scope when not set in config", () => {
const provider = makeProvider({})
expect(provider.clientMetadata.scope).toBeUndefined()
})
test("sets token_endpoint_auth_method to client_secret_post when clientSecret provided", () => {
const provider = makeProvider({ clientSecret: "secret" })
expect(provider.clientMetadata.token_endpoint_auth_method).toBe("client_secret_post")
})
test("sets token_endpoint_auth_method to none when no clientSecret", () => {
const provider = makeProvider({})
expect(provider.clientMetadata.token_endpoint_auth_method).toBe("none")
})
})