@noir-ai/create 1.13.0 → 1.14.0-beta.1
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/dist/index.d.ts +48 -10
- package/dist/index.js +126 -28
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/templates/config.env.tmpl +75 -0
- package/templates/config.yml.tmpl +6 -0
- package/templates/env.example.tmpl +73 -5
- package/templates/gitignore.tmpl +0 -3
- package/templates/noir-readme.md.tmpl +57 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noir-ai/create",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0-beta.1",
|
|
4
4
|
"description": "Noir scaffold engine — the idempotent declarative writer, manifest, templates, stack-detect, and migrations that power `noir init`/`create`/`sync`.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "agaaaptr",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"templates"
|
|
47
47
|
],
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@noir-ai/
|
|
50
|
-
"@noir-ai/
|
|
49
|
+
"@noir-ai/adapters": "1.14.0-beta.1",
|
|
50
|
+
"@noir-ai/core": "1.14.0-beta.1"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/node": "^22.17.0"
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# .noir/.env — project-scoped configuration for this repo.
|
|
2
|
+
#
|
|
3
|
+
# This file is the recommended home for project-scoped configuration and
|
|
4
|
+
# secrets. Precedence:
|
|
5
|
+
# 1. run profile env run.profiles.<n>.env (per-invocation; merges OVER)
|
|
6
|
+
# 2. .noir/.env <- recommended home for project-scoped configuration
|
|
7
|
+
# 3. real environment CI / container / launchd / shell rc
|
|
8
|
+
# 4. built-in default
|
|
9
|
+
#
|
|
10
|
+
# A real environment variable is a FALLBACK: it applies only to keys this file
|
|
11
|
+
# leaves unset. A machine-global export therefore cannot shadow a value here.
|
|
12
|
+
# Run `noir env` to see which source is winning for each key.
|
|
13
|
+
#
|
|
14
|
+
# Keep this file private: chmod 600 .noir/.env
|
|
15
|
+
# It is gitignored by Noir's managed .gitignore block, and Noir REFUSES to load
|
|
16
|
+
# it if it is tracked by git (a cloned repo could redirect credentials).
|
|
17
|
+
# Never commit it.
|
|
18
|
+
#
|
|
19
|
+
# EVERY LINE BELOW IS COMMENTED OUT. `noir init` created this file at mode 0600
|
|
20
|
+
# with no active value, so it parses to an empty overlay and changes no
|
|
21
|
+
# behaviour. Uncomment only what you enable, and fill in a real value.
|
|
22
|
+
# `.noir/.env.example` carries the same set and stays committable.
|
|
23
|
+
#
|
|
24
|
+
# Full reference: docs/reference/environment.md
|
|
25
|
+
|
|
26
|
+
# --- Integrations -----------------------------------------------------------
|
|
27
|
+
# ClickUp — only if the noir-clickup integration is enabled.
|
|
28
|
+
# CLICKUP_API_TOKEN=pk_00000000000000000000000000000000
|
|
29
|
+
#
|
|
30
|
+
# CLICKUP_TEAM_ID is NOT an env var — Noir never reads it. Workspace binding
|
|
31
|
+
# (team/list/space ids) is config.yml instead:
|
|
32
|
+
# integrations:
|
|
33
|
+
# clickup:
|
|
34
|
+
# teamId: "ABC123" # optional — only for custom task IDs (#ABC-123)
|
|
35
|
+
|
|
36
|
+
# --- Remote embedders (context.embedder.kind: remote) -----------------------
|
|
37
|
+
# The default local embedder (kind: local) needs no key.
|
|
38
|
+
# OPENAI_API_KEY=sk-000000000000000000000000000000000000000000000000
|
|
39
|
+
# VOYAGE_API_KEY=pa-0000000000000000000000000000000000000000000000
|
|
40
|
+
# COHERE_API_KEY=0000000000000000000000000000000000000000
|
|
41
|
+
#
|
|
42
|
+
# Ollama (kind: ollama) reads its base URL from config.yml
|
|
43
|
+
# (context.embedder.baseURL); this variable is the fallback:
|
|
44
|
+
# OLLAMA_BASE_URL=http://localhost:11434
|
|
45
|
+
|
|
46
|
+
# --- Model provider key -----------------------------------------------------
|
|
47
|
+
# There is NO fixed "model key" variable, and setting one is not enough on its
|
|
48
|
+
# own. `apiKeyEnv` is a NAME, not an interpolation: the config stores the
|
|
49
|
+
# variable NAME and Noir reads process.env[<that name>] at call time. Write the
|
|
50
|
+
# bare name — never `${...}` — in .noir/config.yml:
|
|
51
|
+
#
|
|
52
|
+
# model:
|
|
53
|
+
# providers:
|
|
54
|
+
# anthropic:
|
|
55
|
+
# apiKeyEnv: ANTHROPIC_API_KEY # -> reads $ANTHROPIC_API_KEY
|
|
56
|
+
# tiers:
|
|
57
|
+
# default:
|
|
58
|
+
# provider: anthropic
|
|
59
|
+
#
|
|
60
|
+
# Only `run.profiles.<name>.env` interpolates `${VAR}`. With no provider
|
|
61
|
+
# configured the model layer degrades to templates — Noir never makes a silent
|
|
62
|
+
# paid call. `ANTHROPIC_API_KEY` is the conventional example, not a variable
|
|
63
|
+
# Noir looks up on its own:
|
|
64
|
+
# ANTHROPIC_API_KEY=sk-ant-0000000000000000000000000000000000000000000000
|
|
65
|
+
|
|
66
|
+
# --- Run profile selection --------------------------------------------------
|
|
67
|
+
# Selects a `run.profiles.<name>` entry for `noir run`.
|
|
68
|
+
# Precedence: --profile flag > NOIR_PROFILE > run.defaultProfile > host default.
|
|
69
|
+
# NOIR_PROFILE=work
|
|
70
|
+
|
|
71
|
+
# --- Update kill-switches ---------------------------------------------------
|
|
72
|
+
# NOIR_DISABLE_UPDATE_CHECK=1 # suppress the background startup check only
|
|
73
|
+
# NOIR_DISABLE_UPDATES=1 # make `noir update` refuse (exit 2)
|
|
74
|
+
|
|
75
|
+
# See docs/reference/environment.md for every variable Noir reads.
|
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
host: {{host}}
|
|
2
2
|
mode: full
|
|
3
|
+
|
|
4
|
+
# noir:env-pointer
|
|
5
|
+
# This file is safe to commit: it holds no secrets.
|
|
6
|
+
# Project-scoped values and secrets belong in .noir/.env (gitignored, mode
|
|
7
|
+
# 0600). .noir/.env.example documents the full variable set; `noir env`
|
|
8
|
+
# reports which source wins for each key.
|
|
@@ -1,11 +1,79 @@
|
|
|
1
|
-
# .noir/.env.example —
|
|
2
|
-
# `.noir/.env` is gitignored — NEVER commit real tokens. Real environment
|
|
3
|
-
# variables always win over this file (it fills only unset keys).
|
|
1
|
+
# .noir/.env.example — committable documentation of the format.
|
|
4
2
|
#
|
|
5
|
-
#
|
|
3
|
+
# This file is a TEMPLATE and is never loaded. Noir reads `.noir/.env`, which
|
|
4
|
+
# `noir init` already created for you at mode 0600 — edit that file and
|
|
5
|
+
# uncomment the entries you need. Keep this example in git so the variable set
|
|
6
|
+
# stays discoverable.
|
|
7
|
+
#
|
|
8
|
+
# ---------------------------------------------------------------------------
|
|
9
|
+
# The block below is the same header `.noir/.env` carries (spec 12.1).
|
|
10
|
+
# ---------------------------------------------------------------------------
|
|
11
|
+
#
|
|
12
|
+
# .noir/.env — project-scoped configuration for this repo.
|
|
13
|
+
#
|
|
14
|
+
# This file is the recommended home for project-scoped configuration and
|
|
15
|
+
# secrets. Precedence:
|
|
16
|
+
# 1. run profile env run.profiles.<n>.env (per-invocation; merges OVER)
|
|
17
|
+
# 2. .noir/.env <- recommended home for project-scoped configuration
|
|
18
|
+
# 3. real environment CI / container / launchd / shell rc
|
|
19
|
+
# 4. built-in default
|
|
20
|
+
#
|
|
21
|
+
# A real environment variable is a FALLBACK: it applies only to keys this file
|
|
22
|
+
# leaves unset. A machine-global export therefore cannot shadow a value here.
|
|
23
|
+
# Run `noir env` to see which source is winning for each key.
|
|
24
|
+
#
|
|
25
|
+
# Keep this file private: chmod 600 .noir/.env
|
|
26
|
+
# It is gitignored by Noir's managed .gitignore block, and Noir REFUSES to load
|
|
27
|
+
# it if it is tracked by git (a cloned repo could redirect credentials).
|
|
28
|
+
# Never commit `.noir/.env`. (THIS file is the committable one.)
|
|
29
|
+
|
|
30
|
+
# --- Integrations -----------------------------------------------------------
|
|
31
|
+
# ClickUp — only if the noir-clickup integration is enabled.
|
|
6
32
|
# CLICKUP_API_TOKEN=pk_00000000000000000000000000000000
|
|
7
33
|
#
|
|
8
|
-
# CLICKUP_TEAM_ID is NOT an env var —
|
|
34
|
+
# CLICKUP_TEAM_ID is NOT an env var — Noir never reads it. Workspace binding
|
|
35
|
+
# (team/list/space ids) is config.yml instead:
|
|
9
36
|
# integrations:
|
|
10
37
|
# clickup:
|
|
11
38
|
# teamId: "ABC123" # optional — only for custom task IDs (#ABC-123)
|
|
39
|
+
|
|
40
|
+
# --- Remote embedders (context.embedder.kind: remote) -----------------------
|
|
41
|
+
# The default local embedder (kind: local) needs no key.
|
|
42
|
+
# OPENAI_API_KEY=sk-000000000000000000000000000000000000000000000000
|
|
43
|
+
# VOYAGE_API_KEY=pa-0000000000000000000000000000000000000000000000
|
|
44
|
+
# COHERE_API_KEY=0000000000000000000000000000000000000000
|
|
45
|
+
#
|
|
46
|
+
# Ollama (kind: ollama) reads its base URL from config.yml
|
|
47
|
+
# (context.embedder.baseURL); this variable is the fallback:
|
|
48
|
+
# OLLAMA_BASE_URL=http://localhost:11434
|
|
49
|
+
|
|
50
|
+
# --- Model provider key -----------------------------------------------------
|
|
51
|
+
# There is NO fixed "model key" variable, and setting one is not enough on its
|
|
52
|
+
# own. `apiKeyEnv` is a NAME, not an interpolation: the config stores the
|
|
53
|
+
# variable NAME and Noir reads process.env[<that name>] at call time. Write the
|
|
54
|
+
# bare name — never `${...}` — in .noir/config.yml:
|
|
55
|
+
#
|
|
56
|
+
# model:
|
|
57
|
+
# providers:
|
|
58
|
+
# anthropic:
|
|
59
|
+
# apiKeyEnv: ANTHROPIC_API_KEY # -> reads $ANTHROPIC_API_KEY
|
|
60
|
+
# tiers:
|
|
61
|
+
# default:
|
|
62
|
+
# provider: anthropic
|
|
63
|
+
#
|
|
64
|
+
# Only `run.profiles.<name>.env` interpolates `${VAR}`. With no provider
|
|
65
|
+
# configured the model layer degrades to templates — Noir never makes a silent
|
|
66
|
+
# paid call. `ANTHROPIC_API_KEY` is the conventional example, not a variable
|
|
67
|
+
# Noir looks up on its own:
|
|
68
|
+
# ANTHROPIC_API_KEY=sk-ant-0000000000000000000000000000000000000000000000
|
|
69
|
+
|
|
70
|
+
# --- Run profile selection --------------------------------------------------
|
|
71
|
+
# Selects a `run.profiles.<name>` entry for `noir run`.
|
|
72
|
+
# Precedence: --profile flag > NOIR_PROFILE > run.defaultProfile > host default.
|
|
73
|
+
# NOIR_PROFILE=work
|
|
74
|
+
|
|
75
|
+
# --- Update kill-switches ---------------------------------------------------
|
|
76
|
+
# NOIR_DISABLE_UPDATE_CHECK=1 # suppress the background startup check only
|
|
77
|
+
# NOIR_DISABLE_UPDATES=1 # make `noir update` refuse (exit 2)
|
|
78
|
+
|
|
79
|
+
# See docs/reference/environment.md for every variable Noir reads.
|
package/templates/gitignore.tmpl
CHANGED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# `.noir/` — the Noir project store
|
|
2
|
+
|
|
3
|
+
This directory is the canonical project state — not the host's own files.
|
|
4
|
+
Everything here is either emitted by `noir init` / `noir sync` or written by
|
|
5
|
+
the feature named beside it.
|
|
6
|
+
|
|
7
|
+
## What exists now
|
|
8
|
+
|
|
9
|
+
| Path | What it is |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `project.id` | Canonical project id. It names the store database (`store/<project.id>.db`) — don't regenerate it by hand. |
|
|
12
|
+
| `config.yml` | Your config seed: host, mode, integrations, context / memory / model settings. Yours to edit. |
|
|
13
|
+
| `NOIR.md` | The context brief the host context file `@`-imports. Noir-managed region. |
|
|
14
|
+
| `rules/RULES.md` | The AI working contract the host `@`-imports. Yours to edit. |
|
|
15
|
+
| `.env` | Project-scoped configuration and secrets (mode 0600, gitignored). |
|
|
16
|
+
| `.env.example` | Committable documentation of the same variable set. Never loaded. |
|
|
17
|
+
| `scaffold-version` | Which scaffold version produced this tree — drives `noir init --upgrade`. |
|
|
18
|
+
| `ancestors.json` | Merge base for Noir's managed regions (leave it alone). |
|
|
19
|
+
| `README.md` | This map. |
|
|
20
|
+
|
|
21
|
+
Host-side pointers sit at the repository root, not here: `CLAUDE.md` (claude),
|
|
22
|
+
`AGENTS.md` (agents-md / cursor / opencode) or `GEMINI.md` (gemini), plus that
|
|
23
|
+
host's MCP config (`.mcp.json`, `.gemini/mcp.json`, `.cursor/mcp.json`,
|
|
24
|
+
`opencode.json`). With `--host claude`, `router.md` and `hooks/` (the
|
|
25
|
+
SessionStart contract and its runner) live here too.
|
|
26
|
+
|
|
27
|
+
## What appears later
|
|
28
|
+
|
|
29
|
+
Nothing below is created eagerly — each directory shows up the first time the
|
|
30
|
+
feature that owns it runs, so an empty project stays empty. `store/`, `handoff/`
|
|
31
|
+
and `transcripts/` hold runtime data and are gitignored; everything else is
|
|
32
|
+
committed.
|
|
33
|
+
|
|
34
|
+
| Directory | Written by | Triggered by |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| `store/` | The daemon — single-writer SQLite + FTS5 + vectors | the first command that touches the store (`store/<project.id>.db`) |
|
|
37
|
+
| `intake/`, `specs/`, `plans/`, `tasks/`, `clarifications/` | The SDD workflow phases | `noir task new` → `noir task advance` |
|
|
38
|
+
| `decisions/` | The ADR stub written in the document phase | a task landing at `done` |
|
|
39
|
+
| `audit/` | Task gate results, plus integration call logs | `noir task verify`, and the first integration call |
|
|
40
|
+
| `transcripts/` | Raw host output (best effort) | `noir run <prompt>` |
|
|
41
|
+
| `handoff/` | Session handoff prompts | `noir handoff --write` |
|
|
42
|
+
|
|
43
|
+
## Where to go next
|
|
44
|
+
|
|
45
|
+
- **Configuration** — `.noir/config.yml` holds host, mode, integrations and the
|
|
46
|
+
context / memory / model settings. `noir doctor` reports what is drifted and
|
|
47
|
+
what a re-emit would change.
|
|
48
|
+
- **Environment variables** — put project-scoped values (and secrets) in
|
|
49
|
+
`.noir/.env`; `.noir/.env.example` documents the full set and is the file to
|
|
50
|
+
commit. The file **wins for every key it defines** — a real environment
|
|
51
|
+
variable is only the fallback for keys it leaves unset. There is no
|
|
52
|
+
`VAR=value noir ...` prefix level; for a genuine per-invocation value add a
|
|
53
|
+
`run.profiles.<name>.env` entry and select it with `noir run --profile <name>`.
|
|
54
|
+
`noir env` shows which source wins per key.
|
|
55
|
+
- **The workflow** — `noir task new` starts the spec → plan → implement →
|
|
56
|
+
verify → document lifecycle, `noir status` shows where every task stands, and
|
|
57
|
+
`noir skills list` lists the on-demand skills your host can load.
|