lumina-wiki 0.9.0 → 1.0.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.
- package/CHANGELOG.md +42 -1
- package/README.md +5 -4
- package/README.vi.md +9 -8
- package/README.zh.md +5 -4
- package/bin/lumina.js +37 -0
- package/package.json +4 -2
- package/src/installer/commands.js +48 -7
- package/src/scripts/discover-runner.mjs +443 -0
- package/src/scripts/lib/discovery-state.mjs +60 -0
- package/src/scripts/lib/watchlist-config.mjs +274 -0
- package/src/skills/core/ingest/references/step-01-draft.md +3 -0
- package/src/skills/core/ingest/references/step-02-lint.md +12 -21
- package/src/skills/core/ingest/references/step-03-verify.md +27 -11
- package/src/skills/core/ingest/references/step-04-finalize.md +7 -7
- package/src/skills/packs/research/prefill/SKILL.md +14 -5
- package/src/skills/packs/research/watchlist/SKILL.md +181 -0
- package/src/templates/AGENTS.md +1 -1
- package/src/templates/CLAUDE.md +1 -1
- package/src/templates/GEMINI.md +1 -1
- package/src/templates/README.md +15 -3
- package/src/templates/_lumina/config/watchlist.yml +23 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,45 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [1.0.0] - 2026-05-06
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `lumina discover run` command for one-shot scheduled discovery runs from a workspace watchlist.
|
|
13
|
+
- Research-pack watchlist configuration template at install time, with upgrade behavior that preserves user edits.
|
|
14
|
+
- Scheduled discovery runner output under `raw/discovered/`, including scoring metadata, duplicate tracking, and run summaries.
|
|
15
|
+
- `/lumi-research-watchlist` skill to help users configure research watchlists with an agent.
|
|
16
|
+
- Advanced scheduled discovery guides in English, Vietnamese, and Simplified Chinese, covering GitHub Actions, macOS/Linux cron, and Windows Task Scheduler.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- User guides now link to the advanced scheduled discovery guide from their guide menu.
|
|
21
|
+
- Scheduled discovery documentation now explains what to do after new research is found, including reviewing candidates and ingesting useful sources.
|
|
22
|
+
- GitHub Actions guidance now includes auto-commit behavior for discovered research output when a run finds changes.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- Scheduled discovery now exits non-zero when hard source fetch errors occur, so CI and cron jobs do not silently pass failed runs.
|
|
27
|
+
- Scheduled discovery now deduplicates the same paper across arXiv and Semantic Scholar before falling back to source-specific IDs.
|
|
28
|
+
|
|
29
|
+
### Migration
|
|
30
|
+
|
|
31
|
+
- Existing workspaces can re-run `npx lumina-wiki@latest install --yes` to receive the scheduled discovery runner, watchlist template, and watchlist skill. Existing `wiki/`, `raw/`, and user-edited watchlists are preserved.
|
|
32
|
+
|
|
33
|
+
## [0.9.1] - 2026-05-05
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- `/lumi-ingest` now uses selective human review: after the user accepts the draft, link cleanup and source checking continue automatically when clean. The skill asks again only when user judgment is needed, such as unresolved page issues, source-check findings, missing source files, overwrite/restart decisions, or saving with lower confidence.
|
|
38
|
+
- Installed agent context now emphasizes plain, everyday communication for non-technical users. Agents should sound like helpful knowledge assistants, use the configured communication language consistently, translate workflow terms, and avoid coding-agent language in user-facing replies.
|
|
39
|
+
- README-generated IDE stubs now explicitly point agents to the README's user communication rules while staying thin and regenerated.
|
|
40
|
+
- `/lumi-research-prefill` prompts now follow the same language rule and avoid exposing internal tool terms in user-facing choices.
|
|
41
|
+
- README and user guide docs in English, Vietnamese, and Simplified Chinese now describe the quieter ingest flow instead of four mandatory checkpoints.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- `package-lock.json` root package version is now aligned with `package.json`.
|
|
46
|
+
|
|
8
47
|
## [0.9.0] - 2026-05-05
|
|
9
48
|
|
|
10
49
|
### Added
|
|
@@ -189,7 +228,9 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
189
228
|
|
|
190
229
|
---
|
|
191
230
|
|
|
192
|
-
[Unreleased]: https://github.com/tronghieu/lumina-wiki/compare/
|
|
231
|
+
[Unreleased]: https://github.com/tronghieu/lumina-wiki/compare/v1.0.0...HEAD
|
|
232
|
+
[1.0.0]: https://github.com/tronghieu/lumina-wiki/compare/v0.9.1...v1.0.0
|
|
233
|
+
[0.9.1]: https://github.com/tronghieu/lumina-wiki/compare/v0.9.0...v0.9.1
|
|
193
234
|
[0.9.0]: https://github.com/tronghieu/lumina-wiki/compare/v0.8.1...v0.9.0
|
|
194
235
|
[0.8.1]: https://github.com/tronghieu/lumina-wiki/compare/v0.8.0...v0.8.1
|
|
195
236
|
[0.8.0]: https://github.com/tronghieu/lumina-wiki/compare/v0.7.0...v0.8.0
|
package/README.md
CHANGED
|
@@ -106,7 +106,7 @@ Interact with your wiki using these commands in your AI chat interface, such as
|
|
|
106
106
|
|
|
107
107
|
**Phase 1: Ingest and Build Knowledge**
|
|
108
108
|
- `/lumi-init`: Scan the `raw/` directory and perform the first wiki build.
|
|
109
|
-
- `/lumi-ingest [path/to/file]`: Process a new document into the knowledge base
|
|
109
|
+
- `/lumi-ingest [path/to/file]`: Process a new document into the knowledge base. It asks you to review the draft, then keeps going unless something needs your judgment.
|
|
110
110
|
|
|
111
111
|
**Phase 2: Query and Maintain**
|
|
112
112
|
- `/lumi-ask [your question]`: Ask a question against the full knowledge base in `wiki/`.
|
|
@@ -161,13 +161,14 @@ These are the commands you can use when chatting with your AI agent.
|
|
|
161
161
|
| Pack | Skill | Purpose |
|
|
162
162
|
| :--- | :--- | :--- |
|
|
163
163
|
| **Core** | `/lumi-init` | Initialize the wiki from all files in `raw/`. |
|
|
164
|
-
| | `/lumi-ingest` | Read a document and write a wiki page.
|
|
164
|
+
| | `/lumi-ingest` | Read a document and write a wiki page. It asks you to review the draft, then continues on its own unless something needs your judgment. Resumable across sessions. |
|
|
165
165
|
| | `/lumi-ask` | Ask a question against the full knowledge base. |
|
|
166
166
|
| | `/lumi-edit` | Request a manual edit to a wiki page. |
|
|
167
167
|
| | `/lumi-check` | Check the wiki for errors, such as broken links. |
|
|
168
168
|
| | `/lumi-reset` | Safely reset parts of the wiki. |
|
|
169
169
|
| | `/lumi-verify` | Check that wiki notes match the sources they cite. Reports anything suspicious for your review; never edits notes for you. |
|
|
170
170
|
| **Research** | `/lumi-research-discover` | Discover and rank relevant research papers. |
|
|
171
|
+
| | `/lumi-research-watchlist` | Choose research topics for scheduled discovery with AI help. |
|
|
171
172
|
| | `/lumi-research-survey` | Create a survey or summary from existing knowledge. |
|
|
172
173
|
| | `/lumi-research-prefill` | Seed foundational concepts to avoid duplicates. |
|
|
173
174
|
| | `/lumi-research-setup` | Help configure API keys for research tools. |
|
|
@@ -185,8 +186,8 @@ The scripts behind these skills live in `_lumina/scripts/` and `_lumina/tools/`;
|
|
|
185
186
|
The current release is **v0.2** (preview). The full plan is in [`ROADMAP.md`](./ROADMAP.md). Headline items:
|
|
186
187
|
|
|
187
188
|
**v1.0.0 - First Stable**
|
|
188
|
-
- **
|
|
189
|
-
- New `/lumi-
|
|
189
|
+
- **Scheduled discovery** - saved research topics can be checked on a schedule you choose.
|
|
190
|
+
- New `/lumi-research-watchlist` skill to help you choose and update the topics to follow.
|
|
190
191
|
- Stability lock for the v0.1 surface: CLI flags, exit codes, and schema field names.
|
|
191
192
|
- Cross-platform CI matrix: macOS, Linux, and Windows on Node 20 and 22.
|
|
192
193
|
|
package/README.vi.md
CHANGED
|
@@ -106,7 +106,7 @@ Tương tác với wiki của bạn bằng cách sử dụng các lệnh này tr
|
|
|
106
106
|
|
|
107
107
|
**Giai đoạn 1: Nạp và Xây dựng kiến thức**
|
|
108
108
|
- `/lumi-init`: Quét thư mục `raw/` và thực hiện xây dựng wiki lần đầu.
|
|
109
|
-
- `/lumi-ingest [đường/dẫn/tới/file]`:
|
|
109
|
+
- `/lumi-ingest [đường/dẫn/tới/file]`: Đưa một tài liệu mới vào wiki. AI cho bạn xem bản nháp trước, rồi tự tiếp tục nếu không có điểm cần bạn quyết định.
|
|
110
110
|
|
|
111
111
|
**Giai đoạn 2: Khai thác và Bảo trì**
|
|
112
112
|
- `/lumi-ask [câu hỏi của bạn]`: Đặt câu hỏi dựa trên toàn bộ cơ sở kiến thức trong `wiki/`.
|
|
@@ -161,13 +161,14 @@ npx skills add https://github.com/tobi/qmd --skill qmd
|
|
|
161
161
|
| Gói | Skill | Mục đích |
|
|
162
162
|
| :--- | :--- | :--- |
|
|
163
163
|
| **Core** | `/lumi-init` | Khởi tạo wiki từ tất cả các file trong `raw/`. |
|
|
164
|
-
| | `/lumi-ingest` | Đọc một tài liệu và viết trang wiki.
|
|
164
|
+
| | `/lumi-ingest` | Đọc một tài liệu và viết trang wiki. AI cho bạn xem bản nháp trước, rồi tự tiếp tục nếu không có điểm cần bạn quyết định. Có thể tiếp tục giữa các phiên. |
|
|
165
165
|
| | `/lumi-ask` | Đặt câu hỏi dựa trên toàn bộ cơ sở kiến thức. |
|
|
166
166
|
| | `/lumi-edit` | Yêu cầu chỉnh sửa thủ công một trang wiki. |
|
|
167
167
|
| | `/lumi-check` | Kiểm tra lỗi trong wiki (liên kết hỏng, v.v.). |
|
|
168
168
|
| | `/lumi-reset` | Xóa các phần của wiki một cách an toàn. |
|
|
169
169
|
| | `/lumi-verify` | Kiểm tra xem các trang wiki có khớp với nguồn đã trích dẫn không. Báo cáo những điểm đáng ngờ để bạn xem xét; không tự sửa ghi chú giúp bạn. |
|
|
170
170
|
| **Research**| `/lumi-research-discover` | Khám phá và xếp hạng các bài báo nghiên cứu liên quan. |
|
|
171
|
+
| | `/lumi-research-watchlist` | Giúp bạn chọn các chủ đề nghiên cứu để AI tìm định kỳ. |
|
|
171
172
|
| | `/lumi-research-survey` | Tạo một bài tổng quan/khảo sát từ kiến thức hiện có. |
|
|
172
173
|
| | `/lumi-research-prefill` | Tạo trước các khái niệm nền tảng để tránh trùng lặp. |
|
|
173
174
|
| | `/lumi-research-setup` | Giúp cấu hình API key cho các công cụ nghiên cứu. |
|
|
@@ -185,16 +186,16 @@ Các script chạy nền nằm trong `_lumina/scripts/` và `_lumina/tools/`; th
|
|
|
185
186
|
Phiên bản hiện tại là **v0.2** (preview). Kế hoạch đầy đủ ở [`ROADMAP.md`](./ROADMAP.md). Những hạng mục chính:
|
|
186
187
|
|
|
187
188
|
**v1.0.0 — Bản ổn định đầu tiên**
|
|
188
|
-
- **
|
|
189
|
-
- Skill mới `/lumi-
|
|
189
|
+
- **Tìm tài liệu định kỳ** — các chủ đề nghiên cứu đã lưu có thể được kiểm tra lại theo lịch bạn chọn.
|
|
190
|
+
- Skill mới `/lumi-research-watchlist` để giúp bạn chọn và cập nhật các chủ đề muốn theo dõi.
|
|
190
191
|
- Khoá ổn định bề mặt v0.1 (CLI flags, exit codes, tên trường schema).
|
|
191
192
|
- CI matrix đa nền tảng (macOS + Linux + Windows, Node 20 + 22).
|
|
192
193
|
|
|
193
|
-
**v2.0.0 — Mở rộng nguồn
|
|
194
|
-
- **Nguồn
|
|
195
|
-
- **Đánh giá
|
|
194
|
+
**v2.0.0 — Mở rộng nguồn bài báo nghiên cứu cho Research Pack**
|
|
195
|
+
- **Nguồn bài báo mới:** OpenAlex, Unpaywall, CORE (Ưu tiên 1) → OpenReview, Hugging Face Papers, Papers With Code (Ưu tiên 2) → Crossref, DOAJ, RSS từ các blog research lab (Ưu tiên 3).
|
|
196
|
+
- **Đánh giá bài báo:** skill mới `/lumi-rank` đưa các chỉ số influential-citation count, xếp hạng theo lĩnh vực, Scite support/contrast, và Altmetric vào block `ranking:` trong frontmatter.
|
|
196
197
|
|
|
197
|
-
**Muốn đóng góp?** Chọn bất kỳ hạng mục chưa tick trong `ROADMAP.md`, mở issue để nhận, rồi gửi PR. Các fetcher nguồn
|
|
198
|
+
**Muốn đóng góp?** Chọn bất kỳ hạng mục chưa tick trong `ROADMAP.md`, mở issue để nhận, rồi gửi PR. Các fetcher nguồn bài báo đều tuân theo cùng pattern trong `src/tools/` (CLI + JSON, no async, exit codes `0/2/3`) nên rất phù hợp cho lần contribute đầu tiên. Xem hướng dẫn dev cục bộ bên dưới.
|
|
198
199
|
|
|
199
200
|
---
|
|
200
201
|
|
package/README.zh.md
CHANGED
|
@@ -106,7 +106,7 @@ node _lumina/scripts/wiki.mjs migrate --add-defaults
|
|
|
106
106
|
|
|
107
107
|
**阶段一:导入与构建知识**
|
|
108
108
|
- `/lumi-init`: 扫描 `raw/` 目录并执行首次 wiki 构建。
|
|
109
|
-
- `/lumi-ingest [path/to/file]`:
|
|
109
|
+
- `/lumi-ingest [path/to/file]`: 把一份新文档加入知识库。AI 会先请你审阅草稿;如果没有需要你判断的问题,就会继续完成后续步骤。
|
|
110
110
|
|
|
111
111
|
**阶段二:查询与维护**
|
|
112
112
|
- `/lumi-ask [您的问题]`: 基于 `wiki/` 中的完整知识库提问。
|
|
@@ -161,13 +161,14 @@ npx skills add https://github.com/tobi/qmd --skill qmd
|
|
|
161
161
|
| Pack | Skill | 用途 |
|
|
162
162
|
| :--- | :--- | :--- |
|
|
163
163
|
| **Core** | `/lumi-init` | 从 `raw/` 中的所有文件初始化 wiki。 |
|
|
164
|
-
| | `/lumi-ingest` | 阅读一份文档并撰写 wiki
|
|
164
|
+
| | `/lumi-ingest` | 阅读一份文档并撰写 wiki 页面。AI 会先请你审阅草稿;如果没有需要你判断的问题,就会继续完成后续步骤。可跨会话续接。 |
|
|
165
165
|
| | `/lumi-ask` | 基于整个知识库提问。 |
|
|
166
166
|
| | `/lumi-edit` | 要求手动编辑 wiki 页面。 |
|
|
167
167
|
| | `/lumi-check` | 检查 wiki 中的问题(断链等)。 |
|
|
168
168
|
| | `/lumi-reset` | 安全地删除 wiki 的部分内容。 |
|
|
169
169
|
| | `/lumi-verify` | 核查 wiki 里的笔记是否与引用的来源相符。把可疑之处报告给你审阅;不会替你修改笔记。 |
|
|
170
170
|
| **Research**| `/lumi-research-discover` | 发现并排序相关研究论文。 |
|
|
171
|
+
| | `/lumi-research-watchlist` | 帮你选择要定期查找的研究主题。 |
|
|
171
172
|
| | `/lumi-research-survey` | 从现有知识创建综述/调研。 |
|
|
172
173
|
| | `/lumi-research-prefill` | 预先生成基础概念,避免重复。 |
|
|
173
174
|
| | `/lumi-research-setup` | 帮助配置研究工具的 API key。 |
|
|
@@ -185,8 +186,8 @@ npx skills add https://github.com/tobi/qmd --skill qmd
|
|
|
185
186
|
当前版本是 **v0.2**(预览版)。完整计划见 [`ROADMAP.md`](./ROADMAP.md)。主要项目:
|
|
186
187
|
|
|
187
188
|
**v1.0.0 — 首个稳定版**
|
|
188
|
-
-
|
|
189
|
-
- 新技能 `/lumi-
|
|
189
|
+
- **定期查找新资料** — 已保存的研究主题可以按你选择的频率再次检查。
|
|
190
|
+
- 新技能 `/lumi-research-watchlist`,帮助你选择和更新要跟踪的研究主题。
|
|
190
191
|
- 锁定 v0.1 的稳定接口(CLI flags、退出码、schema 字段名)。
|
|
191
192
|
- 跨平台 CI 矩阵(macOS + Linux + Windows,Node 20 + 22)。
|
|
192
193
|
|
package/bin/lumina.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Commands:
|
|
7
7
|
* lumina install — scaffold or upgrade a Lumina Wiki workspace
|
|
8
8
|
* lumina uninstall — remove Lumina-managed files (preserve wiki/ and raw/)
|
|
9
|
+
* lumina discover run — run scheduled discovery once
|
|
9
10
|
* lumina --version — print version + optional update check
|
|
10
11
|
* lumina --help — print usage
|
|
11
12
|
*
|
|
@@ -101,6 +102,7 @@ Examples:
|
|
|
101
102
|
lumina install --yes
|
|
102
103
|
lumina install --yes --packs core,research,reading --ide-targets claude_code,codex
|
|
103
104
|
lumina install --directory /path/to/project
|
|
105
|
+
lumina discover run --dry-run
|
|
104
106
|
lumina uninstall
|
|
105
107
|
lumina --version
|
|
106
108
|
`);
|
|
@@ -196,6 +198,41 @@ program
|
|
|
196
198
|
}
|
|
197
199
|
});
|
|
198
200
|
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// discover subcommand
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
const discover = program
|
|
205
|
+
.command('discover')
|
|
206
|
+
.description('scheduled discovery commands');
|
|
207
|
+
|
|
208
|
+
discover
|
|
209
|
+
.command('run')
|
|
210
|
+
.description('run scheduled discovery once')
|
|
211
|
+
.option('--config <path>', 'watchlist config path')
|
|
212
|
+
.option('--schedule <value>', 'filter by schedule: manual,daily,weekly,monthly')
|
|
213
|
+
.option('--source <value>', 'filter by source: arxiv,s2')
|
|
214
|
+
.option('--limit <number>', 'override per-source fetch limit')
|
|
215
|
+
.option('--dry-run', 'show what would be written without changing files')
|
|
216
|
+
.option('--json', 'print machine-readable summary')
|
|
217
|
+
.action(async (cmdOpts) => {
|
|
218
|
+
try {
|
|
219
|
+
const { main } = await import('../src/scripts/discover-runner.mjs');
|
|
220
|
+
const args = [];
|
|
221
|
+
if (cmdOpts.config) args.push('--config', cmdOpts.config);
|
|
222
|
+
if (cmdOpts.schedule) args.push('--schedule', cmdOpts.schedule);
|
|
223
|
+
if (cmdOpts.source) args.push('--source', cmdOpts.source);
|
|
224
|
+
if (cmdOpts.limit) args.push('--limit', String(cmdOpts.limit));
|
|
225
|
+
if (cmdOpts.dryRun) args.push('--dry-run');
|
|
226
|
+
if (cmdOpts.json) args.push('--json');
|
|
227
|
+
const code = await main(args);
|
|
228
|
+
process.exit(code);
|
|
229
|
+
} catch (err) {
|
|
230
|
+
console.error(`[error] ${err.message}`);
|
|
231
|
+
if (process.env.DEBUG) console.error(err.stack);
|
|
232
|
+
process.exit(err.code === 2 ? 2 : 3);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
|
|
199
236
|
// ---------------------------------------------------------------------------
|
|
200
237
|
// Parse argv
|
|
201
238
|
// ---------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "lumina-wiki",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"description": "Domain-agnostic, multi-IDE wiki scaffolder — Karpathy's LLM-Wiki vision, cross-platform and pack-based.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"llm-wiki",
|
|
@@ -44,6 +44,8 @@
|
|
|
44
44
|
"src/scripts/lint.mjs",
|
|
45
45
|
"src/scripts/reset.mjs",
|
|
46
46
|
"src/scripts/schemas.mjs",
|
|
47
|
+
"src/scripts/discover-runner.mjs",
|
|
48
|
+
"src/scripts/lib/*.mjs",
|
|
47
49
|
"src/skills/**/*.md",
|
|
48
50
|
"src/tools/_env.py",
|
|
49
51
|
"src/tools/extract_pdf.py",
|
|
@@ -74,7 +76,7 @@
|
|
|
74
76
|
"scripts": {
|
|
75
77
|
"test": "npm run test:installer",
|
|
76
78
|
"test:installer": "node --test src/installer/commands.test.js src/installer/fs.test.js src/installer/manifest.test.js src/installer/template-engine.test.js src/installer/update-check.test.js",
|
|
77
|
-
"test:scripts": "node --test src/scripts/lint.test.mjs src/scripts/reset.test.mjs src/scripts/wiki.test.mjs",
|
|
79
|
+
"test:scripts": "node --test src/scripts/lint.test.mjs src/scripts/reset.test.mjs src/scripts/wiki.test.mjs src/scripts/discover-runner.test.mjs",
|
|
78
80
|
"test:python": "python3 -m pytest src/tools/tests -q",
|
|
79
81
|
"test:all": "npm run test:installer && npm run test:scripts && npm run test:python",
|
|
80
82
|
"test:fs": "node --test src/installer/fs.test.js",
|
|
@@ -240,6 +240,7 @@ export async function installCommand(opts = {}) {
|
|
|
240
240
|
// 12. Render .env.example (research pack only)
|
|
241
241
|
if (hasResearch) {
|
|
242
242
|
await renderEnvExample(projectRoot);
|
|
243
|
+
await writeWatchlistTemplate(projectRoot);
|
|
243
244
|
}
|
|
244
245
|
|
|
245
246
|
// 13. Write .gitignore (only if not exists)
|
|
@@ -751,17 +752,17 @@ function buildIdeStub(target, vars) {
|
|
|
751
752
|
const name = vars.project_name || 'this wiki';
|
|
752
753
|
switch (target) {
|
|
753
754
|
case 'claude_code':
|
|
754
|
-
return `# Claude Code — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
755
|
+
return `# Claude Code — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
755
756
|
case 'codex':
|
|
756
|
-
return `# AGENTS.md — Lumina Wiki\n\nThis file is the entry point for any CLI agent that reads \`AGENTS.md\` (Codex, Amp, Crush, Goose, Auggie, OpenCode, Kimi Code, Mistral Vibe, and other AGENTS.md-compatible tools).\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
757
|
+
return `# AGENTS.md — Lumina Wiki\n\nThis file is the entry point for any CLI agent that reads \`AGENTS.md\` (Codex, Amp, Crush, Goose, Auggie, OpenCode, Kimi Code, Mistral Vibe, and other AGENTS.md-compatible tools).\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
757
758
|
case 'gemini_cli':
|
|
758
|
-
return `# Gemini CLI — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
759
|
+
return `# Gemini CLI — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
759
760
|
case 'cursor':
|
|
760
|
-
return `---\ndescription: Lumina Wiki workspace rules for Cursor\nglobs: ["**/*.md"]\nalwaysApply: true\n---\n\n# Cursor — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
761
|
+
return `---\ndescription: Lumina Wiki workspace rules for Cursor\nglobs: ["**/*.md"]\nalwaysApply: true\n---\n\n# Cursor — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
761
762
|
case 'qwen':
|
|
762
|
-
return `# Qwen Code — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
763
|
+
return `# Qwen Code — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
763
764
|
case 'iflow':
|
|
764
|
-
return `# iFlow CLI — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions,
|
|
765
|
+
return `# iFlow CLI — Lumina Wiki\n\nYou are the wiki maintainer for **${name}**.\n\nRead \`README.md\` at the project root first — it contains the full schema, page types, link conventions, skill list, and user communication rules for this workspace.\n\nCommunicate with the user in **${vars.communication_language}**. Write wiki pages in **${vars.document_output_language}**.\n`;
|
|
765
766
|
default:
|
|
766
767
|
return null;
|
|
767
768
|
}
|
|
@@ -769,7 +770,7 @@ function buildIdeStub(target, vars) {
|
|
|
769
770
|
|
|
770
771
|
async function copyScripts(projectRoot) {
|
|
771
772
|
const destDir = join(projectRoot, '_lumina', 'scripts');
|
|
772
|
-
const scriptFiles = ['wiki.mjs', 'lint.mjs', 'reset.mjs', 'schemas.mjs'];
|
|
773
|
+
const scriptFiles = ['wiki.mjs', 'lint.mjs', 'reset.mjs', 'schemas.mjs', 'discover-runner.mjs'];
|
|
773
774
|
for (const file of scriptFiles) {
|
|
774
775
|
const src = join(SCRIPTS_DIR, file);
|
|
775
776
|
const dest = join(destDir, file);
|
|
@@ -779,6 +780,17 @@ async function copyScripts(projectRoot) {
|
|
|
779
780
|
// Scripts may not exist yet (P4+ work); skip gracefully
|
|
780
781
|
}
|
|
781
782
|
}
|
|
783
|
+
const libFiles = ['watchlist-config.mjs', 'discovery-state.mjs'];
|
|
784
|
+
for (const file of libFiles) {
|
|
785
|
+
const src = join(SCRIPTS_DIR, 'lib', file);
|
|
786
|
+
const dest = join(destDir, 'lib', file);
|
|
787
|
+
try {
|
|
788
|
+
await ensureDir(dirname(dest));
|
|
789
|
+
await copyFile(src, dest);
|
|
790
|
+
} catch (_) {
|
|
791
|
+
// Script libs may not exist yet; skip gracefully
|
|
792
|
+
}
|
|
793
|
+
}
|
|
782
794
|
}
|
|
783
795
|
|
|
784
796
|
async function copyChangelog(projectRoot) {
|
|
@@ -856,6 +868,7 @@ function getSkillDefs(packs) {
|
|
|
856
868
|
{ name: 'survey', canonicalId: 'lumi-research-survey', displayName: '/lumi-research-survey' },
|
|
857
869
|
{ name: 'prefill', canonicalId: 'lumi-research-prefill', displayName: '/lumi-research-prefill' },
|
|
858
870
|
{ name: 'setup', canonicalId: 'lumi-research-setup', displayName: '/lumi-research-setup' },
|
|
871
|
+
{ name: 'watchlist', canonicalId: 'lumi-research-watchlist', displayName: '/lumi-research-watchlist' },
|
|
859
872
|
];
|
|
860
873
|
for (const s of researchSkills) {
|
|
861
874
|
defs.push({ ...s, pack: 'research', srcPackPath: 'packs/research' });
|
|
@@ -937,6 +950,34 @@ async function renderEnvExample(projectRoot) {
|
|
|
937
950
|
await atomicWrite(destPath, content);
|
|
938
951
|
}
|
|
939
952
|
|
|
953
|
+
async function writeWatchlistTemplate(projectRoot) {
|
|
954
|
+
const destPath = join(projectRoot, '_lumina', 'config', 'watchlist.yml');
|
|
955
|
+
let exists = false;
|
|
956
|
+
try {
|
|
957
|
+
await access(destPath, fsConstants.F_OK);
|
|
958
|
+
exists = true;
|
|
959
|
+
} catch (_) {}
|
|
960
|
+
if (exists) return;
|
|
961
|
+
|
|
962
|
+
const templatePath = join(TEMPLATES_DIR, '_lumina', 'config', 'watchlist.yml');
|
|
963
|
+
let content;
|
|
964
|
+
try {
|
|
965
|
+
content = await readFile(templatePath, 'utf8');
|
|
966
|
+
} catch (_) {
|
|
967
|
+
content = [
|
|
968
|
+
'version: 1',
|
|
969
|
+
'defaults:',
|
|
970
|
+
' sources: [arxiv]',
|
|
971
|
+
' schedule: weekly',
|
|
972
|
+
' limit: 20',
|
|
973
|
+
' max_new: 5',
|
|
974
|
+
'items: []',
|
|
975
|
+
'',
|
|
976
|
+
].join('\n');
|
|
977
|
+
}
|
|
978
|
+
await atomicWrite(destPath, content);
|
|
979
|
+
}
|
|
980
|
+
|
|
940
981
|
async function writeGitignore(projectRoot) {
|
|
941
982
|
const gitignorePath = join(projectRoot, '.gitignore');
|
|
942
983
|
let exists = false;
|