zco-claude 0.0.8__py3-none-any.whl

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 (34) hide show
  1. ClaudeSettings/DOT.claudeignore +7 -0
  2. ClaudeSettings/README.md +100 -0
  3. ClaudeSettings/commands/generate_changelog.sh +49 -0
  4. ClaudeSettings/commands/show_env +92 -0
  5. ClaudeSettings/commands/zco-clean +164 -0
  6. ClaudeSettings/commands/zco-git-summary +15 -0
  7. ClaudeSettings/commands/zco-git-tag +42 -0
  8. ClaudeSettings/hooks/CHANGELOG.md +157 -0
  9. ClaudeSettings/hooks/README.md +254 -0
  10. ClaudeSettings/hooks/save_chat_plain.py +148 -0
  11. ClaudeSettings/hooks/save_chat_spec.py +398 -0
  12. ClaudeSettings/rules/README.md +270 -0
  13. ClaudeSettings/rules/go/.golangci.yml.template +170 -0
  14. ClaudeSettings/rules/go/GoBuildAutoVersion.v250425.md +95 -0
  15. ClaudeSettings/rules/go/check-standards.sh +128 -0
  16. ClaudeSettings/rules/go/coding-standards.md +973 -0
  17. ClaudeSettings/rules/go/example.go +207 -0
  18. ClaudeSettings/rules/go/go-testing.md +691 -0
  19. ClaudeSettings/rules/go/list-comments.sh +85 -0
  20. ClaudeSettings/settings.sample.json +71 -0
  21. ClaudeSettings/skills/README.md +225 -0
  22. ClaudeSettings/skills/zco-docs-update/SKILL.md +381 -0
  23. ClaudeSettings/skills/zco-help/SKILL.md +601 -0
  24. ClaudeSettings/skills/zco-plan/SKILL.md +661 -0
  25. ClaudeSettings/skills/zco-plan-new/SKILL.md +585 -0
  26. ClaudeSettings/zco-scripts/co-docs-update.sh +150 -0
  27. ClaudeSettings/zco-scripts/test_update_plan_metadata.py +328 -0
  28. ClaudeSettings/zco-scripts/update-plan-metadata.py +324 -0
  29. zco_claude-0.0.8.dist-info/METADATA +190 -0
  30. zco_claude-0.0.8.dist-info/RECORD +34 -0
  31. zco_claude-0.0.8.dist-info/WHEEL +5 -0
  32. zco_claude-0.0.8.dist-info/entry_points.txt +3 -0
  33. zco_claude-0.0.8.dist-info/top_level.txt +1 -0
  34. zco_claude_init.py +1732 -0
@@ -0,0 +1,324 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Plan Metadata Auto-Update Script
4
+
5
+ Updates YAML front matter in plan documents with:
6
+ - Status transitions (draft:0 → ongoing:2 → completed:3)
7
+ - Timestamp management (created_at, updated_at)
8
+ - Auto-generated tags (from Claude input)
9
+
10
+ Usage:
11
+ echo '{"plan_path": "/path/to/plan.md", "action": "start"}' | python3 update-plan-metadata.py
12
+
13
+ Actions:
14
+ - start: Set status to ongoing:2, initialize timestamps
15
+ - complete: Set status to completed:3, update timestamp
16
+ - fail: Set status to failed:4, update timestamp
17
+ - cancel: Set status to canceled:5, update timestamp
18
+
19
+ Input (stdin JSON):
20
+ {
21
+ "plan_path": "/path/to/plan.md",
22
+ "action": "start|complete|fail|cancel",
23
+ "tags": ["feature", "backend"] # optional
24
+ }
25
+
26
+ Output (stdout JSON):
27
+ Success: {"success": true, "old_status": "draft:0", "new_status": "ongoing:2", "updated_at": "2026-01-09 15:30:45"}
28
+ Error: {"success": false, "error": "error message"}
29
+ """
30
+
31
+ import json
32
+ import sys
33
+ import re
34
+ from datetime import datetime
35
+ from pathlib import Path
36
+ import tempfile
37
+ import shutil
38
+
39
+ try:
40
+ import yaml
41
+ except ImportError:
42
+ print(json.dumps({
43
+ 'success': False,
44
+ 'error': 'PyYAML not installed. Run: pip install PyYAML'
45
+ }), file=sys.stderr)
46
+ sys.exit(1)
47
+
48
+
49
+ class PlanMetadataUpdater:
50
+ """Handles parsing and updating plan document YAML front matter"""
51
+
52
+ STATUS_ENUM = {
53
+ 'draft:0': '起稿中',
54
+ 'ready:1': '准备就绪',
55
+ 'ongoing:2': '进行中',
56
+ 'completed:3': '执行完成',
57
+ 'failed:4': '执行失败',
58
+ 'canceled:5': '已取消',
59
+ 'archived:8': '已归档'
60
+ }
61
+
62
+ PRIORITY_ENUM = {
63
+ 'p0:紧急:重要': '紧急且重要',
64
+ 'p1:高:当前迭代/排期内重点解决': '高优先级',
65
+ 'p2:中:可纳入后续迭代计划': '中等优先级',
66
+ 'p3:低:可记录,待后续评估': '低优先级',
67
+ 'p4:无:不影响当前迭代/排期': '无优先级'
68
+ }
69
+
70
+ def __init__(self, plan_path: str):
71
+ self.plan_path = Path(plan_path)
72
+
73
+ if not self.plan_path.exists():
74
+ raise FileNotFoundError(f"Plan file not found: {plan_path}")
75
+
76
+ self.content = self._read_file()
77
+ self.yaml_data, self.yaml_start, self.yaml_end = self._parse_yaml()
78
+ self.body = self.content[self.yaml_end:]
79
+
80
+ def _read_file(self) -> str:
81
+ """Read plan file content"""
82
+ try:
83
+ return self.plan_path.read_text(encoding='utf-8')
84
+ except Exception as e:
85
+ raise IOError(f"Failed to read file {self.plan_path}: {e}")
86
+
87
+ def _parse_yaml(self) -> tuple:
88
+ """
89
+ Parse YAML front matter
90
+
91
+ Returns:
92
+ tuple: (yaml_data dict, yaml_start pos, yaml_end pos)
93
+ """
94
+ # Extract YAML between --- markers
95
+ match = re.match(r'^(---\n)(.*?)(---\n)', self.content, re.DOTALL)
96
+
97
+ if not match:
98
+ raise ValueError(
99
+ f"No YAML front matter found in {self.plan_path.name}. "
100
+ "File must start with ---\\n and end YAML section with ---\\n"
101
+ )
102
+
103
+ yaml_start = match.start()
104
+ yaml_end = match.end()
105
+ yaml_text = match.group(2)
106
+
107
+ try:
108
+ yaml_data = yaml.safe_load(yaml_text)
109
+ except yaml.YAMLError as e:
110
+ raise ValueError(f"Malformed YAML in {self.plan_path.name}: {e}")
111
+
112
+ if not isinstance(yaml_data, dict):
113
+ raise ValueError(f"YAML front matter must be a dictionary, got: {type(yaml_data)}")
114
+
115
+ return yaml_data, yaml_start, yaml_end
116
+
117
+ def normalize_status(self, status: str) -> str:
118
+ """
119
+ Convert old status format to new enum format
120
+
121
+ Args:
122
+ status: Status string (old or new format)
123
+
124
+ Returns:
125
+ Normalized status in enum format (e.g., "ongoing:2")
126
+ """
127
+ # Map old format to new format
128
+ status_map = {
129
+ 'pending': 'draft:0',
130
+ 'in-progress': 'ongoing:2',
131
+ 'completed': 'completed:3',
132
+ 'cancelled': 'canceled:5'
133
+ }
134
+
135
+ if ':' in status:
136
+ # Already new format - validate it exists
137
+ if status in self.STATUS_ENUM:
138
+ return status
139
+ else:
140
+ # Unknown enum, default to draft
141
+ return 'draft:0'
142
+ else:
143
+ # Old format - convert
144
+ return status_map.get(status.lower(), 'draft:0')
145
+
146
+ def update_status(self, new_status: str, tags: list = None):
147
+ """
148
+ Update plan status and timestamps
149
+
150
+ Args:
151
+ new_status: Target status (ongoing:2, completed:3, etc.)
152
+ tags: Optional tags list from Claude
153
+
154
+ Returns:
155
+ tuple: (old_status, new_status)
156
+ """
157
+ now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
158
+
159
+ # Get and normalize current status
160
+ old_status = self.yaml_data.get('status', 'draft:0')
161
+ old_status = self.normalize_status(old_status)
162
+
163
+ # Validate new status
164
+ if new_status not in self.STATUS_ENUM:
165
+ raise ValueError(f"Invalid status: {new_status}. Must be one of: {list(self.STATUS_ENUM.keys())}")
166
+
167
+ # Update status
168
+ self.yaml_data['status'] = new_status
169
+
170
+ # Update timestamps
171
+ if not self.yaml_data.get('created_at') or self.yaml_data.get('created_at') == '':
172
+ # First execution - set created_at
173
+ self.yaml_data['created_at'] = now
174
+
175
+ self.yaml_data['updated_at'] = now
176
+
177
+ # Update tags if provided
178
+ if tags is not None:
179
+ if isinstance(tags, list):
180
+ self.yaml_data['tags'] = tags
181
+ elif isinstance(tags, str):
182
+ # Parse comma-separated string
183
+ self.yaml_data['tags'] = [t.strip() for t in tags.split(',') if t.strip()]
184
+
185
+ # Ensure other required fields exist
186
+ if 'seq' not in self.yaml_data:
187
+ # Try to extract from filename: plan.{seq}.*.md
188
+ match = re.match(r'plan\.(\d+)\.', self.plan_path.name)
189
+ if match:
190
+ self.yaml_data['seq'] = int(match.group(1))
191
+
192
+ if 'priority' not in self.yaml_data or self.yaml_data.get('priority') == '':
193
+ # Default priority
194
+ self.yaml_data['priority'] = 'p2:中:可纳入后续迭代计划'
195
+
196
+ # Write back to file
197
+ self._write_file()
198
+
199
+ return old_status, new_status
200
+
201
+ def _write_file(self):
202
+ """
203
+ Write updated content back to file using atomic write
204
+
205
+ Uses temp file + rename to prevent corruption
206
+ """
207
+ try:
208
+ # Dump YAML with custom settings
209
+ yaml_str = yaml.dump(
210
+ self.yaml_data,
211
+ allow_unicode=True,
212
+ default_flow_style=False,
213
+ sort_keys=False,
214
+ width=1000 # Prevent line wrapping
215
+ )
216
+
217
+ # Reconstruct file content
218
+ new_content = f"---\n{yaml_str}---\n{self.body}"
219
+
220
+ # Atomic write: write to temp file, then rename
221
+ temp_fd, temp_path = tempfile.mkstemp(
222
+ suffix='.md',
223
+ prefix=f'.{self.plan_path.name}_',
224
+ dir=self.plan_path.parent,
225
+ text=True
226
+ )
227
+
228
+ try:
229
+ with open(temp_fd, 'w', encoding='utf-8') as f:
230
+ f.write(new_content)
231
+
232
+ # Atomic rename
233
+ shutil.move(temp_path, self.plan_path)
234
+
235
+ except Exception as e:
236
+ # Cleanup temp file on error
237
+ try:
238
+ Path(temp_path).unlink()
239
+ except:
240
+ pass
241
+ raise
242
+
243
+ except Exception as e:
244
+ raise IOError(f"Failed to write file {self.plan_path}: {e}")
245
+
246
+
247
+ def main():
248
+ """
249
+ CLI Interface for plan metadata updates
250
+
251
+ Reads JSON from stdin, updates plan metadata, outputs JSON result
252
+ """
253
+ try:
254
+ # Read JSON input from stdin
255
+ input_data = json.load(sys.stdin)
256
+
257
+ # Validate required fields
258
+ if 'plan_path' not in input_data:
259
+ raise ValueError("Missing required field: plan_path")
260
+
261
+ if 'action' not in input_data:
262
+ raise ValueError("Missing required field: action")
263
+
264
+ plan_path = input_data['plan_path']
265
+ action = input_data['action']
266
+ tags = input_data.get('tags', None)
267
+
268
+ # Map action to status
269
+ status_map = {
270
+ 'start': 'ongoing:2',
271
+ 'complete': 'completed:3',
272
+ 'fail': 'failed:4',
273
+ 'cancel': 'canceled:5'
274
+ }
275
+
276
+ new_status = status_map.get(action)
277
+ if not new_status:
278
+ raise ValueError(f"Invalid action: {action}. Must be one of: {list(status_map.keys())}")
279
+
280
+ # Update metadata
281
+ updater = PlanMetadataUpdater(plan_path)
282
+ old_status, new_status = updater.update_status(new_status, tags)
283
+
284
+ # Success response
285
+ result = {
286
+ 'success': True,
287
+ 'plan_path': plan_path,
288
+ 'old_status': old_status,
289
+ 'new_status': new_status,
290
+ 'created_at': updater.yaml_data.get('created_at', ''),
291
+ 'updated_at': updater.yaml_data.get('updated_at', ''),
292
+ 'tags': updater.yaml_data.get('tags', [])
293
+ }
294
+
295
+ print(json.dumps(result, ensure_ascii=False, indent=2))
296
+ sys.exit(0)
297
+
298
+ except json.JSONDecodeError as e:
299
+ error_result = {
300
+ 'success': False,
301
+ 'error': f'Invalid JSON input: {e}'
302
+ }
303
+ print(json.dumps(error_result), file=sys.stderr)
304
+ sys.exit(1)
305
+
306
+ except (ValueError, FileNotFoundError, IOError) as e:
307
+ error_result = {
308
+ 'success': False,
309
+ 'error': str(e)
310
+ }
311
+ print(json.dumps(error_result), file=sys.stderr)
312
+ sys.exit(1)
313
+
314
+ except Exception as e:
315
+ error_result = {
316
+ 'success': False,
317
+ 'error': f'Unexpected error: {type(e).__name__}: {e}'
318
+ }
319
+ print(json.dumps(error_result), file=sys.stderr)
320
+ sys.exit(1)
321
+
322
+
323
+ if __name__ == '__main__':
324
+ main()
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.4
2
+ Name: zco-claude
3
+ Version: 0.0.8
4
+ Summary: Claude Code 配置管理工具 - 快速初始化项目的 .claude 配置目录
5
+ Home-page: https://github.com/zco-team/zco-claude
6
+ Author: ZCO Team
7
+ Author-email: NicoNing <vmico@outlook.com>
8
+ License-Expression: MIT
9
+ Project-URL: Homepage, https://github.com/zco-team/zco-claude
10
+ Project-URL: Repository, https://github.com/zco-team/zco-claude.git
11
+ Project-URL: Issues, https://github.com/zco-team/zco-claude/issues
12
+ Keywords: claude,claude-code,cli,configuration,settings template,claude-skills
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.8
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development
22
+ Classifier: Topic :: Utilities
23
+ Requires-Python: >=3.8
24
+ Description-Content-Type: text/markdown
25
+ Dynamic: author
26
+ Dynamic: home-page
27
+ Dynamic: requires-python
28
+
29
+
30
+ # ClaudeSettings 配置扩展包
31
+
32
+ [![PyPI version](https://badge.fury.io/py/zco-claude.svg)](https://badge.fury.io/py/zco-claude)
33
+ [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
34
+
35
+ Claude Code 配置管理工具 - 快速初始化项目的 `.claude` 配置目录
36
+
37
+ ## 安装
38
+
39
+ ### 方式一:通过 pip 安装(推荐)
40
+
41
+ ```bash
42
+ pip install zco-claude
43
+ ```
44
+
45
+ ### 方式二:本地安装
46
+
47
+ ```bash
48
+ git clone <repository-url>
49
+ cd zco-claude-skills
50
+ pip install -e .
51
+ ```
52
+
53
+ ### 方式三:使用 Makefile
54
+
55
+ ```bash
56
+ make install # 复制安装
57
+ make link # 软链接安装(开发推荐)
58
+ make uninstall # 卸载
59
+ ```
60
+
61
+ ## 使用方法
62
+
63
+ ### 初始化项目
64
+
65
+ ```bash
66
+ # 初始化当前目录
67
+ zco-claude init
68
+
69
+ # 初始化指定目录
70
+ zco-claude init /path/to/project
71
+
72
+ # 使用自定义模板
73
+ zco-claude init /path/to/project --tpl /custom/template
74
+ ```
75
+
76
+ ### 管理已链接项目
77
+
78
+ ```bash
79
+ # 列出所有已链接的项目
80
+ zco-claude list-linked-repos
81
+
82
+ # 修复所有项目的软链接
83
+ zco-claude fix-linked-repos
84
+
85
+ # 删除不存在的项目记录
86
+ zco-claude fix-linked-repos --remove-not-found
87
+
88
+ # 修复指定项目
89
+ zco-claude fix /path/to/project
90
+ ```
91
+
92
+ ### 生成全局配置
93
+
94
+ ```bash
95
+ # 仅生成全局配置
96
+ zco-claude
97
+ ```
98
+
99
+ ## 支持的命令
100
+
101
+ | 命令 | 说明 |
102
+ |------|------|
103
+ | `init [path] [--tpl]` | 初始化项目配置 |
104
+ | `list-linked-repos` | 列出已链接项目 |
105
+ | `fix-linked-repos [--remove-not-found]` | 修复所有项目软链接 |
106
+ | `fix [path] [--tpl]` | 修复指定项目软链接 |
107
+
108
+ ## zco-plan 工作流程
109
+
110
+ ### 1. 安装工具
111
+
112
+ ```bash
113
+ pip install zco-claude
114
+ ```
115
+
116
+ ### 2. 初始化项目
117
+
118
+ ```bash
119
+ cd /path/to/your/project
120
+ zco-claude init
121
+ ```
122
+
123
+ ### 3. 启动 Claude Code
124
+
125
+ ```bash
126
+ claude .
127
+ ```
128
+
129
+ ### 4. 执行计划
130
+
131
+ ```
132
+ /zco-plan 001
133
+ ```
134
+
135
+ ### 5. 创建新计划
136
+
137
+ ```
138
+ /zco-plan-new 实现用户认证功能
139
+ ```
140
+
141
+ ## 项目结构
142
+
143
+ ```
144
+ .
145
+ ├── src/
146
+ │ └── zco_claude/
147
+ │ ├── __init__.py
148
+ │ ├── __main__.py
149
+ │ ├── cli.py # 主命令行工具
150
+ │ └── ClaudeSettings/ # 配置模板
151
+ │ ├── commands/
152
+ │ ├── hooks/
153
+ │ ├── rules/
154
+ │ ├── skills/
155
+ │ └── zco-scripts/
156
+ ├── docs/
157
+ │ └── plans/ # 计划文档
158
+ ├── pyproject.toml # 包配置
159
+ ├── setup.py # 安装脚本
160
+ └── Makefile # 快捷命令
161
+ ```
162
+
163
+ ## 开发
164
+
165
+ ### 构建包
166
+
167
+ ```bash
168
+ python setup.py sdist bdist_wheel
169
+ ```
170
+
171
+ ### 本地测试安装
172
+
173
+ ```bash
174
+ pip install -e .
175
+ ```
176
+
177
+ ### 上传到 PyPI
178
+
179
+ ```bash
180
+ # 安装工具
181
+ pip install twine
182
+
183
+ # 上传
184
+ python -m twine upload dist/*
185
+ ```
186
+
187
+ ## 许可证
188
+
189
+ MIT License
190
+
@@ -0,0 +1,34 @@
1
+ zco_claude_init.py,sha256=dC2gOKAFpzZ3IDjTNl3yuq8ZRH_cAFmssRggNDan_5k,59106
2
+ ClaudeSettings/DOT.claudeignore,sha256=5TunbuRtwH2Sqls0-O-qVsLnGG_OuzXe6pNuTRyI7_Y,74
3
+ ClaudeSettings/README.md,sha256=2pkCTpQJvkGUSgDYN2VT-jzvcUJ1PRHjmXzsddCRRkE,2541
4
+ ClaudeSettings/settings.sample.json,sha256=2dPH5LpQxv0qClREr27uqrlYn3bUdjOOi7Nt6rw4L2E,1701
5
+ ClaudeSettings/commands/generate_changelog.sh,sha256=9U7LdF0wDQpjqSak5ql92IS4V1D3HEnbnSu2wAmwelM,1771
6
+ ClaudeSettings/commands/show_env,sha256=A7K0MG4RfP6XqRiJ3ZYZyapjrCUepPTnk3DCWKefCFg,2816
7
+ ClaudeSettings/commands/zco-clean,sha256=tGCd9TxxIHiuWPnS4Jkp0xqYmJJ53EacvVTfAmcAywg,4839
8
+ ClaudeSettings/commands/zco-git-summary,sha256=hb0Tr1GOUk4wjkEWw8O3aj_hlcw8GFOR-inyK5_3Zbo,375
9
+ ClaudeSettings/commands/zco-git-tag,sha256=VGTr7WoIVRUqTbRaxQ92SkYbl3ZARmhuRTqYlLHSQLc,1394
10
+ ClaudeSettings/hooks/CHANGELOG.md,sha256=pXR_iKRy29Vrg-pLG51c0KIl--0FIA7OheQOxJq8xzU,3343
11
+ ClaudeSettings/hooks/README.md,sha256=-3L2RW7n6ukLYsuFRGE_cJfssRG4PVudYXdAD57miOE,6047
12
+ ClaudeSettings/hooks/save_chat_plain.py,sha256=aeCQUK0DkONBd9ZKbDeihcH-SX1WJ7shBEeqFAlCO3I,4748
13
+ ClaudeSettings/hooks/save_chat_spec.py,sha256=CH78j3TYaqt6aZDYvnQNV22MlyKYKp9aIxMuSJumCac,13811
14
+ ClaudeSettings/rules/README.md,sha256=cGbgv4k-bL9gXTmSNP0XGMgZG2oAciL-V4Zduxa_XO8,5919
15
+ ClaudeSettings/rules/go/.golangci.yml.template,sha256=3REc23nDiqUMJWQRBnnTbjuLLNNUls283M3oVj9Ln64,3505
16
+ ClaudeSettings/rules/go/GoBuildAutoVersion.v250425.md,sha256=CJt8kPPCTtNwlsdou-QzaXVkmwCuLBEfqZX954bVu10,2589
17
+ ClaudeSettings/rules/go/check-standards.sh,sha256=jj9Du95rgJRC0jV_-MeMVWGa9oovRpo4758YEzTXh_Q,3519
18
+ ClaudeSettings/rules/go/coding-standards.md,sha256=B5IW2zkX_UXWdjpqPC5e6EoeUz4brU0ya_ytSYLEZwg,19877
19
+ ClaudeSettings/rules/go/example.go,sha256=dtpIyCBsUwd5udhz_qgPTg5hyj-16FBgKu6dfX6Lh1Y,5129
20
+ ClaudeSettings/rules/go/go-testing.md,sha256=K-LCGQZjRRvKUEmh2jlbTdK9cOlhPX7Yv4dZVWjvXOs,14177
21
+ ClaudeSettings/rules/go/list-comments.sh,sha256=jBhFkbbmQwiYsYwuEtB5gbgw3FnrQYfB4ptk_wRoAdE,2244
22
+ ClaudeSettings/skills/README.md,sha256=GiDBytWucdaKRkFu0fhg7PhFyO-S7S-LjNPl3EP1xEk,4690
23
+ ClaudeSettings/skills/zco-docs-update/SKILL.md,sha256=ttNUH4zEum1X-ycOyeopxV3qOQAu9WNQPtdLtlTdLW4,8826
24
+ ClaudeSettings/skills/zco-help/SKILL.md,sha256=RiPcbekw0MhAT8kJH15McBN3M5UuAfONAB8-vpYBUCA,16858
25
+ ClaudeSettings/skills/zco-plan/SKILL.md,sha256=PqFkbKCH49SnzjiqBrU_5ToD-gHaBrES-DEC9GDhV1M,15348
26
+ ClaudeSettings/skills/zco-plan-new/SKILL.md,sha256=fw50MM6ES74X_V1agmYNOoNGXJ5JluEd1NjfYPavyy0,13866
27
+ ClaudeSettings/zco-scripts/co-docs-update.sh,sha256=4Pq8ZzHSlmdorbTaCgKsGLl8Xdrx2JMZ_hQAA0m95cc,4217
28
+ ClaudeSettings/zco-scripts/test_update_plan_metadata.py,sha256=Vuvci7--b6-jEvThnmdpukw-yq21Q9BNCpCLCT1A8Hc,8875
29
+ ClaudeSettings/zco-scripts/update-plan-metadata.py,sha256=xHmARVV-gth6zY6TwfJPMJzn9WeZNbPlrwdrYkGUg5E,10169
30
+ zco_claude-0.0.8.dist-info/METADATA,sha256=C5eMTJL8pSjMGVNDinj3s8J-xT15X2MIHXrNPsG34JU,3921
31
+ zco_claude-0.0.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
32
+ zco_claude-0.0.8.dist-info/entry_points.txt,sha256=7scvouCbVq1bajSMnTlB0p08sz_HVPSYgtVMMkdOAJk,79
33
+ zco_claude-0.0.8.dist-info/top_level.txt,sha256=z90aX525nPqTigU74uWrpww-_dFTPMPQm9CQkg2NvSc,16
34
+ zco_claude-0.0.8.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.10.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ zco = zco_claude_init:main
3
+ zco-claude = zco_claude_init:main
@@ -0,0 +1 @@
1
+ zco_claude_init