fix(config): supplement missing fields and fix comments in -g template

Add missing fields to GenerateConfigYAML output:
- proxy.timeout.dial (TCP dial timeout)
- health_check.slow_start and health_check.match (status/body/headers)
- proxy.buffering.buffers (multi-buffer config)
- lua.scripts[].route and route_type (routing mode)

Fix coroutine_stack_size comment to show actual default (64).
This commit is contained in:
xfy 2026-06-04 00:04:13 +08:00
parent 9bdb8b24a7
commit 2ad056d0ca
5 changed files with 155 additions and 365 deletions

View File

@ -0,0 +1,131 @@
# Skill: 更新 -g 默认配置模板
当 config struct 新增/修改字段时,同步更新 `GenerateConfigYAML` 输出模板。
## 涉及文件
| 文件 | 职责 |
|------|------|
| `internal/config/*.go` | struct 定义(改字段) |
| `internal/config/defaults.go` | `DefaultConfig()` 默认值 + `GenerateConfigYAML()` 模板 |
| `internal/config/defaults_test.go` | `TestGenerateConfigYAML*` 覆盖率测试 |
## 更新流程
### 1. 修改 struct
在对应的 `*_config.go` 文件中添加/修改字段,确保:
- 有 `yaml` tag
- 有中文注释说明字段用途和有效值
### 2. 更新 DefaultConfig()
`defaults.go``DefaultConfig()` 函数中为新字段设置合理默认值。
### 3. 更新 GenerateConfigYAML()
`defaults.go``GenerateConfigYAML()` 函数中,找到对应区块,添加/修改模板行。
**规则:**
1. **格式一致性**:使用 `buf.WriteString` 写注释行,`fmt.Fprintf` 写带默认值的行
2. **注释行前缀**:可选配置用 `#` 注释,必填/有默认值的配置直接输出
3. **注释规范**:每行末尾 `#` 注释说明用途,新字段加 `# 有效值: a, b, c` 格式的可选值说明
4. **默认值来源**:使用 `cfg.Servers[0].Xxx` 读取 `DefaultConfig()` 的值,不硬编码
5. **缩进层级**
- 顶层配置无缩进(`logging:`, `http3:`
- server 内配置 4 空格(` listen:`
- server 子配置 6-8 空格(` access:`
- 注释中的示例配置也保持正确缩进
### 4. struct 字段 → GenerateConfigYAML 区块对照表
| struct 文件 | GenerateConfigYAML 区块 |
|-------------|------------------------|
| `config.go``Config.Mode` | mode 注释块(~L254 |
| `config.go``Config.Mode` | servers 开头(~L263 |
| `server_config.go``ServerConfig` | servers 列表内L264-288 |
| `server_config.go``TypesConfig` | types 注释块(~L292 |
| `server_config.go``LimitRateConfig` | limit_rate 注释块(~L302 |
| `monitoring_config.go``CacheAPIConfig` | cache_api 注释块(~L310 |
| `variable_config.go``LuaMiddlewareConfig` | lua 注释块(~L324 |
| `variable_config.go``CompressionConfig` | compression 块(~L607 |
| `variable_config.go``RewriteRule` | rewrite 注释块(~L598 |
| `server_config.go``StaticConfig` | static 块(~L349 |
| `proxy_config.go``ProxyConfig` | proxy 注释块(~L385 |
| `proxy_config.go``ProxyTimeout` | proxy.timeout~L413 |
| `proxy_config.go``ProxyBufferingConfig` | proxy.buffering~L418 |
| `proxy_config.go``HealthCheckConfig` | proxy.health_check~L403 |
| `proxy_config.go``ProxyHeaders` | proxy.headers~L424 |
| `cache_config.go``ProxyCacheConfig` | proxy.cache~L435 |
| `cache_config.go``ProxyCacheValidConfig` | proxy.cache_valid~L448 |
| `proxy_config.go``ProxySSLConfig` | proxy.proxy_ssl~L454 |
| `proxy_config.go``NextUpstreamConfig` | proxy.next_upstream~L464 |
| `proxy_config.go``BalancerByLuaConfig` | proxy.balancer_by_lua~L467 |
| `proxy_config.go``RedirectRewriteConfig` | proxy.redirect_rewrite~L472 |
| `ssl_config.go``SSLConfig` | ssl 注释块(~L486 |
| `ssl_config.go``SessionTicketsConfig` | ssl.session_tickets~L506 |
| `ssl_config.go``ClientVerifyConfig` | ssl.client_verify~L511 |
| `performance_config.go``HTTP2Config` | ssl.http2~L517 |
| `security_config.go``SecurityConfig` | security 块(~L534 |
| `security_config.go``AccessConfig`/`GeoIPConfig` | security.access/geoip~L537 |
| `security_config.go``RateLimitConfig` | security.rate_limit~L555 |
| `security_config.go``AuthConfig` | security.auth~L564 |
| `security_config.go``SecurityHeaders` | security.headers~L573 |
| `security_config.go``ErrorPageConfig` | security.error_page~L581 |
| `security_config.go``AuthRequestConfig` | security.auth_request~L587 |
| `performance_config.go``ShutdownConfig` | shutdown 块(~L623 |
| `server_config.go``StreamConfig` | stream 注释块(~L631 |
| `monitoring_config.go``LoggingConfig` | logging 块(~L662 |
| `performance_config.go``PerformanceConfig` | performance 块(~L676 |
| `performance_config.go``HTTP3Config` | http3 块(~L693 |
| `monitoring_config.go``MonitoringConfig` | monitoring 块(~L703 |
| `performance_config.go``ResolverConfig` | resolver 块(~L723 |
| `variable_config.go``VariablesConfig` | variables 块(~L737 |
| `variable_config.go``IncludeConfig` | include 注释块(~L745 |
### 5. 运行验证
```bash
# 测试模板覆盖率(检查 struct 字段是否都在模板中出现)
go test -v -run TestGenerateConfigYAML ./internal/config/...
# 测试 app 层 generateConfig 函数
go test -v -run TestGenerateConfig ./internal/app/...
# 完整测试 + lint
make test
make lint
```
## 添加新字段的模板示例
### 简单字符串字段(可选,注释形式)
```go
buf.WriteString(" # new_field: \"\" # 新字段说明(有效值: a, b, c\n")
```
### 带默认值的字段(使用 fmt.Fprintf
```go
fmt.Fprintf(&buf, " # new_field: %d # 新字段说明\n", cfg.Servers[0].NewField)
```
### 新的嵌套结构体
```go
buf.WriteString(" # new_section: # 新区块说明\n")
buf.WriteString(" # enabled: false # 是否启用\n")
buf.WriteString(" # option: \"\" # 选项说明\n")
buf.WriteString("\n")
```
## 常见遗漏检查清单
添加新字段后,逐项确认:
- [ ] struct 有 `yaml` tag
- [ ] `DefaultConfig()` 有默认值
- [ ] `GenerateConfigYAML()` 有注释行(可选字段)或输出行(有默认值的字段)
- [ ] 注释中包含 `有效值:` 说明(枚举类字段)
- [ ] `fmt.Fprintf` 使用 `cfg.Servers[0].Xxx` 而非硬编码数字
- [ ] `TestGenerateConfigYAMLFieldsCoverage` 通过(它会检查 struct 字段是否出现在模板中)
- [ ] `make lint` 无新增 warning

View File

@ -1,315 +0,0 @@
# Lolly 项目缺少文档注释的导出标识符检测报告
## 概述
使用 AST 静态分析扫描 `/root/projects/lolly`,共发现 **180** 个导出的函数/类型/常量/变量缺少以标识符名称开头的文档注释GoDoc
---
## 一、公共 API非 internal 包)
| 文件 | 行号 | 类型 | 名称 |
|------|------|------|------|
| `gjson/gjson.go` | 35 | const | `ModuleName` |
| `gjson/gjson.go` | 38 | const | `Version` |
**说明**`gjson` 是项目中唯一的非 internal 子包,其导出的 `ModuleName``Version` 常量缺少文档注释。
---
## 二、internal 包中的缺失(按文件分组)
### internal/benchmark/tools/tools.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 13 | const | `Size100B` |
| 14 | const | `Size1KB` |
| 15 | const | `Size10KB` |
| 16 | const | `Size100KB` |
| 17 | const | `Size1MB` |
| 36 | const | `ModeNormalResponse` |
| 37 | const | `ModeRandomResponse` |
| 38 | const | `ModeErrorResponse` |
| 39 | const | `ModeDelayedResponse` |
### internal/config/config.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 33 | const | `DefaultPprofPath` |
| 44 | const | `ServerModeSingle` |
| 46 | const | `ServerModeVHost` |
| 48 | const | `ServerModeMultiServer` |
| 50 | const | `ServerModeAuto` |
### internal/converter/nginx/converter.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 28 | method | `Warning.String` |
### internal/converter/nginx/parser.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 31 | method | `*ParseError.Error` |
### internal/e2e/testutil/constants.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 18 | const | `ContainerStartupTimeout` |
| 21 | const | `HealthCheckWaitTimeout` |
| 24 | const | `HealthCheckDetectionTime` |
| 27 | const | `CacheExpireBuffer` |
| 30 | const | `DefaultTestTimeout` |
| 33 | const | `DefaultClientTimeout` |
| 36 | const | `ConcurrentRequestTimeout` |
| 39 | const | `ShortTestTimeout` |
| 42 | const | `MediumTestTimeout` |
| 48 | const | `DefaultBackendCount` |
| 51 | const | `DefaultConcurrentRequests` |
| 54 | const | `HighConcurrentRequests` |
| 57 | const | `CacheTestMaxAge` |
| 60 | const | `CacheTestShortMaxAge` |
| 66 | const | `TLSVersion12` |
| 69 | const | `TLSVersion13` |
### internal/e2e/testutil/websocket.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 41 | func | `WithWSHeaders` |
### internal/lua/api_log.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 29 | const | `LogStderr` |
| 30 | const | `LogEmerg` |
| 31 | const | `LogAlert` |
| 32 | const | `LogCrit` |
| 33 | const | `LogErr` |
| 34 | const | `LogWarn` |
| 35 | const | `LogNotice` |
| 36 | const | `LogInfo` |
| 37 | const | `LogDebug` |
| 42 | const | `HTTPContinue` |
| 43 | const | `HTTPSwitchingProtocols` |
| 44 | const | `HTTPOK` |
| 45 | const | `HTTPCreated` |
| 46 | const | `HTTPAccepted` |
| 47 | const | `HTTPNoContent` |
| 48 | const | `HTTPPartialContent` |
| 49 | const | `HTTPMovedPermanently` |
| 50 | const | `HTTPFound` |
| 51 | const | `HTTPSeeOther` |
| 52 | const | `HTTPNotModified` |
| 53 | const | `HTTPTemporaryRedirect` |
| 54 | const | `HTTPPermanentRedirect` |
| 55 | const | `HTTPBadRequest` |
| 56 | const | `HTTPUnauthorized` |
| 57 | const | `HTTPForbidden` |
| 58 | const | `HTTPNotFound` |
| 59 | const | `HTTPMethodNotAllowed` |
| 60 | const | `HTTPRequestTimeout` |
| 61 | const | `HTTPConflict` |
| 62 | const | `HTTPGone` |
| 63 | const | `HTTPLengthRequired` |
| 64 | const | `HTTPPayloadTooLarge` |
| 65 | const | `HTTPURITooLong` |
| 66 | const | `HTTPUnsupportedMedia` |
| 67 | const | `HTTPRangeNotSatisfiable` |
| 68 | const | `HTTPTooManyRequests` |
| 69 | const | `HTTPInternalServerError` |
| 70 | const | `HTTPNotImplemented` |
| 71 | const | `HTTPBadGateway` |
| 72 | const | `HTTPServiceUnavailable` |
| 73 | const | `HTTPGatewayTimeout` |
| 74 | const | `HTTPHTTPVersionNotSupported` |
### internal/lua/api_req.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 36 | const | `APILayerDirect` |
| 40 | const | `APILayerCompatible` |
| 44 | const | `APILayerPseudoNonBlocking` |
| 58 | method | `ngxReqAPILayer.String` |
### internal/lua/cache.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 38 | const | `CacheKeyInline` |
| 41 | const | `CacheKeyFile` |
### internal/lua/coroutine.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 35 | const | `PhaseInit` |
| 37 | const | `PhaseRewrite` |
| 39 | const | `PhaseAccess` |
| 41 | const | `PhaseContent` |
| 43 | const | `PhaseLog` |
| 45 | const | `PhaseHeaderFilter` |
| 47 | const | `PhaseBodyFilter` |
| 50 | method | `Phase.String` |
### internal/lua/socket_manager.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 36 | const | `SocketStateIdle` |
| 38 | const | `SocketStateConnecting` |
| 40 | const | `SocketStateConnected` |
| 42 | const | `SocketStateSending` |
| 44 | const | `SocketStateReceiving` |
| 46 | const | `SocketStateClosing` |
| 48 | const | `SocketStateClosed` |
| 50 | const | `SocketStateError` |
| 83 | const | `OpConnect` |
| 85 | const | `OpSend` |
| 87 | const | `OpReceive` |
| 89 | const | `OpClose` |
### internal/matcher/location.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 257 | method | `*ConflictError.Error` |
### internal/matcher/matcher.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 27 | const | `LocationTypeExact` |
| 28 | const | `LocationTypePrefix` |
| 29 | const | `LocationTypePrefixPriority` |
| 30 | const | `LocationTypeRegex` |
| 31 | const | `LocationTypeRegexCaseless` |
| 32 | const | `LocationTypeNamed` |
### internal/middleware/compression/compression.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 100 | const | `AlgorithmGzip` |
| 102 | const | `AlgorithmBrotli` |
### internal/middleware/limitrate/limitrate.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 15 | const | `LargeFileStrategySkip` |
| 17 | const | `LargeFileStrategyCoarse` |
### internal/middleware/rewrite/rewrite.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 41 | const | `FlagLast` |
| 44 | const | `FlagRedirect` |
| 47 | const | `FlagPermanent` |
| 50 | const | `FlagBreak` |
### internal/middleware/security/access.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 47 | const | `ActionAllow` |
| 49 | const | `ActionDeny` |
### internal/middleware/security/auth.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 52 | const | `HashBcrypt` |
| 54 | const | `HashArgon2id` |
### internal/resolver/resolver.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 446 | method | `*noopResolver.LookupHost` |
| 450 | method | `*noopResolver.LookupHostWithCache` |
| 454 | method | `*noopResolver.Refresh` |
| 458 | method | `*noopResolver.Start` |
| 462 | method | `*noopResolver.Stop` |
| 466 | method | `*noopResolver.Stats` |
### internal/ssl/client_verify.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 33 | const | `VerifyOff` |
| 35 | const | `VerifyOn` |
| 37 | const | `VerifyOptional` |
| 39 | const | `VerifyOptionalNoCA` |
### internal/stream/stream.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 82 | method | `*roundRobin.Select` |
| 171 | method | `*weightedRoundRobin.Select` |
| 244 | method | `*ipHash.Select` |
| 248 | method | `*ipHash.SelectByIP` |
### internal/utils/httperror.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 26 | var | `ErrNotFound` |
| 27 | var | `ErrForbidden` |
| 28 | var | `ErrUnauthorized` |
| 29 | var | `ErrBadGateway` |
| 30 | var | `ErrGatewayTimeout` |
| 31 | var | `ErrInternalError` |
| 32 | var | `ErrTooManyRequests` |
| 33 | var | `ErrServiceUnavailable` |
### internal/variable/builtin.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 19 | const | `VarHost` |
| 20 | const | `VarRemoteAddr` |
| 21 | const | `VarRemotePort` |
| 22 | const | `VarRequestURI` |
| 23 | const | `VarURI` |
| 24 | const | `VarArgs` |
| 25 | const | `VarRequestMethod` |
| 26 | const | `VarScheme` |
| 27 | const | `VarServerName` |
| 28 | const | `VarServerPort` |
| 29 | const | `VarStatus` |
| 30 | const | `VarBodyBytesSent` |
| 31 | const | `VarRequestTime` |
| 32 | const | `VarTimeLocal` |
| 33 | const | `VarTimeISO8601` |
| 34 | const | `VarRequestID` |
| 36 | const | `VarUpstreamAddr` |
| 37 | const | `VarUpstreamStatus` |
| 38 | const | `VarUpstreamResponseTime` |
| 39 | const | `VarUpstreamConnectTime` |
| 40 | const | `VarUpstreamHeaderTime` |
### internal/variable/ssl.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 24 | const | `VarSSLClientVerify` |
| 25 | const | `VarSSLClientSerial` |
| 26 | const | `VarSSLClientSubject` |
| 27 | const | `VarSSLClientIssuer` |
| 28 | const | `VarSSLClientFingerprint` |
| 29 | const | `VarSSLClientNotBefore` |
| 30 | const | `VarSSLClientNotAfter` |
| 31 | const | `VarSSLClientDNS` |
| 32 | const | `VarSSLClientEmail` |
### internal/version/version.go
| 行号 | 类型 | 名称 |
|------|------|------|
| 9 | var | `Version` |
| 11 | var | `GitCommit` |
| 13 | var | `GitBranch` |
| 15 | var | `BuildTime` |
| 17 | var | `GoVersion` |
| 19 | var | `BuildPlatform` |
---
## 统计汇总
| 类别 | 数量 |
|------|------|
| 公共 API非 internal | 2 |
| internal 常量 | 134 |
| internal 变量 | 14 |
| internal 方法 | 14 |
| internal 函数 | 1 |
| **总计** | **180** |
---
*检测规则:导出的标识符(首字母大写)必须紧跟以该标识符名称开头的 `//` 文档注释,才被视为已文档化。`_test.go` 和 vendor 目录已排除。*

View File

@ -1,48 +0,0 @@
## 更新配置文件实例
ulw 深度分析配置文件,当前支持的配置和 --generate-config 是否有不一样的地方,--generate-config
需要完整且详细,包括所有字段的枚举值都要有
ulw 深度分析下有没有代码实现了,但是 --generate-config 缺失的地方
ulw 逐行分析下当前的 --generate-config看看代码中是否都实现了
ulw 分析 lib/nginx 代码,然后更新 docs/nginx/ 里的文档
ulw 深度分析下 @docs/ 下的 nginx 文档,看看当前项目实现的怎么样了
## 单元测试
ulw 深度分析下当前测试覆盖率
/ralplan 深度分析一个完善测试的方案
ulw 分析并完善测试覆盖率,每完成一个功能点提交一次
## 注释
ulw 参考 @docs/comments.md深度分析项目注释是否完善
## 优化
ulw 深度分析下,有没有重复的逻辑/代码,或者冗余的东西,或者没用的东西
ulw 运行 make lint并修复
ulw 深度分析下当前项目的性能
@Makefile 运行性能基准测试
ulw 完善性能基准测试
ulw 深度分析下代码质量
ulw 深度分析下代码架构
ulw 分析下 lib/fasthttp/ 的源码,然后看下 lolly 的用法合不合理,有没有性能可以提升的地方
## 兼容性
ulw @docs/config/ 下有些nginx的配置示例,深度分析下当前 lolly 项目,然后看看 lolly 是否支持实现这些 nginx 的效果
ulw 查看 @docs/nginx/04-nginx-proxy-loadbalancing.md 分析下 lolly 是否实现了这些功能

View File

@ -327,6 +327,9 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) {
buf.WriteString(" # scripts: # Lua 脚本列表\n")
buf.WriteString(" # - path: \"/scripts/auth.lua\" # 脚本路径\n")
buf.WriteString(" # phase: \"access\" # 执行阶段(有效值: rewrite, access, content, log, header_filter, body_filter\n")
buf.WriteString(" # # 或者使用路由匹配模式(与 phase 互斥)\n")
buf.WriteString(" # # route: \"/api/.*\" # 路由匹配路径/模式(设置后按路由匹配执行,而非阶段执行)\n")
buf.WriteString(" # # route_type: \"regex\" # 路由匹配类型(有效值: exact, prefix, prefix_priority, regex, regex_caseless默认 prefix\n")
buf.WriteString(" # timeout: 10s # 执行超时\n")
buf.WriteString(" # enabled: true # 是否启用此脚本\n")
buf.WriteString(" # global_settings: # 全局设置\n")
@ -335,7 +338,7 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) {
fmt.Fprintf(&buf, " # code_cache_size: %d # 字节码缓存条目数\n", cfg.Servers[0].Lua.GlobalSettings.CodeCacheSize)
fmt.Fprintf(&buf, " # enable_file_watch: %v # 启用文件变更检测\n", cfg.Servers[0].Lua.GlobalSettings.EnableFileWatch)
fmt.Fprintf(&buf, " # max_execution_time: %ds # 最大执行时间\n", int(cfg.Servers[0].Lua.GlobalSettings.MaxExecutionTime.Seconds()))
fmt.Fprintf(&buf, " # coroutine_stack_size: %d # 协程栈大小0=使用默认值)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutineStackSize)
fmt.Fprintf(&buf, " # coroutine_stack_size: %d # 协程栈大小0=使用引擎默认值 64最大 256\n", cfg.Servers[0].Lua.GlobalSettings.CoroutineStackSize)
fmt.Fprintf(&buf, " # coroutine_pool_warmup: %d # 协程池预热数量0=不预热)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutinePoolWarmup)
fmt.Fprintf(&buf, " # minimize_stack_memory: %v # 最小化栈内存使用\n", cfg.Servers[0].Lua.GlobalSettings.MinimizeStackMemory)
fmt.Fprintf(&buf, " # lstate_pool_initial_size: %d # LState池初始大小\n", cfg.Servers[0].Lua.GlobalSettings.LStatePoolInitialSize)
@ -401,13 +404,21 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) {
buf.WriteString(" # interval: 10s\n")
buf.WriteString(" # path: /health\n")
buf.WriteString(" # timeout: 5s\n")
buf.WriteString(" # slow_start: 0s # 慢启动时间0 表示禁用)\n")
buf.WriteString(" # match: # 健康检查匹配条件(可选,未配置时仅检查状态码 2xx\n")
buf.WriteString(" # status: [\"200-299\"] # 匹配的状态码范围列表\n")
buf.WriteString(" # body: \"ok\" # 响应体正则匹配(可选)\n")
buf.WriteString(" # headers: # 响应头匹配(可选)\n")
buf.WriteString(" # X-Health: \"ok\"\n")
buf.WriteString(" # timeout: # 超时配置\n")
buf.WriteString(" # connect: 5s # 连接超时\n")
buf.WriteString(" # dial: 5s # TCP 连接建立超时(不含 DNS/TLS\n")
buf.WriteString(" # connect: 5s # 总连接超时(含 DNS/TLS\n")
buf.WriteString(" # read: 30s # 读取超时\n")
buf.WriteString(" # write: 30s # 写入超时\n")
buf.WriteString(" # buffering: # 代理缓冲配置\n")
buf.WriteString(" # mode: \"default\" # 缓冲模式(有效值: default, on, offoff 为流式转发)\n")
buf.WriteString(" # buffer_size: 0 # 响应缓冲区大小字节0 表示使用默认值)\n")
buf.WriteString(" # buffers: \"8 16k\" # 多缓冲区配置(格式: \"数量 大小\",如 \"8 16k\" 或 \"4 4k 8 16k\"\n")
buf.WriteString(" # proxy_bind: \"\" # 代理拨号绑定本地地址\n")
buf.WriteString(" # internal: false # 仅允许内部重定向访问\n")
buf.WriteString(" # headers: # 头部修改\n")

11
skills-lock.json Normal file
View File

@ -0,0 +1,11 @@
{
"version": 1,
"skills": {
"golang-pro": {
"source": "jeffallan/claude-skills",
"sourceType": "github",
"skillPath": "skills/golang-pro/SKILL.md",
"computedHash": "12b4cac8f65228f82cbc26f0da9232aba87ffa45ccd01afa3998fb8ec61dc288"
}
}
}