@nextcommerce/campaigns-os 1.60.0 → 1.61.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 +126 -0
- package/README.md +5 -5
- package/agents/claude/CLAUDE.md +15 -0
- package/agents/codex/AGENTS.md +15 -0
- package/agents/copilot/copilot-instructions.md +15 -0
- package/agents/cursor/campaigns-os.mdc +15 -0
- package/compatibility.json +1 -1
- package/contracts/brand-theme-target-tokens.next-core.v0.json +95 -25
- package/contracts/campaign-cart-sdk-support-policy.v0.json +2 -2
- package/contracts/commerce-surface-catalog.json +27 -26
- package/contracts/release-ledger.json +768 -0
- package/contracts/supported-surface.json +4 -4
- package/contracts/template-brand-contract.shared-commerce.v0.json +1 -1
- package/docs/access-model.md +20 -0
- package/docs/brand-theme-bridge.md +62 -3
- package/docs/build-packet.md +28 -1
- package/docs/campaign-build-brief.md +16 -0
- package/docs/campaigns-os-build-flow.md +61 -2
- package/docs/campaignspec-authoring-examples.md +116 -0
- package/docs/design-source-package.md +46 -2
- package/docs/entry-points.md +188 -0
- package/docs/local-setup.md +1 -1
- package/docs/orientation-contract-reference.md +1 -1
- package/docs/polish-evidence.md +40 -2
- package/docs/qa-and-test-orders.md +50 -2
- package/docs/quickstart.md +438 -0
- package/docs/readback.md +119 -6
- package/docs/runtime-readiness.md +1 -1
- package/docs/sdk-storage-compatibility.md +3 -1
- package/docs/skills-revision.md +10 -10
- package/docs/source-adapters.md +213 -0
- package/package.json +10 -3
- package/schemas/campaign-design-source-package.v0.schema.json +8 -0
- package/schemas/campaigns-os-readback.v2.schema.json +177 -1
- package/schemas/source-html-manifest.v0.schema.json +3 -0
- package/skills/campaign-lifecycle-orientation/SKILL.md +3 -3
- package/skills/campaign-readback-classification/SKILL.md +3 -3
- package/skills/campaign-run-evidence/SKILL.md +3 -3
- package/skills/contribution-intake/SKILL.md +3 -3
- package/skills/next-campaigns-build/SKILL.md +4 -4
- package/skills/next-campaigns-os/SKILL.md +4 -3
- package/skills/next-campaigns-os-setup/SKILL.md +3 -3
- package/skills/next-campaigns-polish/SKILL.md +6 -9
- package/skills/next-campaigns-qa/SKILL.md +3 -3
- package/skills/next-campaigns-sdk-bump/SKILL.md +117 -24
- package/skills.json +11 -11
- package/src/brand-theme.mjs +413 -8
- package/src/brief-summary.mjs +6 -2
- package/src/browser-launch.mjs +2 -1
- package/src/build-brief.mjs +9 -2
- package/src/built-site-scope.mjs +2 -2
- package/src/cli.mjs +52 -13
- package/src/design-file-reference.mjs +93 -0
- package/src/design-source-package.mjs +55 -1
- package/src/doctor/checks.mjs +8 -74
- package/src/doctor/ci.mjs +112 -0
- package/src/doctor/inspect.mjs +18 -0
- package/src/doctor/source-provenance.mjs +74 -0
- package/src/evidence-debt.mjs +119 -0
- package/src/parity/compare.mjs +316 -0
- package/src/parity/design-access.mjs +54 -0
- package/src/parity/element-parity-record.mjs +569 -0
- package/src/parity/probe.mjs +205 -0
- package/src/parity/snapshot.mjs +110 -0
- package/src/png-header.mjs +87 -0
- package/src/polish-browser.mjs +186 -9
- package/src/polish-captures-record.mjs +52 -0
- package/src/polish-deadline.mjs +14 -0
- package/src/polish-gate.mjs +25 -6
- package/src/polish-node.mjs +81 -7
- package/src/polish-visual-fixtures.mjs +74 -0
- package/src/polish-visual.mjs +606 -0
- package/src/qa-analytics-correctness.mjs +14 -2
- package/src/qa-analytics-parity.mjs +94 -5
- package/src/qa-node.mjs +39 -6
- package/src/qc-accept.mjs +148 -6
- package/src/qc-check-registry.mjs +37 -1
- package/src/qc-results.mjs +404 -16
- package/src/readback.mjs +57 -13
- package/src/sdk-attribute-index.mjs +11 -11
- package/src/sdk-markup.mjs +77 -2
- package/src/sdk-storage-compatibility.mjs +94 -4
- package/src/source-html-manifest.mjs +7 -0
- package/src/source-html-server.mjs +129 -0
- package/src/stage-record.mjs +45 -7
- package/src/theme-gate.mjs +2 -2
- package/src/visual-diff.mjs +296 -0
- package/src/visual-reference.mjs +126 -0
|
@@ -8,7 +8,7 @@ npx --no-install campaigns-os sdk storage-check --target . --target-sdk 0.4.38 -
|
|
|
8
8
|
|
|
9
9
|
Omit `--json` for the concise human report. Exit 0 means source-compatible; exit 2 means incompatible or unknown; invalid arguments or manifests exit 1. No merchant files or pins are rewritten. This is independent of doctor's built HTML markup check.
|
|
10
10
|
|
|
11
|
-
The manifest is generated and owned by Campaign Cart, from its storage registry. The scanner has no independent SDK key list and fetches no remote code. Supply `docs/compatibility/storage-migrations.v1.json` from an unmodified checkout of a Campaign Cart release tag, v0.4.40 or later. The report records the full file SHA-256, SDK version, supported target range, registry/extractor/input digest, and Git provenance. When the supplied bytes equal their repository HEAD blob, provenance is `verified-git-blob` with commit and repository path. Proposed, modified, or copied manifests are labeled `unverified-local-file`; the label never certifies a release. Review/pin SDK provenance separately before acting on findings. A release manifest covers the target range it declares, which may end below its own SDK version: the v0.4.40 manifest, for example, covers 0.4.38 only. Targets outside the manifest's supported SDK range report unknown. A manifest whose SDK version is below its supported maximum is invalid.
|
|
11
|
+
The manifest is generated and owned by Campaign Cart, from its storage registry. The scanner has no independent SDK key list and fetches no remote code. Supply `docs/compatibility/storage-migrations.v1.json` from an unmodified checkout of a Campaign Cart release tag, v0.4.40 or later. The report records the full file SHA-256, SDK version, supported target range, registry/extractor/input digest, and Git provenance. When the supplied bytes equal their repository HEAD blob, provenance is `verified-git-blob` with commit and repository path. Proposed, modified, or copied manifests are labeled `unverified-local-file`; the label never certifies a release. Review/pin SDK provenance separately before acting on findings. A release manifest covers the target range it declares, which may end below its own SDK version: the v0.4.40 manifest, for example, covers 0.4.38 only. Targets outside the manifest's supported SDK range report unknown (exit 2), and the human report says so before anything else: its first line names the range the manifest covers and the requested target it does not, and the count line repeats it. With a v0.4.43 manifest, `--target-sdk 0.4.43` reads `checked against SDK 0.4.38, not the requested target 0.4.43`. `--json` carries `targetCovered: false`. A manifest whose SDK version is below its supported maximum is invalid.
|
|
12
12
|
|
|
13
13
|
`--target` must name the Git root. `--scope` is mandatory: comma-separated literal repository-relative directory/file paths; use `.` only when the complete repository is intended. Add shared JavaScript directories explicitly. `--exclude` uses the same syntax and records explicit exclusions. Archives receive no implicit exemption. Only Git-tracked `.html`, `.htm`, `.js`, `.mjs`, and `.cjs` files in the selected scope are scanned, using current working-tree bytes and per-file digests; untracked files and built dependencies are outside this evidence. A selected HTML page's local script outside the selected files reports unknown. In a Page Kit campaign (a page under `src/<slug>/`), a script src written `{{ 'js/x.js' | campaign_asset }}` resolves to `src/<slug>/assets/js/x.js`, as Page Kit serves it, and a page's frontmatter `scripts:` entries resolve the same way, since a layout's `{% for script in scripts %}` loop loads them through that filter. Any other `campaign_asset` value, a path that resolves outside the assets folder, and frontmatter that is not valid YAML or whose `scripts` is not a list of paths report unknown. Relative scripts affected by an HTML `<base href>` also report unknown; review their actual dependency paths. Remote SDK and third-party scripts are not fetched or analyzed.
|
|
14
14
|
|
|
@@ -16,6 +16,8 @@ Acorn parses JavaScript ASTs; parse5 identifies executable inline HTML scripts a
|
|
|
16
16
|
|
|
17
17
|
Dynamic storage keys, unresolved storage methods, shadowed storage names, missing migration release evidence, unsupported target versions, and JavaScript parse failures report unknown. This bounded analysis does not execute merchant code or prove computed keys correct. It does not follow arbitrary data flow, dynamic imports, event-handler attributes, generated code or runtime-loaded script graphs. Inspect unresolved findings and include all campaign sources in scope; a clean result is only static tracked source compatibility evidence. Browser behavior, order creation, tracking and analytics still require their own proof, especially where multiple campaigns share an origin. Use the SDK public store API where the manifest recommends it; do not invent a prefix-first merchant repair.
|
|
18
18
|
|
|
19
|
+
A `dynamic-key`, `unsupported-storage-method` or `storage-object-escape` line inside a loop, or an array callback such as `filter` or `forEach`, that tests a key it read from storage (a `k = sessionStorage.key(i)` variable, a `for…of Object.keys(sessionStorage)` or `for…in sessionStorage` variable, or the element parameter, the second for `reduce`, of a callback chained on `Object.keys(sessionStorage)`) with `k.indexOf('<prefix>') === 0` (or `!== 0`) or `k.startsWith('<prefix>')`, where the prefix is a scoped SDK key from the manifest (`next-cart-state` for `next-cart-state{__scope}`), ends in `[prefix loop: <prefix>]` and carries `prefixScan` in `--json`, when the line is where that key came from or reads that key by name. Other storage use in the loop, such as passing `sessionStorage` to a function, is not marked: the prefix test does not explain it. One note below the findings explains them all. Such a loop finds the SDK key with or without its scope suffix, so scoping alone does not break it. The lines still report unknown: Campaign Cart scopes these keys so campaigns on one origin cannot read each other's copy, and a prefix match reads whichever copy it meets first. Where the manifest names a public store for the key, as it does `useOrderStore` for `next-order`, the note names it too.
|
|
20
|
+
|
|
19
21
|
Storage `length` property reads are unaffected metadata (`storage-metadata-read`). Storage `key()` enumeration, extracted method references, and mutations of reserved members remain unknown; enumeration cannot prove an SDK key lookup safe. Git discovery failures return one bounded CLI error. Local script diagnostics retain repository-relative spellings from HTML source, including `../` paths; excluded/outside sources are not read. The Git root and operator target are compared by filesystem device/inode identity, so supported case aliases and symlinks can name the same root. Source containment uses realpaths below the Git root without case folding. Extra positional CLI arguments are rejected so an accidental scope or version value cannot silently disappear.
|
|
20
22
|
|
|
21
23
|
## Rewriting hardcoded pins in a static repo
|
package/docs/skills-revision.md
CHANGED
|
@@ -16,7 +16,7 @@ that the copy on disk moved.
|
|
|
16
16
|
`skills.json` carries one top-level field:
|
|
17
17
|
|
|
18
18
|
```json
|
|
19
|
-
"bundle_revision": "1.
|
|
19
|
+
"bundle_revision": "1.61.0+skills.1"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
The spelling is `<package version>+skills.<n>`:
|
|
@@ -25,7 +25,7 @@ The spelling is `<package version>+skills.<n>`:
|
|
|
25
25
|
skills ship with (`check-skill-versions.mjs` fails if the two disagree);
|
|
26
26
|
- `<n>` is a plain counter, not a semver component. It says "this is the *n*th
|
|
27
27
|
skill-text revision published against that package version" and it **resets
|
|
28
|
-
with the prefix**. `1.
|
|
28
|
+
with the prefix**. `1.61.0+skills.1` is therefore ahead of `1.40.0+skills.7`.
|
|
29
29
|
|
|
30
30
|
It is one identity for the bundle as a whole, on purpose. Per-skill versions
|
|
31
31
|
still exist and still gate per-skill changes, but an agent that loaded one skill
|
|
@@ -37,7 +37,7 @@ The first body line of every bundled `SKILL.md`, immediately after the
|
|
|
37
37
|
frontmatter, is exactly:
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
Bundle revision: 1.
|
|
40
|
+
Bundle revision: 1.61.0+skills.1
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
followed by a short paragraph telling the agent to run the check below at the
|
|
@@ -48,7 +48,7 @@ text the agent is actually reading, not from a file it would have to go and open
|
|
|
48
48
|
## The check
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
51
|
+
npx --no-install campaigns-os tooling status --skills-revision 1.61.0+skills.1
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
The value is compared against the bundle revision of the **CLI the command runs
|
|
@@ -90,20 +90,20 @@ reports the choice as `skills.scope` (`requested`, `installed_platforms`, or
|
|
|
90
90
|
"revision_check": "match",
|
|
91
91
|
"skills_revision": {
|
|
92
92
|
"status": "match",
|
|
93
|
-
"requested": "1.
|
|
93
|
+
"requested": "1.61.0+skills.1",
|
|
94
94
|
"spelling": "bundle",
|
|
95
|
-
"on_disk": "1.
|
|
95
|
+
"on_disk": "1.61.0+skills.1",
|
|
96
96
|
"on_disk_skill": null,
|
|
97
|
-
"message": "match (1.
|
|
97
|
+
"message": "match (1.61.0+skills.1)"
|
|
98
98
|
}
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
The text view prints one named line, as a header above the rest of the status:
|
|
102
102
|
|
|
103
103
|
```
|
|
104
|
-
Skills revision: match (1.
|
|
105
|
-
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.
|
|
106
|
-
Skills revision: unchecked (on disk 1.
|
|
104
|
+
Skills revision: match (1.61.0+skills.1)
|
|
105
|
+
Skills revision: mismatch: loaded 1.39.0+skills.1, on disk 1.61.0+skills.1 — start a fresh session
|
|
106
|
+
Skills revision: unchecked (on disk 1.61.0+skills.1)
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
`unchecked` is the state when the flag is absent. It is not an error — an
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Source Adapters
|
|
2
|
+
|
|
3
|
+
The current release uses `html_funnel`: prepared HTML/CSS/assets provided by the developer.
|
|
4
|
+
|
|
5
|
+
The adapter is deliberately explicit so the Build Packet, doctor, build, polish, deploy, and QA gates can reason about the source pages the same way every time.
|
|
6
|
+
|
|
7
|
+
> **Where does the source HTML come from?** That's the entry-point question, covered in a separate doc: [docs/entry-points.md](./entry-points.md) names the five recognized shapes (template-stock, Figma-driven, AI-generated, hand-authored, mixed) and explains how each populates the inputs this adapter consumes.
|
|
8
|
+
|
|
9
|
+
Source adapter inputs are compatibility contracts, not the final design-source
|
|
10
|
+
contract. `prepare-build` may translate them into Design Source Contributions in
|
|
11
|
+
the public Design Source Package while keeping the existing source-html manifest
|
|
12
|
+
available for current producers.
|
|
13
|
+
|
|
14
|
+
## `html_funnel`
|
|
15
|
+
|
|
16
|
+
Input:
|
|
17
|
+
|
|
18
|
+
- local folder
|
|
19
|
+
- one or more `.html` pages
|
|
20
|
+
- assets referenced by those pages
|
|
21
|
+
- explicit or inferred page mapping to CampaignSpec pages
|
|
22
|
+
- Page Kit target projection in `source_html.pages[].page_kit` after
|
|
23
|
+
`prepare-build`
|
|
24
|
+
|
|
25
|
+
When no source-html manifest exists, `prepare-build` may infer page mappings
|
|
26
|
+
from filenames. If more than one HTML file can satisfy the same active
|
|
27
|
+
CampaignSpec page, or if every matching file was already assigned to a sibling
|
|
28
|
+
page, Campaigns OS blocks `prepare_build`, records
|
|
29
|
+
`context.source.ambiguous_candidates`, and drafts
|
|
30
|
+
`context.source.manifest_draft`. Copy that draft to
|
|
31
|
+
`.campaigns-os/source-html-manifest.json`, choose the intended candidate path for
|
|
32
|
+
each ambiguous page, and rerun `start`/`prepare-build`. The fallback matcher
|
|
33
|
+
should not silently choose among ambiguous source or asset-mirror pages.
|
|
34
|
+
|
|
35
|
+
The `.html` files should be prepared for page-kit ingestion. This does not mean
|
|
36
|
+
"rewrite everything into Liquid." Page Kit source files are HTML files with
|
|
37
|
+
optional YAML frontmatter and optional Liquid filters/includes. Liquid is only
|
|
38
|
+
needed where the page must call page-kit helpers such as `campaign_link`,
|
|
39
|
+
`campaign_asset`, or `campaign_include`.
|
|
40
|
+
|
|
41
|
+
`source_html.pages[].path` is the source file path relative to the source root.
|
|
42
|
+
For mixed producers it may point at `figma-export/landing.html` or
|
|
43
|
+
`checkout/index.html`. Build agents should use the sibling `page_kit` block for
|
|
44
|
+
the target Page Kit file, route, CPK `page_type`, and frontmatter projection.
|
|
45
|
+
|
|
46
|
+
## Adapter Decisions
|
|
47
|
+
|
|
48
|
+
`prepare-build` records the reusable conversion contract in three places:
|
|
49
|
+
|
|
50
|
+
- `packet.source_html.adapter_contract`
|
|
51
|
+
- `context.adapter_decisions`
|
|
52
|
+
- `report.adapter_decisions`
|
|
53
|
+
|
|
54
|
+
These fields are intentionally machine-readable so doctor can name unfinished
|
|
55
|
+
work instead of relying on chat history. After the build, record each true
|
|
56
|
+
scalar choice with `record build --adapter-decision <key>=<value>`; put several
|
|
57
|
+
choices in one comma-separated flag. A repeated flag keeps only the last list.
|
|
58
|
+
`wrapper_policy` is selected at intake, not through this record flag.
|
|
59
|
+
|
|
60
|
+
- `raw_html_conversion_status`: wrapper stripping, frontmatter, asset moves,
|
|
61
|
+
script/style refs, CTA rewrites, route policy, and layout choice are still
|
|
62
|
+
`pending` until build records `completed` or `not_required` with
|
|
63
|
+
`record build --adapter-decision raw_html_conversion_status=<value>`.
|
|
64
|
+
- `source_asset_strategy`: page-kit campaigns should normally use
|
|
65
|
+
`pagekit_campaign_asset_root`, where `src/<slug>/assets/*` publishes as
|
|
66
|
+
`/<slug>/*`.
|
|
67
|
+
- `commerce_shell_adoption`: runtime commerce pages should be
|
|
68
|
+
`template_clone_first_verified` or `sdk_surfaces_preserved` before a completed
|
|
69
|
+
build handoff. `custom_html_experimental` is a doctor blocker on runtime
|
|
70
|
+
pages.
|
|
71
|
+
- `route_rewrite_policy`: record whether CampaignSpec routes and CTAs were
|
|
72
|
+
rewritten through campaign-aware routes/helpers.
|
|
73
|
+
- `template_files_copied`: records the selected template family as an atomic
|
|
74
|
+
slice. A complete/verified slice covers `pages`, `_includes`, `_layouts`,
|
|
75
|
+
`assets/css`, `assets/js`, and `frontmatter_vocabulary`; its `paths` are
|
|
76
|
+
target-repo-relative proof paths that doctor checks once assembly is complete.
|
|
77
|
+
- `config_script_strategy`: records how campaign config scripts load
|
|
78
|
+
(`campaign_asset`, `frontmatter_script`, `inline`, or `not_required`).
|
|
79
|
+
- `wrapper_policy`: records whether document wrappers were stripped, preserved,
|
|
80
|
+
or not required (`strip_document_wrappers`, `preserve_document_wrappers`,
|
|
81
|
+
`not_required`, `unknown`). Unlike the other decisions here, this one is
|
|
82
|
+
selectable before the build stage runs — see
|
|
83
|
+
[Selecting the wrapper policy at intake](#selecting-the-wrapper-policy-at-intake).
|
|
84
|
+
- `frontmatter_policy`: records whether Page Kit YAML frontmatter was created,
|
|
85
|
+
preserved, or intentionally not required.
|
|
86
|
+
- `script_style_reference_policy`: records whether scripts/styles were moved to
|
|
87
|
+
frontmatter, campaign assets, inline blocks, or raw passthrough.
|
|
88
|
+
- `cta_rewrite_policy`: records how CTA destinations were rewritten from
|
|
89
|
+
CampaignSpec routes.
|
|
90
|
+
- `layout_choice`: records the Page Kit layout strategy used for the prepared
|
|
91
|
+
source.
|
|
92
|
+
|
|
93
|
+
Raw AI-generated HTML normally needs this conversion pass before build:
|
|
94
|
+
|
|
95
|
+
1. Keep the page-owned body markup that represents the design intent.
|
|
96
|
+
2. Remove document wrappers such as `<!doctype>`, `<html>`, `<head>`, and `<body>` so the page can be wrapped by the campaign layout.
|
|
97
|
+
3. Add YAML frontmatter for `title`, the `page_kit.frontmatter.page_type`, route/permalink or `next_url`, and any `styles`/`scripts`.
|
|
98
|
+
4. Move reusable `<style>` blocks into `src/<slug>/assets/css/...` and reference them from frontmatter; keep tiny page-specific styles inline only when that matches the target campaign style.
|
|
99
|
+
5. Move referenced images/fonts/assets into the campaign asset tree and use `campaign_asset` when paths need to be campaign-rooted. Page Kit copies `src/<slug>/assets/*` to the campaign root in built output: `src/<slug>/assets/config.js` renders as `/<slug>/config.js`, and `src/<slug>/assets/products/foo.png` renders as `/<slug>/products/foo.png`. Do not leave raw `/assets/...` or `/<slug>/assets/...` references in rendered pages unless that nested `assets/` directory exists intentionally.
|
|
100
|
+
6. Replace internal page links and CTA destinations with CampaignSpec-derived routes, usually through `campaign_link`.
|
|
101
|
+
7. For checkout, upsell, downsell, receipt, payment, totals, and submit controls, preserve or recreate the starter-template SDK contract rather than trusting raw source commerce markup.
|
|
102
|
+
8. Run page-kit build and inspect `_site/<slug>/` for a complete body, expected meta tags, campaign-rooted links, and SDK runtime markers.
|
|
103
|
+
|
|
104
|
+
A single-file static landing page is a good source artifact, but it is not
|
|
105
|
+
automatically a complete page-kit page.
|
|
106
|
+
|
|
107
|
+
## Source preparation check
|
|
108
|
+
|
|
109
|
+
The preparation steps above used to be tacit knowledge; the doctor now checks
|
|
110
|
+
them deterministically (#262). The check runs as the `source_html.preparation`
|
|
111
|
+
slot in the Doctor Check Registry (phase `source`) on every mapped
|
|
112
|
+
`source_html.pages[].path` file, so `start` and `build` — which embed doctor —
|
|
113
|
+
gate on it before assembly, and a plain `campaigns-os doctor` re-checks the
|
|
114
|
+
current files after source edits. Blocking findings are doctor **errors**: they
|
|
115
|
+
set status `blocked` and make doctor's `next` block name the same stage the
|
|
116
|
+
`next` command would (`prepare-build` while the prepare-build stage records
|
|
117
|
+
the blockers, `doctor-blocked` otherwise), like any other unprepared input. The check is scoped to the certified template families'
|
|
118
|
+
page-kit ingestion expectations; it is not a general HTML linter.
|
|
119
|
+
|
|
120
|
+
| Code | Severity | Meaning and fix |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `source_html.prep.document_wrapper` | error (warning under a recorded `wrapper_policy: "preserve_document_wrappers"`) | A mapped source page is still a full browser document. Once the converted page-kit page exists at the page's `page_kit.output_path`, that page is checked instead of the design, since it is the file page-kit builds. Strip `<!doctype>`, `<html>`, `<head>`, and `<body>` so the campaign layout can wrap the page (conversion step 2; [docs/quickstart.md](./quickstart.md) "Prepare Raw HTML Source"), or record `preserve_document_wrappers` as an explicit adapter decision — the manifest `wrapper_policy` key or `--wrapper-policy`, see [Selecting the wrapper policy at intake](#selecting-the-wrapper-policy-at-intake). |
|
|
123
|
+
| `source_html.prep.frontmatter_residue` | error | Leftover or broken YAML frontmatter: a leading `---` fence that never closes, or a frontmatter block (page-kit keys such as `page_type:`, `next_url:`) embedded below content where page-kit would render it literally. Keep exactly one closed frontmatter block at the very top of the file, or none when the packet's `page_kit.frontmatter` projection supplies it (conversion step 3). |
|
|
124
|
+
| `source_html.prep.internal_link_unrooted` | warning | An internal link/CTA still targets a source file (`checkout.html`) instead of a CampaignSpec-derived route. Replace it, usually via `campaign_link` (conversion step 6). Warning rather than error because CTA rewrites are sanctioned build-stage work recorded under `cta_rewrite_policy`; the adapter gates own the completed-assembly block. |
|
|
125
|
+
|
|
126
|
+
### Selecting the wrapper policy at intake
|
|
127
|
+
|
|
128
|
+
`preserve_document_wrappers` is a real choice, so whoever hands over the source
|
|
129
|
+
can make it — without editing the Build Packet the build stage writes. Two
|
|
130
|
+
channels select it, both in the vocabulary above:
|
|
131
|
+
|
|
132
|
+
**The source-html manifest.** Declare it once, next to the pages it applies to,
|
|
133
|
+
in `.campaigns-os/source-html-manifest.json`:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"schema_version": "source-html-manifest/v0",
|
|
138
|
+
"wrapper_policy": "preserve_document_wrappers",
|
|
139
|
+
"pages": [{ "page_id": "landing", "path": "landing.html" }]
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**The CLI flag.** Select it per run on the command that prepares the build:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
campaigns-os prepare-build --spec <spec.json> --source <html-dir> \
|
|
147
|
+
--target <page-kit-dir> --template-family <family> \
|
|
148
|
+
--wrapper-policy preserve_document_wrappers
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
`start` and `build` take the same flag, since both run the prepare step.
|
|
152
|
+
|
|
153
|
+
**Order of operations.** Decide the wrapper policy before you capture
|
|
154
|
+
`source_screenshot` proof or record `source_hash`, because both describe the
|
|
155
|
+
file as it is handed over. `source_hash` is the sha256 of the source file at
|
|
156
|
+
manifest generation time; `doctor` recomputes it and reports
|
|
157
|
+
`source_html.pages.source_hash` when the file no longer matches. So under the
|
|
158
|
+
default `strip_document_wrappers` policy, strip first, then capture the
|
|
159
|
+
screenshots and compute the hashes of the stripped files. Under
|
|
160
|
+
`preserve_document_wrappers` nothing is stripped, the existing screenshots and
|
|
161
|
+
hashes stay valid, and the design-source gate and the preparation check read
|
|
162
|
+
the same file. Stripping after the manifest was written invalidates its hashes
|
|
163
|
+
and its screenshots, and a stripped page is no longer the standalone document
|
|
164
|
+
its `source_screenshot` proof was captured from.
|
|
165
|
+
|
|
166
|
+
**Precedence.** The flag wins over the manifest key, and with neither the
|
|
167
|
+
default is `strip_document_wrappers` — the same order the template family uses
|
|
168
|
+
for its CLI override and its spec hint (see
|
|
169
|
+
[docs/build-packet.md](./build-packet.md), "Authoring-Time Hints"). The
|
|
170
|
+
resolved value is written to
|
|
171
|
+
`source_html.adapter_contract.wrapper_policy` on the packet, and a non-default
|
|
172
|
+
selection is echoed on stderr with the channel that set it. A value outside the
|
|
173
|
+
vocabulary fails the run when it comes from the flag. From the manifest key it
|
|
174
|
+
does not: the manifest is used as written — `pages[]`, `producer_provenance`
|
|
175
|
+
and `files[]` all survive — the key alone is ignored, the default policy
|
|
176
|
+
applies, and one warning names the key, the value, and the accepted values.
|
|
177
|
+
Dropping a whole manifest over one optional hint would cost far more than the
|
|
178
|
+
hint is worth.
|
|
179
|
+
|
|
180
|
+
Selecting `preserve_document_wrappers` does not silence the finding: the
|
|
181
|
+
document wrappers are still reported on every page that carries them, as a
|
|
182
|
+
warning rather than a blocking error.
|
|
183
|
+
|
|
184
|
+
Asset-path rooting (raw `/assets/...` references, missing or out-of-root
|
|
185
|
+
files) stays owned by the prepare-build source asset crawl and its
|
|
186
|
+
`source_asset.*` codes (conversion step 5); the preparation check does not
|
|
187
|
+
duplicate them.
|
|
188
|
+
|
|
189
|
+
Known-unprepared and prepared reference fixtures live at
|
|
190
|
+
`fixtures/source-prep/`; `src/source-prep.test.mjs` and
|
|
191
|
+
`src/doctor-source-prep.test.mjs` pin each code and the pass path.
|
|
192
|
+
|
|
193
|
+
Wedge relevance: the Stage 0 wedge run protocol (#259) includes this check —
|
|
194
|
+
wedge runs treat a `source_html.prep.*` blocker as a classified workflow
|
|
195
|
+
signal at the source-preparation handoff, not founder-interpretation territory.
|
|
196
|
+
|
|
197
|
+
Checkout, cart, upsell, receipt, payment, totals, and submit behavior should remain governed by starter-template contracts and SDK wiring. Source files can carry page design, but live commerce behavior comes from the campaign setup and runtime surfaces.
|
|
198
|
+
|
|
199
|
+
If a source page marks a region as SDK-owned, for example with
|
|
200
|
+
`data-commerce-zone="checkout-form"` or comments like `SDK-OWNED: ... provided
|
|
201
|
+
by the limos checkout commerce surface`, treat that as an instruction to adopt
|
|
202
|
+
the selected starter-template family shell for that runtime surface. It is not
|
|
203
|
+
permission to invent a custom checkout shell and paste only borrowed partials
|
|
204
|
+
inside it. `prepare-build` records these regions in the Build Context, and
|
|
205
|
+
doctor warns until the build path has a clear shell-adoption decision.
|
|
206
|
+
|
|
207
|
+
Template families are not single-file dependencies. If setup copies a starter
|
|
208
|
+
family into a target campaign, copy the matching pages together with their
|
|
209
|
+
family `_includes/`, `_layouts/`, `assets/css/`, and `assets/js/` dependencies.
|
|
210
|
+
Copying only `checkout.html` and `receipt.html` can leave Liquid includes,
|
|
211
|
+
layouts, CSS, or JavaScript unresolved. Record the copied or verified target
|
|
212
|
+
paths in `template_files_copied.paths`; a completed report with missing paths is
|
|
213
|
+
not doctor-clean.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextcommerce/campaigns-os",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.61.0",
|
|
4
4
|
"description": "Toolkit for agent-assisted NEXT campaign builds.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -104,7 +104,9 @@
|
|
|
104
104
|
"yaml": "^2.9.1"
|
|
105
105
|
},
|
|
106
106
|
"optionalDependencies": {
|
|
107
|
-
"
|
|
107
|
+
"pixelmatch": "^7.2.0",
|
|
108
|
+
"playwright": "^1.63.0",
|
|
109
|
+
"pngjs": "^7.0.0"
|
|
108
110
|
},
|
|
109
111
|
"devDependencies": {
|
|
110
112
|
"typescript": "^5.9.3"
|
|
@@ -153,6 +155,11 @@
|
|
|
153
155
|
"docs/progress-snapshots.md",
|
|
154
156
|
"demo",
|
|
155
157
|
"docs/demo-preview.md",
|
|
156
|
-
"docs/local-setup.md"
|
|
158
|
+
"docs/local-setup.md",
|
|
159
|
+
"docs/quickstart.md",
|
|
160
|
+
"docs/access-model.md",
|
|
161
|
+
"docs/entry-points.md",
|
|
162
|
+
"docs/source-adapters.md",
|
|
163
|
+
"docs/campaignspec-authoring-examples.md"
|
|
157
164
|
]
|
|
158
165
|
}
|
|
@@ -272,8 +272,15 @@
|
|
|
272
272
|
"sha256": { "$ref": "#/$defs/sha256" },
|
|
273
273
|
"role": { "type": "string", "minLength": 1 },
|
|
274
274
|
"media_type": { "type": "string", "minLength": 1 },
|
|
275
|
+
"design_file_type": { "type": "string", "minLength": 1, "pattern": "\\S" },
|
|
275
276
|
"notes": { "type": ["string", "null"] }
|
|
276
277
|
},
|
|
278
|
+
"allOf": [
|
|
279
|
+
{
|
|
280
|
+
"if": { "properties": { "design_file_type": true }, "required": ["design_file_type"] },
|
|
281
|
+
"then": { "properties": { "role": { "const": "design_file" } }, "required": ["role"] }
|
|
282
|
+
}
|
|
283
|
+
],
|
|
277
284
|
"anyOf": [
|
|
278
285
|
{ "properties": { "path": true }, "required": ["path"] },
|
|
279
286
|
{ "properties": { "url": true }, "required": ["url"] }
|
|
@@ -460,6 +467,7 @@
|
|
|
460
467
|
"screenshot_refs": { "$ref": "#/$defs/stringList" },
|
|
461
468
|
"reference_refs": { "$ref": "#/$defs/stringList" },
|
|
462
469
|
"template_reference_id": { "type": "string", "minLength": 1 },
|
|
470
|
+
"derived_from": { "type": "string", "minLength": 1, "pattern": "\\S" },
|
|
463
471
|
"notes": { "type": ["string", "null"] }
|
|
464
472
|
},
|
|
465
473
|
"allOf": [
|
|
@@ -44,12 +44,188 @@
|
|
|
44
44
|
"description": "Where two artifacts record different states for one stage: the assembly report calls a stage completed while the QA verdict fails an assertion whose id is namespaced to that stage. One record per stage, in the order the failures were seen. The readback reports the disagreement and does not adjudicate it. This too is the readback's own layer.",
|
|
45
45
|
"items": { "$ref": "#/$defs/divergence" }
|
|
46
46
|
},
|
|
47
|
+
"evidence_debt": {
|
|
48
|
+
"description": "Optional additive build-binding assessment emitted by current readback in JSON and text. Reads built bytes without timestamps, processes, writes or network. It does not rerun stages or reinterpret verdicts; unknown never establishes no debt.",
|
|
49
|
+
"type": "object",
|
|
50
|
+
"additionalProperties": true,
|
|
51
|
+
"required": [
|
|
52
|
+
"polish",
|
|
53
|
+
"qa",
|
|
54
|
+
"changes"
|
|
55
|
+
],
|
|
56
|
+
"properties": {
|
|
57
|
+
"polish": {
|
|
58
|
+
"$ref": "#/$defs/evidence_debt_stage"
|
|
59
|
+
},
|
|
60
|
+
"qa": {
|
|
61
|
+
"$ref": "#/$defs/evidence_debt_stage"
|
|
62
|
+
},
|
|
63
|
+
"changes": {
|
|
64
|
+
"$ref": "#/$defs/evidence_debt_changes"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
47
68
|
"clean": {
|
|
48
69
|
"type": "boolean",
|
|
49
|
-
"description": "True only when every artifact the readback found is loaded or absent (never unreadable or unrecognized), staleness is computable and NO loaded artifact is stale, staleness.unparseable_keys is empty (no loaded artifact recorded an age the readback could not read), divergences is empty,
|
|
70
|
+
"description": "True only when every artifact the readback found is loaded or absent (never unreadable or unrecognized), staleness is computable and NO loaded artifact is stale, staleness.unparseable_keys is empty (no loaded artifact recorded an age the readback could not read), divergences is empty, doctor.error_count is zero, and neither evidence_debt stage is owed (any owed Polish or QA stage makes clean false). Unknown debt alone does not make clean false; consumers must inspect evidence_debt even when clean is true. A readback-integrity flag, not a verdict: a blocked QA verdict whose artifacts all read cleanly is still clean, because the readback saw exactly what Campaigns OS recorded. docs/readback.md states the rule and its limits."
|
|
50
71
|
}
|
|
51
72
|
},
|
|
52
73
|
"$defs": {
|
|
74
|
+
"build_fingerprint": {
|
|
75
|
+
"type": [
|
|
76
|
+
"string",
|
|
77
|
+
"null"
|
|
78
|
+
],
|
|
79
|
+
"minLength": 1
|
|
80
|
+
},
|
|
81
|
+
"evidence_debt_stage": {
|
|
82
|
+
"type": "object",
|
|
83
|
+
"additionalProperties": true,
|
|
84
|
+
"required": [
|
|
85
|
+
"status",
|
|
86
|
+
"matches_current_build",
|
|
87
|
+
"recorded_build_fingerprint",
|
|
88
|
+
"current_build_fingerprint",
|
|
89
|
+
"reason"
|
|
90
|
+
],
|
|
91
|
+
"properties": {
|
|
92
|
+
"status": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"enum": [
|
|
95
|
+
"current",
|
|
96
|
+
"owed",
|
|
97
|
+
"unknown"
|
|
98
|
+
],
|
|
99
|
+
"description": "current: the stage binding matches current built bytes, the assembly fingerprint is available, and the stage is not required. owed: the binding differs or the lifecycle requires the stage again. unknown: the packet, the built output or the assembly fingerprint is unavailable, which takes precedence over owed even for a required stage, or the stage fingerprint is missing on a stage that is not required; unknown never means no debt."
|
|
100
|
+
},
|
|
101
|
+
"matches_current_build": {
|
|
102
|
+
"type": [
|
|
103
|
+
"boolean",
|
|
104
|
+
"null"
|
|
105
|
+
],
|
|
106
|
+
"description": "Fingerprint equality, or null when either fingerprint is absent. A true value does not cancel lifecycle debt."
|
|
107
|
+
},
|
|
108
|
+
"recorded_build_fingerprint": {
|
|
109
|
+
"$ref": "#/$defs/build_fingerprint",
|
|
110
|
+
"description": "The stage binding: Polish source_build_fingerprint (top-level before evidence); QA evidence.qc_build_fingerprint before source_build_fingerprint."
|
|
111
|
+
},
|
|
112
|
+
"current_build_fingerprint": {
|
|
113
|
+
"$ref": "#/$defs/build_fingerprint"
|
|
114
|
+
},
|
|
115
|
+
"reason": {
|
|
116
|
+
"enum": [
|
|
117
|
+
null,
|
|
118
|
+
"build_fingerprint_changed",
|
|
119
|
+
"stage_required_by_build",
|
|
120
|
+
"stage_required_by_brief",
|
|
121
|
+
"stage_required_by_spec",
|
|
122
|
+
"stage_required",
|
|
123
|
+
"packet_unavailable",
|
|
124
|
+
"build_output_location_unknown",
|
|
125
|
+
"build_output_missing",
|
|
126
|
+
"build_output_unreadable",
|
|
127
|
+
"assembly_build_fingerprint_missing",
|
|
128
|
+
"stage_build_fingerprint_missing"
|
|
129
|
+
],
|
|
130
|
+
"description": "Null for current. Owed names a changed binding or the recorded required_by cause (build, brief, spec, or unspecified). Unknown names the unavailable input or fingerprint."
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"evidence_debt_changes": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"additionalProperties": true,
|
|
137
|
+
"description": "Current built output compared with the retained assembly manifest, which need not be the build an older stage reviewed. Empty lists under unknown do not establish that no files changed; older stage manifests are not reconstructed.",
|
|
138
|
+
"required": [
|
|
139
|
+
"status",
|
|
140
|
+
"reason",
|
|
141
|
+
"recorded_build_fingerprint",
|
|
142
|
+
"current_build_fingerprint",
|
|
143
|
+
"changed_pages",
|
|
144
|
+
"unmapped_files",
|
|
145
|
+
"extra",
|
|
146
|
+
"missing",
|
|
147
|
+
"changed"
|
|
148
|
+
],
|
|
149
|
+
"properties": {
|
|
150
|
+
"status": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"enum": [
|
|
153
|
+
"known",
|
|
154
|
+
"unknown"
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"reason": {
|
|
158
|
+
"enum": [
|
|
159
|
+
null,
|
|
160
|
+
"packet_unavailable",
|
|
161
|
+
"build_output_location_unknown",
|
|
162
|
+
"build_output_missing",
|
|
163
|
+
"build_output_unreadable",
|
|
164
|
+
"assembly_build_fingerprint_missing",
|
|
165
|
+
"build_output_pages_unresolved",
|
|
166
|
+
"build_manifest_unavailable"
|
|
167
|
+
],
|
|
168
|
+
"description": "Null when known. Missing or unusable manifest and unresolved page map make changes unknown independently of stage binding status."
|
|
169
|
+
},
|
|
170
|
+
"recorded_build_fingerprint": {
|
|
171
|
+
"$ref": "#/$defs/build_fingerprint",
|
|
172
|
+
"description": "The retained assembly baseline fingerprint."
|
|
173
|
+
},
|
|
174
|
+
"current_build_fingerprint": {
|
|
175
|
+
"$ref": "#/$defs/build_fingerprint"
|
|
176
|
+
},
|
|
177
|
+
"changed_pages": {
|
|
178
|
+
"type": "array",
|
|
179
|
+
"description": "Added, removed or modified HTML pages in sorted built-path order, using route-derived page identities. Removed HTML uses the same route projection. Paths are relative to _site/<public_route_slug>/.",
|
|
180
|
+
"items": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"additionalProperties": true,
|
|
183
|
+
"required": [
|
|
184
|
+
"page_id",
|
|
185
|
+
"built_path"
|
|
186
|
+
],
|
|
187
|
+
"properties": {
|
|
188
|
+
"page_id": {
|
|
189
|
+
"type": "string",
|
|
190
|
+
"minLength": 1
|
|
191
|
+
},
|
|
192
|
+
"built_path": {
|
|
193
|
+
"type": "string",
|
|
194
|
+
"minLength": 1
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
"unmapped_files": {
|
|
200
|
+
"type": "array",
|
|
201
|
+
"items": {
|
|
202
|
+
"type": "string"
|
|
203
|
+
},
|
|
204
|
+
"description": "Sorted differing paths outside the built page map, including shared CSS, scripts and assets."
|
|
205
|
+
},
|
|
206
|
+
"extra": {
|
|
207
|
+
"type": "array",
|
|
208
|
+
"items": {
|
|
209
|
+
"type": "string"
|
|
210
|
+
},
|
|
211
|
+
"description": "Complete sorted paths added since the retained manifest, relative to the built output root."
|
|
212
|
+
},
|
|
213
|
+
"missing": {
|
|
214
|
+
"type": "array",
|
|
215
|
+
"items": {
|
|
216
|
+
"type": "string"
|
|
217
|
+
},
|
|
218
|
+
"description": "Complete sorted paths removed since the retained manifest, relative to the built output root."
|
|
219
|
+
},
|
|
220
|
+
"changed": {
|
|
221
|
+
"type": "array",
|
|
222
|
+
"items": {
|
|
223
|
+
"type": "string"
|
|
224
|
+
},
|
|
225
|
+
"description": "Complete sorted paths modified since the retained manifest, relative to the built output root."
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
},
|
|
53
229
|
"artifact_key": {
|
|
54
230
|
"type": "string",
|
|
55
231
|
"enum": ["packet", "doctor", "context", "report", "qa_verdict", "findings"]
|
|
@@ -139,6 +139,9 @@
|
|
|
139
139
|
"minLength": 1,
|
|
140
140
|
"description": "Active CampaignSpec page id. This is the primary join key."
|
|
141
141
|
},
|
|
142
|
+
"design_file": {
|
|
143
|
+
"description": "Optional design-file authority behind this page's HTML export, normally {type?, file_url, breakpoints?: {desktop?, tablet?, mobile?}}. Deliberately unconstrained: the runtime accepts every JSON value here, warns on unusable declarations or frame links and ignores them without rejecting the manifest. Usable file_url values parse as absolute HTTPS URLs (scheme case-insensitive)."
|
|
144
|
+
},
|
|
142
145
|
"path": {
|
|
143
146
|
"type": "string",
|
|
144
147
|
"minLength": 1,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-lifecycle-orientation
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.46
|
|
4
4
|
description: Orient a reader to the Campaigns OS lifecycle artifacts a run has already emitted, without advancing any stage or changing any state.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.61.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.61.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-readback-classification
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.46
|
|
4
4
|
description: Classify a selected campaign from the readback projection's v2 fields and write a read-only handoff without turning diagnosis into permission.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.61.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.61.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: campaign-run-evidence
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.46
|
|
4
4
|
description: Interpret existing Campaigns OS doctor, QA and proof-depth evidence without claiming more proof than the artifacts contain.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.61.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.61.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: contribution-intake
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.46
|
|
4
4
|
description: Turn a suggestion about the agent surface into a classified, evidence-checked proposal and, only with attended approval, one issue on this repository's tracker.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Bundle revision: 1.
|
|
8
|
-
Run `npx --no-install campaigns-os tooling status --skills-revision 1.
|
|
7
|
+
Bundle revision: 1.61.0+skills.1
|
|
8
|
+
Run `npx --no-install campaigns-os tooling status --skills-revision 1.61.0+skills.1`
|
|
9
9
|
from the campaign's Page Kit folder, where it runs the project's pinned copy and
|
|
10
10
|
never installs one, at the start of each task. Start a fresh session if it
|
|
11
11
|
reports `mismatch`: this text is already in your context and is never re-read
|