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.
- ClaudeSettings/DOT.claudeignore +7 -0
- ClaudeSettings/README.md +100 -0
- ClaudeSettings/commands/generate_changelog.sh +49 -0
- ClaudeSettings/commands/show_env +92 -0
- ClaudeSettings/commands/zco-clean +164 -0
- ClaudeSettings/commands/zco-git-summary +15 -0
- ClaudeSettings/commands/zco-git-tag +42 -0
- ClaudeSettings/hooks/CHANGELOG.md +157 -0
- ClaudeSettings/hooks/README.md +254 -0
- ClaudeSettings/hooks/save_chat_plain.py +148 -0
- ClaudeSettings/hooks/save_chat_spec.py +398 -0
- ClaudeSettings/rules/README.md +270 -0
- ClaudeSettings/rules/go/.golangci.yml.template +170 -0
- ClaudeSettings/rules/go/GoBuildAutoVersion.v250425.md +95 -0
- ClaudeSettings/rules/go/check-standards.sh +128 -0
- ClaudeSettings/rules/go/coding-standards.md +973 -0
- ClaudeSettings/rules/go/example.go +207 -0
- ClaudeSettings/rules/go/go-testing.md +691 -0
- ClaudeSettings/rules/go/list-comments.sh +85 -0
- ClaudeSettings/settings.sample.json +71 -0
- ClaudeSettings/skills/README.md +225 -0
- ClaudeSettings/skills/zco-docs-update/SKILL.md +381 -0
- ClaudeSettings/skills/zco-help/SKILL.md +601 -0
- ClaudeSettings/skills/zco-plan/SKILL.md +661 -0
- ClaudeSettings/skills/zco-plan-new/SKILL.md +585 -0
- ClaudeSettings/zco-scripts/co-docs-update.sh +150 -0
- ClaudeSettings/zco-scripts/test_update_plan_metadata.py +328 -0
- ClaudeSettings/zco-scripts/update-plan-metadata.py +324 -0
- zco_claude-0.0.8.dist-info/METADATA +190 -0
- zco_claude-0.0.8.dist-info/RECORD +34 -0
- zco_claude-0.0.8.dist-info/WHEEL +5 -0
- zco_claude-0.0.8.dist-info/entry_points.txt +3 -0
- zco_claude-0.0.8.dist-info/top_level.txt +1 -0
- 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
|
+
[](https://badge.fury.io/py/zco-claude)
|
|
33
|
+
[](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 @@
|
|
|
1
|
+
zco_claude_init
|