@event4u/agent-config 2.23.0 → 2.25.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/.agent-src/commands/create-pr/description-only.md +39 -11
- package/.agent-src/commands/create-pr.md +59 -5
- package/.agent-src/commands/video/from-script.md +123 -0
- package/.agent-src/commands/video/scene.md +92 -0
- package/.agent-src/commands/video/stitch.md +83 -0
- package/.agent-src/commands/video/storyboard.md +95 -0
- package/.agent-src/commands/video.md +59 -0
- package/.agent-src/contexts/execution/roadmap-process-loop.md +69 -14
- package/.agent-src/personas/README.md +5 -1
- package/.agent-src/personas/ai-video-technical-director.md +81 -0
- package/.agent-src/personas/hollywood-director.md +99 -0
- package/.agent-src/profiles/content_creator.yml +5 -0
- package/.agent-src/rules/media-governance-routing.md +82 -0
- package/.agent-src/rules/persona-governance.md +90 -0
- package/.agent-src/rules/post-push-rewrite-discipline.md +70 -0
- package/.agent-src/rules/provider-lifecycle-discipline.md +75 -0
- package/.agent-src/rules/roadmap-ci-steps-policy.md +145 -0
- package/.agent-src/rules/roadmap-progress-sync.md +11 -5
- package/.agent-src/skills/character-consistency/SKILL.md +131 -0
- package/.agent-src/skills/git-workflow/SKILL.md +133 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +161 -0
- package/.agent-src/skills/pixar-storyteller/SKILL.md +120 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +10 -0
- package/.agent-src/skills/scene-expander/SKILL.md +137 -0
- package/.agent-src/skills/scene-expander/scene-blueprint.schema.yaml +108 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +17 -15
- package/.agent-src/skills/video-director/SKILL.md +126 -0
- package/.agent-src/templates/agent-settings.md +19 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/roadmaps.md +16 -0
- package/.claude-plugin/marketplace.json +11 -1
- package/CHANGELOG.md +65 -0
- package/README.md +7 -5
- package/config/agent-settings.template.yml +54 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
- package/docs/architecture.md +3 -3
- package/docs/catalog.md +18 -5
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/compression-default-kill-criterion.md +1 -1
- package/docs/contracts/file-ownership-matrix.json +405 -0
- package/docs/contracts/provider-lifecycle.md +122 -0
- package/docs/decisions/ADR-011-domain-pack-readiness.md +213 -0
- package/docs/decisions/INDEX.md +1 -0
- package/docs/getting-started-by-role.md +10 -0
- package/docs/getting-started.md +2 -2
- package/docs/parity/ruflo.md +3 -3
- package/docs/personas.md +73 -26
- package/docs/profiles.md +9 -4
- package/package.json +1 -1
- package/scripts/_tmp_scan_framework_leakage.py +119 -0
- package/scripts/ai-video/adapters/gemini-veo.sh +62 -0
- package/scripts/ai-video/adapters/higgsfield.sh +88 -0
- package/scripts/ai-video/adapters/kling.sh +59 -0
- package/scripts/ai-video/adapters/openai-images.sh +57 -0
- package/scripts/ai-video/adapters/sora.sh +60 -0
- package/scripts/ai-video/lib/adapter-common.sh +116 -0
- package/scripts/ai-video/lib/adapter-contract.md +163 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/kling/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/kling/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/scene-0001.png +3 -0
- package/scripts/ai-video/lib/fixtures/sora/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/sora/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/load-config.sh +140 -0
- package/scripts/ai-video/lib/operator-pick.sh +119 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +122 -0
- package/scripts/ai-video/lib/redact.sh +85 -0
- package/scripts/ai-video/lib/validate-deps.sh +132 -0
- package/scripts/ai-video/stitch.sh +154 -0
- package/scripts/ai-video/test-pipeline.sh +169 -0
- package/scripts/check_portability.py +6 -0
- package/scripts/lint_media_policy_linkage.py +140 -0
- package/scripts/lint_persona_governance.py +164 -0
- package/scripts/lint_roadmap_ci_steps.py +182 -0
- package/scripts/schemas/command.schema.json +8 -0
- package/scripts/smoke/schema.sh +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Hard-Gate linter for the ``roadmap-ci-steps-policy`` rule.
|
|
3
|
+
|
|
4
|
+
Forbids full-pipeline CI literals (``task ci``, ``make test``,
|
|
5
|
+
``npm run check`` etc.) inside ``agents/roadmaps/*.md`` checkbox steps
|
|
6
|
+
or fenced bash blocks **when** ``quality.local_auto_run`` in
|
|
7
|
+
``.agent-settings.yml`` is ``false``.
|
|
8
|
+
|
|
9
|
+
Carve-outs:
|
|
10
|
+
* Setting is ``true`` → linter no-ops (exit 0).
|
|
11
|
+
* Step line carries ``<!-- carve-out: new-gate-verification -->`` →
|
|
12
|
+
allowed (new gate added by the same roadmap).
|
|
13
|
+
* ``## Acceptance criteria`` section → documentation, not steps.
|
|
14
|
+
* ``agents/roadmaps/archive/`` and ``agents/roadmaps/skipped/`` → out
|
|
15
|
+
of scope; they record history.
|
|
16
|
+
|
|
17
|
+
Cap: ≤ 150 LOC, stdlib only. Hooked into ``task ci-fast`` via
|
|
18
|
+
``task lint-roadmap-ci-steps``.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import re
|
|
23
|
+
import sys
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
QUIET = "--quiet" in sys.argv
|
|
27
|
+
|
|
28
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
29
|
+
ROADMAP_GLOB = "agents/roadmaps/*.md"
|
|
30
|
+
SETTINGS_FILE = REPO_ROOT / ".agent-settings.yml"
|
|
31
|
+
LOCAL_AUTO_RUN_PAT = re.compile(
|
|
32
|
+
r"^\s*local_auto_run:\s*(true|false)\s*(?:#.*)?$", re.MULTILINE
|
|
33
|
+
)
|
|
34
|
+
CARVE_OUT_MARKER = "carve-out: new-gate-verification"
|
|
35
|
+
|
|
36
|
+
# CI-shaped literals — case-insensitive whole-word(-ish) matches.
|
|
37
|
+
CI_PATTERNS: tuple[tuple[re.Pattern[str], str], ...] = (
|
|
38
|
+
(re.compile(r"\btask\s+ci-strict\b", re.IGNORECASE), "task ci-strict"),
|
|
39
|
+
(re.compile(r"\btask\s+ci-fast\b", re.IGNORECASE), "task ci-fast"),
|
|
40
|
+
(re.compile(r"\btask\s+ci\b(?!-)", re.IGNORECASE), "task ci"),
|
|
41
|
+
(re.compile(r"\bmake\s+ci\b", re.IGNORECASE), "make ci"),
|
|
42
|
+
(re.compile(r"\bmake\s+test\b", re.IGNORECASE), "make test"),
|
|
43
|
+
(re.compile(r"\bnpm\s+run\s+check\b", re.IGNORECASE), "npm run check"),
|
|
44
|
+
(re.compile(r"\bpnpm\s+run\s+check\b", re.IGNORECASE), "pnpm run check"),
|
|
45
|
+
(re.compile(r"\byarn\s+check\b", re.IGNORECASE), "yarn check"),
|
|
46
|
+
(re.compile(r"\bcomposer\s+test\b", re.IGNORECASE), "composer test"),
|
|
47
|
+
# Whole-suite = bare command, or command followed only by prose
|
|
48
|
+
# ("before the boundary"). A real shell argument starts with ``-``
|
|
49
|
+
# (flag) or contains ``/`` or ``.`` (path / .php file) — that
|
|
50
|
+
# signals a targeted run and is allowed.
|
|
51
|
+
(re.compile(r"\bvendor/bin/phpunit\b(?!\s+(?:-|\S*[/.]))", re.IGNORECASE),
|
|
52
|
+
"vendor/bin/phpunit (whole suite)"),
|
|
53
|
+
(re.compile(r"\bphp\s+artisan\s+test\b(?!\s+(?:-|\S*[/.]))", re.IGNORECASE),
|
|
54
|
+
"php artisan test (whole suite)"),
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
CHECKBOX_PAT = re.compile(r"^\s*-\s*\[[ x~/-]\]\s")
|
|
58
|
+
FENCE_PAT = re.compile(r"^\s*```")
|
|
59
|
+
HEADING_PAT = re.compile(r"^(#{1,6})\s+(.*?)\s*$")
|
|
60
|
+
ACCEPTANCE_HEADING_PAT = re.compile(
|
|
61
|
+
r"^acceptance criteria\b", re.IGNORECASE
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _read_local_auto_run() -> bool:
|
|
66
|
+
"""Return ``quality.local_auto_run`` from ``.agent-settings.yml``.
|
|
67
|
+
|
|
68
|
+
Default ``True`` (= no-op) when file or key is missing. The Hard
|
|
69
|
+
Gate only fires when the setting is explicitly ``false``.
|
|
70
|
+
"""
|
|
71
|
+
if not SETTINGS_FILE.is_file():
|
|
72
|
+
return True
|
|
73
|
+
try:
|
|
74
|
+
text = SETTINGS_FILE.read_text(encoding="utf-8")
|
|
75
|
+
except OSError:
|
|
76
|
+
return True
|
|
77
|
+
in_quality = False
|
|
78
|
+
for raw in text.splitlines():
|
|
79
|
+
if not raw.strip() or raw.lstrip().startswith("#"):
|
|
80
|
+
continue
|
|
81
|
+
if raw.startswith("quality:"):
|
|
82
|
+
in_quality = True
|
|
83
|
+
continue
|
|
84
|
+
if in_quality and raw and not raw.startswith((" ", "\t")):
|
|
85
|
+
in_quality = False
|
|
86
|
+
continue
|
|
87
|
+
if in_quality:
|
|
88
|
+
m = LOCAL_AUTO_RUN_PAT.match(raw)
|
|
89
|
+
if m:
|
|
90
|
+
return m.group(1).lower() == "true"
|
|
91
|
+
return True
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _scan(text: str) -> list[tuple[int, str, str]]:
|
|
95
|
+
"""Return ``(line_no, matched_literal, line_text)`` for every hit.
|
|
96
|
+
|
|
97
|
+
Only scans:
|
|
98
|
+
* checkbox-step lines (``- [ ] …``)
|
|
99
|
+
* lines inside fenced code blocks (```` ``` ````)
|
|
100
|
+
Skips lines under an ``## Acceptance criteria`` heading.
|
|
101
|
+
Skips lines carrying the carve-out marker.
|
|
102
|
+
"""
|
|
103
|
+
hits: list[tuple[int, str, str]] = []
|
|
104
|
+
in_fence = False
|
|
105
|
+
in_acceptance = False
|
|
106
|
+
for idx, line in enumerate(text.splitlines(), start=1):
|
|
107
|
+
if FENCE_PAT.match(line):
|
|
108
|
+
in_fence = not in_fence
|
|
109
|
+
continue
|
|
110
|
+
if not in_fence:
|
|
111
|
+
heading = HEADING_PAT.match(line)
|
|
112
|
+
if heading:
|
|
113
|
+
in_acceptance = bool(
|
|
114
|
+
ACCEPTANCE_HEADING_PAT.match(heading.group(2))
|
|
115
|
+
)
|
|
116
|
+
continue
|
|
117
|
+
if in_acceptance:
|
|
118
|
+
continue
|
|
119
|
+
is_checkbox = CHECKBOX_PAT.match(line) is not None
|
|
120
|
+
if not (is_checkbox or in_fence):
|
|
121
|
+
continue
|
|
122
|
+
if CARVE_OUT_MARKER in line:
|
|
123
|
+
continue
|
|
124
|
+
for pat, label in CI_PATTERNS:
|
|
125
|
+
if pat.search(line):
|
|
126
|
+
hits.append((idx, label, line.strip()))
|
|
127
|
+
break
|
|
128
|
+
return hits
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def main() -> int:
|
|
132
|
+
if _read_local_auto_run():
|
|
133
|
+
if not QUIET:
|
|
134
|
+
print(
|
|
135
|
+
"✅ quality.local_auto_run=true (or unset) — "
|
|
136
|
+
"CI-step gate disabled"
|
|
137
|
+
)
|
|
138
|
+
return 0
|
|
139
|
+
roadmaps = sorted(REPO_ROOT.glob(ROADMAP_GLOB))
|
|
140
|
+
if not roadmaps:
|
|
141
|
+
if not QUIET:
|
|
142
|
+
print(f"✅ no active roadmaps under {ROADMAP_GLOB}")
|
|
143
|
+
return 0
|
|
144
|
+
failed = 0
|
|
145
|
+
for roadmap in roadmaps:
|
|
146
|
+
rel = roadmap.relative_to(REPO_ROOT)
|
|
147
|
+
text = roadmap.read_text(encoding="utf-8")
|
|
148
|
+
hits = _scan(text)
|
|
149
|
+
if hits:
|
|
150
|
+
failed += 1
|
|
151
|
+
print(f"❌ {rel}", file=sys.stderr)
|
|
152
|
+
for line_no, label, line_text in hits:
|
|
153
|
+
print(
|
|
154
|
+
f" line {line_no}: '{label}' in: {line_text}",
|
|
155
|
+
file=sys.stderr,
|
|
156
|
+
)
|
|
157
|
+
print(
|
|
158
|
+
" → reword as a narrow command "
|
|
159
|
+
"(e.g. 'vendor/bin/phpstan analyse app/Modules/X'), or "
|
|
160
|
+
"mark with '<!-- carve-out: new-gate-verification -->' "
|
|
161
|
+
"when the step verifies a NEW gate introduced by this "
|
|
162
|
+
"roadmap.",
|
|
163
|
+
file=sys.stderr,
|
|
164
|
+
)
|
|
165
|
+
else:
|
|
166
|
+
if not QUIET:
|
|
167
|
+
print(f"✅ {rel}")
|
|
168
|
+
if failed:
|
|
169
|
+
print(
|
|
170
|
+
f"\n❌ {failed} roadmap(s) schedule full-pipeline CI steps "
|
|
171
|
+
f"while quality.local_auto_run=false — "
|
|
172
|
+
f"see .augment/rules/roadmap-ci-steps-policy.md",
|
|
173
|
+
file=sys.stderr,
|
|
174
|
+
)
|
|
175
|
+
return 1
|
|
176
|
+
if not QUIET:
|
|
177
|
+
print(f"\n✅ {len(roadmaps)} roadmap(s) CI-step-clean")
|
|
178
|
+
return 0
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
sys.exit(main())
|
|
@@ -34,6 +34,14 @@
|
|
|
34
34
|
"pattern": "^[a-z][a-z0-9-]*$"
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
|
+
"personas": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
42
|
+
},
|
|
43
|
+
"description": "Personas this command invokes (see .agent-src.uncompressed/personas/). Mirrors `skills:`; each entry must match a persona slug."
|
|
44
|
+
},
|
|
37
45
|
"cluster": {
|
|
38
46
|
"type": "string",
|
|
39
47
|
"pattern": "^[a-z][a-z0-9-]*$",
|