@profile-as-code/cli 0.2.0 → 0.3.5
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/README.md +119 -24
- package/dist/index.js +3620 -803
- package/package.json +13 -8
- package/skills/README.md +62 -0
- package/skills/github-org/SKILL.md +92 -0
- package/skills/github-org/checks.yaml +40 -0
- package/skills/github-org/playbook.md +30 -0
- package/skills/github-org/research/SOTA-2026.md +39 -0
- package/skills/github-readme/SKILL.md +114 -0
- package/skills/github-readme/checks.yaml +32 -0
- package/skills/github-readme/playbook.md +36 -0
- package/skills/github-readme/research/SOTA-2026.md +105 -0
- package/skills/hotmart/SKILL.md +150 -0
- package/skills/hotmart/checks.yaml +43 -0
- package/skills/hotmart/playbook.md +53 -0
- package/skills/hotmart/research/SOTA-2026.md +142 -0
- package/skills/kofi/SKILL.md +127 -0
- package/skills/kofi/checks.yaml +42 -0
- package/skills/kofi/playbook.md +47 -0
- package/skills/kofi/research/SOTA-2026.md +160 -0
- package/skills/linkedin/post.md +50 -0
- package/skills/linkedin/posting.yaml +23 -0
- package/skills/x/post.md +46 -0
- package/skills/x/posting.yaml +24 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `@profile-as-code/cli` — `pasco`
|
|
2
2
|
|
|
3
|
-
The `pasco` CLI — `@profile-as-code/cli
|
|
3
|
+
The `pasco` CLI — `@profile-as-code/cli`. Consumes `@profile-as-code/core`
|
|
4
4
|
(`load`/`driftCheck`/`geoCheck`/`compile`) — it never re-implements them. The
|
|
5
5
|
contract source is `schema/profile.schema.json` (D3); Zod is generated in core.
|
|
6
6
|
|
|
@@ -8,18 +8,50 @@ contract source is `schema/profile.schema.json` (D3); Zod is generated in core.
|
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
npm i -g @profile-as-code/cli # the package
|
|
11
|
-
pasco --version # the bin —
|
|
11
|
+
pasco --version # the bin — prints the installed version
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
`@profile-as-code/cli` is the **package**; `pasco` is the **bin** it installs.
|
|
15
15
|
The install adds one global bin and nothing else: no post-install script, no
|
|
16
16
|
server, no account.
|
|
17
17
|
|
|
18
|
-
> **
|
|
19
|
-
>
|
|
20
|
-
>
|
|
21
|
-
> (
|
|
22
|
-
>
|
|
18
|
+
> **Published** [OFICIAL] [WEB: registry.npmjs.org, checked 2026-10-12]:
|
|
19
|
+
> `@profile-as-code/cli` is public on npm — the registry is the source of truth
|
|
20
|
+
> (`npm view @profile-as-code/cli version`). The current release is `0.3.0`
|
|
21
|
+
> (published 2026-10-11T03:43:27Z, dist-tag `latest`; tag `v0.3.0` → `21e4cde`)
|
|
22
|
+
> and the bin was verified running (`node packages/cli/dist/index.js --version`
|
|
23
|
+
> → `pasco 0.3.0` on `main`, 2026-10-12) — a **local-build** check, not a run of the
|
|
24
|
+
> published tarball. No published version carries a
|
|
25
|
+
> provenance attestation while the source repo is private — documented, not pending.
|
|
26
|
+
> Source install: [User Guide §2](../../docs/USER-GUIDE.md#2-install-the-pasco-cli).
|
|
27
|
+
|
|
28
|
+
## Get a workspace
|
|
29
|
+
|
|
30
|
+
`pasco` reads a **workspace folder** (`content/*.yaml` + `.pascorc`) by configured
|
|
31
|
+
path. That folder does not have to be a git repository, and it does not have to live
|
|
32
|
+
on GitHub — a repo is the **recommended** place to keep it, not a requirement
|
|
33
|
+
([SPEC §9](../../docs/SPEC.md)). Three on-ramps, each with its capability difference
|
|
34
|
+
stated up front:
|
|
35
|
+
|
|
36
|
+
| On-ramp | What you get | Automation + history | Account + repo |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| **Template repo** *(recommended)* | the complete example workspace, operational docs, licence, repo automation | yes | **required** |
|
|
39
|
+
| **`pasco init`** (this package) | a minimal validating folder in seconds | **no** — nothing runs on a change and nothing versions it | **none** |
|
|
40
|
+
| **Bring your own storage** | the same `pasco init` scaffold, written at a path you choose (local disk, a synced folder, another git host) | same as `pasco init` | **none** |
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
pasco init ~/profile-data-me # person flavor (default); brand: --flavor brand
|
|
44
|
+
pasco validate # run from the workspace root
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The two no-account on-ramps keep the whole engine command set except `pasco diff`
|
|
48
|
+
(which needs a git history). What they lose is the template's automation and
|
|
49
|
+
history — `pasco init` is minimal on purpose, and the complete package lives in
|
|
50
|
+
the template. **Where each on-ramp is discovered:** the template repo's own README,
|
|
51
|
+
this package page, and — in the repository — the
|
|
52
|
+
[User Guide §3](../../docs/USER-GUIDE.md#3-create-your-workspace-profile-data-username)
|
|
53
|
+
(EN). Links into `docs/` resolve in the repository, not on this npm page: the two
|
|
54
|
+
commands above are the standalone path.
|
|
23
55
|
|
|
24
56
|
## Commands
|
|
25
57
|
|
|
@@ -27,27 +59,64 @@ server, no account.
|
|
|
27
59
|
|---|---|---|
|
|
28
60
|
| `pasco init [dir]` | Scaffold a profile-data workspace (`content/identity.yaml`, `README.md`, `.pascorc`) — `pasco validate`-clean | ✅ |
|
|
29
61
|
| `pasco validate [--json]` | Schema **fail** (exit 1) + drift/geo **warn** (exit 0) — D12 | ✅ |
|
|
30
|
-
| `pasco build [platform] [--lang]` | Deterministic base texts per platform+lang; platforms with a renderer (
|
|
62
|
+
| `pasco build [platform] [--lang]` | Deterministic base texts per platform+lang; platforms with a renderer (the eight registered in the generated renderer map) write `profiles/<platform>/README.md` + bundled media; renderer-less manual surfaces with a bio row write `profiles/<platform>.md` (#239). Empty render = no-trace unbuild of the generated output, preserving `profiles/<platform>/variants/` (chosen-variant input, #238; pure profiles/, §15.1 — v1.7). Media in `profiles/<platform>/assets/` + `assets/manifest.json` (M8/§18.6 — see `docs/media-pipeline.md`) | ✅ |
|
|
31
63
|
| `pasco diff [--json]` | Changes since the last `release-*` tag (git-based → CHANGELOG hint) | ✅ |
|
|
32
|
-
| `pasco status [platform] [--mark <ledgerKey> <surface>] [--write-checklist]` | Per-entry deploy report — origin · surfaces · in-sync/stale/never + ledger write
|
|
33
|
-
| `pasco refine <platform> [--lang] [--variants N] [--choose <id>]` | Agent-driven variant flow (D10/D11/D13) | 🚧 template + `--choose` (full flow M3) |
|
|
34
|
-
| `pasco check [platform]` | User checks from `content/checks.yaml` (schema-validated catalog) + registry rules (M7/§18.8) + media-transport rules (M8/§18.6) | 🚧 offline rules today (catalog M3/M4) |
|
|
35
|
-
| `pasco
|
|
64
|
+
| `pasco status [platform] [--mark <ledgerKey> <surface>] [--verify] [--write-checklist] [--completeness]` | Per-entry deploy report — origin · surfaces · in-sync/stale/never · **certification** (verified/attested/unverifiable/out-of-band-drift, §19.5) + the derived **publication truth** per surface (§20.1, #242) + ledger write paths (D18, §19) | ✅ |
|
|
65
|
+
| `pasco refine <platform> [--lang] [--variants N] [--choose <id>]` | Agent-driven variant flow (D10/D11/D13); the chosen body is `profiles/<platform>/variants/<id>.md` (a complete platform artifact), rendered by `pasco build` (#238) | 🚧 template + `--choose` (full flow M3) |
|
|
66
|
+
| `pasco check [platform]` | User checks from `content/checks.yaml` (schema-validated catalog) + registry rules (M7/§18.8) + media-transport rules (M8/§18.6) + offline `max-chars`/`min-chars` over headlines/bios (#240) | 🚧 offline rules today (limits + registry + media; remaining catalog M3/M4) |
|
|
67
|
+
| `pasco post <seed\|task\|choose\|check\|export\|import\|list>` | Week-1 post MVP (#264): a seed at `posts/<seed>/seed.md` → task bundle → chosen variant → check → optional Postiz draft payload; the CLI never calls an LLM | 🚧 experiment (not in the v1 contract; `docs/post-mvp.md`) |
|
|
68
|
+
| `pasco skills:export <dir> [--force] [--list]` | Copy the platform skills this package ships into a directory you name (`--list` shows them; no per-agent paths are invented — #254) | ✅ |
|
|
36
69
|
|
|
37
70
|
The partial commands are explicit, and each one says what still owns the rest:
|
|
38
71
|
|
|
39
72
|
- **`refine`** — without `--choose` it emits the **agent task template** the
|
|
40
73
|
executing agent works from (the CLI never calls an LLM and never wires the hub);
|
|
41
|
-
`--choose` records the pick in `content/active.yaml`. The
|
|
42
|
-
|
|
74
|
+
`--choose` records the pick in `content/active.yaml`. The platform skill ships
|
|
75
|
+
**inside this package**, so the template prints its real path on an npm install
|
|
76
|
+
(and says `no skill for <platform>` vs `skills not shipped` distinctly —
|
|
77
|
+
#253). The full variant flow is M3 (`src/commands/refine.ts`).
|
|
43
78
|
- **`check`** — executes the offline rules that exist today: the brand handle
|
|
44
|
-
matrix (brand flavor only, D15/§17), the evidence-registry checks (M7/§18.8)
|
|
45
|
-
|
|
46
|
-
`content/checks.yaml`
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
79
|
+
matrix (brand flavor only, D15/§17), the evidence-registry checks (M7/§18.8),
|
|
80
|
+
the media-transport rules (M8/§18.6), and the `max-chars` / `min-chars` rows
|
|
81
|
+
declared in `content/checks.yaml` over the headline/bio rows that exist
|
|
82
|
+
(offline, warn-class, #240). The remaining per-platform rules in the catalog
|
|
83
|
+
ship with the skills `checks.yaml` union (M3) and the full `pasco check` (M4).
|
|
84
|
+
It prints its `owner` line (`src/commands/check.ts`).
|
|
85
|
+
- **`skills:export`** — copies the platform skills this package ships into the
|
|
86
|
+
directory the user names (`--list` first; an existing non-empty directory needs
|
|
87
|
+
`--force`). It replaces the earlier projection stub: the CLI never invents a
|
|
88
|
+
per-agent destination and never points at tooling the reader cannot open
|
|
89
|
+
(`src/commands/skills-export.ts`, #254).
|
|
90
|
+
- **`post`** — the week-1 experiment (#264/#265): a CLI subcommand family over
|
|
91
|
+
the `posts/` store; it never calls an LLM, emits the agent task, records the
|
|
92
|
+
choice, checks limits/URLs/refs and exports a Postiz draft. It reads the
|
|
93
|
+
`skills/` bundled with the package (set `PASCO_SKILLS_DIR` only to point at a
|
|
94
|
+
custom tree), and it is **not part of the v1 contract yet** (`docs/post-mvp.md`).
|
|
95
|
+
|
|
96
|
+
### Publication truth (derived — SPEC §20.1, #242)
|
|
97
|
+
|
|
98
|
+
The `status` report ends with one line per surface that has a ledger record or an
|
|
99
|
+
artifact on disk (`--completeness` prints the coverage phrase only; `--selection`
|
|
100
|
+
is a different view, and `--mark`/`--verify` are the write paths):
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
github-readme: in-sync · artifact: matches-SSOT · limits: ok
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- `sync` — the §19 ledger (`in-sync` / `stale` / `never`), unchanged.
|
|
107
|
+
- `artifact` — the artifact on disk vs what the SSOT renders **today**
|
|
108
|
+
(`matches-SSOT` / `diverges` / `absent`). Offline: no fetch. `pasco build`
|
|
109
|
+
repairs a divergence; §19.5's `out-of-band-drift` (a live page that no longer
|
|
110
|
+
matches) forces `diverges` and is found by the opt-in `--verify`.
|
|
111
|
+
- `limits` — the offline `max-chars` catalog (§18.8/#240); the finding is printed
|
|
112
|
+
under the line with its cited source.
|
|
113
|
+
|
|
114
|
+
It is **derived and never stored**: `--json` carries it as the additive
|
|
115
|
+
`publication` array, `--completeness` folds it in as *coverage of publication*
|
|
116
|
+
(the weighted percentage never moves because a surface drifted), and
|
|
117
|
+
`--write-checklist` writes the coverage phrase into the generated `CHECKLIST.md`.
|
|
118
|
+
The path is `src/publication.ts` (one home for artifact resolution and the three
|
|
119
|
+
axes) and `src/limits.ts` (the cap executor `check` and `status` share).
|
|
51
120
|
|
|
52
121
|
## Usage
|
|
53
122
|
|
|
@@ -59,12 +128,23 @@ pasco build github-readme --lang en
|
|
|
59
128
|
pasco diff
|
|
60
129
|
pasco status # what's published where — per entry
|
|
61
130
|
pasco status linkedin # filter one surface
|
|
62
|
-
pasco status --mark identity linkedin # confirm a paste (records the current contentHash)
|
|
131
|
+
pasco status --mark identity linkedin # confirm a paste (records the current contentHash + attested)
|
|
132
|
+
pasco status --verify # §19.5 C1: does the live page still match? (the only network path)
|
|
133
|
+
# a surface with no extractor reports unverifiable: no-extractor
|
|
134
|
+
# (a DECLARED reason is stated, never written: only an attempt is recorded)
|
|
63
135
|
pasco status --write-checklist # regenerate CHECKLIST.md from the ledger
|
|
136
|
+
pasco status # …also prints the derived publication-truth line:
|
|
137
|
+
# github-readme: in-sync · artifact: matches-SSOT · limits: ok
|
|
64
138
|
pasco refine linkedin --variants 3 # emits the agent task template (full flow M3)
|
|
65
139
|
pasco refine linkedin --choose li-en-2 # records the chosen variant in content/active.yaml
|
|
66
140
|
pasco check github-readme
|
|
67
|
-
pasco
|
|
141
|
+
pasco post seed demo --text seed.md # week-1 experiment: posts/<seed>/seed.md
|
|
142
|
+
pasco post task demo --channel linkedin,x # task bundles (no LLM call)
|
|
143
|
+
pasco post choose demo --channel linkedin --variant linkedin-1
|
|
144
|
+
pasco post check demo # limits + URLs + {{fact:...}} refs
|
|
145
|
+
pasco post export demo --target postiz # POST /posts draft payload
|
|
146
|
+
pasco skills:export --list # skill channels shipped with this package
|
|
147
|
+
pasco skills:export ./pasco-skills # copy them to a directory you choose
|
|
68
148
|
```
|
|
69
149
|
|
|
70
150
|
## Workspace resolution (D14)
|
|
@@ -78,10 +158,25 @@ file) > current directory.
|
|
|
78
158
|
{
|
|
79
159
|
"workspace": ".",
|
|
80
160
|
"defaults": { "lang": "en", "variants": 3 },
|
|
81
|
-
"diff": { "tagPattern": "release-*" }
|
|
161
|
+
"diff": { "tagPattern": "release-*" },
|
|
162
|
+
"completeness": {
|
|
163
|
+
"target": "github-milestone",
|
|
164
|
+
"langs": ["en", "es"],
|
|
165
|
+
"items": [
|
|
166
|
+
{ "id": "deployment", "weight": 0 },
|
|
167
|
+
{ "id": "geoAnchors", "weight": 0.4 }
|
|
168
|
+
]
|
|
169
|
+
}
|
|
82
170
|
}
|
|
83
171
|
```
|
|
84
172
|
|
|
173
|
+
The `completeness` block is the policy for `pasco status --completeness` (issue
|
|
174
|
+
#102): `target` names the milestone; `langs` sets which languages text coverage is
|
|
175
|
+
measured in; `items` overrides the shipped weights per catalog id (a weight of `0`
|
|
176
|
+
drops the item from the percentage). Every field is optional — omitted fields use
|
|
177
|
+
`DEFAULT_COMPLETENESS_POLICY`. The percentage itself is **derived** and never
|
|
178
|
+
written to the workspace; only this policy is stored.
|
|
179
|
+
|
|
85
180
|
## Exit codes
|
|
86
181
|
|
|
87
182
|
| Code | Meaning |
|