diff --git a/adapters/jiuwenswarm/manifest.yaml b/adapters/jiuwenswarm/manifest.yaml new file mode 100644 index 00000000..e540f211 --- /dev/null +++ b/adapters/jiuwenswarm/manifest.yaml @@ -0,0 +1,49 @@ +# Human-reviewed adapter for openJiuwen-ai/jiuwenswarm (kb init pilot 2). +# Upstream facts checked 2026-09-30: public, default branch `develop`, Python +# (package `jiuwenswarm/` plus the `jiuwenbox` sandbox service under +# `jiuwenbox/src/jiuwenbox/`), pytest under `tests/`, docs in `docs/zh` and +# `docs/en` (the same set in two languages), no GitHub Actions workflows. +# It has no knowledge pages yet: `kb init jiuwenswarm` creates repos/jiuwenswarm/. +name: jiuwenswarm +status: active +created_by: human +schema_version: 1 +capabilities: [] + +repo: + path: ${JIUWENSWARM_REPO} + full_name: openJiuwen-ai/jiuwenswarm + aliases: [jiuwenswarm, openJiuwen-ai/jiuwenswarm] + default_branch: develop + language: python + +knowledge: + source: openJiuwen-ai/jiuwenswarm@develop + repo_subdir: repos/jiuwenswarm + +push: + default_remote: origin + protected_branches: [develop, main, master] + allowed: false + +# Knowledge service: declared but disabled; kb init's third PR flips it to +# shadow after human review (design kb-init §9). +knowledge_lifecycle: + enabled: false + mode: shadow + knowledge_dir: repos/jiuwenswarm + release: + trigger: none + upstream_visibility: public + init: + seeds: + # linked, never copied: repo-neutral design-review rules + - general/review/rules.md + # linked: check the existing tests before proposing a fix; the repo + # has a large tests/ tree (unit, integration, system, e2e) + - general/ci/guides/inspect-existing-tests-first.md + # one language only: docs/zh and docs/en carry the same pages, and reading + # both would double the doc-corpus cost for no new facts + doc_globs: [README_CN.md, TESTING.md, "docs/zh/**/*.md", jiuwenbox/README_CN.md] + source_roots: [jiuwenswarm/, jiuwenbox/src/jiuwenbox/] + exclude: ["*/tests/*", "*/__init__.py", "*/resources/*", "*/node_modules/*"] diff --git a/doc/knowledge/SCHEMA.md b/doc/knowledge/SCHEMA.md index 6de0c9d2..cf3fa8d5 100644 --- a/doc/knowledge/SCHEMA.md +++ b/doc/knowledge/SCHEMA.md @@ -45,7 +45,7 @@ contradictions: [相对路径] # 可选:与本页冲突的页面 新标签必须先加入此表再使用(防止标签蔓延): -- 归属:`general`、`vllm-omni`、`afd-plugin`、`vllm-gr` +- 归属:`general`、`vllm-omni`、`afd-plugin`、`vllm-gr`、`jiuwenswarm` - 工作主题:`review`、`ci`、`docs`、`git`、`debug`、`bug`、`benchmark`、`environment`、 `remote`、`agents`、`planning`、`dev`、`rebase` - 代码/模型轴:`components`、`models`、`diffusion`、`model-executor`、`serving`、 diff --git a/test/test_kb_init_pilot_jiuwenswarm.py b/test/test_kb_init_pilot_jiuwenswarm.py new file mode 100644 index 00000000..be0dff38 --- /dev/null +++ b/test/test_kb_init_pilot_jiuwenswarm.py @@ -0,0 +1,36 @@ +"""kb init pilot 2: the jiuwenswarm adapter is loadable, has no knowledge +pages yet, and its init block parses with seeds that exist (design kb-init §12).""" + +from __future__ import annotations + +from infermatrix_copilot.adapters.base import AdapterRegistry +from infermatrix_copilot.kb_service.config import load_registry, validate_seeds +from infermatrix_copilot.sdk._resources import adapters_root, knowledge_root + + +def test_jiuwenswarm_adapter_is_a_disabled_empty_kb_pilot(): + adapter = next(a for a in AdapterRegistry(adapters_root()).all() if a.name == "jiuwenswarm") + assert adapter.manifest["repo"]["full_name"] == "openJiuwen-ai/jiuwenswarm" + assert adapter.manifest["push"]["allowed"] is False + lifecycle = load_registry(adapters_root())["jiuwenswarm"] + assert lifecycle.enabled is False and lifecycle.mode == "shadow" + assert lifecycle.upstream_visibility == "public" + init = lifecycle.init + assert init is not None + assert all(seed.startswith("general/") for seed in init.seeds) + assert validate_seeds(init, knowledge_root()) == [] + # the empty-KB path: kb init creates the tree, this PR must not + assert not (knowledge_root() / "repos" / "jiuwenswarm").exists() + + +def test_jiuwenswarm_tag_is_in_the_knowledge_taxonomy(): + # kb init refuses to write pages whose repo tag the taxonomy lacks + # (check_wiki_lint reads doc/knowledge/SCHEMA.md), so the tag is declared first + import importlib.util + from pathlib import Path + + lint_path = Path(__file__).resolve().parents[1] / "knowledge" / "tools" / "check_wiki_lint.py" + spec = importlib.util.spec_from_file_location("check_wiki_lint", lint_path) + lint = importlib.util.module_from_spec(spec) + spec.loader.exec_module(lint) + assert "jiuwenswarm" in lint.taxonomy()