Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ instructions for a personal learning space.
- `bootstrap.md` gets a nontechnical learner from an agent prompt to a working
learning repository.
- `pathmx` owns PathMX authoring, tooling, Player use, annotations, and review.
- `path` owns the agent-led personal learning workflow and uses `pathmx` for
- `learn` owns the agent-led personal learning workflow and uses `pathmx` for
authoring.
- `teach` owns reusable paths intended for multiple learners and uses `pathmx`
for authoring.
- `pathmx/library/` owns stable reusable patterns, templates, components, and
fictional examples shared by `learn` and `teach`.
- `work-log/` keeps design history. It is not installed as skill content.
- The public `pathmx-learning-starter` is a consumer, not a source of truth.

Keep checked-in content self-contained. Keep prose short and plain. Put core
procedure in `SKILL.md`; put detailed syntax and examples in references.

Add only syntax supported by the pinned PathMX version and a local fixture.
Add only syntax supported by the pinned PathMX version and a local fixture or
verified library item.
Treat Player interactions, annotations, questions, components, routes, and CLI
claims as version-sensitive. Verify them against fixtures or the installed CLI.
The exact dependency in `package.json` is the fixture baseline. Keep bootstrap
Expand All @@ -29,7 +34,8 @@ The learning workflow is buffered, not Block-at-a-time:
- adapt at useful session or module boundaries;
- keep annotations and durable evidence in Sources.

Keep learner fixtures fictional. Do not add real personal or sensitive data.
Keep learner fixtures and library examples fictional. Do not add real personal
or sensitive data.

Test sync changes with temporary repositories, including check mode, conflicts,
containment, and rollback. Run `bun run check` before handoff.
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
# PathMX Skills

Canonical agent instructions for authoring PathMX and running a personal
learning space.
Canonical agent instructions for authoring PathMX, personal learning, and
shared learning paths.

Give an agent [the bootstrap instructions](./bootstrap.md) to create a new
learning repository. After setup, repository instructions and these two skills
learning repository. After setup, repository instructions and these skills
carry the workflow:

| Skill | Use |
| --- | --- |
| `/pathmx` | Author, play, review, and verify PathMX. Invoked automatically for PathMX work. |
| `/path` | Start or resume a buffered adaptive learning path for one learner. |
| `/learn` | Start or resume a buffered adaptive learning path for one learner. |
| `/teach` | Design, author, pilot, and review a reusable path for many learners. |

The `/pathmx` [library](./skills/pathmx/library/index.md) holds stable patterns,
templates, components, and fictional examples shared by `/learn` and `/teach`.
Reusable material is verified in place; diagnostic-only cases stay under
`tests/fixtures/`.

Skills install under `.agents/skills/`. Codex discovers that directory
directly. Claude Code uses the matching `.claude/skills` discovery link and a
Expand Down Expand Up @@ -42,8 +48,10 @@ Apply the canonical packages:
bun run sync-skills -- --write <target-repository>
```

Write mode owns only the packages declared in `skills/manifest.json` and their
Claude discovery links. It leaves unrelated target content and skills alone.
Write mode owns the packages declared in `skills/manifest.json`, names they
explicitly replace, and their Claude discovery links. It removes the retired
`/path` package while installing `/learn`, and leaves unrelated target content
and skills alone.

## Evals

Expand Down
8 changes: 5 additions & 3 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@

## Later work

- Forward-test bootstrap and both implicit skill triggers in clean Codex and
- Forward-test bootstrap and all implicit skill triggers in clean Codex and
Claude Code sessions.
- Refine `/teach` against representative deployed PathMX paths before treating
its distribution, facilitation, and release conventions as settled.
- Expand stable annotation review and reply workflows after field use.
- Add more learning-path examples only when they cover a distinct domain or
learner need.
- Add library examples only when they cover a distinct audience, domain,
authoring pattern, or learner need.
- Explore an optional, more playful home and milestone map without making it a
dependency of the minimal starter.
- Add general actions or spaceholders only after their public authoring
Expand Down
6 changes: 3 additions & 3 deletions bootstrap.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ below.
## 3. Create the learning repository

Create the chosen directory from the official starter. This command also
installs the current official `/path` and `/pathmx` skills:
installs the current official `/learn` and `/pathmx` skills:

```sh
pathmx init <learning-space> --template pathmx-learning-starter
Expand All @@ -59,7 +59,7 @@ bun install --frozen-lockfile
```

Read `AGENTS.md` and, when present, the instructions for the current agent
harness. Confirm that `.agents/skills/path/SKILL.md` and
harness. Confirm that `.agents/skills/learn/SKILL.md` and
`.agents/skills/pathmx/SKILL.md` exist.

Shell tool calls may not preserve a prior `cd`. Run every following project
Expand Down Expand Up @@ -120,7 +120,7 @@ Open the bundled Player tutorial for a first-time learner. They may skip it.

## 5. Begin learning

Use `/path` implicitly. Ask a few questions at a time about:
Use `/learn` implicitly. Ask a few questions at a time about:

- what the learner wants to be able to do and why;
- what they already know, with one small piece of evidence;
Expand Down
4 changes: 2 additions & 2 deletions scripts/check-markdown-links.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ async function check(markdown: string) {
}

describe("Markdown links", () => {
it("accepts valid files, directories, anchors, and query strings", async () => {
it("accepts valid files, directories, anchors, nested labels, and query strings", async () => {
expect(
await check(
"[file](./docs/target.md) [dir](./docs) [anchor](./docs/target.md?view=1#target-heading)\n",
"[:lucide-arrow-right[Next]:](./docs/target.md) [file](./docs/target.md) [dir](./docs) [anchor](./docs/target.md?view=1#target-heading)\n",
),
).toEqual([])
})
Expand Down
8 changes: 6 additions & 2 deletions scripts/check-markdown-links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ function maskIgnoredMarkdown(markdown: string) {
export function extractMarkdownLinks(markdown: string): MarkdownLink[] {
const links: MarkdownLink[] = []
for (const [index, line] of maskIgnoredMarkdown(markdown).entries()) {
for (const match of line.matchAll(/!?\[[^\]]*\]\((<[^>]+>|[^)]+)\)/g)) {
for (const match of line.matchAll(
/!?\[(?:[^\[\]]|\[[^\[\]]*\])*\]\((<[^>]+>|[^)]+)\)/g,
)) {
let target = match[1]?.trim() ?? ""
if (target.startsWith("<") && target.endsWith(">")) {
target = target.slice(1, -1)
Expand All @@ -65,7 +67,9 @@ export function extractMarkdownLinks(markdown: string): MarkdownLink[] {
if (target) links.push({ line: index + 1, target })
}

const definition = line.match(/^\s*\[(?!\^)[^\]]+\]:\s*(<[^>]+>|\S+)/)
const definition = line.match(
/^\s*\[(?!\^)[^\]]+\]:\s*(?!\]\()(<[^>]+>|\S+)/,
)
if (definition?.[1]) {
links.push({
line: index + 1,
Expand Down
Loading
Loading