@huajiwuyan/hello 3.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.
Files changed (117) hide show
  1. package/README.md +68 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +448 -0
  4. package/package.json +38 -0
  5. package/templates/claude/commands/hello.md +760 -0
  6. package/templates/claude/skills/SKILL.md +90 -0
  7. package/templates/claude/skills/SKILL.toml +7 -0
  8. package/templates/claude/skills/assets/icon-large.svg +12 -0
  9. package/templates/claude/skills/assets/icon-small-400px.svg +12 -0
  10. package/templates/claude/skills/assets/templates/CHANGELOG.md +24 -0
  11. package/templates/claude/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
  12. package/templates/claude/skills/assets/templates/INDEX.md +36 -0
  13. package/templates/claude/skills/assets/templates/archive/_index.md +22 -0
  14. package/templates/claude/skills/assets/templates/context.md +82 -0
  15. package/templates/claude/skills/assets/templates/modules/_index.md +22 -0
  16. package/templates/claude/skills/assets/templates/modules/module.md +35 -0
  17. package/templates/claude/skills/assets/templates/plan/proposal.md +104 -0
  18. package/templates/claude/skills/assets/templates/plan/tasks.md +49 -0
  19. package/templates/claude/skills/references/functions/auto.md +217 -0
  20. package/templates/claude/skills/references/functions/clean.md +167 -0
  21. package/templates/claude/skills/references/functions/commit.md +374 -0
  22. package/templates/claude/skills/references/functions/exec.md +178 -0
  23. package/templates/claude/skills/references/functions/help.md +105 -0
  24. package/templates/claude/skills/references/functions/init.md +228 -0
  25. package/templates/claude/skills/references/functions/plan.md +219 -0
  26. package/templates/claude/skills/references/functions/review.md +146 -0
  27. package/templates/claude/skills/references/functions/rollback.md +208 -0
  28. package/templates/claude/skills/references/functions/test.md +153 -0
  29. package/templates/claude/skills/references/functions/upgrade.md +371 -0
  30. package/templates/claude/skills/references/functions/validate.md +147 -0
  31. package/templates/claude/skills/references/rules/package.md +212 -0
  32. package/templates/claude/skills/references/rules/scaling.md +150 -0
  33. package/templates/claude/skills/references/rules/state.md +318 -0
  34. package/templates/claude/skills/references/rules/tools.md +371 -0
  35. package/templates/claude/skills/references/services/knowledge.md +408 -0
  36. package/templates/claude/skills/references/services/templates.md +344 -0
  37. package/templates/claude/skills/references/stages/analyze.md +201 -0
  38. package/templates/claude/skills/references/stages/design.md +379 -0
  39. package/templates/claude/skills/references/stages/develop.md +497 -0
  40. package/templates/claude/skills/references/stages/evaluate.md +286 -0
  41. package/templates/claude/skills/references/stages/tweak.md +244 -0
  42. package/templates/claude/skills/scripts/create_package.py +260 -0
  43. package/templates/claude/skills/scripts/list_packages.py +145 -0
  44. package/templates/claude/skills/scripts/migrate_package.py +399 -0
  45. package/templates/claude/skills/scripts/project_stats.py +438 -0
  46. package/templates/claude/skills/scripts/upgradewiki.py +321 -0
  47. package/templates/claude/skills/scripts/utils.py +596 -0
  48. package/templates/claude/skills/scripts/validate_package.py +309 -0
  49. package/templates/codex/prompts/hello.md +757 -0
  50. package/templates/codex/skills/SKILL.md +74 -0
  51. package/templates/codex/skills/SKILL.toml +7 -0
  52. package/templates/codex/skills/assets/icon-large.svg +12 -0
  53. package/templates/codex/skills/assets/icon-small-400px.svg +12 -0
  54. package/templates/codex/skills/assets/templates/CHANGELOG.md +24 -0
  55. package/templates/codex/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
  56. package/templates/codex/skills/assets/templates/INDEX.md +36 -0
  57. package/templates/codex/skills/assets/templates/archive/_index.md +22 -0
  58. package/templates/codex/skills/assets/templates/context.md +82 -0
  59. package/templates/codex/skills/assets/templates/modules/_index.md +22 -0
  60. package/templates/codex/skills/assets/templates/modules/module.md +35 -0
  61. package/templates/codex/skills/assets/templates/plan/proposal.md +104 -0
  62. package/templates/codex/skills/assets/templates/plan/tasks.md +29 -0
  63. package/templates/codex/skills/references/functions/auto.md +181 -0
  64. package/templates/codex/skills/references/functions/brain.md +275 -0
  65. package/templates/codex/skills/references/functions/clean.md +154 -0
  66. package/templates/codex/skills/references/functions/commit.md +265 -0
  67. package/templates/codex/skills/references/functions/debug/condition-based-waiting.md +151 -0
  68. package/templates/codex/skills/references/functions/debug/defense-in-depth.md +147 -0
  69. package/templates/codex/skills/references/functions/debug/root-cause-tracing.md +168 -0
  70. package/templates/codex/skills/references/functions/debug.md +389 -0
  71. package/templates/codex/skills/references/functions/exec.md +153 -0
  72. package/templates/codex/skills/references/functions/help.md +101 -0
  73. package/templates/codex/skills/references/functions/init.md +221 -0
  74. package/templates/codex/skills/references/functions/plan.md +178 -0
  75. package/templates/codex/skills/references/functions/review.md +135 -0
  76. package/templates/codex/skills/references/functions/rlm.md +864 -0
  77. package/templates/codex/skills/references/functions/rollback.md +190 -0
  78. package/templates/codex/skills/references/functions/test.md +140 -0
  79. package/templates/codex/skills/references/functions/upgrade.md +363 -0
  80. package/templates/codex/skills/references/functions/validate.md +135 -0
  81. package/templates/codex/skills/references/rules/cache.md +136 -0
  82. package/templates/codex/skills/references/rules/scaling.md +124 -0
  83. package/templates/codex/skills/references/rules/state.md +201 -0
  84. package/templates/codex/skills/references/rules/tools.md +301 -0
  85. package/templates/codex/skills/references/services/attention.md +53 -0
  86. package/templates/codex/skills/references/services/knowledge.md +559 -0
  87. package/templates/codex/skills/references/services/package.md +383 -0
  88. package/templates/codex/skills/references/services/templates.md +390 -0
  89. package/templates/codex/skills/references/stages/analyze.md +191 -0
  90. package/templates/codex/skills/references/stages/design.md +355 -0
  91. package/templates/codex/skills/references/stages/develop.md +520 -0
  92. package/templates/codex/skills/references/stages/tweak.md +239 -0
  93. package/templates/codex/skills/rlm/__init__.py +39 -0
  94. package/templates/codex/skills/rlm/agent_orchestrator.py +422 -0
  95. package/templates/codex/skills/rlm/context_manager.py +366 -0
  96. package/templates/codex/skills/rlm/engine.py +915 -0
  97. package/templates/codex/skills/rlm/folding.py +391 -0
  98. package/templates/codex/skills/rlm/repl.py +452 -0
  99. package/templates/codex/skills/rlm/roles/analyzer.md +66 -0
  100. package/templates/codex/skills/rlm/roles/designer.md +94 -0
  101. package/templates/codex/skills/rlm/roles/explorer.md +43 -0
  102. package/templates/codex/skills/rlm/roles/implementer.md +62 -0
  103. package/templates/codex/skills/rlm/roles/kb_keeper.md +138 -0
  104. package/templates/codex/skills/rlm/roles/pkg_keeper.md +163 -0
  105. package/templates/codex/skills/rlm/roles/reviewer.md +74 -0
  106. package/templates/codex/skills/rlm/roles/synthesizer.md +90 -0
  107. package/templates/codex/skills/rlm/roles/tester.md +83 -0
  108. package/templates/codex/skills/rlm/schemas/agent_result.json +174 -0
  109. package/templates/codex/skills/rlm/session.py +376 -0
  110. package/templates/codex/skills/rlm/shared_tasks.py +370 -0
  111. package/templates/codex/skills/scripts/create_package.py +260 -0
  112. package/templates/codex/skills/scripts/list_packages.py +145 -0
  113. package/templates/codex/skills/scripts/migrate_package.py +399 -0
  114. package/templates/codex/skills/scripts/project_stats.py +438 -0
  115. package/templates/codex/skills/scripts/upgradewiki.py +321 -0
  116. package/templates/codex/skills/scripts/utils.py +596 -0
  117. package/templates/codex/skills/scripts/validate_package.py +309 -0
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ 方案包验证脚本
5
+ 验证方案包完整性、任务状态、可执行性
6
+
7
+ Usage:
8
+ python validate_package.py [--path <base-path>] [package-name]
9
+
10
+ Examples:
11
+ python validate_package.py # 验证当前目录下所有方案包
12
+ python validate_package.py --path /project # 验证指定目录下所有方案包
13
+ python validate_package.py 202501_feat # 验证指定方案包
14
+ python validate_package.py --path /project pkg # 指定目录和方案包
15
+ """
16
+
17
+ import argparse
18
+ import json
19
+ import re
20
+ import sys
21
+ from pathlib import Path
22
+ from datetime import datetime
23
+
24
+ # 确保能找到同目录下的 utils 模块
25
+ sys.path.insert(0, str(Path(__file__).parent))
26
+ from utils import setup_encoding, get_plan_path, script_error_handler, validate_base_path, get_template_loader
27
+
28
+ # 任务状态符号
29
+ TASK_STATUS = {
30
+ "[ ]": "pending",
31
+ "[√]": "completed",
32
+ "[X]": "failed",
33
+ "[-]": "skipped",
34
+ "[?]": "uncertain"
35
+ }
36
+
37
+ # 方案包必需文件
38
+ REQUIRED_FILES = ["proposal.md", "tasks.md"]
39
+ OPTIONAL_FILES = []
40
+
41
+
42
+ def parse_tasks(tasks_content: str) -> dict:
43
+ """解析tasks.md中的任务"""
44
+ tasks = {
45
+ "total": 0,
46
+ "by_status": {
47
+ "pending": 0,
48
+ "completed": 0,
49
+ "failed": 0,
50
+ "skipped": 0,
51
+ "uncertain": 0
52
+ },
53
+ "items": []
54
+ }
55
+
56
+ # 匹配任务行: - [ ] 任务描述 或 - [√] 任务描述
57
+ task_pattern = re.compile(r'^[-*]\s*\[([ √X\-?])\]\s*(.+)$', re.MULTILINE)
58
+
59
+ for match in task_pattern.finditer(tasks_content):
60
+ status_char = match.group(1)
61
+ description = match.group(2).strip()
62
+
63
+ # 映射状态
64
+ status_key = f"[{status_char}]"
65
+ status = TASK_STATUS.get(status_key, "pending")
66
+
67
+ tasks["items"].append({
68
+ "status": status,
69
+ "description": description[:100] # 截断过长描述
70
+ })
71
+ tasks["total"] += 1
72
+ tasks["by_status"][status] += 1
73
+
74
+ return tasks
75
+
76
+
77
+ def get_template_sections() -> tuple:
78
+ """
79
+ 从模板文件动态提取章节标题(语言无关)
80
+
81
+ Returns:
82
+ (sections, template_missing): 章节列表和模板是否缺失的标志
83
+ """
84
+ loader = get_template_loader()
85
+
86
+ # 检查模板是否存在
87
+ if not loader.exists("plan/proposal.md"):
88
+ return [], True # 返回空列表和模板缺失标志
89
+
90
+ return loader.get_sections("plan/proposal.md", level=2), False
91
+
92
+
93
+ def parse_proposal(proposal_content: str) -> dict:
94
+ """解析proposal.md中的关键信息"""
95
+ proposal = {
96
+ "sections_found": 0,
97
+ "sections_expected": 0,
98
+ "decisions": [],
99
+ "pkg_type": "implementation",
100
+ "template_missing": False
101
+ }
102
+
103
+ # 从模板动态获取期望的章节(语言无关)
104
+ expected_sections, template_missing = get_template_sections()
105
+ proposal["sections_expected"] = len(expected_sections)
106
+ proposal["template_missing"] = template_missing
107
+
108
+ # 检测实际存在的章节
109
+ for section in expected_sections:
110
+ # 移除编号前缀(如 "1. ")和可选标记(如 "(可选)")
111
+ core = re.sub(r'^\d+\.\s*', '', section)
112
+ core = re.sub(r'[((].*?[))]', '', core).strip()
113
+ if core and core in proposal_content:
114
+ proposal["sections_found"] += 1
115
+
116
+ # 提取决策ID(语言无关:#D001格式)
117
+ proposal["decisions"] = re.findall(r'#D\d{3}', proposal_content)
118
+
119
+ # 提取方案类型(语言无关:implementation/overview)
120
+ if re.search(r':\s*overview\b', proposal_content, re.IGNORECASE):
121
+ proposal["pkg_type"] = "overview"
122
+
123
+ return proposal
124
+
125
+
126
+ def validate_package(package_path: Path) -> dict:
127
+ """验证单个方案包"""
128
+ result = {
129
+ "name": package_path.name,
130
+ "path": str(package_path),
131
+ "valid": True,
132
+ "executable": True,
133
+ "issues": [],
134
+ "warnings": [],
135
+ "files": {
136
+ "present": [],
137
+ "missing": []
138
+ },
139
+ "tasks": None,
140
+ "proposal": None
141
+ }
142
+
143
+ # 检查必需文件
144
+ for file in REQUIRED_FILES:
145
+ file_path = package_path / file
146
+ if file_path.exists():
147
+ result["files"]["present"].append(file)
148
+ else:
149
+ result["files"]["missing"].append(file)
150
+ result["valid"] = False
151
+ result["executable"] = False
152
+ result["issues"].append(f"缺少必需文件: {file}")
153
+
154
+ # 检查可选文件
155
+ for file in OPTIONAL_FILES:
156
+ file_path = package_path / file
157
+ if file_path.exists():
158
+ result["files"]["present"].append(file)
159
+ else:
160
+ result["warnings"].append(f"缺少可选文件: {file}")
161
+
162
+ # 先解析proposal.md获取方案类型
163
+ proposal_path = package_path / "proposal.md"
164
+ pkg_type = "implementation" # 默认类型
165
+ if proposal_path.exists():
166
+ try:
167
+ content = proposal_path.read_text(encoding="utf-8")
168
+ result["proposal"] = parse_proposal(content)
169
+ pkg_type = result["proposal"].get("pkg_type", "implementation")
170
+
171
+ # 检查模板是否缺失
172
+ if result["proposal"].get("template_missing", False):
173
+ result["warnings"].append("模板文件缺失 (plan/proposal.md),章节验证已跳过")
174
+ except Exception as e:
175
+ result["warnings"].append(f"解析proposal.md失败: {str(e)}")
176
+
177
+ is_overview = (pkg_type == "overview")
178
+
179
+ # 解析tasks.md
180
+ tasks_path = package_path / "tasks.md"
181
+ if tasks_path.exists():
182
+ try:
183
+ content = tasks_path.read_text(encoding="utf-8")
184
+ result["tasks"] = parse_tasks(content)
185
+
186
+ # 检查任务数量(overview 类型除外)
187
+ if result["tasks"]["total"] == 0 and not is_overview:
188
+ result["issues"].append("tasks.md中没有任务项")
189
+ result["executable"] = False
190
+
191
+ # overview 类型标记为不可执行但不报告问题
192
+ if is_overview:
193
+ result["executable"] = False
194
+
195
+ # 检查是否有待执行任务
196
+ if result["tasks"]["by_status"]["pending"] == 0 and not is_overview:
197
+ if result["tasks"]["by_status"]["completed"] == result["tasks"]["total"]:
198
+ result["warnings"].append("所有任务已完成,建议迁移至archive/")
199
+ result["executable"] = False
200
+ elif result["tasks"]["by_status"]["failed"] > 0:
201
+ result["warnings"].append(f"存在{result['tasks']['by_status']['failed']}个失败任务")
202
+
203
+ except Exception as e:
204
+ result["issues"].append(f"解析tasks.md失败: {str(e)}")
205
+ result["valid"] = False
206
+
207
+ return result
208
+
209
+
210
+ def validate_all_packages(plan_path: Path) -> dict:
211
+ """验证所有方案包"""
212
+ results = {
213
+ "timestamp": datetime.now().isoformat(),
214
+ "plan_path": str(plan_path),
215
+ "total": 0,
216
+ "valid": 0,
217
+ "invalid": 0,
218
+ "executable": 0,
219
+ "packages": []
220
+ }
221
+
222
+ # plan/ 目录不存在是正常情况(新项目),返回空结果即可
223
+ if not plan_path.is_dir():
224
+ return results
225
+
226
+ for item in sorted(plan_path.iterdir()):
227
+ if item.is_dir() and not item.name.startswith("."):
228
+ pkg_result = validate_package(item)
229
+ results["packages"].append(pkg_result)
230
+ results["total"] += 1
231
+
232
+ if pkg_result["valid"]:
233
+ results["valid"] += 1
234
+ else:
235
+ results["invalid"] += 1
236
+
237
+ if pkg_result["executable"]:
238
+ results["executable"] += 1
239
+
240
+ return results
241
+
242
+
243
+ @script_error_handler
244
+ def main():
245
+ """主函数"""
246
+ setup_encoding()
247
+
248
+ parser = argparse.ArgumentParser(
249
+ description="验证 HelloAGENTS 方案包完整性"
250
+ )
251
+ parser.add_argument(
252
+ "package",
253
+ nargs="?",
254
+ help="方案包名称(不指定则验证所有)"
255
+ )
256
+ parser.add_argument(
257
+ "--path",
258
+ default=None,
259
+ help="项目根目录(默认: 当前目录)"
260
+ )
261
+
262
+ args = parser.parse_args()
263
+
264
+ # 验证基础路径
265
+ try:
266
+ validate_base_path(args.path)
267
+ except ValueError as e:
268
+ print(json.dumps({
269
+ "error": str(e),
270
+ "valid": False
271
+ }, ensure_ascii=False, indent=2))
272
+ sys.exit(1)
273
+
274
+ # 获取 plan/ 目录
275
+ plan_path = get_plan_path(args.path)
276
+
277
+ # 判断是验证单个包还是所有包
278
+ if args.package:
279
+ # 验证指定的方案包
280
+ package_path = plan_path / args.package
281
+
282
+ if not package_path.is_dir():
283
+ # 尝试作为完整路径
284
+ package_path = Path(args.package)
285
+
286
+ if package_path.is_dir():
287
+ result = validate_package(package_path)
288
+ print(json.dumps(result, ensure_ascii=False, indent=2))
289
+ sys.exit(0 if result["valid"] else 1)
290
+ else:
291
+ print(json.dumps({
292
+ "error": f"方案包不存在: {args.package}",
293
+ "valid": False
294
+ }, ensure_ascii=False, indent=2))
295
+ sys.exit(1)
296
+ else:
297
+ # 验证所有方案包
298
+ results = validate_all_packages(plan_path)
299
+ print(json.dumps(results, ensure_ascii=False, indent=2))
300
+
301
+ # 返回状态码: 0=全部有效, 1=存在无效方案包
302
+ if results["invalid"] > 0:
303
+ sys.exit(1)
304
+ else:
305
+ sys.exit(0)
306
+
307
+
308
+ if __name__ == "__main__":
309
+ main()