mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-18 23:32:02 +00:00
* feat(doctor): add --lint mode + structured HealthFinding shape
Adds the core machinery for `openclaw doctor --lint` per the
doctor-lint-and-oc-rules upstream proposal. PR-1 of the proposal:
no new top-level verb, no public plugin SDK; everything internal.
Files:
- src/flows/checks.ts ? HealthFinding / HealthCheck / HealthCheckContext
types. Findings carry severity per-finding; checks return
readonly HealthFinding[]. Mode tag (doctor/lint/fix) lets a check
distinguish the calling posture.
- src/flows/health-check-registry.ts ? module-level registry with
duplicate-id rejection + test reset helper.
- src/flows/doctor-lint-flow.ts ? runner over registered checks.
Catches throws into synthetic error findings (anchored at check id;
message scrubbed of control chars, capped at 256 bytes). Sorts
findings by severity desc, check id, path. Exports
exitCodeFromFindings (1 if any warning/error, 0 otherwise).
- src/flows/doctor-core-checks.ts ? 4 modern HealthChecks rewriting
logic from existing legacy run*Health functions:
core/doctor/gateway-config (warning)
core/doctor/command-owner (info)
core/doctor/workspace-status (info)
core/doctor/final-config-validation (error)
Each was audited safe per the proposal's adapter constraints
(no writes, no repair calls, no prompts, no probes incl. local-bind).
Legacy run*Health contributions in doctor-health-contributions.ts
are unchanged ? doctor mode (no --lint) still runs the existing 35.
- src/commands/doctor-lint.ts ? CLI dispatch for --lint. Reads config
snapshot, builds HealthCheckContext (mode: "lint"), runs the registry,
filters by --severity-min, emits human or JSON output, returns exit
code from unfiltered set so --severity-min hides info findings
without changing CI signal.
- src/cli/program/register.maintenance.ts ? adds --lint, --json,
--severity-min, --skip, --only flags to existing doctor command.
--lint branches to runDoctorLintCli; without --lint, doctor runs
unchanged.
LoC: 382 src across 6 files. Tests + doc + oc-path-side rule packs
follow as separate commits on this branch.
* fix: avoid string spread in doctor errors
* chore: refresh plugin SDK API baseline
* docs: clarify doctor lint usage
* feat(doctor): prepare repairs for dry-run reporting
122 lines
2.3 KiB
TypeScript
122 lines
2.3 KiB
TypeScript
export type PluginSdkDocCategory =
|
|
| "channel"
|
|
| "core"
|
|
| "legacy"
|
|
| "provider"
|
|
| "runtime"
|
|
| "utilities";
|
|
|
|
type PluginSdkDocMetadata = {
|
|
category: PluginSdkDocCategory;
|
|
};
|
|
|
|
export const pluginSdkDocMetadata = {
|
|
index: {
|
|
category: "legacy",
|
|
},
|
|
core: {
|
|
category: "core",
|
|
},
|
|
health: {
|
|
category: "core",
|
|
},
|
|
"approval-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"approval-auth-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"approval-client-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"approval-delivery-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"approval-native-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"approval-reply-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"plugin-entry": {
|
|
category: "core",
|
|
},
|
|
"access-groups": {
|
|
category: "channel",
|
|
},
|
|
"channel-actions": {
|
|
category: "channel",
|
|
},
|
|
"channel-config-schema": {
|
|
category: "channel",
|
|
},
|
|
"channel-config-schema-legacy": {
|
|
category: "channel",
|
|
},
|
|
"channel-contract": {
|
|
category: "channel",
|
|
},
|
|
"channel-pairing": {
|
|
category: "channel",
|
|
},
|
|
"channel-ingress": {
|
|
category: "channel",
|
|
},
|
|
"channel-ingress-runtime": {
|
|
category: "channel",
|
|
},
|
|
"channel-reply-pipeline": {
|
|
category: "channel",
|
|
},
|
|
"channel-setup": {
|
|
category: "channel",
|
|
},
|
|
"command-auth": {
|
|
category: "channel",
|
|
},
|
|
zalouser: {
|
|
category: "channel",
|
|
},
|
|
"command-status": {
|
|
category: "channel",
|
|
},
|
|
"command-status-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"secret-input": {
|
|
category: "channel",
|
|
},
|
|
"webhook-ingress": {
|
|
category: "channel",
|
|
},
|
|
"provider-onboard": {
|
|
category: "provider",
|
|
},
|
|
"provider-selection-runtime": {
|
|
category: "provider",
|
|
},
|
|
"runtime-store": {
|
|
category: "runtime",
|
|
},
|
|
"agent-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"speech-core": {
|
|
category: "provider",
|
|
},
|
|
"tts-runtime": {
|
|
category: "runtime",
|
|
},
|
|
"allow-from": {
|
|
category: "utilities",
|
|
},
|
|
"reply-payload": {
|
|
category: "utilities",
|
|
},
|
|
} as const satisfies Record<string, PluginSdkDocMetadata>;
|
|
|
|
export type PluginSdkDocEntrypoint = keyof typeof pluginSdkDocMetadata;
|
|
|
|
export function resolvePluginSdkDocImportSpecifier(entrypoint: PluginSdkDocEntrypoint): string {
|
|
return entrypoint === "index" ? "openclaw/plugin-sdk" : `openclaw/plugin-sdk/${entrypoint}`;
|
|
}
|