@yottameta/yotta-chain 0.1.1 → 0.1.2

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
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.1.2 (2026-08-29)
4
+
5
+ - 安装方式统一为四方式(对齐发布规范 §3.3.1):方式一 `npx -y @yottameta/yotta-chain --agent <name>` / `--dir <dir>`(推荐,走 npm 源);方式二 `git clone https://github.com/YottaMeta/yotta-chain.git`;方式三 GitHub Download ZIP;方式四 `bash install.sh --agent/--dir/--list`。移除 `npx skills` 与 `-g` 推荐;中英双 README 安装节同步。
6
+ - 版本对齐:package.json / SKILL.md / CHANGELOG / 引擎 VERSION / 测试断言 / README 锚点 = 0.1.2。
7
+ - 无功能变更(仅文档与版本同步)。
8
+
3
9
  ## 0.1.1 (2026-08-27)
4
10
 
5
11
  - 修复:README 安装方式统一为三方式(方式一 npx `-g` / `--dir` 指定目录,方式二 install.sh(`--agent` 仅示例用),方式三手动复制+目录表),删除 npx 固定 `--agent codex` 的写法;README 中英双版同步。
package/README.md CHANGED
@@ -81,54 +81,39 @@ python3 scripts/yotta_chain.py version
81
81
 
82
82
  ## Installation
83
83
 
84
- Pick any of the three methods; skill files are always fetched from **npm** (GitHub can be slow without a proxy; npm supports mirrors).
84
+ Pick any of the four methods below; the order is the recommended priority. Skill files always come from **npm** (GitHub can be slow without a proxy; npm supports mirrors).
85
85
 
86
- ### Method 1: npm (recommended, one-liner)
87
- ```bash
86
+ ### Method 1: npm one-liner (recommended)
87
+
88
+ ```text
88
89
  # Optional China mirror: npm config set registry https://registry.npmmirror.com
89
- npx -y @yottameta/yotta-chain -g
90
- npx -y @yottameta/yotta-chain --dir <your skills dir> # any agent: install to a custom directory
90
+ npx -y @yottameta/yotta-chain --agent <agent-name> # install to the agent's default user-level skills dir
91
+ npx -y @yottameta/yotta-chain --dir <your-skills-dir> # point to the skills dir itself (e.g. ~/.codex/skills)
91
92
  ```
92
- > Agent not in the preset list? Use `--dir` to point at its skills directory, or copy manually (Method 3). `--list` shows the default directory of each agent.
93
93
 
94
- ### Method 2: install.sh
95
- After obtaining the skill folder (`npm pack` unpack or `git clone`), enter the folder:
96
- ```bash
97
- bash install.sh -g # user-level; bash install.sh --list shows all directories
98
- bash install.sh --agent codex # a specific agent (see --list)
99
- bash install.sh # project-level: auto-detect existing skills directories
100
- bash install.sh --dir /path/to/skills
94
+ - `--agent <name>` installs to that agent's default user-level directory; `--list` shows each agent's default directory.
95
+ - `--dir <path>` installs to the given directory; for agents not in the preset list, point `--dir` at their skills directory.
96
+ - If the mirror has not synced the new package (404): add `--registry=https://registry.npmjs.org/` (a proxy may be needed in China), or wait for the mirror cache.
97
+
98
+ ### Method 2: git clone (developers / git available)
99
+
100
+ ```text
101
+ git clone https://github.com/YottaMeta/yotta-chain.git <your-skills-dir>/yotta-chain
101
102
  ```
102
- > Covers 17 agent families, including Trae / Qwen / Comate / CodeBuddy / Kimi.
103
103
 
104
- ### Method 3: manual copy
105
- Copy the whole `yotta-chain` folder into the target agent's skills directory. Common user-level locations (`%USERPROFILE%` on Windows, `~` on Linux/macOS):
104
+ ### Method 3: GitHub Download ZIP (manual / no git)
106
105
 
107
- | Agent | User-level directory | Project-level directory |
108
- |---|---|---|
109
- | Codex | `%USERPROFILE%\.codex\skills\yotta-chain\` | `.codex\skills\` |
110
- | Claude Code | `%USERPROFILE%\.claude\skills\yotta-chain\` | `.claude\skills\` |
111
- | Cursor | `%USERPROFILE%\.cursor\skills\yotta-chain\` | `.cursor\skills\` |
112
- | Windsurf | `%USERPROFILE%\.codeium\windsurf\skills\yotta-chain\` | `.windsurf\skills\` |
113
- | opencode | `%USERPROFILE%\.config\opencode\skills\yotta-chain\` | `.opencode\skills\` |
114
- | Gemini | `%USERPROFILE%\.gemini\skills\yotta-chain\` | `.gemini\skills\` |
115
- | Goose | `%USERPROFILE%\.config\goose\skills\yotta-chain\` | `.goose\skills\` |
116
- | Amp | `%USERPROFILE%\.config\agents\skills\yotta-chain\` | `.agents\skills\` |
117
- | Kiro | `%USERPROFILE%\.kiro\skills\yotta-chain\` | `.kiro\skills\` |
118
- | WorkBuddy | `%USERPROFILE%\.workbuddy\skills\yotta-chain\` | `.workbuddy\skills\` |
119
- | Trae Code CLI | `%USERPROFILE%\.traecli\skills\yotta-chain\` | `.traecli\skills\` |
120
- | Trae IDE (CN) | `%USERPROFILE%\.trae-cn\skills\yotta-chain\` | `.trae\skills\` |
121
- | Qwen Code | `%USERPROFILE%\.qwen\skills\yotta-chain\` | `.qwen\skills\` |
122
- | Comate | `%USERPROFILE%\.comate\skills\yotta-chain\` | `.comate\skills\` |
123
- | CodeBuddy | `%USERPROFILE%\.codebuddy\skills\yotta-chain\` | `.codebuddy\skills\` |
124
- | Kimi | `%USERPROFILE%\.kimi\skills\yotta-chain\` | `.kimi\skills\` |
125
- | Generic AGENTS.md | `%USERPROFILE%\.agents\skills\yotta-chain\` | `.agents\skills\` |
126
-
127
- > If Codex's `CODEX_HOME` is set, it overrides the default; the same applies to opencode's `XDG_CONFIG_HOME`. `.agents\skills` is not a universal directory — only OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI / GitHub Copilot etc. read it; **Claude Code and Codex do not read it by default**. When unsure, use `--dir` or let the agent install it.
128
-
129
- > Project-level: run `npx -y @yottameta/yotta-chain` or `bash install.sh` inside the project to install into the detected project-level directory.
106
+ On the GitHub repository `YottaMeta/yotta-chain`, click **Code → Download ZIP**, unzip it and put the `yotta-chain` folder into the agent's skills directory.
107
+
108
+ ### Method 4: install.sh (multi-agent one-liner script)
130
109
 
110
+ ```text
111
+ bash install.sh --agent <name> # install to the agent's default user-level directory
112
+ bash install.sh --dir <path> # install to the given directory
113
+ bash install.sh --list # list agents -> default directories
114
+ ```
131
115
 
116
+ > Method 1 uses the npm registry (npmmirror / npmjs) and does not depend on GitHub; Methods 2/3 use GitHub and may fail without a proxy in China.
132
117
  ## Usage with an AI agent
133
118
 
134
119
  Tell the agent the context, e.g.:
@@ -159,12 +144,12 @@ The agent runs the engine, reports findings by severity, and explains each rule
159
144
  | `typosquat` | low | Name within edit distance 2 of a well-known package — review manually |
160
145
  | `snapshot` | low | Maven dependency uses a SNAPSHOT version |
161
146
 
162
- ## Supported ecosystems (v0.1.1)
147
+ ## Supported ecosystems (v0.1.2)
163
148
 
164
149
  - **npm** — `package.json` + `package-lock.json` (v1 / v2 / v3) / `npm-shrinkwrap.json` + `.npmrc` (per-scope registries);
165
150
  - **Python** — `requirements*.txt` (with `--index-url` / `--extra-index-url` / `-r` recursion), `pyproject.toml` (PEP 621 / poetry), `poetry.lock`, `Pipfile` / `Pipfile.lock`;
166
151
  - **Maven** — `pom.xml` (basic: unpinned / SNAPSHOT / suspicious repository URLs / property + dependencyManagement resolution).
167
- - `yarn.lock` / `pnpm-lock.yaml` / `go.mod` / `Cargo.lock` are not yet supported in v0.1.1 (see CHANGELOG).
152
+ - `yarn.lock` / `pnpm-lock.yaml` / `go.mod` / `Cargo.lock` are not yet supported in v0.1.2 (see CHANGELOG).
168
153
 
169
154
  ## Boundaries
170
155
 
package/README.zh-CN.md CHANGED
@@ -81,54 +81,39 @@ python3 scripts/yotta_chain.py version
81
81
 
82
82
  ## 安装
83
83
 
84
- 三种方式任选其一,技能文件统一从 **npm** 获取(GitHub 无代理时较慢,npm 可配国内镜像加速)。
84
+ 以下四种方式任选,顺序即推荐优先级;技能文件一律从 **npm** 获取(GitHub 无代理较慢,npm 支持镜像)。
85
85
 
86
- ### 方式一:npm(推荐,一行安装)
87
- ```bash
88
- # 国内加速(可选):npm config set registry https://registry.npmmirror.com
89
- npx -y @yottameta/yotta-chain -g
90
- npx -y @yottameta/yotta-chain --dir <你的技能目录> # 任意智能体:指定目录安装
86
+ ### 方式一:npm 一行装(推荐)
87
+
88
+ ```text
89
+ # 可选国内加速:npm config set registry https://registry.npmmirror.com
90
+ npx -y @yottameta/yotta-chain --agent <智能体名称> # 装到指定智能体默认用户级技能目录
91
+ npx -y @yottameta/yotta-chain --dir <智能体的技能目录> # 指到技能目录本身(如 ~/.codex/skills)
91
92
  ```
92
- > 智能体不在预置列表里?用 `--dir` 指定它的 skills 目录,或手动复制(方式三)。`--list` 可查看各智能体对应的默认目录。想手动拿文件也可 `npm pack @yottameta/yotta-chain` 解包后按方式二/三安装。
93
93
 
94
- ### 方式二:install.sh 一键安装
95
- 获取技能文件夹后(`npm pack` 解包或 `git clone`),进入技能文件夹:
96
- ```bash
97
- bash install.sh -g # 用户级;bash install.sh --list 查看全部目录
98
- bash install.sh --agent codex # 指定智能体(--list 可查看可用项)
99
- bash install.sh # 项目级:自动检测已存在的 .claude/.cursor/.codex 等 skills 目录
100
- bash install.sh --dir /path/to/skills
94
+ - `--agent <name>` 自动装到该智能体默认用户级目录;`--list` 可查看各智能体默认目录。
95
+ - `--dir <路径>` 装到指定的技能目录;未收录的智能体用 `--dir` 指到它的技能目录。
96
+ - npmmirror 未同步新包(404):加 `--registry=https://registry.npmjs.org/`(国内需代理),或稍等镜像缓存。
97
+
98
+ ### 方式二:git clone(开发者 / 有 git 环境)
99
+
100
+ ```text
101
+ git clone https://github.com/YottaMeta/yotta-chain.git <智能体的技能目录>/yotta-chain
101
102
  ```
102
- > 覆盖 17 类智能体,含国内 Trae / Qwen / Comate / CodeBuddy / Kimi。Windows 用户:装有 Git Bash 即可用;否则用方式三手动复制。
103
103
 
104
- ### 方式三:手动复制
105
- 把整个 `yotta-chain` 文件夹复制到目标智能体的 skills 目录。常见位置(用户级;Windows 用 `%USERPROFILE%`,Linux/macOS 用 `~`):
104
+ ### 方式三:GitHub 下载压缩包(手动 / 无 git 环境)
106
105
 
107
- | 智能体 | 用户级目录 | 项目级目录 |
108
- |---|---|---|
109
- | Codex | `%USERPROFILE%\.codex\skills\yotta-chain\` | `.codex\skills\` |
110
- | Claude Code | `%USERPROFILE%\.claude\skills\yotta-chain\` | `.claude\skills\` |
111
- | Cursor | `%USERPROFILE%\.cursor\skills\yotta-chain\` | `.cursor\skills\` |
112
- | Windsurf | `%USERPROFILE%\.codeium\windsurf\skills\yotta-chain\` | `.windsurf\skills\` |
113
- | opencode | `%USERPROFILE%\.config\opencode\skills\yotta-chain\` | `.opencode\skills\` |
114
- | Gemini | `%USERPROFILE%\.gemini\skills\yotta-chain\` | `.gemini\skills\` |
115
- | Goose | `%USERPROFILE%\.config\goose\skills\yotta-chain\` | `.goose\skills\` |
116
- | Amp | `%USERPROFILE%\.config\agents\skills\yotta-chain\` | `.agents\skills\` |
117
- | Kiro | `%USERPROFILE%\.kiro\skills\yotta-chain\` | `.kiro\skills\` |
118
- | WorkBuddy | `%USERPROFILE%\.workbuddy\skills\yotta-chain\` | `.workbuddy\skills\` |
119
- | Trae Code CLI | `%USERPROFILE%\.traecli\skills\yotta-chain\` | `.traecli\skills\` |
120
- | Trae IDE(国内) | `%USERPROFILE%\.trae-cn\skills\yotta-chain\` | `.trae\skills\` |
121
- | Qwen Code | `%USERPROFILE%\.qwen\skills\yotta-chain\` | `.qwen\skills\` |
122
- | Comate | `%USERPROFILE%\.comate\skills\yotta-chain\` | `.comate\skills\` |
123
- | CodeBuddy | `%USERPROFILE%\.codebuddy\skills\yotta-chain\` | `.codebuddy\skills\` |
124
- | Kimi | `%USERPROFILE%\.kimi\skills\yotta-chain\` | `.kimi\skills\` |
125
- | 通用 AGENTS.md | `%USERPROFILE%\.agents\skills\yotta-chain\` | `.agents\skills\` |
126
-
127
- > 若设置了 Codex 的 `CODEX_HOME`,安装自动以该变量为准;opencode 同理(`XDG_CONFIG_HOME`)。`.agents\skills` 不是通用目录——仅 OpenCode / Cursor / Cline / Amp / Kimi / Gemini CLI / GitHub Copilot 等读取;**Claude Code 与 Codex 默认不读**。不确定时用 `--dir` 或让智能体自行安装。
128
-
129
- > 装到项目:在项目内运行 `npx -y @yottameta/yotta-chain` 或 `bash install.sh`,会装到检测到的项目级目录。
106
+ 在 GitHub 仓库 `YottaMeta/yotta-chain` 点 **Code → Download ZIP**,解压后把 `yotta-chain` 文件夹放进智能体技能目录。
107
+
108
+ ### 方式四:install.sh(多智能体一键脚本)
130
109
 
110
+ ```text
111
+ bash install.sh --agent <name> # 装到指定智能体默认用户级目录
112
+ bash install.sh --dir <path> # 装到指定目录
113
+ bash install.sh --list # 列出智能体 -> 默认目录
114
+ ```
131
115
 
116
+ > 方式一走 npm 源(npmmirror / npmjs),不依赖 GitHub;方式二 / 三走 GitHub,国内无代理可能失败。
132
117
  ## 让智能体使用
133
118
 
134
119
  给智能体下指令即可,例如:
@@ -159,12 +144,12 @@ bash install.sh --dir /path/to/skills
159
144
  | `typosquat` | low | 名字与知名包编辑距离 ≤ 2,疑似拼写仿冒 |
160
145
  | `snapshot` | low | Maven 依赖使用 SNAPSHOT 版本 |
161
146
 
162
- ## 支持的生态(v0.1.1)
147
+ ## 支持的生态(v0.1.2)
163
148
 
164
149
  - **npm** — `package.json` + `package-lock.json`(v1 / v2 / v3)/ `npm-shrinkwrap.json` + `.npmrc`(作用域仓库映射);
165
150
  - **Python** — `requirements*.txt`(含 `--index-url` / `--extra-index-url` / `-r` 递归)、`pyproject.toml`(PEP 621 / poetry)、`poetry.lock`、`Pipfile` / `Pipfile.lock`;
166
151
  - **Maven** — `pom.xml`(基础:未固定版本 / SNAPSHOT / 可疑仓库 URL / 属性与 dependencyManagement 解析)。
167
- - `yarn.lock` / `pnpm-lock.yaml` / `go.mod` / `Cargo.lock` v0.1.1 暂不支持(见 CHANGELOG)。
152
+ - `yarn.lock` / `pnpm-lock.yaml` / `go.mod` / `Cargo.lock` v0.1.2 暂不支持(见 CHANGELOG)。
168
153
 
169
154
  ## 边界
170
155
 
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: yotta-chain
3
- version: 0.1.1
3
+ version: 0.1.2
4
4
  description: 元链 —— 跨智能体的供应链依赖校验技能:零依赖自研引擎本地解析 npm(package.json / package-lock v1-v3 / .npmrc)与 Python(requirements / pyproject.toml / poetry.lock / Pipfile)及 Maven pom.xml,检测依赖混淆(私有包名被公共仓库同名抢占 / 混合仓库 / 可疑仓库 URL / extra-index 回退)、lockfile 与清单不一致、缺失锁文件、未固定版本、typo-squat 仿冒命名,并生成 SBOM-lite(CycloneDX 1.5 子集)。触发:用户要在构建 / 发布 / CI 前检查项目依赖是否存在供应链风险、核对锁文件与清单是否一致、排查依赖混淆风险或生成 SBOM 时。边界:纯本地离线解析,不做在线 CVE 比对、不查询公共包仓库、不发送任何数据;结果只是「需人工复核的风险信号」,是否真实需人工核实;仅用于已获授权 / 自有资产 / 教学环境。
5
5
  license: MIT
6
6
  ---
@@ -77,13 +77,13 @@ python3 scripts/yotta_chain.py version
77
77
 
78
78
  完整规则、判定逻辑与修复指引见 `references/rules.md`。
79
79
 
80
- ## 支持的生态(v0.1.1)
80
+ ## 支持的生态(v0.1.2)
81
81
 
82
82
  - **npm**:package.json + package-lock.json(v1 / v2 / v3)/ npm-shrinkwrap.json + .npmrc(作用域仓库映射);
83
83
  - **Python**:requirements*.txt(含 --index-url / --extra-index-url / -r 递归)、pyproject.toml(PEP 621 / poetry)、
84
84
  poetry.lock、Pipfile / Pipfile.lock;
85
85
  - **Maven**:pom.xml(基础:未固定版本 / SNAPSHOT / 可疑仓库 URL / dependencyManagement 属性解析)。
86
- - yarn.lock / pnpm-lock.yaml / go.mod / Cargo.lock:v0.1.1 暂不支持,见 CHANGELOG 后续计划。
86
+ - yarn.lock / pnpm-lock.yaml / go.mod / Cargo.lock:v0.1.2 暂不支持,见 CHANGELOG 后续计划。
87
87
 
88
88
  ## 与家族协同
89
89
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yottameta/yotta-chain",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Yuanlian — a zero-dependency supply-chain dependency validator for AI agents: detects dependency confusion (private package names resolved from public registries, mixed registries, suspicious registry URLs), lockfile consistency issues (missing entries, unsatisfied ranges, dangling references, missing integrity), missing lockfiles, unpinned versions, SNAPSHOT deps and typosquatting across npm (package.json + package-lock v1/v2/v3), Python (requirements.txt, pyproject.toml, poetry.lock, Pipfile/Pipfile.lock) and Maven (pom.xml); generates SBOM-lite (CycloneDX 1.5 subset). Pure Python 3.8+ standard library, fully local and offline, no online CVE lookups. Triggers when the user needs to check a project dependencies for supply-chain risks before build/release, verify a lockfile matches its manifest, detect dependency-confusion exposure, or generate an SBOM. Boundaries: local and offline; no CVE databases, no package-registry queries, no data leaves the machine; findings are review signals to be verified by humans; authorized / own-asset / educational use only.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -115,7 +115,7 @@
115
115
  - **npm semver**:`^` `~` `>=` `<=` `>` `<` `=`、x 范围(`1.x` / `1.2.x`)、`*`、`||` 或、连字符范围(`1.2.3 - 2.3.4`)、预发布规则(预发布版本默认不满足不含预发布的比较器)。
116
116
  - **PEP 440**:`==` `!=` `>=` `<=` `>` `<` `~=` `===`、逗号 AND、`||` 或、`==1.2.*` 通配;`~=1.2` = `>=1.2,==1.2.*`。
117
117
 
118
- ## 六、已知限制(v0.1.1)
118
+ ## 六、已知限制(v0.1.2)
119
119
 
120
120
  - 不做在线 CVE 比对(那是 snyk / trivy / npm audit 的地盘)。
121
121
  - 依赖混淆为本地近似:真正确认「私有包名被公共仓库抢占」需要在线核对,引擎给强信号供人工复核。
@@ -115,7 +115,7 @@ class TestToml(unittest.TestCase):
115
115
  doc = '''
116
116
  [project]
117
117
  name = "demo"
118
- version = "0.1.1"
118
+ version = "0.1.2"
119
119
  dependencies = [
120
120
  "requests>=2.28",
121
121
  'flask<3.0',
@@ -547,7 +547,7 @@ class TestCli(unittest.TestCase):
547
547
  self.assertEqual(data["bomFormat"], "CycloneDX")
548
548
 
549
549
  def test_version(self):
550
- self.assertEqual(yc.VERSION, "0.1.1")
550
+ self.assertEqual(yc.VERSION, "0.1.2")
551
551
 
552
552
 
553
553
  class TestNpmLockV1(unittest.TestCase):
@@ -4,7 +4,7 @@
4
4
 
5
5
  Zero-dependency Python 3.8+ implementation (standard library only).
6
6
 
7
- Scope (v0.1.1):
7
+ Scope (v0.1.2):
8
8
  - npm : package.json + package-lock.json (v1/v2/v3) + npm-shrinkwrap.json + .npmrc
9
9
  - python: requirements*.txt + pyproject.toml (PEP 621 / poetry) + poetry.lock
10
10
  + Pipfile / Pipfile.lock
@@ -35,7 +35,7 @@ try:
35
35
  except Exception:
36
36
  pass
37
37
 
38
- VERSION = "0.1.1"
38
+ VERSION = "0.1.2"
39
39
 
40
40
  SEVERITY_ORDER = ["info", "low", "medium", "high"]
41
41
  SEVERITY_RANK = {s: i for i, s in enumerate(SEVERITY_ORDER)}