@ainova-systems/intelligence 0.11.0-rc.4 → 0.11.0-rc.6
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/cli/commands/add.sh +23 -1
- package/cli/commands/doctor.sh +28 -7
- package/cli/commands/init.sh +67 -21
- package/cli/commands/install.sh +55 -5
- package/cli/commands/migrate.sh +41 -9
- package/cli/commands/registry.sh +54 -35
- package/cli/commands/remove.sh +13 -1
- package/cli/commands/search.sh +12 -13
- package/cli/commands/status.sh +5 -4
- package/cli/commands/sync.sh +19 -1
- package/cli/commands/update.sh +23 -4
- package/cli/commands/upgrade.sh +50 -9
- package/cli/engine-package.yaml +14 -0
- package/cli/lib/cli-common.sh +37 -48
- package/cli/lib/manifest.sh +118 -0
- package/cli/lib/registry.sh +74 -39
- package/cli/lib/semver.sh +5 -2
- package/engine/agents/intelligence-operator.md +4 -4
- package/engine/docs/ADAPTERS.md +2 -1
- package/engine/docs/CLI.md +12 -13
- package/engine/docs/CONVENTIONS.md +5 -3
- package/engine/rules/intelligence-authoring.md +4 -4
- package/engine/scripts/ENGINE_SHA +1 -0
- package/engine/scripts/lib/common.sh +6 -2
- package/engine/scripts/sync.sh +1 -1
- package/engine/skills/intelligence-add-agent/SKILL.md +7 -7
- package/engine/skills/intelligence-add-rule/SKILL.md +5 -5
- package/engine/skills/intelligence-add-skill/SKILL.md +5 -5
- package/engine/skills/intelligence-extract-skill/SKILL.md +2 -2
- package/engine/skills/intelligence-install-adapter/SKILL.md +6 -6
- package/engine/skills/intelligence-learn-from-context/SKILL.md +1 -1
- package/engine/skills/intelligence-review-skills/SKILL.md +5 -5
- package/engine/skills/intelligence-sync/SKILL.md +5 -7
- package/engine/skills/intelligence-uninstall-adapter/SKILL.md +2 -2
- package/engine/skills/intelligence-update/SKILL.md +6 -0
- package/package.json +2 -3
- package/registry/index.yaml +0 -22
package/engine/docs/ADAPTERS.md
CHANGED
|
@@ -110,7 +110,8 @@ The engine ships artifacts of its own — the `intelligence-authoring` rule and
|
|
|
110
110
|
| Token | Expands to |
|
|
111
111
|
|---|---|
|
|
112
112
|
| `<umbrella>` | repo-relative umbrella dir (e.g. `Intelligence`) |
|
|
113
|
-
| `<module>` | repo-relative engine module (e.g. `Intelligence/sync`; CLI setup: `.intelligence/
|
|
113
|
+
| `<module>` | repo-relative engine module (e.g. `Intelligence/sync`; CLI setup: `.intelligence/packages/@ainova-systems/sync`) |
|
|
114
|
+
| `<manifest>` | the project's config file name — vendored: `config.yaml`, CLI setup: `intelligence.yaml` (`IS_MANIFEST_NAME`) |
|
|
114
115
|
| `<sync-cmd>` | the sync invocation — vendored: `bash <module>/scripts/sync.sh`, CLI setup: `intelligence sync` (`IS_SYNC_CMD`) |
|
|
115
116
|
|
|
116
117
|
Values are exported by `sync.sh` (`IS_UMBRELLA_REL`, `IS_MODULE_REL`; `IS_SYNC_CMD` comes from the CLI in CLI mode), derived from the detected layout. Expansion covers frontmatter and body, so `paths: ["<umbrella>/**"]` reaches Claude's `paths:`, Cursor's `globs:` and Copilot's `applyTo:` carrying the project's real folder name. A file written without `finalize_output_file` ships a literal `<umbrella>` into an IDE — CI fails the build if any generated output still contains a token.
|
package/engine/docs/CLI.md
CHANGED
|
@@ -16,37 +16,35 @@ project/
|
|
|
16
16
|
├── intelligence.yaml # manifest, at the repo root (like package.json)
|
|
17
17
|
├── intelligence.lock # resolved package state — commit it
|
|
18
18
|
├── intelligence/ # the project's own rules/ agents/ skills/
|
|
19
|
-
├── .intelligence/ # gitignored store: packages/<name>/,
|
|
19
|
+
├── .intelligence/ # gitignored store: packages/<name>/, backup/
|
|
20
20
|
├── .claude/ .cursor/ … # generated by sync
|
|
21
21
|
└── AGENTS.md
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
No engine code lives in the project. The engine
|
|
24
|
+
No engine code lives in the project. The engine's *scripts* ship inside the npm package; the engine's *content* — the authoring rule, both engine agents, every `intelligence-*` meta-skill and the docs — is the package **`@ainova-systems/sync`**: auto-added by `init` (opt out with `--bare`), visible in `list`/`search`, pinned exactly to the bundled engine version, and materialized from the npm bundle without network whenever the pin matches (only a cross-version install reaches git). `intelligence update` never moves it — `intelligence upgrade` does, together with the schema stamp. Removing it (`remove @ainova-systems/sync --force`) drops the meta-content from the outputs while the sync engine itself keeps working. After a fresh clone, `intelligence install` restores the whole store from the lock.
|
|
25
25
|
|
|
26
26
|
## Commands
|
|
27
27
|
|
|
28
28
|
| Command | Does |
|
|
29
29
|
|---|---|
|
|
30
|
-
| `init [--targets a,b] [--no-sync]` |
|
|
30
|
+
| `init [--targets a,b] [--dir d] [--bare] [--no-sync]` | Enable `agents` (the tool-neutral AGENTS.md) plus every tool DETECTED by repo markers (`.claude`/`CLAUDE.md`, `.cursor`, `.codex`, `.pi`, `.opencode`, `.github/instructions`) or named via `--targets` — a tool is never invented. Writes a minimal self-documenting root manifest, `.gitignore`s the store, installs `@ainova-systems/sync` (unless `--bare`), first sync. No dirs are created. |
|
|
31
31
|
| `add <spec> [--name @s/n] [--no-sync]` | Resolve → fetch → wire sources → manifest entry → lock → sync. Specs: `@scope/name[@range]`, `github:org/repo[#path]`, `git+<url>[@ref][#path]`. |
|
|
32
|
-
| `remove <name
|
|
32
|
+
| `remove <name> [--force]` | Inverse of add: manifest, sources, lock, store. |
|
|
33
33
|
| `install [--frozen] [--force]` | Restore the store exactly from the lock; resolve manifest packages the lock lacks (`--frozen` refuses instead, and fails on sha drift). |
|
|
34
34
|
| `update [name]` | Re-resolve ranges, refetch what moved, rewrite the lock. `ref:`-pinned packages never move here. |
|
|
35
|
-
| `upgrade` | Bring the project to this CLI's engine:
|
|
35
|
+
| `upgrade` | Bring the project to this CLI's engine: apply v2 schema migrations, move the `@ainova-systems/sync` pin to the bundled version and reinstall it, restamp `sync_version`, sync. |
|
|
36
36
|
| `sync [target]` | Run the bundled engine against the manifest. In a vendored (v1) project it delegates to that project's own engine. |
|
|
37
37
|
| `list` / `status` / `doctor` | Inspect; doctor exits 1 on inconsistencies (unlocked packages, missing store, stale stamp, dead sources). |
|
|
38
|
-
| `registry <list\|add
|
|
38
|
+
| `registry <list\|add <url> [--force]\|remove <url>>` | Manage the trust list of registries — rare, once per organization. `add` fails closed on a URL with no `index.yaml` (`--force` records it anyway). |
|
|
39
39
|
| `migrate [--dry-run] [--force]` | Convert a vendored setup to the CLI setup. Transactional; see below. |
|
|
40
40
|
|
|
41
41
|
## Packages
|
|
42
42
|
|
|
43
43
|
**A package's name is its identity everywhere**: the `packages:` key in the manifest, the store directory (`.intelligence/packages/@scope/name/` — npm's nesting), and the lock key. What a package provides is a convention: whichever of `rules/`, `agents/`, `skills/` exist at its top level get wired into the matching `sources:` sections by `add`.
|
|
44
44
|
|
|
45
|
-
**
|
|
45
|
+
**Names are global.** The name is the trust anchor a developer reasons with — the same `@scope/name` means the same package in every project, every lock and every conversation. A registry never renames anything, and two versions of one name cannot coexist in a project: intelligence artifacts land in each tool's flat namespace (`.claude/skills/<name>/`, the `AGENTS.md` tables), so duplicates would collide file-by-file. Need pieces of two versions? That is a different package — fork it under a different name. Need to override one artifact? Put a same-named file in your own content dir; project sources are listed after package sources.
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
2. The bundled default index (`registry/index.yaml`) — needed exactly when a name is not a repo (monorepos: `@ainova-systems/core` → `intelligence-dev-packs` at `packs/core`).
|
|
49
|
-
3. Convention: `@org/name` → `https://github.com/org/name.git`, content at the repo root. Zero infrastructure: any repo with the three dirs is already a package.
|
|
47
|
+
**Name → repo resolution: the trust list is the ONLY resolver.** `registries:` in the manifest holds registry repos (git repos with an `index.yaml`), consulted in order — the first to declare the name wins. There is deliberately **no built-in catalog and no `@org/name` → github guessing**: the CLI core knows no vendor, and a name nobody explicitly trusted never turns into an install from an invented URL. A name no trusted registry declares is refused with suggestions. Installs without a registry are always **explicit sources**: `github:org/repo`, `git+<url>[@ref][#path]`. Vendor defaults exist only as lines `init` seeds into the manifest — visible, reviewable, deletable (`doctor` still flags a name whose current resolution url no longer matches the lock).
|
|
50
48
|
|
|
51
49
|
**Versions are git tags.** Ranges (`^1.2.0`, `~1.2.0`, exact, `latest`) match stable `x.y.z` tags (optional `v` prefix) listed via `git ls-remote` — no clone to resolve. `add` without a range picks the highest stable tag and records `^that`. A branch or commit pin is `ref:`, the escape hatch that ranges never touch. Prerelease-suffixed tags are invisible to ranges by design.
|
|
52
50
|
|
|
@@ -61,7 +59,7 @@ packages:
|
|
|
61
59
|
"@ainova-systems/core":
|
|
62
60
|
version: "^0.3.0" # or: ref: main / url: + path: (direct git specs)
|
|
63
61
|
registries:
|
|
64
|
-
|
|
62
|
+
- "https://github.com/acme/intelligence-registry.git"
|
|
65
63
|
```
|
|
66
64
|
|
|
67
65
|
`project.intelligence_dir` names the content dir when it is not `intelligence/`. `sync_version` stays the frozen schema-contract key, stamped by the CLI with the bundled engine version — an npm prerelease suffix never reaches it.
|
|
@@ -75,14 +73,15 @@ The engine's CLI mode is an env contract, set by the dispatcher and honored only
|
|
|
75
73
|
| `CONFIG_FILE` | `<root>/intelligence.yaml` |
|
|
76
74
|
| `REPO_ROOT` | the project root |
|
|
77
75
|
| `IS_UMBRELLA_REL` | content dir (`intelligence`) |
|
|
78
|
-
| `IS_MODULE_REL` | `.intelligence/
|
|
76
|
+
| `IS_MODULE_REL` | `.intelligence/packages/@ainova-systems/sync` |
|
|
77
|
+
| `IS_MANIFEST_NAME` | `intelligence.yaml` (feeds the `<manifest>` token; vendored default `config.yaml`) |
|
|
79
78
|
| `IS_SYNC_CMD` | `intelligence sync` (expanded for the `<sync-cmd>` token) |
|
|
80
79
|
| `IS_PROTECTED_DIRS` | `<content-dir>:.intelligence` — restores output-path protection for a root manifest |
|
|
81
80
|
| `IS_SUPPRESS_CLI_NOTE` | set to silence the vendored-flow recommendation note |
|
|
82
81
|
|
|
83
82
|
## migrate: vendored (v1) → CLI (v2)
|
|
84
83
|
|
|
85
|
-
Fail-closed preconditions (clean worktree unless `--force`; no half-migrated state; project schema not newer than the engine; an older schema is first brought up by the engine's own migration chain). Then **stage** — the manifest is `config.yaml` transformed comment-preservingly (module sources →
|
|
84
|
+
Fail-closed preconditions (clean worktree unless `--force`; no half-migrated state; project schema not newer than the engine; an older schema is first brought up by the engine's own migration chain). Then **stage** — the manifest is `config.yaml` transformed comment-preservingly (module sources → the `@ainova-systems/sync` package store, `@pack/sub` references → store paths, `packs:` → `packages:` entries keeping their `ref:` pins), mirrored packs are *copied* from their mirrors (network untouched, sha carried from the `.pack` stamp), transient packs fetched — **verify** (staged sources exist; per-adapter `enabled`/`output` equality against the old config) — **commit**: store and manifest move in, a real sync must report `IS_STATUS=ok`, and only then are the vendored module, `config.yaml` (backed up to `.intelligence/backup/`) and the mirrors removed. Any earlier failure rolls back to an untouched project. `--dry-run` stages, verifies, prints, writes nothing.
|
|
86
85
|
|
|
87
86
|
## Developing and releasing the CLI
|
|
88
87
|
|
|
@@ -56,7 +56,8 @@ An artifact shipped *by the engine* cannot write the umbrella's name down — th
|
|
|
56
56
|
| Token | Expands to | Example |
|
|
57
57
|
|---|---|---|
|
|
58
58
|
| `<umbrella>` | repo-relative umbrella dir | `Intelligence` |
|
|
59
|
-
| `<module>` | repo-relative engine module | `Intelligence/sync` (CLI setup: `.intelligence/
|
|
59
|
+
| `<module>` | repo-relative engine module | `Intelligence/sync` (CLI setup: `.intelligence/packages/@ainova-systems/sync`) |
|
|
60
|
+
| `<manifest>` | the project's config file, by name | vendored: `config.yaml`; CLI setup: `intelligence.yaml` |
|
|
60
61
|
| `<sync-cmd>` | how a reader re-runs the sync | vendored: `bash Intelligence/sync/scripts/sync.sh`; CLI setup: `intelligence sync` |
|
|
61
62
|
|
|
62
63
|
Expansion covers frontmatter and body alike, so `paths: ["<umbrella>/**"]` reaches Claude's `paths:`, Cursor's `globs:` and Copilot's `applyTo:` already carrying the project's real folder name. Project-authored artifacts may use the tokens too, but they have no reason to — they can simply name their own folders. `<sync-cmd>` exists because "run a sync" is spelled differently per setup: engine content says the token, and `IS_SYNC_CMD` (set by the CLI) picks the spelling; unset, it reproduces the vendored command string exactly.
|
|
@@ -408,12 +409,13 @@ Bash emits `IS_STATUS=<code> [IS_DETAIL=...]` on stdout and exits with the match
|
|
|
408
409
|
|---|---|
|
|
409
410
|
| `CONFIG_FILE` | `<root>/intelligence.yaml` (the root manifest) |
|
|
410
411
|
| `REPO_ROOT` | project root |
|
|
411
|
-
| `IS_UMBRELLA_REL` / `IS_MODULE_REL` | content dir (default `intelligence`) / `.intelligence/
|
|
412
|
+
| `IS_UMBRELLA_REL` / `IS_MODULE_REL` | content dir (default `intelligence`) / `.intelligence/packages/@ainova-systems/sync` |
|
|
413
|
+
| `IS_MANIFEST_NAME` | `intelligence.yaml` — feeds the `<manifest>` token (vendored default: `config.yaml`) |
|
|
412
414
|
| `IS_SYNC_CMD` | `intelligence sync` (feeds the `<sync-cmd>` token) |
|
|
413
415
|
| `IS_PROTECTED_DIRS` | colon-separated dirs `validate_output_path` must refuse — restores the source-tree protection a root manifest would otherwise disable |
|
|
414
416
|
| `IS_SUPPRESS_CLI_NOTE` | silences the vendored-flow recommendation NOTE (stderr-only either way) |
|
|
415
417
|
|
|
416
|
-
In CLI projects the
|
|
418
|
+
In CLI projects the engine's content is the `@ainova-systems/sync` package (auto-added by `init`, pinned to the engine version, moved only by `intelligence upgrade`), so **every** meta-skill ships in both modes: `intelligence-sync` runs `<sync-cmd>` wherever it lands, and `intelligence-update` self-redirects to `intelligence upgrade` when it finds a root `intelligence.yaml`. `sync.sh` in CLI mode still never migrates: an outdated stamp exits `needs-update` and the CLI's own `upgrade` closes the gap. See `docs/CLI.md` for the full CLI surface.
|
|
417
419
|
|
|
418
420
|
## .gitignore Pattern
|
|
419
421
|
|
|
@@ -25,9 +25,9 @@ Three ways to shorten, in order of what they are worth:
|
|
|
25
25
|
|
|
26
26
|
## Source of truth
|
|
27
27
|
|
|
28
|
-
Edit the sources listed in
|
|
28
|
+
Edit the sources listed in `<manifest>` — the `rules/`, `agents/` and `skills/` directories it names — and `<manifest>` itself. A source that arrived from the engine or an installed package is not yours to edit either — it is replaced on the next update or install; change it in its own repository. Everything else is derived: `.claude/`, `.cursor/`, `.github/{instructions,agents,skills}/`, `.codex/`, `.agents/skills/`, `.pi/`, `.opencode/` and `AGENTS.md` are **generated output**, and a hand edit there survives exactly until the next sync.
|
|
29
29
|
|
|
30
|
-
`<module>/` is the
|
|
30
|
+
`<module>/` is the engine's own content. It owns its own rules, agents and meta-skills, and every engine update replaces it wholesale, so a local edit there is lost. Fix it upstream instead.
|
|
31
31
|
|
|
32
32
|
After any change: `<sync-cmd>`. A change that was not synced does not exist for any tool.
|
|
33
33
|
|
|
@@ -84,11 +84,11 @@ The verb just names the action — `add-`, `run-`, `review-`, `extract-`, `plan-
|
|
|
84
84
|
|
|
85
85
|
Two verbs are told apart by what already exists. **`add-` puts one new member into a set that is already there** — a field on an existing type, a record among records, a component in the inventory the project keeps — so the noun names the member, and the number of files it takes to land is not the point. **`create-` brings the container itself into existence**, where nothing hosted it before. Neither verb describes how a skill is factored inside, so splitting a skill's internals never renames it.
|
|
86
86
|
|
|
87
|
-
`intelligence-` is **reserved** for the engine's own artifacts. A project skill carrying that prefix
|
|
87
|
+
`intelligence-` is **reserved** for the engine's own artifacts. A project skill carrying that prefix collides with engine ownership — everything under the prefix is the engine's to replace or remove on update — rename it.
|
|
88
88
|
|
|
89
89
|
### Shape
|
|
90
90
|
|
|
91
|
-
- **A skill is executed, so it must not hardcode what can move.** Its steps are followed literally: a path, a command or a project name baked into a procedure breaks the moment the layout moves. Resolve them from a rule or from
|
|
91
|
+
- **A skill is executed, so it must not hardcode what can move.** Its steps are followed literally: a path, a command or a project name baked into a procedure breaks the moment the layout moves. Resolve them from a rule or from `<manifest>` instead. This does **not** apply to rules and agents — a rule's job is to *describe* the repository, so naming a path in prose is exactly right. Naming a path is description; baking one into a procedure is a defect waiting to fire.
|
|
92
92
|
- **Keep everything the skill needs inside the skill's own folder.** The Agent Skills standard lets a skill ship `scripts/`, `references/` and `assets/` beside `SKILL.md`, and sync copies the whole directory, so a bundled helper travels with the skill to every tool. That is the default.
|
|
93
93
|
- **Promote a helper out of the skill folder only when a second skill needs it** — then it belongs beside the source groups, and every skill resolves it the same way. The dividing line is reuse, not repetition: one skill's helper stays with that skill however often it runs.
|
|
94
94
|
- **A helper is code.** It gets what code gets — a test, and a way to run it that does not assume one person's machine.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3a5cd174c73bd3918ac0a01df8d54a6f3d98b485
|
|
@@ -42,13 +42,16 @@ finalize_output_file() {
|
|
|
42
42
|
# `<sync-cmd>` is how engine content says "run a sync": vendored setups
|
|
43
43
|
# expand it to the script invocation (built from $mod, so it reproduces the
|
|
44
44
|
# exact pre-token string), the CLI overrides it via IS_SYNC_CMD
|
|
45
|
-
# (`intelligence sync`).
|
|
45
|
+
# (`intelligence sync`). `<manifest>` names the project's config file the
|
|
46
|
+
# same way: `config.yaml` vendored, `intelligence.yaml` under the CLI
|
|
47
|
+
# (IS_MANIFEST_NAME).
|
|
46
48
|
local sc="${IS_SYNC_CMD:-bash $mod/scripts/sync.sh}"
|
|
49
|
+
local mf="${IS_MANIFEST_NAME:-config.yaml}"
|
|
47
50
|
local tmp_file="$target.tmp"
|
|
48
51
|
# Literal (index-based) substitution, not gsub: a regex replacement would
|
|
49
52
|
# give `&` in a path its special meaning, and POSIX awk has no way to pass a
|
|
50
53
|
# replacement string verbatim.
|
|
51
|
-
awk -v umb="$umb" -v mod="$mod" -v sc="$sc" '
|
|
54
|
+
awk -v umb="$umb" -v mod="$mod" -v sc="$sc" -v mf="$mf" '
|
|
52
55
|
function repl(s, from, to, out, i) {
|
|
53
56
|
out = ""
|
|
54
57
|
while ((i = index(s, from)) > 0) {
|
|
@@ -60,6 +63,7 @@ finalize_output_file() {
|
|
|
60
63
|
{
|
|
61
64
|
sub(/\r$/, "")
|
|
62
65
|
$0 = repl($0, "<sync-cmd>", sc)
|
|
66
|
+
$0 = repl($0, "<manifest>", mf)
|
|
63
67
|
$0 = repl($0, "<module>", mod)
|
|
64
68
|
$0 = repl($0, "<umbrella>", umb)
|
|
65
69
|
print
|
package/engine/scripts/sync.sh
CHANGED
|
@@ -94,7 +94,7 @@ if [ "${IS_CLI:-0}" = "1" ]; then
|
|
|
94
94
|
# `/d/...`, and prefix comparisons downstream need one spelling.
|
|
95
95
|
CONFIG_FILE="$(cd "$(dirname "$CONFIG_FILE")" && pwd)/$(basename "$CONFIG_FILE")"
|
|
96
96
|
IS_UMBRELLA_REL="${IS_UMBRELLA_REL:-intelligence}"
|
|
97
|
-
IS_MODULE_REL="${IS_MODULE_REL:-.intelligence/
|
|
97
|
+
IS_MODULE_REL="${IS_MODULE_REL:-.intelligence/packages/@ainova-systems/sync}"
|
|
98
98
|
# Project-owned adapters keep their v1 home: <umbrella>/adapters/.
|
|
99
99
|
INTELLIGENCE_DIR="$REPO_ROOT/$IS_UMBRELLA_REL"
|
|
100
100
|
else
|
|
@@ -9,19 +9,19 @@ argument-hint: <domain> [description]
|
|
|
9
9
|
## Steps
|
|
10
10
|
|
|
11
11
|
1. **Determine domain prefix** (the scope is required):
|
|
12
|
-
- **Reuse the existing domain when one fits**: list
|
|
12
|
+
- **Reuse the existing domain when one fits**: list `<umbrella>/agents/` and `<umbrella>/skills/`. If a domain prefix is already established for the target area (`backend-`, `frontend-`, `devops-`), use it. Introduce a new domain only when the scope is materially different from all existing ones.
|
|
13
13
|
- **When no existing domain fits**, derive from repo structure:
|
|
14
|
-
- Single / root project → use the project codename from
|
|
14
|
+
- Single / root project → use the project codename from `<manifest>` → `project.name`
|
|
15
15
|
- Backend service / API component → `backend-`
|
|
16
16
|
- Frontend / web / UI component → `frontend-`
|
|
17
17
|
- Infrastructure, IaC, CI/CD, deployment → `devops-`
|
|
18
18
|
- Shared library / common / cross-cutting code → `core-`
|
|
19
19
|
- Test suites (e2e, integration) → `tests-`
|
|
20
|
-
- Tool-internal (intelligence-sync itself) → `intelligence-`
|
|
20
|
+
- Tool-internal (intelligence-sync itself) → `intelligence-` (only inside the intelligence-sync repo — downstream projects must not use this prefix)
|
|
21
21
|
- If the repo is a monorepo with named components (e.g., `apps/billing`, `services/auth`), prefer the component name as the domain (`billing-`, `auth-`).
|
|
22
22
|
- **Every agent needs a domain prefix.** If the scope is unclear, ask the user before proceeding.
|
|
23
23
|
|
|
24
|
-
2. **Check existing agents**: Read
|
|
24
|
+
2. **Check existing agents**: Read `<umbrella>/agents/` to avoid duplicates. If an agent for this domain exists, ask user whether to update it instead.
|
|
25
25
|
|
|
26
26
|
3. **Determine tier and access**:
|
|
27
27
|
- Developer agents: `tier: heavy`, `access: full`
|
|
@@ -36,7 +36,7 @@ argument-hint: <domain> [description]
|
|
|
36
36
|
- Build and test commands
|
|
37
37
|
- Key conventions and forbidden patterns
|
|
38
38
|
|
|
39
|
-
5. **Create agent**: Write
|
|
39
|
+
5. **Create agent**: Write `<umbrella>/agents/<domain>-<role>.md` (create the directory if missing) with frontmatter:
|
|
40
40
|
```yaml
|
|
41
41
|
---
|
|
42
42
|
name: <domain>-<role>
|
|
@@ -52,11 +52,11 @@ argument-hint: <domain> [description]
|
|
|
52
52
|
|
|
53
53
|
6. **Write body** with sections: **Expertise** -> **Boundaries** -> **Build & Verify**
|
|
54
54
|
- An agent is **thin**: who it is, where it stops, how it verifies. Everything else already reaches it.
|
|
55
|
-
- **Do not tell the agent to read the rules.** Rules load on their own: Claude Code loads `.claude/rules/` into every custom subagent's startup context alongside `CLAUDE.md` (*Subagents → What loads at startup*), and Cursor / Copilot / Codex / Pi / opencode receive always-on rules inlined in `AGENTS.md`. A `Read
|
|
55
|
+
- **Do not tell the agent to read the rules.** Rules load on their own: Claude Code loads `.claude/rules/` into every custom subagent's startup context alongside `CLAUDE.md` (*Subagents → What loads at startup*), and Cursor / Copilot / Codex / Pi / opencode receive always-on rules inlined in `AGENTS.md`. A `Read <umbrella>/rules/<domain>.md before starting` line duplicates content the agent already has — double the tokens, and a second copy that drifts from the rule it copied.
|
|
56
56
|
- **Point at a rule, never restate it.** If you want to copy a rule into the agent, the rule is in the wrong place — move it, do not clone it.
|
|
57
57
|
- **Do carry** what is genuinely the agent's own: its boundaries ("if the app is not running, stop — do not hand-write the output"), its verification commands, its definition of done.
|
|
58
58
|
- All content must come from actual codebase analysis.
|
|
59
59
|
|
|
60
|
-
7. **Link existing skills**: Find skills in
|
|
60
|
+
7. **Link existing skills**: Find skills in `<umbrella>/skills/` matching this domain prefix and add them to the agent's `skills:` frontmatter.
|
|
61
61
|
|
|
62
62
|
8. **Run `/intelligence-sync`** to distribute to all enabled IDE targets.
|
|
@@ -9,9 +9,9 @@ argument-hint: <name> [paths-glob]
|
|
|
9
9
|
## Steps
|
|
10
10
|
|
|
11
11
|
1. **Determine rule name from domain** (the scope is required):
|
|
12
|
-
- **Reuse the existing domain when one fits**: list
|
|
12
|
+
- **Reuse the existing domain when one fits**: list `<umbrella>/rules/`. If a rule file covers the target area (e.g., `backend.md`, `frontend.md`), extend it. Introduce a new domain only when the scope is materially different from all existing rules.
|
|
13
13
|
- **When no existing rule fits**, derive the filename from repo structure:
|
|
14
|
-
- Single / root project → use the project codename from
|
|
14
|
+
- Single / root project → use the project codename from `<manifest>` → `project.name` (e.g., `<codename>.md`)
|
|
15
15
|
- Backend service / API component → `backend.md`
|
|
16
16
|
- Frontend / web / UI component → `frontend.md`
|
|
17
17
|
- Infrastructure, IaC, CI/CD, deployment → `devops.md`
|
|
@@ -21,7 +21,7 @@ argument-hint: <name> [paths-glob]
|
|
|
21
21
|
- If the repo is a monorepo with named components (e.g., `apps/billing`, `services/auth`), prefer the component name as the rule name (`billing.md`, `auth.md`).
|
|
22
22
|
- **Rule filenames match the domain used by skills/agents.** If the scope is unclear, ask the user before proceeding.
|
|
23
23
|
|
|
24
|
-
2. **Check existing rules**: Read
|
|
24
|
+
2. **Check existing rules**: Read `<umbrella>/rules/` to detect overlapping scope — favor extending an existing rule over creating a new one.
|
|
25
25
|
|
|
26
26
|
3. **Determine scope**:
|
|
27
27
|
- If paths glob provided — scoped rule with `paths:` frontmatter
|
|
@@ -34,7 +34,7 @@ argument-hint: <name> [paths-glob]
|
|
|
34
34
|
- Build and test commands specific to this scope
|
|
35
35
|
- Anti-patterns observed in code, each paired with the positive replacement that should adopt instead
|
|
36
36
|
|
|
37
|
-
5. **Create rule**: Write
|
|
37
|
+
5. **Create rule**: Write `<umbrella>/rules/<name>.md` (create the directory if it does not exist — the sources list already covers it):
|
|
38
38
|
```yaml
|
|
39
39
|
---
|
|
40
40
|
paths:
|
|
@@ -49,6 +49,6 @@ argument-hint: <name> [paths-glob]
|
|
|
49
49
|
- Examples come from the actual codebase — reference real files
|
|
50
50
|
- Every REQUIRED / Invariant / Pattern is backed by observed code
|
|
51
51
|
|
|
52
|
-
7. **Update
|
|
52
|
+
7. **Update `<manifest>` only when needed**: add the path to `sources.rules` only if the rule lives in a directory not already listed there — creating a pre-listed directory is enough.
|
|
53
53
|
|
|
54
54
|
8. **Run `/intelligence-sync`** to distribute to all enabled IDE targets.
|
|
@@ -9,15 +9,15 @@ argument-hint: <domain> <verb-noun> [description]
|
|
|
9
9
|
## Steps
|
|
10
10
|
|
|
11
11
|
1. **Determine domain prefix** (the scope is required):
|
|
12
|
-
- **Reuse the existing domain when one fits**: list
|
|
12
|
+
- **Reuse the existing domain when one fits**: list `<umbrella>/skills/` and `<umbrella>/agents/`. If a domain prefix is already established for the target area (`backend-`, `frontend-`, `devops-`), use it. Introduce a new domain only when the scope is materially different from all existing ones.
|
|
13
13
|
- **When no existing domain fits**, derive from repo structure:
|
|
14
|
-
- Single / root project → use the project codename from
|
|
14
|
+
- Single / root project → use the project codename from `<manifest>` → `project.name`
|
|
15
15
|
- Backend service / API component → `backend-`
|
|
16
16
|
- Frontend / web / UI component → `frontend-`
|
|
17
17
|
- Infrastructure, IaC, CI/CD, deployment → `devops-`
|
|
18
18
|
- Shared library / common / cross-cutting code → `core-`
|
|
19
19
|
- Test suites (e2e, integration) → `tests-`
|
|
20
|
-
- Tool-internal (intelligence-sync itself) → `intelligence-`
|
|
20
|
+
- Tool-internal (intelligence-sync itself) → `intelligence-` (only inside the intelligence-sync repo — downstream projects must not use this prefix)
|
|
21
21
|
- If the repo is a monorepo with named components (e.g., `apps/billing`, `services/auth`), prefer the component name as the domain (`billing-`, `auth-`).
|
|
22
22
|
- **Every skill needs a domain prefix.** If the scope is unclear, ask the user before proceeding.
|
|
23
23
|
|
|
@@ -28,13 +28,13 @@ argument-hint: <domain> <verb-noun> [description]
|
|
|
28
28
|
- `run-` — executes an operation (tests, build, sync)
|
|
29
29
|
- `review-` — read-only analysis
|
|
30
30
|
|
|
31
|
-
3. **Check for existing agent**: Find an agent in
|
|
31
|
+
3. **Check for existing agent**: Find an agent in `<umbrella>/agents/` matching the domain
|
|
32
32
|
- If found — this skill will be linked to that agent
|
|
33
33
|
- If not — ask user whether to create a new agent via `/intelligence-add-agent` first
|
|
34
34
|
|
|
35
35
|
4. **Analyze codebase patterns**: Read existing implementations to extract the repeatable steps this skill should automate. Each step must come from actual code patterns, not generic knowledge.
|
|
36
36
|
|
|
37
|
-
5. **Create skill**: Write
|
|
37
|
+
5. **Create skill**: Write `<umbrella>/skills/<full-name>/SKILL.md` (create the directory if missing — no config edit needed) with frontmatter:
|
|
38
38
|
```yaml
|
|
39
39
|
---
|
|
40
40
|
name: <full-name>
|
|
@@ -26,7 +26,7 @@ Both end at the same artifact format. Extract starts from observed behavior, so
|
|
|
26
26
|
- Behavioral preference / constraint / pattern to default to → **rule** (use `intelligence-learn-from-context` for single preferences from session)
|
|
27
27
|
- Knowledge area / persona / expertise scope → **agent**
|
|
28
28
|
|
|
29
|
-
4. **Determine domain prefix** (for skill / agent): reuse the existing domain when one fits — list
|
|
29
|
+
4. **Determine domain prefix** (for skill / agent): reuse the existing domain when one fits — list `<umbrella>/skills/` and `<umbrella>/agents/`. Derive from repo structure only when no existing domain matches.
|
|
30
30
|
|
|
31
31
|
5. **Determine naming** (for skill): `<domain>-<verb>-<noun>` with convention verbs — `add-` (one new member of a set that already exists), `create-` (the container itself, where nothing hosted it), `update-` (revise what is there), `run-` (execute), `review-` (read-only analysis).
|
|
32
32
|
|
|
@@ -38,7 +38,7 @@ Both end at the same artifact format. Extract starts from observed behavior, so
|
|
|
38
38
|
|
|
39
39
|
## Authoring guidance
|
|
40
40
|
|
|
41
|
-
Follow the **Authoring Discipline** section in
|
|
41
|
+
Follow the **Authoring Discipline** section in `<module>/docs/CONVENTIONS.md` when writing the artifact body — size budgets (<500 lines for SKILL.md body), imperative form, explain WHY, reserve absolute language for true invariants, lead with positive defaults.
|
|
42
42
|
|
|
43
43
|
## Related skills
|
|
44
44
|
|
|
@@ -7,19 +7,19 @@ agent: intelligence-operator
|
|
|
7
7
|
|
|
8
8
|
# Install Adapter
|
|
9
9
|
|
|
10
|
-
The
|
|
10
|
+
The project's config is `<manifest>`; the content dir is `<umbrella>/` (never assume the name or casing); the engine's own files live under `<module>/` — these paths are localized to this project at sync time.
|
|
11
11
|
|
|
12
12
|
## Steps
|
|
13
13
|
|
|
14
|
-
1. Check whether target `$ARGUMENTS` is already enabled in
|
|
14
|
+
1. Check whether target `$ARGUMENTS` is already enabled in `<manifest>` — if yes, report and stop.
|
|
15
15
|
|
|
16
|
-
2. **Locate the adapter.**
|
|
17
|
-
- **Built-in**: `<module>/scripts/adapters/$ARGUMENTS.sh` — upstream-owned.
|
|
18
|
-
- **Project-owned**: `<umbrella>/adapters/$ARGUMENTS.sh` —
|
|
16
|
+
2. **Locate the adapter.** The sync discovers adapters in two places:
|
|
17
|
+
- **Built-in**: `<module>/scripts/adapters/$ARGUMENTS.sh` — upstream-owned. Every engine update replaces that whole directory.
|
|
18
|
+
- **Project-owned**: `<umbrella>/adapters/$ARGUMENTS.sh` — updates never touch it. A project adapter of the same name overrides the built-in.
|
|
19
19
|
|
|
20
20
|
If neither exists, research the tool's prompt format (web search for its rules / agents / skills file layout), then copy `<module>/scripts/adapters/_template.sh` to **`<umbrella>/adapters/$ARGUMENTS.sh`** and implement `sync_to_$ARGUMENTS()`. Author it there, never inside the engine's `scripts/adapters/` — a file written there is deleted by the next engine update. Adapter contract: `<module>/docs/ADAPTERS.md`. An adapter that would serve every project is worth contributing upstream.
|
|
21
21
|
|
|
22
|
-
3. Update
|
|
22
|
+
3. Update `<manifest>`:
|
|
23
23
|
- Target exists with `enabled: false` → flip to `enabled: true`.
|
|
24
24
|
- Target missing → add it under `targets:` with its `output:` path.
|
|
25
25
|
- If the target reads always-on rules from `AGENTS.md` (`cursor`, `copilot`, `codex`, `pi`, `opencode`), `targets.agents` must be enabled too — sync fails closed otherwise.
|
|
@@ -21,7 +21,7 @@ The original negative pattern stays in the rule body as an illustrative example
|
|
|
21
21
|
|
|
22
22
|
## Phase A — Analyze (read-only)
|
|
23
23
|
|
|
24
|
-
1. **Read authoring conventions first.**
|
|
24
|
+
1. **Read authoring conventions first.** The paths below are localized to this project at sync time: `<umbrella>/` is the content dir, `<module>/` the engine's own files, `<manifest>` the config. The meta-skills live in `<module>/skills/`, not directly under the umbrella. Load `<module>/skills/intelligence-add-rule/SKILL.md`, `<module>/skills/intelligence-add-skill/SKILL.md`, `<module>/skills/intelligence-add-agent/SKILL.md`, and `<module>/docs/CONVENTIONS.md` (Authoring Discipline section). This skill writes nothing on its own — it delegates to the add-* skills, which carry the authoring conventions.
|
|
25
25
|
|
|
26
26
|
2. **Capture the lesson** from session context or user input. Strip session-specific detail, keep the underlying pattern.
|
|
27
27
|
|
|
@@ -13,11 +13,11 @@ Name reflects the umbrella usage of "skills" for all AI artifacts (rules + agent
|
|
|
13
13
|
|
|
14
14
|
## Scope: what to read, and what to leave alone
|
|
15
15
|
|
|
16
|
-
1. **Resolve the layout — never assume folder names.**
|
|
16
|
+
1. **Resolve the layout — never assume folder names.** `<umbrella>/` is the content dir, `<module>/` the engine's own files, `<manifest>` the config — all localized to this project at sync time. Read authoring conventions from `<module>/docs/CONVENTIONS.md` and the `intelligence-authoring` rule.
|
|
17
17
|
|
|
18
|
-
2. **Enumerate from
|
|
18
|
+
2. **Enumerate from `<manifest>`, not from a guessed path.** The artifacts are exactly the directories listed under `sources.rules`, `sources.agents` and `sources.skills` — there may be several groups (e.g. a shared one and a project one), they may be nested, and a remote entry is a declared pack (vendored setups, `packs:`) or an installed package (CLI setups, `packages:`, content under `.intelligence/packages/`). Take the list from the config; a literal `intelligence/rules/` is wrong in any project that named things differently.
|
|
19
19
|
|
|
20
|
-
3. **Skip everything the engine owns.** Sources under `<module>/` (`<module>/rules`, `<module>/agents`, `<module>/skills/intelligence-*`) are upstream-owned:
|
|
20
|
+
3. **Skip everything the engine owns.** Sources under `<module>/` (`<module>/rules`, `<module>/agents`, `<module>/skills/intelligence-*`) are upstream-owned: every engine update replaces them wholesale, so a local "fix" there is deleted at the next update. Never propose an edit to them. If one of them is genuinely wrong, or a generic check is missing from this skill, that is a **proposal to upstream** — say so in the report rather than patching locally.
|
|
21
21
|
|
|
22
22
|
4. **Never read or edit generated output** (`.claude/`, `.cursor/`, `.github/`, `.codex/`, `.agents/`, `.pi/`, `.opencode/`, `AGENTS.md`). Sync owns those entirely; the finding always belongs to the source.
|
|
23
23
|
|
|
@@ -34,9 +34,9 @@ Name reflects the umbrella usage of "skills" for all AI artifacts (rules + agent
|
|
|
34
34
|
| **Over the cap** | `SKILL.md` over 1000 lines, rule over 500, agent over 200 | `SPLIT` — two artifacts, or move detail into `references/<topic>.md` |
|
|
35
35
|
| **Rule links to a rule** | A markdown link from one rule to another (`R1`) | `UNLINK` — name the rule instead: always-on rules are inlined into `AGENTS.md` and the scoped channels carry only scoped rules, so the link is dead in at least one output |
|
|
36
36
|
| **Machine facts in a rule** | OS, shell, editor or a local absolute path (`R2`) | `MOVE` — these belong in a personal, gitignored `CLAUDE.md`; a rule is committed and read by everyone, including whoever is on another platform |
|
|
37
|
-
| **Literal path or command in a skill** | A path *outside the skill's own folder* baked into a procedure (`R3`) | `PARAMETERIZE` — a skill is *executed*, so a literal path breaks the moment the layout moves; resolve it from a rule or from
|
|
37
|
+
| **Literal path or command in a skill** | A path *outside the skill's own folder* baked into a procedure (`R3`) | `PARAMETERIZE` — a skill is *executed*, so a literal path breaks the moment the layout moves; resolve it from a rule or from `<manifest>`. **Exempt:** the skill's own bundle (`references/`, `scripts/`, `assets/` — content is co-located with its skill by default); rules and agents (describing the repository is their job); an example inside an output-format block; the resolution step itself |
|
|
38
38
|
| **Skill with no verification** | Nothing at the end proves the procedure worked (`R4`) | `FLAG` — a procedure that proves nothing is a note, or just the work: give it a verification, or delete it |
|
|
39
|
-
| **Reserved prefix** | A project artifact named `intelligence-*` | `RENAME` — the prefix belongs to the engine,
|
|
39
|
+
| **Reserved prefix** | A project artifact named `intelligence-*` | `RENAME` — the prefix belongs to the engine, which replaces or removes everything under it on update |
|
|
40
40
|
| **Naming** | A skill that is not `<domain>-<verb>-<noun>`, or a domain invented rather than reused | `RENAME` — or introduce the new domain deliberately |
|
|
41
41
|
| **Stale** | No edits in 6+ months and nothing cross-references it | `ARCHIVE` — move to `<umbrella>/_archive/` |
|
|
42
42
|
| **Negative-framed judgement call** | "Never do X" where a positive default fits, outside safety / security / output-format | `REWRITE` — state the default; reserve NEVER for true must-nots |
|
|
@@ -5,14 +5,12 @@ agent: intelligence-operator
|
|
|
5
5
|
context: fork
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
Run the sync engine to transform rules, agents, and skills from the intelligence
|
|
8
|
+
Run the sync engine to transform rules, agents, and skills from the intelligence sources to each enabled IDE's native format.
|
|
9
9
|
|
|
10
|
-
> **
|
|
11
|
-
>
|
|
12
|
-
> **sync.sh never migrates.** It is a pure synchronizer: on a pre-0.3.1 / non-modular layout or an un-applied schema it **fails closed** with `IS_STATUS=needs-update` (exit 6) and changes nothing. Migration is owned entirely by the `intelligence-update` flow — tell your agent *"Update intelligence-sync"* (or run `<intel>/sync/scripts/update.sh`) first, then re-run sync.
|
|
10
|
+
> **The sync never migrates.** It is a pure synchronizer: across an un-applied schema it **fails closed** with `IS_STATUS=needs-update` (exit 6) and changes nothing. Bringing the project up to the engine is the update flow's job — in a vendored setup tell your agent *"Update intelligence-sync"* (the `intelligence-update` skill); in a CLI setup (root `intelligence.yaml`) run `npm i -g @ainova-systems/intelligence@latest` and `intelligence upgrade` — then re-run sync.
|
|
13
11
|
|
|
14
12
|
## Steps
|
|
15
13
|
|
|
16
|
-
1. Run
|
|
17
|
-
2. Review the output — verify rule, agent, and skill counts per target
|
|
18
|
-
3. If warnings about unsynced directories appear, add the missing paths
|
|
14
|
+
1. Run `<sync-cmd>`.
|
|
15
|
+
2. Review the output — verify rule, agent, and skill counts per target, and that it ends with `IS_STATUS=ok`.
|
|
16
|
+
3. If warnings about unsynced directories appear, add the missing paths under `sources:` in `<manifest>`.
|
|
@@ -7,11 +7,11 @@ agent: intelligence-operator
|
|
|
7
7
|
|
|
8
8
|
# Uninstall Adapter
|
|
9
9
|
|
|
10
|
-
The
|
|
10
|
+
The project's config is `<manifest>`; the content dir is `<umbrella>/` (never assume the name or casing); the engine's own files live under `<module>/` — these paths are localized to this project at sync time.
|
|
11
11
|
|
|
12
12
|
## Steps
|
|
13
13
|
|
|
14
|
-
1. Set `enabled: false` for the target in
|
|
14
|
+
1. Set `enabled: false` for the target in `<manifest>`.
|
|
15
15
|
|
|
16
16
|
2. **Remove only the paths the adapter owns — never the output root.** Several adapters write into a shared root that also holds files nobody generated: `.github/` holds `workflows/`, `.claude/` holds `settings.json`, `.opencode/` holds `opencode.json`. Deleting the root destroys hand-authored work, and no adapter ever does that on re-sync.
|
|
17
17
|
|
|
@@ -35,6 +35,12 @@ They never run shell commands by hand — you do.
|
|
|
35
35
|
|
|
36
36
|
## Steps
|
|
37
37
|
|
|
38
|
+
### 0. Vendored setups only
|
|
39
|
+
If the project has a root `intelligence.yaml` (a CLI setup), **stop** — this
|
|
40
|
+
flow is vendored-only. There the engine ships inside the CLI package: run
|
|
41
|
+
`npm i -g @ainova-systems/intelligence@latest`, then `intelligence upgrade`,
|
|
42
|
+
and verify with `intelligence doctor`.
|
|
43
|
+
|
|
38
44
|
### 1. Locate the umbrella & discover the engine
|
|
39
45
|
Find the dir containing `config.yaml` → `<umbrella>`. Then find the engine by
|
|
40
46
|
role: search `<umbrella>` (one level deep) for a directory `<M>` with both
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ainova-systems/intelligence",
|
|
3
|
-
"version": "0.11.0-rc.
|
|
3
|
+
"version": "0.11.0-rc.6",
|
|
4
4
|
"description": "Build, version and distribute AI agent intelligence across your organization — one CLI, versioned Intelligence Packages, and a sync engine for Claude Code, Cursor, Copilot, Codex, Pi and OpenCode.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"intelligence": "bin/intelligence.js"
|
|
@@ -8,8 +8,7 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"bin",
|
|
10
10
|
"cli",
|
|
11
|
-
"engine"
|
|
12
|
-
"registry"
|
|
11
|
+
"engine"
|
|
13
12
|
],
|
|
14
13
|
"engines": {
|
|
15
14
|
"node": ">=18"
|
package/registry/index.yaml
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# The default Intelligence Registry index, bundled with the CLI.
|
|
2
|
-
#
|
|
3
|
-
# Maps a package name to the git repo (and path inside it) the package lives
|
|
4
|
-
# in. Needed exactly when a name is not the repo — monorepos like
|
|
5
|
-
# intelligence-dev-packs. A name absent here falls through to the convention:
|
|
6
|
-
# @org/name -> https://github.com/org/name.git, content at the repo root.
|
|
7
|
-
# Organizations override or extend this per scope with `intelligence registry
|
|
8
|
-
# add @scope <registry-repo-url>`.
|
|
9
|
-
#
|
|
10
|
-
# This copy travels inside the CLI package. The same index lives at
|
|
11
|
-
# https://github.com/ainova-systems/intelligence-registry and can be bound
|
|
12
|
-
# explicitly (`intelligence registry add @ainova-systems <url>`) to read the
|
|
13
|
-
# newest entries without waiting for a CLI release.
|
|
14
|
-
packages:
|
|
15
|
-
"@ainova-systems/core":
|
|
16
|
-
url: "https://github.com/ainova-systems/intelligence-dev-packs.git"
|
|
17
|
-
path: "packs/core"
|
|
18
|
-
description: "Engineering discipline for AI-first development: context engineering, artifact-derived status, review and diagnosis loops."
|
|
19
|
-
"@ainova-systems/spec":
|
|
20
|
-
url: "https://github.com/ainova-systems/intelligence-dev-packs.git"
|
|
21
|
-
path: "packs/spec"
|
|
22
|
-
description: "Spec-driven delivery: specifications, decision records, sliced execution."
|