@horizon_works/banto 0.8.6 → 0.8.8

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/add_to_config.js CHANGED
@@ -132,4 +132,36 @@ if (!成功) {
132
132
  } else {
133
133
  console.log('\n★このあと、お使いのAIを開き直してください。');
134
134
  console.log('★Antigravity でも Claude Code でも、同じ番頭が動きます。');
135
+
136
+ // ★何ができるようになるかを、ここで伝える(2026-08-29)
137
+ // 由来=依頼元「セットアップ後に、こんなことができるようになったと伝えられるといいのかもね」。
138
+ // ★★「できました」とは書かない。この時点ではまだ繋がっていない
139
+ // (MCPを起動するのはホスト側)ので、「開き直すと、こうなります」と書く。
140
+ // ★道具の名前と説明は server.js の実物から取っている(推測で書かない)。
141
+ console.log([
142
+ '',
143
+ '───────────────────────',
144
+ ' 開き直すと、こうなります',
145
+ '───────────────────────',
146
+ '',
147
+ '■ 道具が34個 使えるようになります。よく使うのはこの4つです。',
148
+ '',
149
+ ' 「このファイルを検査して」',
150
+ ' 外へ出してはいけない固有名や内部メモが入っていないかを調べます。',
151
+ ' ★中身をAIに読ませずに、有無だけ返します。',
152
+ '',
153
+ ' 「これを覚えておいて」',
154
+ ' 気づいたこと・失敗・学びを1行だけ残します。次の窓でも残ります。',
155
+ '',
156
+ ' 「番頭の棚を開いて」',
157
+ ' 使えるサプリの一覧がブラウザで開きます。入れる/外すを選べます。',
158
+ '',
159
+ ' 「自己点検して」',
160
+ ' ちゃんと入っているか、鍵の残りがどれだけかが出ます。',
161
+ '',
162
+ '■ そのあと「番頭の核を取ってきて」と言ってください。',
163
+ ' 作法・記憶・検査の決まりごとが入ります。',
164
+ ' ★既にお名前と持ち場が決まっている番頭には、聞き直させません。',
165
+ '',
166
+ ].join('\n'));
135
167
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horizon_works/banto",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "description": "AI番頭のOS。ルール・記憶・検査を1本のMCPで配ります。中身をクラウドへ渡さずに検査できます。",
5
5
  "keywords": [
6
6
  "mcp",
package/server.js CHANGED
@@ -653,6 +653,45 @@ const CORE_HOME = path.join(
653
653
 
654
654
  function coreFile(rel) { return path.join(CORE_HOME, rel.split('/').join(path.sep)); }
655
655
 
656
+ /**
657
+ * ★核の新しい版が出ていないかを見る(★同期。通信しない)
658
+ *
659
+ * ★通信は別の口(下の `核の版を取りにいく`)が1日1回だけ行い、
660
+ * ★結果を `.remote_version.json` に控える。★ここはその控えを読むだけ。
661
+ * ★★起動を遅くしない。★取れていなければ黙る。
662
+ */
663
+ function 核の版を見る() {
664
+ const 手元 = (() => {
665
+ try { return JSON.parse(fs.readFileSync(path.join(CORE_HOME, '.version.json'), 'utf8')).version; }
666
+ catch (_) { return null; }
667
+ })();
668
+ const 配布口 = (() => {
669
+ try { return JSON.parse(fs.readFileSync(path.join(CORE_HOME, '.remote_version.json'), 'utf8')).version; }
670
+ catch (_) { return null; }
671
+ })();
672
+ if (!配布口) return null; // ★まだ見にいっていない
673
+ if (手元 === 配布口) return null; // ★同じなら黙る
674
+ // ★手元が無い=まだ核が入っていない。★これは別の案内が出るので、ここでは黙る
675
+ if (!手元) return null;
676
+ return { 手元, 配布口, 新しいのがある: true };
677
+ }
678
+
679
+ /** ★1日1回だけ、配布口の版を見にいく(★中身は取らない。版だけ) */
680
+ async function 核の版を取りにいく() {
681
+ const f = path.join(CORE_HOME, '.remote_version.json');
682
+ try {
683
+ const 前 = JSON.parse(fs.readFileSync(f, 'utf8'));
684
+ const 今日 = new Date().toISOString().slice(0, 10);
685
+ if (前.checked_on === 今日) return; // ★今日はもう見た
686
+ } catch (_) {}
687
+ try {
688
+ const v = await supPost('core_version', {});
689
+ fs.mkdirSync(CORE_HOME, { recursive: true });
690
+ fs.writeFileSync(f, JSON.stringify(
691
+ { version: v, checked_on: new Date().toISOString().slice(0, 10) }, null, 2), 'utf8');
692
+ } catch (_) { /* ★取れなければ黙る(★鍵が無い・通信できない) */ }
693
+ }
694
+
656
695
  function loadInstructions() {
657
696
  let core = null;
658
697
  // ① 手元の控え(★鍵が切れても読める)
@@ -713,7 +752,21 @@ function loadInstructions() {
713
752
  // ③ 記録(3件たまったら鳴る)
714
753
  try { const d = FREE.selfDiagnosis(); if (d) 行.push(d); } catch (_) {}
715
754
 
716
- // ④ 下ごしらえ(★足りないものを1つだけ)
755
+ // ④ ★核の新しい版が出ていないか(2026-08-29)
756
+ // 🚨★由来=「接続する度に最新があれば自動的にアップされるの?」→ ★**核はされていなかった**。
757
+ // ★道具(npx -y)は起動のたびに最新になるが、★核は `sync_core` を言うまで古いまま。
758
+ // ★★実際、ドムさんの指摘で直した「名前を聞き直さない」が、★言わないと届かない状態だった。
759
+ // ★**黙って上書きしない**(★手を入れた核を壊さない)。★出るのは「取ってきますか」まで。
760
+ // ★通信するので、★**1日1回だけ**見る(★起動を遅くしない)。★取れなければ黙る。
761
+ try {
762
+ const 版 = 核の版を見る();
763
+ if (版 && 版.新しいのがある) {
764
+ 行.push('★番頭の核に新しい版があります(お手元 ' + (版.手元 || '無し') + ' → ' + 版.配布口 + ')'
765
+ + ' →「番頭の核を取ってきて」で入ります');
766
+ }
767
+ } catch (_) {}
768
+
769
+ // ⑤ 下ごしらえ(★足りないものを1つだけ)
717
770
  try {
718
771
  const e = ENV.guide();
719
772
  if (e.足りないもの) 行.push('下ごしらえ:' + e.次にすること.何が + '(「下ごしらえを見て」で手順が出ます)');
@@ -1872,6 +1925,13 @@ let LICENSE_STATE = { allowed: true, status: 'unconfigured', message: '', daysLe
1872
1925
  if (LICENSE_STATE.allowed && LIC.isSharing && LIC.isSharing()) {
1873
1926
  try { await LIC.reportStats(VERSION, FREE.review(false)); } catch (_) {}
1874
1927
  }
1928
+
1929
+ // ★核の新しい版が出ていないかを、1日1回だけ見にいく(★版だけ。中身は取らない)
1930
+ // ★取れた結果は控えに書き、★次の起動の「いまの状態」に1行出る。
1931
+ // ★★黙って上書きしない。★出るのは「取ってきますか」まで。
1932
+ if (LICENSE_STATE.allowed) {
1933
+ try { await 核の版を取りにいく(); } catch (_) {}
1934
+ }
1875
1935
  } catch (_) {
1876
1936
  // license モジュールが無い構成でも動く
1877
1937
  }