@ainova-systems/intelligence 0.11.0-rc.1 → 0.11.0-rc.2

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.
@@ -0,0 +1,84 @@
1
+ #!/bin/bash
2
+ # intelligence search [term] — what the registries offer, and what this project
3
+ # already has. The catalogue view `list` deliberately is not: `list` answers
4
+ # "what does this project depend on", `search` answers "what could it".
5
+ #
6
+ # Sources, in resolution order (a name found earlier wins, exactly as `add`
7
+ # resolves it): every scope bound in the manifest, then the bundled index.
8
+ set -euo pipefail
9
+ source "$CLI_DIR/lib/cli-common.sh"
10
+
11
+ term="${1:-}"
12
+
13
+ detect_project
14
+ manifest=""
15
+ [ "$IP_MODE" = "v2" ] && manifest="$IP_ROOT/intelligence.yaml"
16
+
17
+ # State of one package name in this project: installed / declared / available.
18
+ pkg_state() {
19
+ local name="$1"
20
+ [ -n "$manifest" ] || { printf 'available'; return 0; }
21
+ local declared=0 k
22
+ while IFS= read -r k; do
23
+ [ "$k" = "$name" ] && declared=1
24
+ done < <(qmap_keys "$manifest" "packages")
25
+ if [ "$declared" -eq 0 ]; then
26
+ printf 'available'
27
+ elif [ -d "$IP_ROOT/.intelligence/packages/$name" ]; then
28
+ printf 'installed %s' "$(qmap_field "$IP_ROOT/intelligence.lock" "packages" "$name" "resolved")"
29
+ else
30
+ printf 'declared (run install)'
31
+ fi
32
+ }
33
+
34
+ seen=" "
35
+ rows=0
36
+ emit_index() {
37
+ local index="$1" origin="$2" name desc state
38
+ [ -n "$index" ] && [ -f "$index" ] || return 0
39
+ while IFS= read -r name; do
40
+ [ -n "$name" ] || continue
41
+ case "$seen" in *" $name "*) continue ;; esac
42
+ if [ -n "$term" ]; then
43
+ desc="$(qmap_field "$index" "packages" "$name" "description")"
44
+ case "$name$desc" in
45
+ *"$term"*) ;;
46
+ *) continue ;;
47
+ esac
48
+ fi
49
+ seen="$seen$name "
50
+ desc="$(qmap_field "$index" "packages" "$name" "description")"
51
+ state="$(pkg_state "$name")"
52
+ printf '%-34s %-22s %s\n' "$name" "$state" "${desc:-$(qmap_field "$index" "packages" "$name" "url")}"
53
+ [ "$origin" = "bundled" ] || printf '%-34s %s\n' "" " via $origin"
54
+ rows=$((rows + 1))
55
+ done < <(qmap_keys "$index" "packages")
56
+ }
57
+
58
+ if [ -n "$manifest" ]; then
59
+ while IFS= read -r scope; do
60
+ [ -n "$scope" ] || continue
61
+ url="$(qmap_value "$manifest" "registries" "$scope")"
62
+ [ -n "$url" ] || continue
63
+ index="$(_fetch_index "${url#git+}")"
64
+ if [ -z "$index" ]; then
65
+ echo " WARN: registry for $scope is unreachable or has no index.yaml: $url" >&2
66
+ continue
67
+ fi
68
+ emit_index "$index" "$scope -> $url"
69
+ done < <(qmap_keys "$manifest" "registries")
70
+ fi
71
+ emit_index "$(default_index_file)" "bundled"
72
+
73
+ if [ "$rows" -eq 0 ]; then
74
+ if [ -n "$term" ]; then
75
+ echo "Nothing matching '$term' in the configured registries."
76
+ else
77
+ echo "No registries hold any packages."
78
+ fi
79
+ echo "Any git repo with rules/, agents/ or skills/ is a package: intelligence add @org/repo"
80
+ exit 0
81
+ fi
82
+
83
+ echo ""
84
+ echo "add one: intelligence add <name> | private registry: intelligence registry add @scope <repo-url>"
package/cli/intelligence CHANGED
@@ -46,6 +46,7 @@ Usage: intelligence <command> [args]
46
46
  update [name] Re-resolve version ranges and rewrite the lockfile
47
47
  upgrade Upgrade the project to this CLI's engine (restage + restamp)
48
48
  list Installed packages with requested/locked versions
49
+ search [term] What the registries offer, and what this project has
49
50
  sync [target] Render intelligence to every enabled tool (.claude, AGENTS.md, ...)
50
51
  registry <list|add|remove> Bind a scope to a registry index
51
52
  migrate [--dry-run] Convert a vendored (v1) setup to the CLI setup
package/engine/INIT.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  The sync engine is already installed in this directory's `scripts/` subfolder. Your job: analyze this codebase, ask the user targeted questions, and generate the project-specific configuration and content.
4
4
 
5
+ > **The intelligence CLI is the recommended setup for new projects.** If `intelligence --version` works on this machine (or `npm i -g @ainova-systems/intelligence` is acceptable), prefer `intelligence init` + `intelligence add <package>` over this document — it automates what this bootstrap does by hand and adds versioned packages with a lockfile (see `docs/CLI.md`). This document remains the authoritative bootstrap for the **vendored** setup, which stays fully supported; a vendored project can convert later with `intelligence migrate`.
6
+
5
7
  **Execute phases sequentially. Do not skip or combine phases. Each phase has a gate — wait for it before proceeding.**
6
8
 
7
9
  ## Bootstrap: install the engine if it isn't here yet
@@ -110,9 +110,10 @@ 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`) |
113
+ | `<module>` | repo-relative engine module (e.g. `Intelligence/sync`; CLI setup: `.intelligence/engine`) |
114
+ | `<sync-cmd>` | the sync invocation — vendored: `bash <module>/scripts/sync.sh`, CLI setup: `intelligence sync` (`IS_SYNC_CMD`) |
114
115
 
115
- Values are exported by `sync.sh` (`IS_UMBRELLA_REL`, `IS_MODULE_REL`), 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.
116
+ 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.
116
117
 
117
118
  ### Cleanup Contract
118
119
 
@@ -56,9 +56,10 @@ 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` |
59
+ | `<module>` | repo-relative engine module | `Intelligence/sync` (CLI setup: `.intelligence/engine`) |
60
+ | `<sync-cmd>` | how a reader re-runs the sync | vendored: `bash Intelligence/sync/scripts/sync.sh`; CLI setup: `intelligence sync` |
60
61
 
61
- 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.
62
+ 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.
62
63
 
63
64
  A custom adapter belongs in the umbrella's `adapters/`, never in the module's `sync/scripts/adapters/` — the module is replaced wholesale on every update, so an adapter written there disappears at the next one. See `docs/ADAPTERS.md`.
64
65
 
@@ -401,6 +402,19 @@ Bash emits `IS_STATUS=<code> [IS_DETAIL=...]` on stdout and exits with the match
401
402
 
402
403
  **Module model.** The engine self-locates by its own path; it does not assume a folder name (`sync/` by convention). Each `<umbrella>/<module>/` is self-contained: its own `scripts/`(+`VERSION`), `skills/`, `INIT.md`, `docs/`. Modules update independently and never touch sibling modules or project content (`rules/`, `agents/`, non-meta `skills/`) nor `config.yaml` beyond the idempotent additive `sources.skills` line and the `sync_version` key.
403
404
 
405
+ **CLI mode (0.11.0+).** The `intelligence` CLI drives the same engine from outside the repo (the npm install dir); the project arrives through an env contract honored only when `IS_CLI=1` — with every variable unset the engine behaves byte-identically to the vendored flow (CI's `legacy-golden` job asserts that):
406
+
407
+ | Variable | CLI-mode value |
408
+ |---|---|
409
+ | `CONFIG_FILE` | `<root>/intelligence.yaml` (the root manifest) |
410
+ | `REPO_ROOT` | project root |
411
+ | `IS_UMBRELLA_REL` / `IS_MODULE_REL` | content dir (default `intelligence`) / `.intelligence/engine` |
412
+ | `IS_SYNC_CMD` | `intelligence sync` (feeds the `<sync-cmd>` token) |
413
+ | `IS_PROTECTED_DIRS` | colon-separated dirs `validate_output_path` must refuse — restores the source-tree protection a root manifest would otherwise disable |
414
+ | `IS_SUPPRESS_CLI_NOTE` | silences the vendored-flow recommendation NOTE (stderr-only either way) |
415
+
416
+ In CLI projects the `intelligence-sync` and `intelligence-update` meta-skills are not installed — `intelligence sync` / `intelligence update` replace them; the other meta-skills ship unchanged and reach outputs from `.intelligence/engine/skills`. `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
+
404
418
  ## .gitignore Pattern
405
419
 
406
420
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ainova-systems/intelligence",
3
- "version": "0.11.0-rc.1",
3
+ "version": "0.11.0-rc.2",
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"
@@ -6,10 +6,17 @@
6
6
  # @org/name -> https://github.com/org/name.git, content at the repo root.
7
7
  # Organizations override or extend this per scope with `intelligence registry
8
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.
9
14
  packages:
10
15
  "@ainova-systems/core":
11
16
  url: "https://github.com/ainova-systems/intelligence-dev-packs.git"
12
17
  path: "packs/core"
18
+ description: "Engineering discipline for AI-first development: context engineering, artifact-derived status, review and diagnosis loops."
13
19
  "@ainova-systems/spec":
14
20
  url: "https://github.com/ainova-systems/intelligence-dev-packs.git"
15
21
  path: "packs/spec"
22
+ description: "Spec-driven delivery: specifications, decision records, sliced execution."