mirror of
https://github.com/larksuite/cli.git
synced 2026-07-08 18:13:01 +08:00
Users who install or upgrade lark-cli via make install, go install, or
direct binary download end up with a binary but no AI agent skills,
degrading agent UX. This PR adds a startup-time skills version drift
notice (injected into JSON envelope _notice.skills, mirroring the
existing _notice.update pattern) and unifies lark-cli update's skills
sync across all three branches (npm / manual / already-latest) with
stamp-based dedup, so any explicit update invocation keeps skills in
sync regardless of how the binary was installed.
Changes:
- new internal/skillscheck package: notice (StaleNotice + atomic
pending), stamp (~/.lark-cli/skills.stamp), skip (CI / DEV /
non-release / LARKSUITE_CLI_NO_SKILLS_NOTIFIER opt-out), check
(synchronous Init)
- cmd/root.go: rename setupUpdateNotice -> setupNotices, compose
output.PendingNotice returning {update?, skills?}; capture
build.Version locally before spawning the async update goroutine
- cmd/update/update.go: add runSkillsAndStamp helper with stamp-based
dedup; rewire the three branches through shared applySkillsResult /
emitSkillsTextHints helpers; add skills_status block to --check JSON
output as a pure report (no side effects)
- internal/update: export IsRelease(version) bool / IsCIEnv() bool
for cross-package reuse; refresh UpdateInfo.Message to append
', run: lark-cli update' so both notices recommend the same fix
- AGENTS.md: add Notification Opt-Outs section documenting
LARKSUITE_CLI_NO_UPDATE_NOTIFIER and LARKSUITE_CLI_NO_SKILLS_NOTIFIER
- internal/binding/types.go: bump default exec-provider timeout from
5s to 10s (out-of-scope flake fix for TestResolveExecRef_JSONResponse
under heavy parallel test load)
39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
// Copyright (c) 2026 Lark Technologies Pte. Ltd.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package skillscheck
|
|
|
|
// Init runs the synchronous skills version check. Stores a StaleNotice
|
|
// when the local stamp does not match currentVersion. Safe to call
|
|
// from cmd/root.go before rootCmd.Execute(); zero network, zero
|
|
// subprocess — only a local stamp file read.
|
|
//
|
|
// Skip rules: see shouldSkip (CI envs, DEV builds, non-release semver,
|
|
// LARKSUITE_CLI_NO_SKILLS_NOTIFIER opt-out).
|
|
//
|
|
// Failure modes (all → no notice, no nag):
|
|
// - shouldSkip rule met
|
|
// - ReadStamp returns an I/O error other than ENOENT
|
|
// - Stamp matches currentVersion (in-sync)
|
|
func Init(currentVersion string) {
|
|
// Clear any stale notice from a prior call so early returns below
|
|
// (skip rules / read errors / in-sync) leave pending == nil instead
|
|
// of preserving a stale value from a previous Init invocation.
|
|
SetPending(nil)
|
|
if shouldSkip(currentVersion) {
|
|
return
|
|
}
|
|
stamp, err := ReadStamp()
|
|
if err != nil {
|
|
// Fail closed — don't nag for a transient FS problem.
|
|
return
|
|
}
|
|
if stamp == currentVersion {
|
|
return
|
|
}
|
|
SetPending(&StaleNotice{
|
|
Current: stamp, // "" when never synced
|
|
Target: currentVersion,
|
|
})
|
|
}
|