@horizon_works/banto 0.5.0

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.
Files changed (36) hide show
  1. package/README.md +109 -0
  2. package/env.js +83 -0
  3. package/gate_core.js +629 -0
  4. package/gtasks.js +233 -0
  5. package/license/client.js +138 -0
  6. package/package.json +45 -0
  7. package/payload/compliance/SKILL.md +113 -0
  8. package/payload/compliance/dict/00_/345/213/225/344/275/234/347/242/272/350/252/215.json +14 -0
  9. package/payload/compliance/dict/06_house_rules.json +16 -0
  10. package/payload/compliance/dict/_sample/04_common_keihyo.json +270 -0
  11. package/payload/compliance/dict/_sample/README.md +72 -0
  12. package/payload/compliance/lint.js +265 -0
  13. package/payload/disciplines//347/225/252/351/240/255/343/201/256/344/275/234/346/263/225.md +64 -0
  14. package/payload/disciplines//350/207/252/345/267/261/345/201/245/350/250/272.md +74 -0
  15. package/payload/disciplines//351/200/261/346/254/241/343/203/241/343/203/263/343/203/206.md +60 -0
  16. package/payload/migration/protocol.md +35 -0
  17. package/payload/skill-maker/SKILL_base_anthropic.md +357 -0
  18. package/payload/skill-maker/skill-maker-v1.0.md +305 -0
  19. package/payload/skills/_/343/201/202/343/201/250/343/201/247/350/266/263/343/201/233/343/202/213/343/202/202/343/201/256.md +47 -0
  20. package/payload/skills/image-gen/SKILL.md +147 -0
  21. package/payload/skills/image-gen/gen.js +225 -0
  22. package/payload/skills/remember/SETUP_Google/351/200/243/346/220/272.md +106 -0
  23. package/payload/skills/remember/SKILL.md +158 -0
  24. package/payload/skills/remember/handoff.js +149 -0
  25. package/payload/skills/remember/tasks.js +320 -0
  26. package/payload/skills/slide-deck/SKILL.md +160 -0
  27. package/payload/skills/transcribe/README.md +182 -0
  28. package/payload/skills/transcribe/dict.json +10 -0
  29. package/payload/skills/transcribe/enroll_speaker.py +76 -0
  30. package/payload/skills/transcribe/identify_speakers.py +153 -0
  31. package/payload/skills/transcribe/transcribe.py +126 -0
  32. package/privacy.js +234 -0
  33. package/server.js +1671 -0
  34. package/shelf.js +172 -0
  35. package/subconscious.js +150 -0
  36. package/supplements.json +192 -0
package/shelf.js ADDED
@@ -0,0 +1,172 @@
1
+ /**
2
+ * 手元の棚(サプリを見て、選ぶ)
3
+ *
4
+ * ★2026-08-21 主「棚はどうやって呼び出すの?」→ 案1を採用。
5
+ * MCPがローカルにHTMLを書いて、ブラウザで開くだけ。
6
+ * ★ポートを開かない。ログインも要らない(鍵はもう手元にある)。
7
+ * ボタンを押すと「番頭ゲートで◯◯を入れて」がコピーされ、AIに貼る。
8
+ *
9
+ * ★「店」(まだ持っていないものを買う)は別物。あとから足しても、ここは壊れない。
10
+ */
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ const esc = (s) => String(s == null ? '' : s)
15
+ .split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;').split('"').join('&quot;');
16
+
17
+ function buildHtml(rows, dir) {
18
+ const now = new Date();
19
+ const p = (n) => String(n).padStart(2, '0');
20
+ const stamp = `${now.getFullYear()}-${p(now.getMonth() + 1)}-${p(now.getDate())} ${p(now.getHours())}:${p(now.getMinutes())}`;
21
+
22
+ const 入っている = rows.filter((r) => String(r.いまの状態).indexOf('入っています') === 0).length;
23
+ const 新しい版 = rows.filter((r) => String(r.いまの状態).indexOf('新しい版') !== -1).length;
24
+
25
+ const cards = rows.map((r) => {
26
+ const st = String(r.いまの状態);
27
+ const has = st.indexOf('入っています') === 0;
28
+ const upd = st.indexOf('新しい版') !== -1;
29
+ const 限定 = r.層 === '★限定';
30
+ const cmd = has || upd
31
+ ? '番頭ゲートで ' + r.名前 + ' を新しくして'
32
+ : '番頭ゲートで ' + r.名前 + ' を入れて';
33
+ const off = '番頭ゲートで ' + r.名前 + ' を外して';
34
+ return `
35
+ <article class="card${has ? ' has' : ''}${upd ? ' upd' : ''}">
36
+ <header>
37
+ <h2>${esc(r.名前)}</h2>
38
+ <span class="ver">v${esc(r.版)}</span>
39
+ ${限定 ? '<span class="tag limited">限定</span>' : '<span class="tag">一般</span>'}
40
+ </header>
41
+ ${r.説明 ? `<p class="desc">${esc(r.説明)}</p>` : ''}
42
+ <p class="meta">${esc(r.ファイル数)} ファイル ・ ${esc(r.大きさ)}</p>
43
+ <p class="state ${has ? 'on' : ''}${upd ? ' warn' : ''}">${esc(st)}</p>
44
+ <div class="btns">
45
+ <button data-c="${esc(cmd)}">${upd ? '新しくする' : has ? '入れ直す' : '入れる'}</button>
46
+ ${has || upd ? `<button class="ghost" data-c="${esc(off)}">外す</button>` : ''}
47
+ </div>
48
+ </article>`;
49
+ }).join('');
50
+
51
+ return `<!doctype html>
52
+ <html lang="ja"><head><meta charset="utf-8">
53
+ <meta name="viewport" content="width=device-width,initial-scale=1">
54
+ <title>番頭の棚</title>
55
+ <style>
56
+ :root{ --ink:#1a1a1a; --sub:#6b6b6b; --line:#e2e0dc; --bg:#faf9f7; --teal:#0f6b68; --wine:#7a2f3a; }
57
+ *{box-sizing:border-box}
58
+ body{margin:0;background:var(--bg);color:var(--ink);
59
+ font-family:"Hiragino Kaku Gothic ProN","Yu Gothic",system-ui,sans-serif;line-height:1.7}
60
+ .wrap{max-width:1000px;margin:0 auto;padding:48px 24px 80px}
61
+ h1{font-size:28px;margin:0 0 4px;letter-spacing:.02em}
62
+ .lead{color:var(--sub);font-size:14px;margin:0 0 28px}
63
+ .sum{display:flex;gap:28px;padding:16px 0 22px;border-bottom:1px solid var(--line);margin-bottom:28px;font-size:13px;color:var(--sub)}
64
+ .sum b{display:block;font-size:22px;color:var(--ink);font-weight:600}
65
+ .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
66
+ .card{background:#fff;border:1px solid var(--line);border-radius:4px;padding:18px 18px 14px}
67
+ .card.has{border-left:3px solid var(--teal)}
68
+ .card.upd{border-left:3px solid var(--wine)}
69
+ .card header{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:6px}
70
+ h2{font-size:16px;margin:0;font-weight:600;word-break:break-all}
71
+ .ver{font-size:12px;color:var(--sub)}
72
+ .tag{font-size:11px;border:1px solid var(--line);border-radius:2px;padding:1px 6px;color:var(--sub)}
73
+ .tag.limited{border-color:var(--wine);color:var(--wine)}
74
+ .desc{font-size:12.5px;color:var(--sub);margin:6px 0;
75
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
76
+ .meta{font-size:12px;color:var(--sub);margin:6px 0 2px}
77
+ .state{font-size:12.5px;margin:0 0 12px;color:var(--sub)}
78
+ .state.on{color:var(--teal)}
79
+ .state.warn{color:var(--wine)}
80
+ .btns{display:flex;gap:8px}
81
+ button{font:inherit;font-size:13px;padding:6px 14px;border-radius:3px;cursor:pointer;
82
+ border:1px solid var(--teal);background:var(--teal);color:#fff}
83
+ button.ghost{background:transparent;color:var(--sub);border-color:var(--line)}
84
+ button:hover{opacity:.88}
85
+ .note{margin-top:40px;padding-top:20px;border-top:1px solid var(--line);font-size:12.5px;color:var(--sub)}
86
+ .note b{color:var(--ink)}
87
+ #toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);
88
+ background:var(--ink);color:#fff;padding:12px 22px;border-radius:3px;font-size:13px;
89
+ opacity:0;transition:.2s;pointer-events:none;max-width:90vw}
90
+ #toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
91
+ @media (prefers-color-scheme:dark){
92
+ :root{--ink:#ece9e4;--sub:#9a958d;--line:#33312e;--bg:#191817;--teal:#4fb3ae;--wine:#c88d97}
93
+ .card{background:#211f1e}
94
+ button{color:#191817}
95
+ #toast{background:#ece9e4;color:#191817}
96
+ }
97
+ </style></head><body>
98
+ <div class="wrap">
99
+ <h1>番頭の棚</h1>
100
+ <p class="lead">お使いいただけるサプリの一覧です。${esc(stamp)} 現在</p>
101
+
102
+ <div class="sum">
103
+ <div><b>${rows.length}</b>使えるもの</div>
104
+ <div><b>${入っている}</b>入っています</div>
105
+ <div><b>${新しい版}</b>新しい版あり</div>
106
+ </div>
107
+
108
+ <div class="grid">${cards}</div>
109
+
110
+ <div class="note">
111
+ <p><b>使い方</b> ボタンを押すと、番頭への頼み方がコピーされます。そのままAIの窓に貼ってください。</p>
112
+ <p>★このページは、いまお使いのパソコンの中にあります。外にはつながっていません。</p>
113
+ <p>★「外す」を選んでも<b>消えません</b>。「_外したサプリ」へ移すだけなので、あとで戻せます。</p>
114
+ <p>★置き場所:${esc(dir)}</p>
115
+ </div>
116
+ </div>
117
+ <div id="toast"></div>
118
+ <script>
119
+ document.querySelectorAll('button[data-c]').forEach(function(b){
120
+ b.addEventListener('click', function(){
121
+ var t = b.getAttribute('data-c');
122
+ var done = function(){
123
+ var el = document.getElementById('toast');
124
+ el.textContent = 'コピーしました 「' + t + '」';
125
+ el.classList.add('on');
126
+ setTimeout(function(){ el.classList.remove('on'); }, 2600);
127
+ };
128
+ if (navigator.clipboard && navigator.clipboard.writeText) {
129
+ navigator.clipboard.writeText(t).then(done, function(){ fallback(t, done); });
130
+ } else { fallback(t, done); }
131
+ });
132
+ });
133
+ function fallback(t, done){
134
+ var a = document.createElement('textarea');
135
+ a.value = t; a.style.position='fixed'; a.style.opacity='0';
136
+ document.body.appendChild(a); a.select();
137
+ try { document.execCommand('copy'); done(); } catch(e){ prompt('この文をコピーしてください', t); }
138
+ document.body.removeChild(a);
139
+ }
140
+ </script>
141
+ </body></html>`;
142
+ }
143
+
144
+ /**
145
+ * 棚を書いて、開く。
146
+ * ★開くのは人。AIは中身を読まない(HTMLのパスだけ返す)。
147
+ */
148
+ function openShelf(rows, dir, noOpen) {
149
+ const base = path.resolve(dir || process.cwd());
150
+ fs.mkdirSync(base, { recursive: true });
151
+ const out = path.join(base, '番頭の棚.html');
152
+ fs.writeFileSync(out, buildHtml(rows, base), 'utf8');
153
+
154
+ let opened = false;
155
+ if (!noOpen) {
156
+ try {
157
+ const { spawn } = require('child_process');
158
+ // ★Windows:既定のブラウザで開く。失敗しても止めない(パスを返せば人が開ける)
159
+ if (process.platform === 'win32') {
160
+ spawn('cmd', ['/c', 'start', '', out], { detached: true, stdio: 'ignore' }).unref();
161
+ } else if (process.platform === 'darwin') {
162
+ spawn('open', [out], { detached: true, stdio: 'ignore' }).unref();
163
+ } else {
164
+ spawn('xdg-open', [out], { detached: true, stdio: 'ignore' }).unref();
165
+ }
166
+ opened = true;
167
+ } catch (_) { opened = false; }
168
+ }
169
+ return { 棚: out, 開きました: opened, 並べた数: rows.length };
170
+ }
171
+
172
+ module.exports = { openShelf, buildHtml };
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 主のこと(潜在意識)
3
+ *
4
+ * ★2026-08-21 主
5
+ * 「普通に使うとサブコンシャスがなかなか書き込まれていない。
6
+ * 北極星を決めても更新されない。北極星を決めたら一度更新して、ここも使っていくようにしたい」
7
+ *
8
+ * ★そのとおりだった。ルールには「使い始めの日に本人と決めて書き込む」と書いてあるのに、
9
+ * **書き込む口が無かった**。`■要確認:` のまま残り続ける。
10
+ * 記録の retain と同じ形=**溜める口はあるが、閉じる口が無い**。
11
+ *
12
+ * ★だから3つ入れる
13
+ * ① 書き込む口(set_polaris / learn)
14
+ * ② 読む口(about_me)
15
+ * ③ ★**起動のたびに「まだ決まっていません」と出す**(人に覚えさせない)
16
+ */
17
+ const fs = require('fs');
18
+ const path = require('path');
19
+
20
+ const HOME = process.env.BANTO_HOME || path.join(require('os').homedir(), '.banto');
21
+ const FILE = path.join(HOME, '主のこと.md');
22
+
23
+ const 見出し = {
24
+ polaris: '## 北極星(何のためにいるか)',
25
+ name: '## 呼び方',
26
+ values: '## 大事にしていること',
27
+ hands: '## 人の手でやりたいこと(★手を出さない)',
28
+ facts: '## 覚えたこと',
29
+ };
30
+
31
+ function stamp() {
32
+ const d = new Date(), p = (n) => String(n).padStart(2, '0');
33
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
34
+ }
35
+
36
+ function read() {
37
+ try { return fs.readFileSync(FILE, 'utf8'); } catch (_) { return null; }
38
+ }
39
+
40
+ function ensure() {
41
+ if (read()) return;
42
+ fs.mkdirSync(HOME, { recursive: true });
43
+ fs.writeFileSync(FILE, [
44
+ '# 主のこと',
45
+ '',
46
+ '> ★これはあなた(人)のためのファイルです。番頭が書き足していきます。',
47
+ '> ★いつでも書き換えてください。番頭は次から、書き換えたほうを読みます。',
48
+ '',
49
+ 見出し.polaris, '',
50
+ '(まだ決まっていません)', '',
51
+ 見出し.name, '', '(まだ聞いていません)', '',
52
+ 見出し.values, '',
53
+ 見出し.hands, '',
54
+ 見出し.facts, '',
55
+ ].join('\n'), 'utf8');
56
+ }
57
+
58
+ function section(text, head) {
59
+ const i = text.indexOf(head);
60
+ if (i === -1) return null;
61
+ const rest = text.slice(i + head.length);
62
+ const j = rest.indexOf('\n## ');
63
+ return (j === -1 ? rest : rest.slice(0, j)).trim();
64
+ }
65
+
66
+ function replaceSection(text, head, body) {
67
+ const i = text.indexOf(head);
68
+ if (i === -1) return text + '\n\n' + head + '\n\n' + body + '\n';
69
+ const before = text.slice(0, i + head.length);
70
+ const rest = text.slice(i + head.length);
71
+ const j = rest.indexOf('\n## ');
72
+ const after = j === -1 ? '' : rest.slice(j);
73
+ return before + '\n\n' + body + '\n' + after;
74
+ }
75
+
76
+ const 未定 = (s) => !s || /^(まだ/.test(s);
77
+
78
+ /** いま分かっていること */
79
+ function aboutMe() {
80
+ ensure();
81
+ const t = read();
82
+ const p = section(t, 見出し.polaris);
83
+ return {
84
+ 置き場所: FILE,
85
+ 北極星: 未定(p) ? '★まだ決まっていません' : p,
86
+ 呼び方: section(t, 見出し.name) || '(まだ)',
87
+ 大事にしていること: section(t, 見出し.values) || '(まだ)',
88
+ 人の手でやりたいこと: section(t, 見出し.hands) || '(まだ)',
89
+ 覚えたこと: (section(t, 見出し.facts) || '').split('\n').filter((l) => l.trim()).length + '件',
90
+ note: 未定(p)
91
+ ? '★北極星がまだです。「いま、いちばん面倒だと思っていることは何ですか」から始めて、' +
92
+ '「それが無くなったら、その時間で何をしたいですか」まで聞いてください。' +
93
+ '★「効率化」で止めないこと。決まったら set_polaris で書き留めます。'
94
+ : '★書き換えたいときは、このファイルを直接開いて構いません。',
95
+ };
96
+ }
97
+
98
+ /** ★北極星を決めて、書き込む(これが無かった) */
99
+ function setPolaris(text, why) {
100
+ const v = String(text || '').trim();
101
+ if (!v) throw new Error('北極星の中身を教えてください');
102
+ ensure();
103
+ let t = read();
104
+ const 前 = section(t, 見出し.polaris);
105
+ const body = [v, '', '> 決めた日: ' + stamp(), why ? '> なぜ: ' + String(why).trim() : ''].filter(Boolean).join('\n');
106
+ t = replaceSection(t, 見出し.polaris, body);
107
+ fs.writeFileSync(FILE, t, 'utf8');
108
+ return {
109
+ 書きました: v,
110
+ 前は: 未定(前) ? '(まだ決まっていませんでした)' : 前.split('\n')[0],
111
+ 置き場所: FILE,
112
+ note: '★これは判断の基準になります。迷ったとき、私はここに戻ります。' +
113
+ '★変わったら、いつでも言ってください。書き換えます。',
114
+ };
115
+ }
116
+
117
+ /** 覚える(呼び方・大事にしていること・触れてほしくないこと・事実) */
118
+ function learn(kind, text, source) {
119
+ const v = String(text || '').trim();
120
+ if (!v) throw new Error('覚える中身を教えてください');
121
+ const k = { '呼び方': 'name', '価値観': 'values', '大事': 'values', '手を出さない': 'hands', '事実': 'facts' }[kind] || kind;
122
+ const head = 見出し[k];
123
+ if (!head) throw new Error('種類は 呼び方 / 価値観 / 手を出さない / 事実 のどれかです');
124
+ ensure();
125
+ let t = read();
126
+ const cur = section(t, head) || '';
127
+ const 出所 = source ? '〈' + source + '〉' : '〈推測〉';
128
+ const line = '- ' + v + ' ' + 出所 + ' ' + stamp().slice(0, 10);
129
+ const body = 未定(cur) ? line : (cur + '\n' + line);
130
+ t = replaceSection(t, head, body);
131
+ fs.writeFileSync(FILE, t, 'utf8');
132
+ return {
133
+ 覚えました: v,
134
+ どこへ: head.replace('## ', ''),
135
+ 出所: 出所,
136
+ note: '★出所を必ず付けています。〈本人〉〈資料〉〈実測〉〈推測〉のどれかです。' +
137
+ 'これが無いと、私の推測が、いつのまにかご本人の言葉として残ります。',
138
+ };
139
+ }
140
+
141
+ /** ★起動時に見る用(軽い) */
142
+ function quick() {
143
+ try {
144
+ const t = read();
145
+ if (!t) return { ある: false, 北極星: false };
146
+ return { ある: true, 北極星: !未定(section(t, 見出し.polaris)) };
147
+ } catch (_) { return { ある: false, 北極星: false }; }
148
+ }
149
+
150
+ module.exports = { aboutMe, setPolaris, learn, quick, FILE };
@@ -0,0 +1,192 @@
1
+ {
2
+ "generated_from": "pharmacy/",
3
+ "items": [
4
+ {
5
+ "name": "agreement36-checker",
6
+ "version": "2.0",
7
+ "description": null,
8
+ "layer": "util",
9
+ "本体": "agreement36-checker-v2.0.md",
10
+ "参照層": "references/agreement36",
11
+ "tier": "open",
12
+ "ファイル数": 10,
13
+ "大きさ": 81255
14
+ },
15
+ {
16
+ "name": "ai-safety-belt",
17
+ "version": "1.0",
18
+ "description": null,
19
+ "layer": "system",
20
+ "本体": "ai-safety-belt-v1.0.md",
21
+ "参照層": null,
22
+ "tier": "open",
23
+ "ファイル数": 1,
24
+ "大きさ": 9789
25
+ },
26
+ {
27
+ "name": "ai-supports",
28
+ "version": "1.0",
29
+ "description": null,
30
+ "layer": null,
31
+ "本体": "ai-supports-v1.0",
32
+ "参照層": null,
33
+ "tier": "open",
34
+ "ファイル数": 29,
35
+ "大きさ": 294743
36
+ },
37
+ {
38
+ "name": "case-tracker",
39
+ "version": "1.0",
40
+ "description": null,
41
+ "layer": "util",
42
+ "本体": "case-tracker-v1.0.md",
43
+ "参照層": null,
44
+ "tier": "open",
45
+ "ファイル数": 1,
46
+ "大きさ": 8543
47
+ },
48
+ {
49
+ "name": "client-book",
50
+ "version": "1.0",
51
+ "description": null,
52
+ "layer": "util",
53
+ "本体": "client-book-v1.0.md",
54
+ "参照層": null,
55
+ "tier": "open",
56
+ "ファイル数": 1,
57
+ "大きさ": 9113
58
+ },
59
+ {
60
+ "name": "design-brand",
61
+ "version": "1.0",
62
+ "description": null,
63
+ "layer": "util",
64
+ "本体": "design-brand-v1.0.md",
65
+ "参照層": null,
66
+ "tier": "open",
67
+ "ファイル数": 1,
68
+ "大きさ": 8679
69
+ },
70
+ {
71
+ "name": "gas-development",
72
+ "version": "1.0",
73
+ "description": null,
74
+ "layer": null,
75
+ "本体": "gas-development-v1.0",
76
+ "参照層": null,
77
+ "tier": "open",
78
+ "ファイル数": 10,
79
+ "大きさ": 193293
80
+ },
81
+ {
82
+ "name": "grant-deadline-alert",
83
+ "version": "1.1",
84
+ "description": null,
85
+ "layer": "util",
86
+ "本体": "grant-deadline-alert-v1.1.md",
87
+ "参照層": null,
88
+ "tier": "open",
89
+ "ファイル数": 1,
90
+ "大きさ": 15553
91
+ },
92
+ {
93
+ "name": "grant-master",
94
+ "version": "1.0",
95
+ "description": null,
96
+ "layer": "data",
97
+ "本体": "grant-master-v1.0.md",
98
+ "参照層": null,
99
+ "tier": "open",
100
+ "ファイル数": 1,
101
+ "大きさ": 31291
102
+ },
103
+ {
104
+ "name": "memory-supplement",
105
+ "version": "1.0",
106
+ "description": null,
107
+ "layer": "util",
108
+ "本体": "memory-supplement-v1.0.md",
109
+ "参照層": null,
110
+ "tier": "open",
111
+ "ファイル数": 1,
112
+ "大きさ": 12536
113
+ },
114
+ {
115
+ "name": "pharmacy-connect",
116
+ "version": "1.0",
117
+ "description": null,
118
+ "layer": "system",
119
+ "本体": "pharmacy-connect-v1.0.md",
120
+ "参照層": null,
121
+ "tier": "open",
122
+ "ファイル数": 1,
123
+ "大きさ": 8383
124
+ },
125
+ {
126
+ "name": "session-log",
127
+ "version": "1.1",
128
+ "description": null,
129
+ "layer": "system",
130
+ "本体": "session-log-v1.1.md",
131
+ "参照層": null,
132
+ "tier": "open",
133
+ "ファイル数": 1,
134
+ "大きさ": 13478
135
+ },
136
+ {
137
+ "name": "skill-maker",
138
+ "version": "1.0",
139
+ "description": null,
140
+ "layer": "system",
141
+ "本体": "skill-maker-v1.0.md",
142
+ "参照層": null,
143
+ "tier": "open",
144
+ "ファイル数": 1,
145
+ "大きさ": 10668
146
+ },
147
+ {
148
+ "name": "zezehihi",
149
+ "version": "1.0",
150
+ "description": null,
151
+ "layer": "util",
152
+ "本体": "zezehihi-v1.0.md",
153
+ "参照層": null,
154
+ "tier": "open",
155
+ "ファイル数": 1,
156
+ "大きさ": 9775
157
+ },
158
+ {
159
+ "name": "newcomer-supplement",
160
+ "version": "1.0.0",
161
+ "description": null,
162
+ "layer": null,
163
+ "本体": "limited/newcomer-supplement-v1.0",
164
+ "参照層": null,
165
+ "tier": "limited",
166
+ "ファイル数": 29,
167
+ "大きさ": 392041
168
+ },
169
+ {
170
+ "name": "payroll-apprentice",
171
+ "version": "1.1",
172
+ "description": null,
173
+ "layer": "app",
174
+ "本体": "payroll-apprentice-v1.1.md",
175
+ "参照層": "limited/payroll-apprentice-v1.1",
176
+ "tier": "limited",
177
+ "ファイル数": 44,
178
+ "大きさ": 277102
179
+ },
180
+ {
181
+ "name": "rule-apprentice",
182
+ "version": "1.0",
183
+ "description": null,
184
+ "layer": "app",
185
+ "本体": "rule-apprentice-v1.0.md",
186
+ "参照層": "limited/rule-apprentice-v1.0",
187
+ "tier": "limited",
188
+ "ファイル数": 71,
189
+ "大きさ": 936066
190
+ }
191
+ ]
192
+ }