@hunyed15/codecgc 0.1.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 (128) hide show
  1. package/.claude/hooks/route-edit.ps1 +86 -0
  2. package/INSTALLATION.md +550 -0
  3. package/LICENSE +21 -0
  4. package/README.md +171 -0
  5. package/bin/cgc-build.js +4 -0
  6. package/bin/cgc-doctor.js +4 -0
  7. package/bin/cgc-entry.js +4 -0
  8. package/bin/cgc-external-audit.js +4 -0
  9. package/bin/cgc-fix.js +4 -0
  10. package/bin/cgc-history.js +4 -0
  11. package/bin/cgc-install.js +4 -0
  12. package/bin/cgc-lifecycle.js +4 -0
  13. package/bin/cgc-package-audit.js +4 -0
  14. package/bin/cgc-plan.js +4 -0
  15. package/bin/cgc-release-readiness.js +4 -0
  16. package/bin/cgc-review.js +4 -0
  17. package/bin/cgc-route.js +4 -0
  18. package/bin/cgc-status.js +4 -0
  19. package/bin/cgc-test.js +4 -0
  20. package/bin/cgc.js +4 -0
  21. package/bin/codecgc.js +1284 -0
  22. package/codecgc/cgc/SKILL.md +46 -0
  23. package/codecgc/cgc-arch/SKILL.md +61 -0
  24. package/codecgc/cgc-build/SKILL.md +53 -0
  25. package/codecgc/cgc-decide/SKILL.md +55 -0
  26. package/codecgc/cgc-fix/SKILL.md +47 -0
  27. package/codecgc/cgc-learn/SKILL.md +46 -0
  28. package/codecgc/cgc-onboard/SKILL.md +52 -0
  29. package/codecgc/cgc-plan/SKILL.md +48 -0
  30. package/codecgc/cgc-refactor/SKILL.md +46 -0
  31. package/codecgc/cgc-req/SKILL.md +61 -0
  32. package/codecgc/cgc-review/SKILL.md +57 -0
  33. package/codecgc/cgc-roadmap/SKILL.md +55 -0
  34. package/codecgc/cgc-test/SKILL.md +21 -0
  35. package/codecgc/reference/api-cgc-review-libdoc.md +13 -0
  36. package/codecgc/reference/artifact-class-policy.md +81 -0
  37. package/codecgc/reference/build-flow.md +95 -0
  38. package/codecgc/reference/checklist-contract.md +103 -0
  39. package/codecgc/reference/execution-audit.md +121 -0
  40. package/codecgc/reference/execution-model.md +118 -0
  41. package/codecgc/reference/execution-routing.md +130 -0
  42. package/codecgc/reference/executor-contract.md +87 -0
  43. package/codecgc/reference/external-capability-registry.json +104 -0
  44. package/codecgc/reference/fix-flow.md +94 -0
  45. package/codecgc/reference/fixture-governance.md +60 -0
  46. package/codecgc/reference/flow-execution.md +65 -0
  47. package/codecgc/reference/lifecycle-map.md +172 -0
  48. package/codecgc/reference/lifecycle-playbook.md +104 -0
  49. package/codecgc/reference/long-lived-artifacts.md +98 -0
  50. package/codecgc/reference/operation-guide.md +242 -0
  51. package/codecgc/reference/release-maintenance-playbook.md +150 -0
  52. package/codecgc/reference/review-writeback.md +141 -0
  53. package/codecgc/reference/role-model.md +128 -0
  54. package/codecgc/reference/runtime-boundary.md +72 -0
  55. package/codecgc/reference/shared-conventions.md +93 -0
  56. package/codecgc/reference/workflow-scaffold.md +57 -0
  57. package/codexmcp/LICENSE +21 -0
  58. package/codexmcp/README.md +294 -0
  59. package/codexmcp/pyproject.toml +37 -0
  60. package/codexmcp/src/codexmcp/__init__.py +4 -0
  61. package/codexmcp/src/codexmcp/cli.py +12 -0
  62. package/codexmcp/src/codexmcp/server.py +529 -0
  63. package/geminimcp/README.md +258 -0
  64. package/geminimcp/pyproject.toml +15 -0
  65. package/geminimcp/src/geminimcp/__init__.py +4 -0
  66. package/geminimcp/src/geminimcp/cli.py +12 -0
  67. package/geminimcp/src/geminimcp/server.py +465 -0
  68. package/model-routing.yaml +30 -0
  69. package/package.json +90 -0
  70. package/requirements.txt +1 -0
  71. package/scripts/README-codecgc-cli.md +89 -0
  72. package/scripts/audit_codecgc_external_capabilities.py +276 -0
  73. package/scripts/audit_codecgc_historical_audits.py +242 -0
  74. package/scripts/audit_codecgc_lifecycle.py +241 -0
  75. package/scripts/audit_codecgc_package_runtime.py +445 -0
  76. package/scripts/audit_codecgc_release_readiness.py +202 -0
  77. package/scripts/audit_codecgc_review_policy.py +82 -0
  78. package/scripts/audit_codecgc_workflow_history.py +317 -0
  79. package/scripts/build_codecgc_task.py +487 -0
  80. package/scripts/codecgc_artifact_roots.py +40 -0
  81. package/scripts/codecgc_cli.py +843 -0
  82. package/scripts/codecgc_command_surface.py +28 -0
  83. package/scripts/codecgc_console_io.py +45 -0
  84. package/scripts/codecgc_executor_registry.py +54 -0
  85. package/scripts/codecgc_file_evidence.py +349 -0
  86. package/scripts/codecgc_flow_control.py +233 -0
  87. package/scripts/codecgc_governance_dedupe.py +161 -0
  88. package/scripts/codecgc_plan_decision.py +103 -0
  89. package/scripts/codecgc_review_control.py +588 -0
  90. package/scripts/codecgc_roadmap_templates.py +149 -0
  91. package/scripts/codecgc_routing_paths.py +16 -0
  92. package/scripts/codecgc_routing_template.py +135 -0
  93. package/scripts/codecgc_runtime_paths.py +22 -0
  94. package/scripts/codecgc_session_recovery.py +44 -0
  95. package/scripts/codecgc_step_control.py +154 -0
  96. package/scripts/codecgc_workflow_runtime.py +63 -0
  97. package/scripts/codecgc_workflow_templates.py +437 -0
  98. package/scripts/entry_codecgc_workflow.py +3419 -0
  99. package/scripts/exercise_mcp_tools.py +109 -0
  100. package/scripts/expand_codecgc_roadmap.py +664 -0
  101. package/scripts/init_codecgc_roadmap.py +134 -0
  102. package/scripts/init_codecgc_workflow.py +207 -0
  103. package/scripts/install_codecgc.py +938 -0
  104. package/scripts/migrate_demo_workflows_to_fixtures.py +128 -0
  105. package/scripts/normalize_codecgc_audits.py +114 -0
  106. package/scripts/normalize_codecgc_governance_docs.py +79 -0
  107. package/scripts/normalize_codecgc_workflow_docs.py +269 -0
  108. package/scripts/plan_codecgc_workflow.py +970 -0
  109. package/scripts/refresh_codecgc_review_policy.py +223 -0
  110. package/scripts/review_codecgc_workflow.py +88 -0
  111. package/scripts/route_codecgc_workflow.py +671 -0
  112. package/scripts/run_codecgc_build.py +104 -0
  113. package/scripts/run_codecgc_fix.py +104 -0
  114. package/scripts/run_codecgc_flow_step.py +165 -0
  115. package/scripts/run_codecgc_task.py +410 -0
  116. package/scripts/run_codecgc_test.py +105 -0
  117. package/scripts/sync_codecgc_mcp_config.py +41 -0
  118. package/scripts/write_codecgc_architecture.py +78 -0
  119. package/scripts/write_codecgc_decision.py +83 -0
  120. package/scripts/write_codecgc_explore.py +118 -0
  121. package/scripts/write_codecgc_guide.py +141 -0
  122. package/scripts/write_codecgc_learning.py +87 -0
  123. package/scripts/write_codecgc_libdoc.py +140 -0
  124. package/scripts/write_codecgc_refactor.py +78 -0
  125. package/scripts/write_codecgc_requirement.py +78 -0
  126. package/scripts/write_codecgc_review.py +291 -0
  127. package/scripts/write_codecgc_roadmap.py +122 -0
  128. package/scripts/write_codecgc_trick.py +123 -0
@@ -0,0 +1,134 @@
1
+ import argparse
2
+ import json
3
+ import re
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from codecgc_roadmap_templates import render_delivery_plan
8
+ from codecgc_roadmap_templates import render_overview
9
+ from codecgc_roadmap_templates import render_phases
10
+
11
+
12
+ WORKSPACE = Path(__file__).resolve().parents[1]
13
+ ROADMAP_ROOT = WORKSPACE / "codecgc" / "roadmap"
14
+
15
+
16
+ def slugify(value: str) -> str:
17
+ normalized = value.strip().lower()
18
+ normalized = re.sub(r"[^a-z0-9]+", "-", normalized)
19
+ normalized = re.sub(r"-{2,}", "-", normalized).strip("-")
20
+ if not normalized:
21
+ raise ValueError("Roadmap slug cannot be empty after normalization.")
22
+ return normalized
23
+
24
+
25
+ def write_file(path: Path, content: str, force: bool) -> None:
26
+ if path.exists() and not force:
27
+ raise FileExistsError(f"File already exists: {path}")
28
+ path.parent.mkdir(parents=True, exist_ok=True)
29
+ path.write_text(content, encoding="utf-8")
30
+
31
+
32
+ def build_parser() -> argparse.ArgumentParser:
33
+ parser = argparse.ArgumentParser(description="Initialize a CodeCGC roadmap scaffold.")
34
+ parser.add_argument("--slug", required=True)
35
+ parser.add_argument("--summary", required=True)
36
+ parser.add_argument("--artifact-class", choices=["product", "fixture"], default="product")
37
+ parser.add_argument("--goal", default="")
38
+ parser.add_argument("--user-story", default="")
39
+ parser.add_argument("--context", action="append", default=[])
40
+ parser.add_argument("--in-scope", action="append", default=[])
41
+ parser.add_argument("--risk", action="append", default=[])
42
+ parser.add_argument("--dependency", action="append", default=[])
43
+ parser.add_argument("--assumption", action="append", default=[])
44
+ parser.add_argument("--validation", action="append", default=[])
45
+ parser.add_argument("--rollback", action="append", default=[])
46
+ parser.add_argument("--open-question", action="append", default=[])
47
+ parser.add_argument("--reason", action="append", default=[])
48
+ parser.add_argument("--frontend-path", action="append", default=[])
49
+ parser.add_argument("--backend-path", action="append", default=[])
50
+ parser.add_argument("--shared-path", action="append", default=[])
51
+ parser.add_argument("--unknown-path", action="append", default=[])
52
+ parser.add_argument("--force", action="store_true")
53
+ return parser
54
+
55
+
56
+ def main() -> int:
57
+ parser = build_parser()
58
+ args = parser.parse_args()
59
+
60
+ try:
61
+ slug = slugify(args.slug)
62
+ directory = ROADMAP_ROOT / slug
63
+ grouped_paths = {
64
+ "frontend": args.frontend_path,
65
+ "backend": args.backend_path,
66
+ "shared": args.shared_path,
67
+ "unknown": args.unknown_path,
68
+ }
69
+
70
+ overview_path = directory / "overview.md"
71
+ phases_path = directory / "phases.md"
72
+ delivery_plan_path = directory / "delivery-plan.md"
73
+
74
+ write_file(
75
+ overview_path,
76
+ render_overview(
77
+ initiative=slug,
78
+ summary=args.summary,
79
+ user_story=args.user_story,
80
+ goal=args.goal,
81
+ context=args.context,
82
+ scope=args.in_scope,
83
+ risks=args.risk,
84
+ reasons=args.reason,
85
+ artifact_class=args.artifact_class,
86
+ ),
87
+ args.force,
88
+ )
89
+ write_file(
90
+ phases_path,
91
+ render_phases(
92
+ initiative=slug,
93
+ grouped_paths=grouped_paths,
94
+ artifact_class=args.artifact_class,
95
+ ),
96
+ args.force,
97
+ )
98
+ write_file(
99
+ delivery_plan_path,
100
+ render_delivery_plan(
101
+ initiative=slug,
102
+ dependencies=args.dependency,
103
+ assumptions=args.assumption,
104
+ validation=args.validation,
105
+ rollback=args.rollback,
106
+ open_questions=args.open_question,
107
+ artifact_class=args.artifact_class,
108
+ ),
109
+ args.force,
110
+ )
111
+ except Exception as error:
112
+ print(json.dumps({"success": False, "error": str(error)}, ensure_ascii=False, indent=2), file=sys.stderr)
113
+ return 1
114
+
115
+ print(
116
+ json.dumps(
117
+ {
118
+ "success": True,
119
+ "directory": str(directory),
120
+ "files": {
121
+ "overview": str(overview_path),
122
+ "phases": str(phases_path),
123
+ "delivery_plan": str(delivery_plan_path),
124
+ },
125
+ },
126
+ ensure_ascii=False,
127
+ indent=2,
128
+ )
129
+ )
130
+ return 0
131
+
132
+
133
+ if __name__ == "__main__":
134
+ raise SystemExit(main())
@@ -0,0 +1,207 @@
1
+ import argparse
2
+ import datetime as dt
3
+ import json
4
+ import re
5
+ import sys
6
+ from pathlib import Path
7
+
8
+ from codecgc_artifact_roots import flow_root
9
+ from codecgc_console_io import configure_utf8_stdio
10
+ from codecgc_console_io import print_json
11
+ from codecgc_workflow_templates import build_feature_paths
12
+ from codecgc_workflow_templates import build_issue_paths
13
+ from codecgc_workflow_templates import render_feature_acceptance
14
+ from codecgc_workflow_templates import render_feature_checklist
15
+ from codecgc_workflow_templates import render_feature_design
16
+ from codecgc_workflow_templates import render_issue_analysis
17
+ from codecgc_workflow_templates import render_issue_fix
18
+ from codecgc_workflow_templates import render_issue_fix_note
19
+ from codecgc_workflow_templates import render_issue_report
20
+
21
+
22
+ def slugify(value: str) -> str:
23
+ normalized = value.strip().lower()
24
+ normalized = re.sub(r"[^a-z0-9]+", "-", normalized)
25
+ normalized = re.sub(r"-{2,}", "-", normalized).strip("-")
26
+ if not normalized:
27
+ raise ValueError("工作流 slug 归一化后不能为空。")
28
+ return normalized
29
+
30
+
31
+ def build_parser() -> argparse.ArgumentParser:
32
+ parser = argparse.ArgumentParser(
33
+ description="初始化最小可用的 CodeCGC 功能开发或问题修复工作流产物。"
34
+ )
35
+ parser.add_argument(
36
+ "--flow",
37
+ required=True,
38
+ choices=["feature", "issue"],
39
+ help="要初始化的工作流类型。",
40
+ )
41
+ parser.add_argument(
42
+ "--slug",
43
+ required=True,
44
+ help="新工作流目录使用的稳定 slug。",
45
+ )
46
+ parser.add_argument(
47
+ "--summary",
48
+ required=True,
49
+ help="面向人的一句话摘要。",
50
+ )
51
+ parser.add_argument(
52
+ "--date",
53
+ default=dt.date.today().isoformat(),
54
+ help="目录日期前缀,格式为 YYYY-MM-DD。",
55
+ )
56
+ parser.add_argument(
57
+ "--target-path",
58
+ action="append",
59
+ default=[],
60
+ help="可选:首个可执行步骤的初始目标路径。",
61
+ )
62
+ parser.add_argument(
63
+ "--kind",
64
+ choices=["auto", "frontend", "backend"],
65
+ default="auto",
66
+ help="可选:首个可执行步骤的初始归属类型。",
67
+ )
68
+ parser.add_argument(
69
+ "--artifact-class",
70
+ choices=["product", "fixture"],
71
+ default="product",
72
+ help="指定生成产物属于 product 还是 fixture。",
73
+ )
74
+ parser.add_argument(
75
+ "--force",
76
+ action="store_true",
77
+ help="如果目标文件已存在,则允许覆盖。",
78
+ )
79
+ return parser
80
+
81
+
82
+ def ensure_parent(path: Path) -> None:
83
+ path.parent.mkdir(parents=True, exist_ok=True)
84
+
85
+
86
+ def write_file(path: Path, content: str, force: bool) -> None:
87
+ if path.exists() and not force:
88
+ raise FileExistsError(f"文件已存在:{path}")
89
+ ensure_parent(path)
90
+ path.write_text(content, encoding="utf-8")
91
+
92
+
93
+ def init_feature(
94
+ flow_dir: Path,
95
+ slug: str,
96
+ summary: str,
97
+ created_date: str,
98
+ kind: str,
99
+ target_paths: list[str],
100
+ artifact_class: str,
101
+ force: bool,
102
+ ) -> dict[str, str]:
103
+ paths = build_feature_paths(flow_dir, slug)
104
+ write_file(
105
+ paths["design"],
106
+ render_feature_design(flow_dir.name, summary, kind, target_paths, artifact_class=artifact_class),
107
+ force,
108
+ )
109
+ write_file(
110
+ paths["checklist"],
111
+ render_feature_checklist(flow_dir.name, slug, created_date, kind, target_paths, artifact_class=artifact_class),
112
+ force,
113
+ )
114
+ write_file(paths["acceptance"], render_feature_acceptance(summary, artifact_class=artifact_class), force)
115
+ return {name: str(path) for name, path in paths.items()}
116
+
117
+
118
+ def init_issue(
119
+ flow_dir: Path,
120
+ slug: str,
121
+ summary: str,
122
+ created_date: str,
123
+ kind: str,
124
+ target_paths: list[str],
125
+ artifact_class: str,
126
+ force: bool,
127
+ ) -> dict[str, str]:
128
+ paths = build_issue_paths(flow_dir, slug)
129
+ write_file(
130
+ paths["report"],
131
+ render_issue_report(flow_dir.name, summary, kind, target_paths, artifact_class=artifact_class),
132
+ force,
133
+ )
134
+ write_file(
135
+ paths["analysis"],
136
+ render_issue_analysis(flow_dir.name, summary, kind, target_paths, artifact_class=artifact_class),
137
+ force,
138
+ )
139
+ write_file(
140
+ paths["fix"],
141
+ render_issue_fix(flow_dir.name, slug, created_date, kind, target_paths, artifact_class=artifact_class),
142
+ force,
143
+ )
144
+ write_file(
145
+ paths["fix_note"],
146
+ render_issue_fix_note(flow_dir.name, summary, created_date, artifact_class=artifact_class),
147
+ force,
148
+ )
149
+ return {name: str(path) for name, path in paths.items()}
150
+
151
+
152
+ def main() -> int:
153
+ configure_utf8_stdio()
154
+ parser = build_parser()
155
+ args = parser.parse_args()
156
+
157
+ try:
158
+ slug = slugify(args.slug)
159
+ directory_name = f"{args.date}-{slug}"
160
+ root = flow_root(args.flow, args.artifact_class)
161
+ flow_dir = root / directory_name
162
+
163
+ if args.flow == "feature":
164
+ created = init_feature(
165
+ flow_dir,
166
+ slug,
167
+ args.summary.strip(),
168
+ args.date,
169
+ args.kind,
170
+ args.target_path,
171
+ args.artifact_class,
172
+ args.force,
173
+ )
174
+ else:
175
+ created = init_issue(
176
+ flow_dir,
177
+ slug,
178
+ args.summary.strip(),
179
+ args.date,
180
+ args.kind,
181
+ args.target_path,
182
+ args.artifact_class,
183
+ args.force,
184
+ )
185
+ except Exception as error:
186
+ print_json(
187
+ {
188
+ "success": False,
189
+ "error": str(error),
190
+ },
191
+ file=sys.stderr,
192
+ )
193
+ return 1
194
+
195
+ print_json(
196
+ {
197
+ "success": True,
198
+ "flow": args.flow,
199
+ "directory": str(flow_dir),
200
+ "files": created,
201
+ }
202
+ )
203
+ return 0
204
+
205
+
206
+ if __name__ == "__main__":
207
+ raise SystemExit(main())