@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.
- package/.claude/hooks/route-edit.ps1 +86 -0
- package/INSTALLATION.md +550 -0
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/bin/cgc-build.js +4 -0
- package/bin/cgc-doctor.js +4 -0
- package/bin/cgc-entry.js +4 -0
- package/bin/cgc-external-audit.js +4 -0
- package/bin/cgc-fix.js +4 -0
- package/bin/cgc-history.js +4 -0
- package/bin/cgc-install.js +4 -0
- package/bin/cgc-lifecycle.js +4 -0
- package/bin/cgc-package-audit.js +4 -0
- package/bin/cgc-plan.js +4 -0
- package/bin/cgc-release-readiness.js +4 -0
- package/bin/cgc-review.js +4 -0
- package/bin/cgc-route.js +4 -0
- package/bin/cgc-status.js +4 -0
- package/bin/cgc-test.js +4 -0
- package/bin/cgc.js +4 -0
- package/bin/codecgc.js +1284 -0
- package/codecgc/cgc/SKILL.md +46 -0
- package/codecgc/cgc-arch/SKILL.md +61 -0
- package/codecgc/cgc-build/SKILL.md +53 -0
- package/codecgc/cgc-decide/SKILL.md +55 -0
- package/codecgc/cgc-fix/SKILL.md +47 -0
- package/codecgc/cgc-learn/SKILL.md +46 -0
- package/codecgc/cgc-onboard/SKILL.md +52 -0
- package/codecgc/cgc-plan/SKILL.md +48 -0
- package/codecgc/cgc-refactor/SKILL.md +46 -0
- package/codecgc/cgc-req/SKILL.md +61 -0
- package/codecgc/cgc-review/SKILL.md +57 -0
- package/codecgc/cgc-roadmap/SKILL.md +55 -0
- package/codecgc/cgc-test/SKILL.md +21 -0
- package/codecgc/reference/api-cgc-review-libdoc.md +13 -0
- package/codecgc/reference/artifact-class-policy.md +81 -0
- package/codecgc/reference/build-flow.md +95 -0
- package/codecgc/reference/checklist-contract.md +103 -0
- package/codecgc/reference/execution-audit.md +121 -0
- package/codecgc/reference/execution-model.md +118 -0
- package/codecgc/reference/execution-routing.md +130 -0
- package/codecgc/reference/executor-contract.md +87 -0
- package/codecgc/reference/external-capability-registry.json +104 -0
- package/codecgc/reference/fix-flow.md +94 -0
- package/codecgc/reference/fixture-governance.md +60 -0
- package/codecgc/reference/flow-execution.md +65 -0
- package/codecgc/reference/lifecycle-map.md +172 -0
- package/codecgc/reference/lifecycle-playbook.md +104 -0
- package/codecgc/reference/long-lived-artifacts.md +98 -0
- package/codecgc/reference/operation-guide.md +242 -0
- package/codecgc/reference/release-maintenance-playbook.md +150 -0
- package/codecgc/reference/review-writeback.md +141 -0
- package/codecgc/reference/role-model.md +128 -0
- package/codecgc/reference/runtime-boundary.md +72 -0
- package/codecgc/reference/shared-conventions.md +93 -0
- package/codecgc/reference/workflow-scaffold.md +57 -0
- package/codexmcp/LICENSE +21 -0
- package/codexmcp/README.md +294 -0
- package/codexmcp/pyproject.toml +37 -0
- package/codexmcp/src/codexmcp/__init__.py +4 -0
- package/codexmcp/src/codexmcp/cli.py +12 -0
- package/codexmcp/src/codexmcp/server.py +529 -0
- package/geminimcp/README.md +258 -0
- package/geminimcp/pyproject.toml +15 -0
- package/geminimcp/src/geminimcp/__init__.py +4 -0
- package/geminimcp/src/geminimcp/cli.py +12 -0
- package/geminimcp/src/geminimcp/server.py +465 -0
- package/model-routing.yaml +30 -0
- package/package.json +90 -0
- package/requirements.txt +1 -0
- package/scripts/README-codecgc-cli.md +89 -0
- package/scripts/audit_codecgc_external_capabilities.py +276 -0
- package/scripts/audit_codecgc_historical_audits.py +242 -0
- package/scripts/audit_codecgc_lifecycle.py +241 -0
- package/scripts/audit_codecgc_package_runtime.py +445 -0
- package/scripts/audit_codecgc_release_readiness.py +202 -0
- package/scripts/audit_codecgc_review_policy.py +82 -0
- package/scripts/audit_codecgc_workflow_history.py +317 -0
- package/scripts/build_codecgc_task.py +487 -0
- package/scripts/codecgc_artifact_roots.py +40 -0
- package/scripts/codecgc_cli.py +843 -0
- package/scripts/codecgc_command_surface.py +28 -0
- package/scripts/codecgc_console_io.py +45 -0
- package/scripts/codecgc_executor_registry.py +54 -0
- package/scripts/codecgc_file_evidence.py +349 -0
- package/scripts/codecgc_flow_control.py +233 -0
- package/scripts/codecgc_governance_dedupe.py +161 -0
- package/scripts/codecgc_plan_decision.py +103 -0
- package/scripts/codecgc_review_control.py +588 -0
- package/scripts/codecgc_roadmap_templates.py +149 -0
- package/scripts/codecgc_routing_paths.py +16 -0
- package/scripts/codecgc_routing_template.py +135 -0
- package/scripts/codecgc_runtime_paths.py +22 -0
- package/scripts/codecgc_session_recovery.py +44 -0
- package/scripts/codecgc_step_control.py +154 -0
- package/scripts/codecgc_workflow_runtime.py +63 -0
- package/scripts/codecgc_workflow_templates.py +437 -0
- package/scripts/entry_codecgc_workflow.py +3419 -0
- package/scripts/exercise_mcp_tools.py +109 -0
- package/scripts/expand_codecgc_roadmap.py +664 -0
- package/scripts/init_codecgc_roadmap.py +134 -0
- package/scripts/init_codecgc_workflow.py +207 -0
- package/scripts/install_codecgc.py +938 -0
- package/scripts/migrate_demo_workflows_to_fixtures.py +128 -0
- package/scripts/normalize_codecgc_audits.py +114 -0
- package/scripts/normalize_codecgc_governance_docs.py +79 -0
- package/scripts/normalize_codecgc_workflow_docs.py +269 -0
- package/scripts/plan_codecgc_workflow.py +970 -0
- package/scripts/refresh_codecgc_review_policy.py +223 -0
- package/scripts/review_codecgc_workflow.py +88 -0
- package/scripts/route_codecgc_workflow.py +671 -0
- package/scripts/run_codecgc_build.py +104 -0
- package/scripts/run_codecgc_fix.py +104 -0
- package/scripts/run_codecgc_flow_step.py +165 -0
- package/scripts/run_codecgc_task.py +410 -0
- package/scripts/run_codecgc_test.py +105 -0
- package/scripts/sync_codecgc_mcp_config.py +41 -0
- package/scripts/write_codecgc_architecture.py +78 -0
- package/scripts/write_codecgc_decision.py +83 -0
- package/scripts/write_codecgc_explore.py +118 -0
- package/scripts/write_codecgc_guide.py +141 -0
- package/scripts/write_codecgc_learning.py +87 -0
- package/scripts/write_codecgc_libdoc.py +140 -0
- package/scripts/write_codecgc_refactor.py +78 -0
- package/scripts/write_codecgc_requirement.py +78 -0
- package/scripts/write_codecgc_review.py +291 -0
- package/scripts/write_codecgc_roadmap.py +122 -0
- 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())
|