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 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 and coexist silently
2122
+ // Detect GSD statusline
2123
2123
  const isGsdStatusline = settings.statusLine.command &&
2124
2124
  settings.statusLine.command.includes('gsd-statusline');
2125
2125
  if (isGsdStatusline) {
2126
- console.log(` ${green}✓${reset} GSD statusline detected, keeping it.`);
2127
- callback(false);
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
- // Append FVS verification context if active
125
+ // Prepend FVS update/staleness indicators, append FVS state
126
+ const fvsCache = readFvsCache();
103
127
  const fvsState = detectFvsState();
104
- if (fvsState) {
105
- process.stdout.write(`${gsdOutput} \x1b[36m| FVS: ${fvsState}\x1b[0m`);
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
- let fvsUpdate = '';
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fv-skills-baif",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Formal verification skills for Claude Code, Codex, OpenCode, and Gemini. Rust -> Lean 4 via Aeneas.",
5
5
  "bin": {
6
6
  "fv-skills-baif": "bin/install.js"