@antoneeo/mkt-agentic-sdlc-skill 0.14.0 → 0.16.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/CHANGELOG.md +15 -0
- package/README.md +157 -150
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/scripts/init.js +6 -6
- package/skills/mkt-agentic-sdlc/ENFORCEMENT.md +5 -5
- package/skills/mkt-agentic-sdlc/SKILL.md +2 -2
- package/skills/mkt-agentic-sdlc/dispatch.md +5 -5
- package/skills/mkt-agentic-sdlc/elicitation.md +217 -217
- package/skills/mkt-agentic-sdlc/hybrid.md +47 -47
- package/skills/mkt-agentic-sdlc/memory.md +88 -88
- package/skills/mkt-agentic-sdlc/review.md +70 -9
- package/skills/mkt-agentic-sdlc/routing.md +28 -16
- package/skills/mkt-agentic-sdlc/scripts/knowledge.py +2091 -2089
- package/skills/mkt-agentic-sdlc/scripts/mkt_check.py +752 -718
- package/skills/mkt-agentic-sdlc/scripts/sdlc_core.py +25 -9
- package/skills/mkt-agentic-sdlc/templates.md +3 -1
|
@@ -203,6 +203,11 @@ DOMAINS = {
|
|
|
203
203
|
"risk_label": "## Threat Map / Plan Risks",
|
|
204
204
|
"id_prefix": "M-",
|
|
205
205
|
},
|
|
206
|
+
"course": {
|
|
207
|
+
"risk_section": ("## Learning and Content Risks",),
|
|
208
|
+
"risk_label": "## Learning and Content Risks",
|
|
209
|
+
"id_prefix": "C-",
|
|
210
|
+
},
|
|
206
211
|
}
|
|
207
212
|
# Absent everything -- no `default_domain:` line, no `domain:` field -- a project is
|
|
208
213
|
# `code`. That is what every project created before this field existed already is,
|
|
@@ -1298,7 +1303,7 @@ def cmd_validate(root, strict=False, hybrid=False):
|
|
|
1298
1303
|
"have the user validate it")
|
|
1299
1304
|
|
|
1300
1305
|
# ANALYSIS: frontmatter and mandatory sections
|
|
1301
|
-
# Ids are unique WITHIN a domain (prefixes F-/K-/M- keep them apart in practice):
|
|
1306
|
+
# Ids are unique WITHIN a domain (prefixes F-/K-/M-/C- keep them apart in practice):
|
|
1302
1307
|
# two lenses over one tree must not collide on a number neither of them chose.
|
|
1303
1308
|
seen_ids = {}
|
|
1304
1309
|
default_domain = project_default_domain(root)
|
|
@@ -1349,10 +1354,10 @@ def cmd_validate(root, strict=False, hybrid=False):
|
|
|
1349
1354
|
"doing the work it triggers")
|
|
1350
1355
|
# comment-stripped, anchored: a '<!-- TODO: the ## Capability Ledger -->'
|
|
1351
1356
|
# must not read as the section being present
|
|
1352
|
-
# Hybrid: the design lives in devPNT and
|
|
1353
|
-
#
|
|
1354
|
-
#
|
|
1355
|
-
#
|
|
1357
|
+
# Hybrid: the design lives in devPNT, and the agent review of it (the
|
|
1358
|
+
# same review.md review, run before the proposal) logs a row keyed on
|
|
1359
|
+
# its e_isp_/e_tdd_ doc_key, not on this filename -- so firing here
|
|
1360
|
+
# would be a permanent, unfixable false positive.
|
|
1356
1361
|
if not hybrid and design_review_due(meta) and not review_logged(root, p.name):
|
|
1357
1362
|
advisories.append(f"{rel}: L3 in implementation with no design-review row in "
|
|
1358
1363
|
f"{review_log_rel()} -- the design was reviewed by nobody but its "
|
|
@@ -1864,15 +1869,26 @@ def print_orient_hook_note(root):
|
|
|
1864
1869
|
pass # detection must never break check
|
|
1865
1870
|
|
|
1866
1871
|
|
|
1867
|
-
def cmd_check(root, strict=False, hybrid=False):
|
|
1872
|
+
def cmd_check(root, strict=False, hybrid=False, extra_validate=None, extra_sections=()):
|
|
1873
|
+
"""An overlay adds its checks through the two hooks, never after the call:
|
|
1874
|
+
the summary line is the verdict, so every check that can fail runs before
|
|
1875
|
+
it. `extra_validate()` folds into the validate stage; each
|
|
1876
|
+
(title, fn) in `extra_sections` gets its own banner and summary rc."""
|
|
1868
1877
|
print("===== validate =====")
|
|
1869
1878
|
rc_v = cmd_validate(root, strict=strict, hybrid=hybrid)
|
|
1879
|
+
if extra_validate is not None:
|
|
1880
|
+
rc_v = max(rc_v, extra_validate())
|
|
1870
1881
|
print("\n===== stale =====")
|
|
1871
1882
|
rc_s = cmd_stale(root, hybrid=hybrid)
|
|
1872
|
-
|
|
1873
|
-
|
|
1883
|
+
rcs = [("validate", rc_v), ("stale", rc_s)]
|
|
1884
|
+
for title, fn in extra_sections:
|
|
1885
|
+
print(f"\n===== {title} =====")
|
|
1886
|
+
rcs.append((title, fn()))
|
|
1887
|
+
failed = any(rc for _, rc in rcs)
|
|
1888
|
+
print(f"\ncheck: {'NOT CLEAN' if failed else 'CLEAN'} "
|
|
1889
|
+
f"({', '.join(f'{title} rc={rc}' for title, rc in rcs)})")
|
|
1874
1890
|
print_orient_hook_note(root)
|
|
1875
|
-
return 1 if
|
|
1891
|
+
return 1 if failed else 0
|
|
1876
1892
|
|
|
1877
1893
|
|
|
1878
1894
|
# --------------------------------------------------------------------- gate
|
|
@@ -498,7 +498,7 @@ One row per completed review (`review.md` §When a review is due). Append-only;
|
|
|
498
498
|
is the record that the gate ran and what it was worth. **One schema for both
|
|
499
499
|
modes** — one required CORE (`date`, `doc_key`, `tier`, `model`, `findings_raised`,
|
|
500
500
|
`findings_real`, `verdict`, `revise_rounds`) plus each mode's own realization
|
|
501
|
-
columns: Standalone adds `reviewer`, a Hybrid
|
|
501
|
+
columns: Standalone adds `reviewer`, a Hybrid row adds `instrument` and
|
|
502
502
|
`notes` and carries no `reviewer` at all. Both modes write this same file.
|
|
503
503
|
|
|
504
504
|
```markdown
|
|
@@ -689,3 +689,5 @@ analyses, discovery-by-grep), `audit/` (audit plan and handoff).
|
|
|
689
689
|
|
|
690
690
|
`default_domain:` is the project's answer for every document that does not declare its own `domain:`. Whichever lens's `init` created the project seeds it; a later init never overwrites it, and an absent line resolves to `code` — so every project created before this field existed keeps behaving exactly as it did. It is written once, at project level, precisely so that the same tree gets **the same verdict from every installed lens**.
|
|
691
691
|
|
|
692
|
+
A course added to a marketing-default `ai_docs/` tree must mark both `vision/features/VISION_course_<slug>.md` and `solutions/ANALYSIS_course_<slug>.md` with `domain: course` and give the ANALYSIS a `C-` ID. Otherwise the untagged feature Vision is treated as marketing work. The project-wide Vision is shared across the four lenses.
|
|
693
|
+
|