@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,366 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ HelloAGENTS-RLM Context Manager
5
+ 三层上下文架构实现
6
+
7
+ 基于Google ADK设计:
8
+ - Layer 1: Working Context (工作上下文) - 当前活跃
9
+ - Layer 2: Session Events (会话事件) - 可压缩
10
+ - Layer 3: Memory & Artifacts (长期记忆) - 知识库
11
+ """
12
+
13
+ from dataclasses import dataclass, field
14
+ from datetime import datetime
15
+ from enum import Enum
16
+ from pathlib import Path
17
+ from typing import Any, Dict, List, Optional
18
+ import json
19
+
20
+
21
+ class ContextLayer(Enum):
22
+ """上下文层级"""
23
+ WORKING = 1 # 工作上下文 (活跃,在LLM context window中)
24
+ SESSION = 2 # 会话事件 (可压缩,内存中)
25
+ MEMORY = 3 # 长期记忆 (持久化,知识库)
26
+
27
+
28
+ @dataclass
29
+ class ContextEvent:
30
+ """上下文事件"""
31
+ event_type: str
32
+ content: Any
33
+ timestamp: str = ""
34
+ layer: ContextLayer = ContextLayer.SESSION
35
+ metadata: Dict[str, Any] = field(default_factory=dict)
36
+
37
+ def __post_init__(self):
38
+ if not self.timestamp:
39
+ self.timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")
40
+
41
+ def to_dict(self) -> Dict[str, Any]:
42
+ return {
43
+ "event_type": self.event_type,
44
+ "content": self.content,
45
+ "timestamp": self.timestamp,
46
+ "layer": self.layer.name,
47
+ "metadata": self.metadata,
48
+ }
49
+
50
+
51
+ @dataclass
52
+ class CompactionConfig:
53
+ """压缩配置 (类似Google ADK EventsCompactionConfig)"""
54
+ compaction_interval: int = 10 # 每N个事件触发压缩
55
+ overlap_size: int = 2 # 压缩时保留的重叠事件数
56
+ max_working_tokens: int = 8000 # 工作上下文最大token数
57
+ summarizer_model: str = "gpt-5.2-codex"
58
+
59
+
60
+ class ContextManager:
61
+ """
62
+ 三层上下文管理器
63
+
64
+ Layer 1 - Working Context:
65
+ - 当前活跃的工作上下文
66
+ - 包含: 系统指令、当前任务、最近对话、活跃子任务摘要
67
+ - 大小限制: < max_working_tokens
68
+
69
+ Layer 2 - Session Events:
70
+ - 可压缩的事件日志
71
+ - 包含: 工具调用、文件操作、子agent交互
72
+ - 压缩策略: 滑动窗口 + LLM摘要
73
+
74
+ Layer 3 - Memory & Artifacts:
75
+ - 长期记忆 (helloagents知识库)
76
+ - 包含: context.md, modules/*.md, archive/
77
+ - 访问方式: 按需读取
78
+ """
79
+
80
+ def __init__(
81
+ self,
82
+ config: Optional[CompactionConfig] = None,
83
+ knowledge_base_path: Optional[Path] = None,
84
+ ):
85
+ self.config = config or CompactionConfig()
86
+ self.kb_path = knowledge_base_path or Path.cwd() / "helloagents"
87
+
88
+ # Layer 1: Working Context
89
+ self.working_context: List[ContextEvent] = []
90
+ self.working_tokens: int = 0
91
+
92
+ # Layer 2: Session Events
93
+ self.session_events: List[ContextEvent] = []
94
+ self.compacted_summaries: List[str] = []
95
+ self.events_since_compaction: int = 0
96
+
97
+ # Layer 3: Memory refs (按需加载)
98
+ self.memory_cache: Dict[str, str] = {}
99
+
100
+ # ==================== Layer 1: Working Context ====================
101
+
102
+ def add_to_working(self, event: ContextEvent) -> bool:
103
+ """
104
+ 添加事件到工作上下文
105
+
106
+ Returns:
107
+ 是否成功 (可能因超限而失败,触发压缩)
108
+ """
109
+ estimated_tokens = self._estimate_tokens(event.content)
110
+
111
+ # 检查是否超限
112
+ if self.working_tokens + estimated_tokens > self.config.max_working_tokens:
113
+ # 需要压缩
114
+ self._compact_working_context()
115
+
116
+ self.working_context.append(event)
117
+ self.working_tokens += estimated_tokens
118
+ return True
119
+
120
+ def get_working_context(self) -> List[Dict[str, Any]]:
121
+ """获取当前工作上下文"""
122
+ return [e.to_dict() for e in self.working_context]
123
+
124
+ def clear_working_context(self):
125
+ """清空工作上下文 (保留到Session)"""
126
+ for event in self.working_context:
127
+ event.layer = ContextLayer.SESSION
128
+ self.session_events.append(event)
129
+
130
+ self.working_context.clear()
131
+ self.working_tokens = 0
132
+
133
+ def _compact_working_context(self):
134
+ """压缩工作上下文"""
135
+ if not self.working_context:
136
+ return
137
+
138
+ # 生成摘要
139
+ contents = [str(e.content) for e in self.working_context]
140
+ summary = self._generate_summary("\n".join(contents))
141
+
142
+ # 移动到Session
143
+ for event in self.working_context:
144
+ event.layer = ContextLayer.SESSION
145
+ self.session_events.append(event)
146
+
147
+ # 创建摘要事件
148
+ summary_event = ContextEvent(
149
+ event_type="working_context_summary",
150
+ content=summary,
151
+ layer=ContextLayer.WORKING,
152
+ metadata={"original_count": len(self.working_context)},
153
+ )
154
+
155
+ self.working_context.clear()
156
+ self.working_context.append(summary_event)
157
+ self.working_tokens = self._estimate_tokens(summary)
158
+
159
+ # ==================== Layer 2: Session Events ====================
160
+
161
+ def add_session_event(self, event: ContextEvent):
162
+ """添加会话事件"""
163
+ event.layer = ContextLayer.SESSION
164
+ self.session_events.append(event)
165
+ self.events_since_compaction += 1
166
+
167
+ # 检查是否需要压缩
168
+ if self.events_since_compaction >= self.config.compaction_interval:
169
+ self._compact_session_events()
170
+
171
+ def get_session_events(
172
+ self,
173
+ limit: Optional[int] = None,
174
+ event_type: Optional[str] = None,
175
+ ) -> List[Dict[str, Any]]:
176
+ """获取会话事件"""
177
+ events = self.session_events
178
+
179
+ if event_type:
180
+ events = [e for e in events if e.event_type == event_type]
181
+
182
+ if limit:
183
+ events = events[-limit:]
184
+
185
+ return [e.to_dict() for e in events]
186
+
187
+ def _compact_session_events(self):
188
+ """压缩会话事件 (滑动窗口)"""
189
+ if len(self.session_events) < self.config.compaction_interval:
190
+ return
191
+
192
+ # 确定压缩范围
193
+ compact_end = len(self.session_events) - self.config.overlap_size
194
+ to_compact = self.session_events[:compact_end]
195
+
196
+ if not to_compact:
197
+ return
198
+
199
+ # 生成摘要
200
+ contents = [str(e.content) for e in to_compact]
201
+ summary = self._generate_summary("\n".join(contents))
202
+ self.compacted_summaries.append(summary)
203
+
204
+ # 保留overlap部分
205
+ self.session_events = self.session_events[compact_end:]
206
+ self.events_since_compaction = 0
207
+
208
+ # ==================== Layer 3: Memory & Artifacts ====================
209
+
210
+ def load_memory(self, key: str) -> Optional[str]:
211
+ """
212
+ 按需加载长期记忆
213
+
214
+ Args:
215
+ key: 记忆键名 (如 "context", "modules/auth", "changelog")
216
+ """
217
+ # 检查缓存
218
+ if key in self.memory_cache:
219
+ return self.memory_cache[key]
220
+
221
+ # 构建文件路径
222
+ file_path = self._resolve_memory_path(key)
223
+ if not file_path or not file_path.exists():
224
+ return None
225
+
226
+ try:
227
+ content = file_path.read_text(encoding='utf-8')
228
+ self.memory_cache[key] = content
229
+ return content
230
+ except Exception:
231
+ return None
232
+
233
+ def save_memory(self, key: str, content: str) -> bool:
234
+ """
235
+ 保存到长期记忆
236
+
237
+ Args:
238
+ key: 记忆键名
239
+ content: 内容
240
+ """
241
+ file_path = self._resolve_memory_path(key)
242
+ if not file_path:
243
+ return False
244
+
245
+ try:
246
+ file_path.parent.mkdir(parents=True, exist_ok=True)
247
+ file_path.write_text(content, encoding='utf-8')
248
+ self.memory_cache[key] = content
249
+ return True
250
+ except Exception:
251
+ return False
252
+
253
+ def _resolve_memory_path(self, key: str) -> Optional[Path]:
254
+ """解析记忆键到文件路径"""
255
+ key_mapping = {
256
+ "context": self.kb_path / "context.md",
257
+ "index": self.kb_path / "INDEX.md",
258
+ "changelog": self.kb_path / "CHANGELOG.md",
259
+ }
260
+
261
+ if key in key_mapping:
262
+ return key_mapping[key]
263
+
264
+ # modules/xxx -> modules/xxx.md
265
+ if key.startswith("modules/"):
266
+ module_name = key.replace("modules/", "")
267
+ return self.kb_path / "modules" / f"{module_name}.md"
268
+
269
+ # 默认作为相对路径
270
+ return self.kb_path / f"{key}.md"
271
+
272
+ def invalidate_memory_cache(self, key: Optional[str] = None):
273
+ """使记忆缓存失效"""
274
+ if key:
275
+ self.memory_cache.pop(key, None)
276
+ else:
277
+ self.memory_cache.clear()
278
+
279
+ # ==================== 辅助方法 ====================
280
+
281
+ def _estimate_tokens(self, content: Any) -> int:
282
+ """估算token数 (简化: 4字符约1token)"""
283
+ if content is None:
284
+ return 0
285
+ return len(str(content)) // 4
286
+
287
+ def _generate_summary(self, content: str) -> str:
288
+ """
289
+ 生成摘要
290
+
291
+ 注意: 简化实现,实际应调用LLM
292
+ """
293
+ lines = content.split('\n')
294
+ key_lines = []
295
+
296
+ for line in lines:
297
+ line = line.strip()
298
+ if not line:
299
+ continue
300
+ # 保留关键行
301
+ if any(marker in line.lower() for marker in
302
+ ['#', 'error', 'success', 'failed', 'completed', 'created', 'modified']):
303
+ key_lines.append(line)
304
+
305
+ if key_lines:
306
+ return '\n'.join(key_lines[:15])
307
+
308
+ # 截断
309
+ return content[:300] + "..." if len(content) > 300 else content
310
+
311
+ # ==================== 状态管理 ====================
312
+
313
+ def get_status(self) -> Dict[str, Any]:
314
+ """获取上下文状态"""
315
+ return {
316
+ "working_context": {
317
+ "events": len(self.working_context),
318
+ "tokens": self.working_tokens,
319
+ "limit": self.config.max_working_tokens,
320
+ },
321
+ "session_events": {
322
+ "events": len(self.session_events),
323
+ "compacted_summaries": len(self.compacted_summaries),
324
+ "since_compaction": self.events_since_compaction,
325
+ },
326
+ "memory": {
327
+ "cached_keys": list(self.memory_cache.keys()),
328
+ "kb_path": str(self.kb_path),
329
+ },
330
+ }
331
+
332
+ def export_session(self) -> Dict[str, Any]:
333
+ """导出会话数据"""
334
+ return {
335
+ "working_context": self.get_working_context(),
336
+ "session_events": self.get_session_events(),
337
+ "compacted_summaries": self.compacted_summaries,
338
+ "memory_cache_keys": list(self.memory_cache.keys()),
339
+ }
340
+
341
+ def reset(self):
342
+ """重置上下文"""
343
+ self.working_context.clear()
344
+ self.working_tokens = 0
345
+ self.session_events.clear()
346
+ self.compacted_summaries.clear()
347
+ self.events_since_compaction = 0
348
+ self.memory_cache.clear()
349
+
350
+
351
+ # ==================== 便捷函数 ====================
352
+
353
+ def create_context_manager(
354
+ compaction_interval: int = 10,
355
+ max_working_tokens: int = 8000,
356
+ kb_path: Optional[str] = None,
357
+ ) -> ContextManager:
358
+ """创建上下文管理器"""
359
+ config = CompactionConfig(
360
+ compaction_interval=compaction_interval,
361
+ max_working_tokens=max_working_tokens,
362
+ )
363
+ return ContextManager(
364
+ config=config,
365
+ knowledge_base_path=Path(kb_path) if kb_path else None,
366
+ )