fv-skills-baif 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/bin/install.js +12 -5
- package/hooks/dist/fvs-statusline.js +29 -13
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,35 @@ All notable changes to FVS (Formal Verification Skills) will be documented in th
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [1.3.1] - 2026-04-07
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- Statusline not showing FVS state in GSD delegation mode -- now detects `.formalising/` as FVS project indicator
|
|
11
|
+
- Update/staleness indicators never shown when GSD statusline active -- `readFvsCache()` shared across both modes
|
|
12
|
+
- Local install skipping FVS statusline when GSD globally present -- now wraps GSD locally via project-level settings
|
|
13
|
+
|
|
14
|
+
## [1.3.0] - 2026-04-05
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- `/fvs:lean-formalise` command -- paper track for formalising mathematical papers into Lean 4 specs, 4 interactive prompts, two-phase researcher→executor dispatch, KB integration
|
|
18
|
+
- `/fvs:kb-setup` command -- interactive NotebookLM knowledge base setup (venv, auth, KB registration)
|
|
19
|
+
- `fvs-kb-query.py` composable CLI tool -- ask/list/health subcommands for querying NotebookLM KBs with structured JSON output
|
|
20
|
+
- `fvs-researcher` formalise mode (6th mode) -- reads resources (PDF, images, LaTeX, text), queries KB with domain gating, extracts mathematical structure, proposes Lean file layout
|
|
21
|
+
- `/fvs:sync-aeneas` command and workflow for continuous Aeneas upstream integration
|
|
22
|
+
- Aeneas upstream documentation snapshot (`fv-skills/upstream/aeneas/`) with sync mapping (`_sync-meta.json`)
|
|
23
|
+
- Aeneas staleness detection in session start hook -- queries GitHub API, shows warning in statusline
|
|
24
|
+
- Protocol verification domain pattern (Spec_pro/Spec_sec/Spec_pro|=Spec_sec) in lean-formalise
|
|
25
|
+
- `knowledge_bases` array in config template for domain-gated KB entries
|
|
26
|
+
- Installer copies `scripts/` directory to target with manifest tracking and uninstall cleanup
|
|
27
|
+
- Acknowledgements section in README
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
- `/fvs:lean-simplify` renamed to `/fvs:lean-refactor` with expanded refactoring corpus
|
|
31
|
+
- `fvs-lean-simplifier` agent renamed to `fvs-lean-refactorer`
|
|
32
|
+
- All tactic names migrated to current Aeneas conventions: `progress`→`step`, `@[progress]`→`@[step]`, `omega` BANNED, `agrind` as default
|
|
33
|
+
- References enriched from upstream: aeneas-patterns (+400 lines), tactic-usage (+260 lines), proof-strategies (+300 lines), lean-refactoring (+400 lines)
|
|
34
|
+
- Test suite expanded from 154 to 167 tests (scripts, new commands, updated counts)
|
|
35
|
+
|
|
7
36
|
## [1.2.0] - 2026-03-16
|
|
8
37
|
|
|
9
38
|
### Added
|
package/bin/install.js
CHANGED
|
@@ -2111,7 +2111,7 @@ function finishInstall(settingsPath, settings, statuslineCommand, shouldInstallS
|
|
|
2111
2111
|
/**
|
|
2112
2112
|
* Handle statusline configuration with optional prompt
|
|
2113
2113
|
*/
|
|
2114
|
-
function handleStatusline(settings, isInteractive, callback) {
|
|
2114
|
+
function handleStatusline(settings, isGlobal, isInteractive, callback) {
|
|
2115
2115
|
const hasExisting = settings.statusLine != null;
|
|
2116
2116
|
|
|
2117
2117
|
if (!hasExisting) {
|
|
@@ -2119,12 +2119,19 @@ function handleStatusline(settings, isInteractive, callback) {
|
|
|
2119
2119
|
return;
|
|
2120
2120
|
}
|
|
2121
2121
|
|
|
2122
|
-
// Detect GSD statusline
|
|
2122
|
+
// Detect GSD statusline
|
|
2123
2123
|
const isGsdStatusline = settings.statusLine.command &&
|
|
2124
2124
|
settings.statusLine.command.includes('gsd-statusline');
|
|
2125
2125
|
if (isGsdStatusline) {
|
|
2126
|
-
|
|
2127
|
-
|
|
2126
|
+
if (isGlobal) {
|
|
2127
|
+
// Global: keep GSD's statusline to avoid overhead in non-FVS repos
|
|
2128
|
+
console.log(` ${green}✓${reset} GSD statusline detected, keeping it.`);
|
|
2129
|
+
callback(false);
|
|
2130
|
+
} else {
|
|
2131
|
+
// Local: install FVS statusline (it delegates to GSD internally, appends FVS state)
|
|
2132
|
+
console.log(` ${green}✓${reset} GSD statusline detected, FVS will wrap it locally.`);
|
|
2133
|
+
callback(true);
|
|
2134
|
+
}
|
|
2128
2135
|
return;
|
|
2129
2136
|
}
|
|
2130
2137
|
|
|
@@ -2276,7 +2283,7 @@ function installAllRuntimes(runtimes, isGlobal, isInteractive) {
|
|
|
2276
2283
|
// Use whichever settings exist to check for existing statusline
|
|
2277
2284
|
const primaryResult = claudeResult || geminiResult;
|
|
2278
2285
|
|
|
2279
|
-
handleStatusline(primaryResult.settings, isInteractive, (shouldInstallStatusline) => {
|
|
2286
|
+
handleStatusline(primaryResult.settings, isGlobal, isInteractive, (shouldInstallStatusline) => {
|
|
2280
2287
|
if (claudeResult) {
|
|
2281
2288
|
finishInstall(claudeResult.settingsPath, claudeResult.settings, claudeResult.statuslineCommand, shouldInstallStatusline, 'claude', isGlobal);
|
|
2282
2289
|
}
|
|
@@ -84,9 +84,32 @@ function detectFvsState() {
|
|
|
84
84
|
return 'formalising';
|
|
85
85
|
} catch (e) {}
|
|
86
86
|
|
|
87
|
+
// Detect FVS project by .formalising/ directory (basic indicator)
|
|
88
|
+
try {
|
|
89
|
+
fs.accessSync(path.join(cwd, '.formalising'));
|
|
90
|
+
return 'ready';
|
|
91
|
+
} catch (e) {}
|
|
92
|
+
|
|
87
93
|
return '';
|
|
88
94
|
}
|
|
89
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Read FVS update/staleness cache. Returns prefix string for statusline.
|
|
98
|
+
*/
|
|
99
|
+
function readFvsCache() {
|
|
100
|
+
let prefix = '';
|
|
101
|
+
try {
|
|
102
|
+
const cache = JSON.parse(fs.readFileSync(path.join(claudeDir, 'cache', 'fvs-update-check.json'), 'utf8'));
|
|
103
|
+
if (cache.update_available) {
|
|
104
|
+
prefix += '\x1b[33m\u2b06 /fvs:update\x1b[0m \u2502 ';
|
|
105
|
+
}
|
|
106
|
+
if (cache.aeneas_stale) {
|
|
107
|
+
prefix += '\x1b[33mAeneas docs outdated \u2192 /fvs:sync-aeneas\x1b[0m \u2502 ';
|
|
108
|
+
}
|
|
109
|
+
} catch (e) {}
|
|
110
|
+
return prefix;
|
|
111
|
+
}
|
|
112
|
+
|
|
90
113
|
/**
|
|
91
114
|
* Delegate to GSD's statusline, append FVS context if active.
|
|
92
115
|
*/
|
|
@@ -99,10 +122,12 @@ function delegateToGsd(gsdPath, data) {
|
|
|
99
122
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
100
123
|
}).trimEnd();
|
|
101
124
|
|
|
102
|
-
//
|
|
125
|
+
// Prepend FVS update/staleness indicators, append FVS state
|
|
126
|
+
const fvsCache = readFvsCache();
|
|
103
127
|
const fvsState = detectFvsState();
|
|
104
|
-
if (fvsState) {
|
|
105
|
-
|
|
128
|
+
if (fvsCache || fvsState) {
|
|
129
|
+
const suffix = fvsState ? ` \x1b[36m| FVS: ${fvsState}\x1b[0m` : '';
|
|
130
|
+
process.stdout.write(`${fvsCache}${gsdOutput}${suffix}`);
|
|
106
131
|
} else {
|
|
107
132
|
process.stdout.write(gsdOutput);
|
|
108
133
|
}
|
|
@@ -184,16 +209,7 @@ function renderStandalone(data) {
|
|
|
184
209
|
}
|
|
185
210
|
|
|
186
211
|
// FVS update available? Aeneas docs outdated?
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
const cache = JSON.parse(fs.readFileSync(path.join(claudeDir, 'cache', 'fvs-update-check.json'), 'utf8'));
|
|
190
|
-
if (cache.update_available) {
|
|
191
|
-
fvsUpdate = '\x1b[33m\u2b06 /fvs:update\x1b[0m \u2502 ';
|
|
192
|
-
}
|
|
193
|
-
if (cache.aeneas_stale) {
|
|
194
|
-
fvsUpdate += '\x1b[33mAeneas docs outdated \u2192 /fvs:sync-aeneas\x1b[0m \u2502 ';
|
|
195
|
-
}
|
|
196
|
-
} catch (e) {}
|
|
212
|
+
const fvsUpdate = readFvsCache();
|
|
197
213
|
|
|
198
214
|
// FVS verification state
|
|
199
215
|
const fvsState = detectFvsState();
|
package/package.json
CHANGED