hj633-aqi 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 yujiale
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # hj633-aqi
2
+
3
+ [![npm](https://img.shields.io/npm/v/hj633-aqi)](https://www.npmjs.com/package/hj633-aqi)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
+
6
+ Claude Code skill:按中国生态环境标准 **HJ 633—2026《环境空气质量指数(AQI)技术规定(试行)》**(2026-02-14 发布,2026-03-01 实施,代替 HJ 633—2012)计算、核对与解释 AQI / IAQI / 首要污染物 / 级别与颜色。
7
+
8
+ 核心是零依赖的 Python 脚本 `scripts/hj633.py`:官方表 3 全部断点、分段线性插值(式 1)、**向上进位取整**(4.2.6)、日报/实时报两种口径(4.2.2 / 4.2.3)、SO₂ 1h 与 O₃ 8h 封顶注 b/c、缺项发布规则(5.3.1)、IAQI 反推浓度、2012 版对照。自带 4875 项审计用例全部通过(`scripts/accuracy_audit.py`)。
9
+
10
+ ## 安装(一键)
11
+
12
+ ```bash
13
+ npm install -g hj633-aqi
14
+ ```
15
+
16
+ postinstall 会自动把 skill 复制到 `~/.claude/skills/hj633-aqi/`(若设置了 `CLAUDE_CONFIG_DIR` 则装到 `$CLAUDE_CONFIG_DIR/skills/`)。重启 Claude Code 会话后生效。
17
+
18
+ 不想全局安装也可以:
19
+
20
+ ```bash
21
+ npx hj633-aqi # 安装
22
+ npx hj633-aqi uninstall # 移除
23
+ ```
24
+
25
+ 或手动安装:
26
+
27
+ ```bash
28
+ git clone https://github.com/jialeyu0888-code/hj633-aqi ~/.claude/skills/hj633-aqi
29
+ ```
30
+
31
+ ## 使用
32
+
33
+ 在 Claude Code 里直接问即可自动触发,例如:
34
+
35
+ - 「PM2.5 日均 75 μg/m³ 对应 IAQI 多少?」
36
+ - 「日报口径:PM2.5 55、PM10 90、O₃ 日最大 8h 160、SO₂ 12、NO₂ 35、CO 0.8,算 AQI 和首要污染物」
37
+ - 「IAQI=100 时各污染物的浓度限值是多少?」
38
+ - 「2026 版和 2012 版断点差在哪?」
39
+
40
+ skill 会强制走脚本计算,不口算、不套用 2012 断点。
41
+
42
+ 也可以直接用命令行(无需 Claude):
43
+
44
+ ```bash
45
+ # 单污染物 IAQI
46
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py iaqi --pollutant PM2.5 --conc 75 --avg 24h
47
+
48
+ # 日报 AQI + 首要污染物
49
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py aqi --mode daily \
50
+ --pm25 55 --pm10 90 --o3 160 --so2 12 --no2 35 --co 0.8 --assume-complete
51
+
52
+ # 实时报(O₃ 为 1h;颗粒物 1h 浓度仍查 24h 断点)
53
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py aqi --mode realtime --pm25 55 --o3 188 --no2 90 --assume-complete
54
+
55
+ # 由 IAQI 反推浓度 / 全表限值 / 级别 / 敏感人群 / 2012 对照
56
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py reverse --pollutant PM2.5 --iaqi 100 --avg 24h
57
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py limits
58
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py category --aqi 165
59
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py sensitive --pollutant O3
60
+ python ~/.claude/skills/hj633-aqi/scripts/hj633.py compare-2012 --pollutant PM2.5 --conc 75 --avg 24h
61
+ ```
62
+
63
+ 所有子命令支持 `--json`。
64
+
65
+ ## 2026 版相对 2012 版的关键变化
66
+
67
+ | 项目 | 2012 | 2026 |
68
+ |------|------|------|
69
+ | PM₂.₅ 24h,IAQI=100 | 75 μg/m³ | **60** μg/m³ |
70
+ | PM₁₀ 24h,IAQI=100 | 150 μg/m³ | **120** μg/m³ |
71
+ | 取整 | GB/T 8170 修约 | **向上进位** |
72
+ | 实时报颗粒物 | 部分实现混用 1h 断点 | 明确用 **24h 断点** |
73
+ | 敏感人群 | 无独立表 | 新增表 2 |
74
+ | 超标污染物 | 有定义 | **删除** |
75
+
76
+ 其余气态污染物断点与 2012 相同;SO₂ 1h > 800 μg/m³ 时 IAQI 按 200 计(注 b),O₃ 8h > 800 μg/m³ 时按 300 计(注 c)。
77
+
78
+ ## 目录结构
79
+
80
+ ```
81
+ ├── SKILL.md # skill 定义(Claude Code 的入口)
82
+ ├── references/
83
+ │ ├── standard.md # 标准完整条文摘录
84
+ │ └── breakpoints.json # 表 3 断点(机器可读)
85
+ ├── scripts/
86
+ │ ├── hj633.py # 计算 CLI(标准库,零依赖)
87
+ │ ├── test_hj633.py # 单元测试
88
+ │ ├── accuracy_audit.py # 全表准确率审计(可 --compare-iaqi 对照外部实现)
89
+ │ └── batch_csv_aqi.py # CSV 批量计算
90
+ ├── evals/evals.json # skill 触发与正确性评测用例
91
+ └── bin/install.js # npm 安装器
92
+ ```
93
+
94
+ ## 验证
95
+
96
+ ```bash
97
+ npm test # 即 python scripts/accuracy_audit.py,4875 项用例
98
+ ```
99
+
100
+ ## License
101
+
102
+ [MIT](LICENSE)
103
+
104
+ ## Disclaimer
105
+
106
+ 本工具按公开发布的标准文本实现,仅供技术参考;正式发布空气质量指数请以生态环境主管部门口径为准。
package/SKILL.md ADDED
@@ -0,0 +1,130 @@
1
+ ---
2
+ name: hj633-aqi
3
+ description: >
4
+ 在计算、核对、解释或实现中国环境空气质量指数时必须使用。触发词包括 AQI、IAQI、
5
+ 空气质量指数、空气质量分指数、首要污染物、HJ 633、HJ633、HJ 633—2026、HJ 633—2012、
6
+ 优/良/轻度污染/中度污染/重度污染/严重污染、PM2.5/PM10/O3/SO2/NO2/CO 与 AQI 换算、
7
+ 日报/实时报/预报 AQI、分指数浓度限值、IAQI 断点、合川/hechuan 空气质量指数。
8
+ 即使用户只说「这个浓度对应多少 AQI」「谁是首要污染物」「IAQI=100 时 PM2.5 是多少」
9
+ 也要使用本技能,不要口算、不要套用 2012 断点。
10
+ ---
11
+
12
+ # HJ 633—2026 环境空气质量指数(AQI)
13
+
14
+ 生态环境部 2026-02-14 发布、2026-03-01 实施,代替 HJ 633—2012。
15
+ 原文 PDF 可在生态环境部官网(mee.gov.cn)检索「HJ 633—2026」获取。
16
+
17
+ **数字一律跑脚本,禁止口算。** 市面上不少实现沿用 2012 断点或抄错高段限值,以本技能脚本为准。
18
+
19
+ ## 先跑计算
20
+
21
+ 脚本:`scripts/hj633.py`(标准库,无第三方依赖)。
22
+
23
+ ```bash
24
+ # 单污染物 IAQI
25
+ python "<skill>/scripts/hj633.py" iaqi --pollutant PM2.5 --conc 75 --avg 24h
26
+
27
+ # 日报 AQI + 首要污染物(O3 为日最大 8h)
28
+ python "<skill>/scripts/hj633.py" aqi --mode daily --pm25 55 --pm10 90 --o3 160 --so2 12 --no2 35 --co 0.8 --assume-complete
29
+
30
+ # 实时报(O3 为 1h;颗粒物 1h 浓度仍用 24h 断点)
31
+ python "<skill>/scripts/hj633.py" aqi --mode realtime --pm25 55 --o3 188 --no2 90 --assume-complete
32
+
33
+ # 由 IAQI 反推浓度(「IAQI=100 时各污染物限值」)
34
+ python "<skill>/scripts/hj633.py" reverse --pollutant PM2.5 --iaqi 100 --avg 24h
35
+
36
+ # 表 3 全表 / 级别颜色 / 敏感人群 / 2012 对照
37
+ python "<skill>/scripts/hj633.py" limits
38
+ python "<skill>/scripts/hj633.py" category --aqi 165
39
+ python "<skill>/scripts/hj633.py" sensitive --pollutant O3
40
+ python "<skill>/scripts/hj633.py" compare-2012 --pollutant PM2.5 --conc 75 --avg 24h
41
+ ```
42
+
43
+ 加 `--json` 便于引用。完整条文见 [references/standard.md](references/standard.md)。
44
+
45
+ ## 核心规则(写代码或解释时必须遵守)
46
+
47
+ 1. **式(1)** 分段线性插值:
48
+ \(IAQI_P = \dfrac{IAQI_{Hi}-IAQI_{Lo}}{BP_{Hi}-BP_{Lo}}(C_P-BP_{Lo})+IAQI_{Lo}\)
49
+ 2. **式(2)** \(AQI=\max(IAQI_P)\),对已参与计算的污染物取最大分指数。
50
+ 3. **4.2.6** IAQI 与 AQI **全部向上进位取整**(`math.ceil`),不是四舍五入,也不是银行家修约。浓度本身按 GB/T 8170 修约(气态/颗粒物整数 μg/m³,CO 一位小数 mg/m³)。
51
+ 4. **日报 4.2.2**:SO₂/NO₂/CO/PM₁₀/PM₂.₅ 用 **24h 平均**,O₃ 用 **日最大 8h 平均**。
52
+ 5. **实时报 4.2.3**:六项都用 **1h 平均浓度**;但 **PM₁₀、PM₂.₅ 的 1h 浓度仍查表 3 的 24h 断点**(式(1) 说明)。SO₂/NO₂/CO/O₃ 的 1h 断点仅用于实时报(表 3 注 a)。
53
+ 6. **预报 4.2.5**:逐日同日报,逐时同实时报。
54
+ 7. **首要污染物 4.3.1**:仅当 **AQI > 50** 时报告;取 IAQI 最大者;并列则全部列出。AQI≤50 不报首要污染物。2026 版已删除「超标污染物」术语。
55
+ 8. **表 3 注 b**:SO₂ 1h **> 800 μg/m³ → IAQI = 200**(没有 300/400/500 档)。
56
+ 9. **表 3 注 c**:O₃ 8h **> 800 μg/m³ → IAQI = 300**(没有 400/500 档)。
57
+ 10. **5.3.1 缺项发布**:缺测时先用其余项算 AQI。**AQI>100 仍发布**;**AQI≤100 则 AQI 标 NA**,只发单项浓度和分指数。缺测填 NA,方案未开展填 `/`。
58
+ 11. **5.3.2**:方案未监测某项,且连续三年未出现以其为首要污染物的轻度及以上污染,可不影响 AQI 发布。
59
+ 12. 点位/县/城市浓度统计按 **HJ 663**(城市是站点浓度均值再算 AQI,不是站点 AQI 的平均)。达标评价按 **GB 3095** 和 HJ 663,不用本标准替代。
60
+
61
+ ## 2026 相对 2012 的变化
62
+
63
+ | 项目 | 2012 | 2026 |
64
+ |------|------|------|
65
+ | PM₂.₅ 24h,IAQI=100 | 75 μg/m³ | **60** μg/m³ |
66
+ | PM₁₀ 24h,IAQI=100 | 150 μg/m³ | **120** μg/m³ |
67
+ | 取整 | GB/T 8170 修约 | **向上进位** |
68
+ | 实时报颗粒物 | 部分实现混用 1h 断点 | 明确用 **24h 断点** |
69
+ | 敏感人群 | 无独立表 | 新增表 2 |
70
+ | 超标污染物 | 有定义 | **删除** |
71
+
72
+ 其余气态污染物断点与 2012 相同。IAQI=50 档 PM₂.₅ 仍为 **35**(征求意见稿曾写 30,正式稿未采纳)。
73
+
74
+ ## 表 3 速查(IAQI → 浓度)
75
+
76
+ 单位:CO 为 mg/m³,其余 μg/m³。`—` 表示该档不定义。
77
+
78
+ | IAQI | SO₂ 24h | SO₂ 1h | NO₂ 24h | NO₂ 1h | CO 24h | CO 1h | O₃ 8h | O₃ 1h | PM₁₀ 24h | PM₂.₅ 24h |
79
+ |------|--------|--------|--------|--------|--------|-------|-------|-------|---------|----------|
80
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
81
+ | 50 | 50 | 150 | 40 | 100 | 2 | 5 | 100 | 160 | 50 | 35 |
82
+ | 100 | 150 | 500 | 80 | 200 | 4 | 10 | 160 | 200 | **120** | **60** |
83
+ | 150 | 475 | 650 | 180 | 700 | 14 | 35 | 215 | 300 | 250 | 115 |
84
+ | 200 | 800 | 800 | 280 | 1200 | 24 | 60 | 265 | 400 | 350 | 150 |
85
+ | 300 | 1600 | — | 565 | 2340 | 36 | 90 | 800 | 800 | 420 | 250 |
86
+ | 400 | 2100 | — | 750 | 3090 | 48 | 120 | — | 1000 | 500 | 350 |
87
+ | 500 | 2620 | — | 940 | 3840 | 60 | 150 | — | 1200 | 600 | 500 |
88
+
89
+ 反推「某 IAQI 对应浓度」用 `reverse`;不要把实时报 SO₂ 的 100 档写成 475(那是 24h 档)。
90
+
91
+ ## 级别、颜色、健康指引(表 1 + 附录 A)
92
+
93
+ | AQI | 级别 | 类别 | RGB | 对健康影响(摘要) | 建议措施(摘要) |
94
+ |-----|------|------|-----|-------------------|------------------|
95
+ | 0–50 | 一级 | 优 | 0,228,0 | 基本无污染 | 正常活动 |
96
+ | 51–100 | 二级 | 良 | 255,255,0 | 极少数异常敏感者可能有较弱影响 | 该人群减少户外活动 |
97
+ | 101–150 | 三级 | 轻度污染 | 255,126,0 | 易感人群症状轻度加剧,健康人刺激症状 | 儿童、老人、心肺疾病患者减少长时间高强度户外锻炼 |
98
+ | 151–200 | 四级 | 中度污染 | 255,0,0 | 易感症状加剧,可能影响健康人心肺 | 上述人群避免长时间高强度户外锻炼,一般人群适量减少 |
99
+ | 201–300 | 五级 | 重度污染 | 153,0,76 | 心肺疾病患者显著加剧,健康人普遍出现症状 | 敏感人群留室内停止户外运动,一般人群减少 |
100
+ | 301–500 | 六级 | 严重污染 | 126,0,35 | 健康人耐受力降低,强烈症状 | 儿童老人病人留室内,一般人群避免户外活动 |
101
+
102
+ 完整措辞以脚本 `category` 或 [references/standard.md](references/standard.md) 表 1 为准。CMYK 见附录 A。
103
+
104
+ IAQI>100 时的敏感人群(表 2):SO₂ 哮喘/儿童/老人;NO₂ 呼吸系统疾病/儿童/老人;CO 心血管病;O₃ 呼吸系统疾病/儿童/户外活动频繁者/老人;PM₁₀ 与 PM₂.₅ 心血管或呼吸系统疾病/儿童/户外活动频繁者/老人。
105
+
106
+ ## 回答结构
107
+
108
+ 计算类问题按这个顺序写,避免只丢一个整数:
109
+
110
+ 1. 口径(日报 / 实时报 / 预报)与平均时段
111
+ 2. 各污染物浓度 → IAQI(注明向上进位)
112
+ 3. AQI = max(IAQI)
113
+ 4. 首要污染物(AQI>50 才报;并列全部列出)
114
+ 5. 级别 / 类别 / 颜色
115
+ 6. 若 IAQI>100:点名该污染物的敏感人群
116
+ 7. 若有缺测:说明 5.3.1 是否把 AQI 标成 NA
117
+
118
+ ## 常见实现错误
119
+
120
+ - 日报与实时报断点不同,不要用一份 1h 表打所有口径。
121
+ - 一些旧实现把 SO₂ 1h 的 100 档写成 475(那是 24h 档值)、O₃ 1h 的 400 档封成 1200,**与表 3 不符**。以本技能表 3 为准。
122
+ - 官方发布序列在新标准实施初期仍可能按 2012 断点出数;对账时用 `compare-2012` 并写明口径。
123
+ - 城市 AQI 不是各站 AQI 的平均。
124
+
125
+ ## 发布时效(第 5 章)
126
+
127
+ - 日报:自然日,次日 **12:00** 前
128
+ - 实时报:整点后发布上一小时,滞后不超过 **1 小时**
129
+ - 预报:至少未来 **3 日**(不含当日),每日 **20:00** 前
130
+ - 发布主体:地级及以上城市生态环境主管部门或其授权机构
package/bin/install.js ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * hj633-aqi skill 安装器。
4
+ * `npm install -g hj633-aqi` 后由 postinstall 自动执行;也可手动运行:
5
+ * npx hj633-aqi 安装 / 更新到最新已下载版本
6
+ * npx hj633-aqi uninstall 移除已安装的 skill
7
+ * 目标目录:$CLAUDE_CONFIG_DIR/skills/hj633-aqi(未设置时为 ~/.claude/skills/hj633-aqi)
8
+ */
9
+ "use strict";
10
+
11
+ const fs = require("fs");
12
+ const os = require("os");
13
+ const path = require("path");
14
+
15
+ const SKILL_NAME = "hj633-aqi";
16
+ const COPY_ITEMS = ["SKILL.md", "references", "scripts", "evals"];
17
+ const EXCLUDES = [/^__pycache__$/, /\.pyc$/];
18
+
19
+ function install() {
20
+ const src = path.resolve(__dirname, "..");
21
+ const claudeDir =
22
+ process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude");
23
+ const dest = path.join(claudeDir, "skills", SKILL_NAME);
24
+
25
+ // 在本仓库内开发时源即目标,跳过
26
+ if (path.relative(src, dest) === "") {
27
+ console.log("[hj633-aqi] 源目录即目标目录(本仓库内开发),跳过安装。");
28
+ return;
29
+ }
30
+
31
+ for (const item of COPY_ITEMS) {
32
+ const s = path.join(src, item);
33
+ if (!fs.existsSync(s)) continue;
34
+ const d = path.join(dest, item);
35
+ fs.rmSync(d, { recursive: true, force: true });
36
+ fs.mkdirSync(path.dirname(d), { recursive: true });
37
+ if (fs.statSync(s).isDirectory()) copyDir(s, d);
38
+ else fs.copyFileSync(s, d);
39
+ }
40
+ console.log(`[hj633-aqi] skill 已安装到 ${dest}`);
41
+ console.log("[hj633-aqi] 重启 Claude Code 会话后生效,试试问一个 AQI 计算问题。");
42
+ }
43
+
44
+ function copyDir(src, dest) {
45
+ fs.mkdirSync(dest, { recursive: true });
46
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
47
+ if (EXCLUDES.some((re) => re.test(entry.name))) continue;
48
+ const s = path.join(src, entry.name);
49
+ const d = path.join(dest, entry.name);
50
+ if (entry.isDirectory()) copyDir(s, d);
51
+ else fs.copyFileSync(s, d);
52
+ }
53
+ }
54
+
55
+ function uninstall() {
56
+ const claudeDir =
57
+ process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude");
58
+ const dest = path.join(claudeDir, "skills", SKILL_NAME);
59
+ if (!fs.existsSync(dest)) {
60
+ console.log(`[hj633-aqi] 未发现已安装的 skill(${dest})。`);
61
+ return;
62
+ }
63
+ fs.rmSync(dest, { recursive: true, force: true });
64
+ console.log(`[hj633-aqi] 已移除 ${dest}`);
65
+ }
66
+
67
+ const cmd = process.argv[2];
68
+ if (cmd === "uninstall" || cmd === "--uninstall") uninstall();
69
+ else install();
@@ -0,0 +1,42 @@
1
+ {
2
+ "skill_name": "hj633-aqi",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "某监测站今天 PM2.5 日均 75 μg/m³,PM10 日均 90,O3 日最大 8 小时 140,SO2 12,NO2 28,CO 0.7。按 HJ 633—2026 算日报 AQI、各项 IAQI 和首要污染物,并说明和 2012 版差在哪。",
7
+ "expected_output": "使用 hj633.py 计算。PM2.5=75 → IAQI 114(向上进位);AQI=114;首要污染物 PM2.5;2012 版同一浓度 PM2.5 IAQI=100。",
8
+ "files": [],
9
+ "expectations": [
10
+ "PM2.5 日均 75 的 IAQI 为 114 而不是 100 或 113",
11
+ "AQI 等于最大 IAQI 114",
12
+ "首要污染物为 PM2.5(或 PM₂.₅)",
13
+ "说明 2026 的 IAQI=100 档 PM2.5 为 60 而非 75",
14
+ "取整方式为向上进位"
15
+ ]
16
+ },
17
+ {
18
+ "id": 2,
19
+ "prompt": "实时报:SO2 一小时 900 μg/m³,其他五项都很低。SO2 的 IAQI 是多少?能不能报 300 以上?",
20
+ "expected_output": "表 3 注 b:SO2 1h >800 时 IAQI 按 200 计,没有 300/400/500 档。",
21
+ "files": [],
22
+ "expectations": [
23
+ "SO2 1h 900 的 IAQI 为 200",
24
+ "引用表 3 注 b 或「高于 800 按 200 计」",
25
+ "不使用 24h 断点把 900 插到 150–200 以上"
26
+ ]
27
+ },
28
+ {
29
+ "id": 3,
30
+ "prompt": "列出 IAQI=50、100、150、200 时 PM2.5、PM10、O3 8h、NO2 1h 的浓度限值。AQI=48 要不要报首要污染物?PM2.5 和 PM10 分指数都是 120 怎么报?",
31
+ "expected_output": "限值来自表 3;AQI≤50 不报首要污染物;并列时全部列出。",
32
+ "files": [],
33
+ "expectations": [
34
+ "PM2.5 在 IAQI 100 为 60 μg/m³",
35
+ "PM10 在 IAQI 100 为 120 μg/m³",
36
+ "O3 8h 在 IAQI 100 为 160 μg/m³",
37
+ "明确 AQI 不大于 50 时不报告首要污染物",
38
+ "IAQI 并列最大时并列为首要污染物"
39
+ ]
40
+ }
41
+ ]
42
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "hj633-aqi",
3
+ "version": "1.0.0",
4
+ "description": "Claude Code skill for China HJ 633—2026 air quality index (AQI/IAQI): official breakpoints, piecewise interpolation, ceil rounding, categories and primary pollutant.",
5
+ "bin": {
6
+ "hj633-aqi": "bin/install.js"
7
+ },
8
+ "files": [
9
+ "SKILL.md",
10
+ "references/",
11
+ "scripts/",
12
+ "evals/",
13
+ "bin/"
14
+ ],
15
+ "scripts": {
16
+ "postinstall": "node bin/install.js",
17
+ "prepack": "node -e \"require('fs').rmSync('scripts/__pycache__',{recursive:true,force:true})\"",
18
+ "test": "python scripts/accuracy_audit.py"
19
+ },
20
+ "keywords": [
21
+ "claude",
22
+ "claude-code",
23
+ "skill",
24
+ "agent-skills",
25
+ "aqi",
26
+ "iaqi",
27
+ "hj633",
28
+ "air-quality",
29
+ "china",
30
+ "环境空气质量指数"
31
+ ],
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/jialeyu0888-code/hj633-aqi.git"
36
+ },
37
+ "engines": {
38
+ "node": ">=16.7"
39
+ }
40
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "standard": "HJ 633—2026",
3
+ "iaqi_nodes": [0, 50, 100, 150, 200, 300, 400, 500],
4
+ "units": {
5
+ "SO2": "ug/m3",
6
+ "NO2": "ug/m3",
7
+ "O3": "ug/m3",
8
+ "PM10": "ug/m3",
9
+ "PM2.5": "ug/m3",
10
+ "CO": "mg/m3"
11
+ },
12
+ "breakpoints": {
13
+ "SO2": {
14
+ "24h": [0, 50, 150, 475, 800, 1600, 2100, 2620],
15
+ "1h": [0, 150, 500, 650, 800, null, null, null]
16
+ },
17
+ "NO2": {
18
+ "24h": [0, 40, 80, 180, 280, 565, 750, 940],
19
+ "1h": [0, 100, 200, 700, 1200, 2340, 3090, 3840]
20
+ },
21
+ "CO": {
22
+ "24h": [0, 2, 4, 14, 24, 36, 48, 60],
23
+ "1h": [0, 5, 10, 35, 60, 90, 120, 150]
24
+ },
25
+ "O3": {
26
+ "8h": [0, 100, 160, 215, 265, 800, null, null],
27
+ "1h": [0, 160, 200, 300, 400, 800, 1000, 1200]
28
+ },
29
+ "PM10": {
30
+ "24h": [0, 50, 120, 250, 350, 420, 500, 600]
31
+ },
32
+ "PM2.5": {
33
+ "24h": [0, 35, 60, 115, 150, 250, 350, 500]
34
+ }
35
+ },
36
+ "caps": {
37
+ "SO2_1h_above_800": 200,
38
+ "O3_8h_above_800": 300
39
+ },
40
+ "pm_realtime_uses_24h_breakpoints": true,
41
+ "rounding": "ceil",
42
+ "primary_pollutant_when_aqi_gt": 50,
43
+ "changes_from_2012": {
44
+ "PM2.5_24h_iaqi_100": {"from": 75, "to": 60},
45
+ "PM10_24h_iaqi_100": {"from": 150, "to": 120}
46
+ }
47
+ }
@@ -0,0 +1,207 @@
1
+ # HJ 633—2026 环境空气质量指数(AQI)技术规定(转录)
2
+
3
+ > 据生态环境部正式文本转录,供技能检索。计算以 `scripts/hj633.py` 为准。
4
+ > 发布:2026-02-14;实施:2026-03-01;代替 HJ 633—2012。
5
+ > ICS 13.040;CCS Z 04。英文名:Technical specifications on ambient air quality index.
6
+
7
+ ## 前言
8
+
9
+ 为贯彻《中华人民共和国环境保护法》《中华人民共和国大气污染防治法》,保护生态环境,保障公众健康,规范环境空气质量指数发布工作,制定本标准。
10
+
11
+ 本标准规定了环境空气质量指数的分级方案、计算方法、级别与类别,以及日报、实时报和预报的发布内容、格式和其他要求。
12
+
13
+ 本标准首次发布于 2012 年。本次为第一次修订,主要变化:
14
+
15
+ - 调整空气质量分指数对应的可吸入颗粒物(PM₁₀)和细颗粒物(PM₂.₅)浓度限值及说明;
16
+ - 增加空气污染物的敏感人群;
17
+ - 调整日报和实时报指标,调整实时报中颗粒物空气质量分指数的计算方法;
18
+ - 删除超标污染物的定义和确定方法;
19
+ - 调整发布要求,增加数据完整性要求。
20
+
21
+ 附录 A 为规范性附录。
22
+
23
+ 本标准由生态环境部大气环境司、法规与标准司组织制订。
24
+
25
+ 起草单位:中国环境监测总站、中国环境科学研究院、上海市环境监测中心。
26
+
27
+ 本标准由生态环境部 2026 年 2 月 14 日批准,自 2026 年 3 月 1 日起实施。自实施之日起,《环境空气质量指数(AQI)技术规定(试行)》(HJ 633—2012)废止。
28
+
29
+ 本标准由生态环境部解释。
30
+
31
+ ## 1 适用范围
32
+
33
+ 本标准规定了环境空气质量指数的分级方案、计算方法、级别与类别,还规定了空气质量指数日报、实时报和预报的发布内容、发布格式和其他相关要求。
34
+
35
+ 本标准适用于点位、县(市、区、旗)、城市环境空气质量指数日报、实时报和预报工作,用于向公众提供健康指引,并支撑环境管理。
36
+
37
+ ## 2 规范性引用文件
38
+
39
+ 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日期的引用文件,仅该日期对应的版本适用于本文件;不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
40
+
41
+ - GB 3095 环境空气质量标准
42
+ - GB/T 8170 数值修约规则与极限数值的表示和判定
43
+ - HJ 663 环境空气质量评价技术规范
44
+ - HJ 664 环境空气质量监测点位布设技术规范
45
+
46
+ ## 3 术语和定义
47
+
48
+ GB 3095、HJ 663、HJ 664 界定的以及下列术语和定义适用于本文件。
49
+
50
+ ### 3.1 空气质量指数 air quality index(AQI)
51
+
52
+ 定量描述空气质量状况的无量纲指数。
53
+
54
+ ### 3.2 空气质量分指数 individual air quality index(IAQI)
55
+
56
+ 单项污染物的空气质量指数。
57
+
58
+ ### 3.3 首要污染物 primary pollutant
59
+
60
+ 空气质量指数大于 50 时,空气质量分指数最大的空气污染物。
61
+
62
+ ## 4 空气质量指数计算方法
63
+
64
+ ### 4.1 空气质量指数分级
65
+
66
+ **4.1.1** 空气质量指数的范围为 1—500,划分为 6 个级别和类别。不同级别空气质量指数的表示颜色、对健康影响情况和建议采取的措施见表 1,空气污染物的敏感人群见表 2。
67
+
68
+ **表 1 空气质量指数及相关信息**
69
+
70
+ | 空气质量指数 | 级别 | 类别及表示颜色 | 对健康影响情况 | 建议采取的措施 |
71
+ |---|---|---|---|---|
72
+ | 0–50 | 一级 | 优,绿色 | 空气质量令人满意,基本无空气污染 | 各类人群可正常活动 |
73
+ | 51–100 | 二级 | 良,黄色 | 空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响 | 极少数异常敏感人群应减少户外活动 |
74
+ | 101–150 | 三级 | 轻度污染,橙色 | 易感人群症状有轻度加剧,健康人群出现刺激症状 | 儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼 |
75
+ | 151–200 | 四级 | 中度污染,红色 | 进一步加剧易感人群症状,可能对健康人群心脏、呼吸系统有影响 | 儿童、老年人及心脏病、呼吸系统疾病患者避免长时间、高强度的户外锻炼,一般人群适量减少户外运动 |
76
+ | 201–300 | 五级 | 重度污染,紫色 | 心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状 | 儿童、老年人和心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动 |
77
+ | 301–500 | 六级 | 严重污染,褐红色 | 健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病 | 儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动 |
78
+
79
+ 说明:正文 4.1.1 写范围为 1—500;表 1 优档从 0 起算。AQI=0 时按优/一级处理。
80
+
81
+ **表 2 空气污染物的敏感人群**
82
+
83
+ | IAQI 超过 100 的污染物 | 建议采取措施的敏感人群 |
84
+ |---|---|
85
+ | 二氧化硫(SO₂) | 患有哮喘的人、儿童(包括青少年)以及老年人 |
86
+ | 二氧化氮(NO₂) | 患有呼吸系统疾病(如哮喘)的人、儿童(包括青少年)以及老年人 |
87
+ | 一氧化碳(CO) | 患有心血管系统疾病的人 |
88
+ | 臭氧(O₃) | 患有呼吸系统疾病(如哮喘)的人、儿童(包括青少年)、户外活动频繁的人以及老年人 |
89
+ | 可吸入颗粒物(PM₁₀)、细颗粒物(PM₂.₅) | 患有心血管系统疾病或呼吸系统疾病(如哮喘)的人、儿童(包括青少年)、户外活动频繁的人以及老年人 |
90
+
91
+ ### 4.2 空气质量指数计算
92
+
93
+ **4.2.1** 空气质量指数可按照点位、县(市、区、旗)、城市分别计算,按统计时段分为日报、实时报和预报。
94
+
95
+ **4.2.2 日报指标** 包括 SO₂、NO₂、CO、PM₁₀、PM₂.₅ 的 24 小时平均以及 O₃ 日最大 8 小时平均,共 6 项。统计时段为自然日。点位、县(市、区、旗)、城市的 6 项污染物浓度依据 HJ 663 相关要求计算。SO₂、NO₂、O₃、PM₁₀、PM₂.₅ 单位为 μg/m³,按 GB/T 8170 修约到整数;CO 单位为 mg/m³,修约到 1 位小数。
96
+
97
+ **4.2.3 实时报指标** 包括 SO₂、NO₂、CO、O₃、PM₁₀ 和 PM₂.₅ 的 1 小时平均,共 6 项。统计时段为当前 1 小时平均。浓度单位和修约要求同 4.2.2。
98
+
99
+ **4.2.4** 日报和实时报中,污染物项目 P 的空气质量分指数按式 (1) 和表 3 计算,空气质量指数按式 (2) 计算:
100
+
101
+ $$IAQI_P = \frac{IAQI_{Hi}-IAQI_{Lo}}{BP_{Hi}-BP_{Lo}}(C_P-BP_{Lo})+IAQI_{Lo} \tag{1}$$
102
+
103
+ 式中:
104
+
105
+ - \(IAQI_P\) —— 污染物项目 P 的空气质量分指数;
106
+ - \(C_P\) —— 污染物项目 P 的质量浓度值;
107
+ - \(BP_{Hi}\) —— 表 3 中与 \(C_P\) 相近的污染物浓度限值的高位值;当 \(C_P\) 为 PM₁₀ 或 PM₂.₅ 的 1 小时平均时,取表 3 中 24 小时平均的高位值;
108
+ - \(BP_{Lo}\) —— 表 3 中与 \(C_P\) 相近的污染物浓度限值的低位值;当 \(C_P\) 为 PM₁₀ 或 PM₂.₅ 的 1 小时平均时,取表 3 中 24 小时平均的低位值;
109
+ - \(IAQI_{Hi}\) —— 表 3 中与 \(BP_{Hi}\) 对应的空气质量分指数;
110
+ - \(IAQI_{Lo}\) —— 表 3 中与 \(BP_{Lo}\) 对应的空气质量分指数。
111
+
112
+ $$AQI = \max \{ IAQI_P \} \tag{2}$$
113
+
114
+ **4.2.5** 预报的统计时段分为逐日预报和逐时预报。逐日预报的计算方法同 4.2.2 和 4.2.4;逐时预报的计算方法同 4.2.3 和 4.2.4。
115
+
116
+ **4.2.6** 环境空气质量指数及空气质量分指数的计算结果应全部向上进位取整数,不保留小数。
117
+
118
+ **表 3 空气质量分指数及对应的污染物项目浓度限值**
119
+
120
+ | IAQI | SO₂ 24h | SO₂ 1hᵃ | NO₂ 24h | NO₂ 1hᵃ | CO 24h | CO 1hᵃ | O₃ 8h | O₃ 1hᵃ | PM₁₀ 24h | PM₂.₅ 24h |
121
+ |------|---------|---------|---------|---------|--------|--------|-------|--------|----------|-----------|
122
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
123
+ | 50 | 50 | 150 | 40 | 100 | 2 | 5 | 100 | 160 | 50 | 35 |
124
+ | 100 | 150 | 500 | 80 | 200 | 4 | 10 | 160 | 200 | 120 | 60 |
125
+ | 150 | 475 | 650 | 180 | 700 | 14 | 35 | 215 | 300 | 250 | 115 |
126
+ | 200 | 800 | 800 | 280 | 1200 | 24 | 60 | 265 | 400 | 350 | 150 |
127
+ | 300 | 1600 | —ᵇ | 565 | 2340 | 36 | 90 | 800 | 800 | 420 | 250 |
128
+ | 400 | 2100 | —ᵇ | 750 | 3090 | 48 | 120 | —ᶜ | 1000 | 500 | 350 |
129
+ | 500 | 2620 | —ᵇ | 940 | 3840 | 60 | 150 | —ᶜ | 1200 | 600 | 500 |
130
+
131
+ 单位:SO₂、NO₂、O₃、PM₁₀、PM₂.₅ 为 μg/m³;CO 为 mg/m³。
132
+
133
+ - 注 a:SO₂、NO₂、CO 和 O₃ 的 1 小时平均浓度限值仅用于实时报。
134
+ - 注 b:SO₂ 1 小时平均浓度高于 800 μg/m³ 的,IAQI 按照 200 计。
135
+ - 注 c:O₃ 8 小时平均浓度高于 800 μg/m³ 的,IAQI 按照 300 计。
136
+
137
+ 相对 HJ 633—2012:仅 PM₁₀、PM₂.₅ 的 IAQI=100 档由 150→120、75→60;其余断点不变。IAQI=50 档 PM₂.₅ 仍为 35(征求意见稿曾出现 30,正式稿未采纳)。
138
+
139
+ ### 4.3 首要污染物的确定
140
+
141
+ **4.3.1** 当 AQI 大于 50 时,IAQI 最大的污染物为首要污染物。若 IAQI 最大的污染物为两项或两项以上时,并列为首要污染物。
142
+
143
+ (2012 版中的「超标污染物」定义及判定方法已删除,不得再按旧标准输出「超标污染物」字段作为本标准要求。)
144
+
145
+ ## 5 空气质量指数发布要求
146
+
147
+ ### 5.1 发布内容和主体
148
+
149
+ **5.1.1** 日报、实时报的发布内容包括:评价时段、地理位置、各污染物的浓度及空气质量分指数、空气质量指数、首要污染物、空气质量指数级别、类别和表示颜色;报告时应说明监测指标和缺测指标。发布内容参考表 4、表 5。预报的发布内容至少包括空气质量指数、首要污染物、空气质量指数级别、类别和表示颜色。
150
+
151
+ **5.1.2** 日报、实时报和预报由各地级及以上城市生态环境主管部门或其授权的机构发布。
152
+
153
+ ### 5.2 发布时效性要求
154
+
155
+ **5.2.1** 日报时间周期为 24 小时,时段为自然日,当日日报应于次日 12 时前向公众发布。
156
+
157
+ **5.2.2** 实时报时间周期为 1 小时,每一整点时刻后即可发布上一小时的实时报,滞后时间不应超过 1 小时。
158
+
159
+ **5.2.3** 预报时效至少覆盖未来 3 日(不含当日),应于每日 20 时前向公众发布。
160
+
161
+ ### 5.3 数据完整性要求
162
+
163
+ **5.3.1** 日报和实时报中某污染物缺数或数据无效时,首先利用其他污染物监测数据计算空气质量指数、首要污染物、级别和类别等信息。当 AQI 大于 100 时仍继续发布;否则仅发布单项污染物浓度及分指数,空气质量指数等信息以 NA 标识。
164
+
165
+ 缺测指标的浓度及分指数均使用 **NA** 标识;监测方案未开展某污染物监测的,使用 **/** 标识。
166
+
167
+ **5.3.2** 因点位、县(市、区、旗)、城市监测方案未开展某项污染物监测导致缺数,且经评估或实测表明连续三年内未出现以其为首要污染物的轻度及以上污染时,不影响空气质量指数信息发布;否则仍按照 5.3.1 执行。
168
+
169
+ ### 表 4 日报数据格式(字段)
170
+
171
+ 时间(自然日);点位/县(市、区、旗)/城市名称;下列各项的浓度与分指数:
172
+
173
+ - SO₂ 24 小时平均,μg/m³
174
+ - NO₂ 24 小时平均,μg/m³
175
+ - CO 24 小时平均,mg/m³
176
+ - O₃ 日最大 8 小时平均,μg/m³
177
+ - PM₁₀ 24 小时平均,μg/m³
178
+ - PM₂.₅ 24 小时平均,μg/m³
179
+
180
+ 以及:AQI、首要污染物、空气质量指数级别、类别、颜色。
181
+
182
+ ### 表 5 实时报数据格式(字段)
183
+
184
+ 时间(年-月-日-时);点位/县(市、区、旗)/城市名称;下列各项的 **1 小时平均** 浓度与分指数:SO₂、NO₂、CO、O₃、PM₁₀、PM₂.₅(CO 为 mg/m³,其余 μg/m³)。以及 AQI、首要污染物、级别、类别、颜色。
185
+
186
+ ## 6 其他要求
187
+
188
+ **6.1** 本标准未明确的其他浓度统计方法和数据统计有效性规定,按 GB 3095 和 HJ 663 的要求执行。
189
+
190
+ **6.2** 评价环境空气质量达标状况时,应依据 GB 3095 和 HJ 663 的规定进行(不得用 AQI 代替达标评价)。
191
+
192
+ ## 附录 A(规范性)空气质量指数类别的表示颜色
193
+
194
+ 空气质量指数类别的表示颜色应符合表 A.1。
195
+
196
+ **表 A.1 RGB 及 CMYK 配色方案**
197
+
198
+ | 颜色 | R | G | B | C | M | Y | K | 对应类别 |
199
+ |------|---|---|---|---|---|---|---|---------|
200
+ | 绿 | 0 | 228 | 0 | 40 | 0 | 100 | 0 | 优 |
201
+ | 黄 | 255 | 255 | 0 | 0 | 0 | 100 | 0 | 良 |
202
+ | 橙 | 255 | 126 | 0 | 0 | 52 | 100 | 0 | 轻度污染 |
203
+ | 红 | 255 | 0 | 0 | 0 | 100 | 100 | 0 | 中度污染 |
204
+ | 紫 | 153 | 0 | 76 | 10 | 100 | 40 | 30 | 重度污染 |
205
+ | 褐红 | 126 | 0 | 35 | 30 | 100 | 100 | 30 | 严重污染 |
206
+
207
+ 注:RGB 为电脑屏幕显示色彩,CMYK 为印刷色彩模式。