create-nola-lang 0.1.3 → 0.1.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 +9 -0
- package/dist/add.d.ts +11 -3
- package/dist/add.d.ts.map +1 -1
- package/dist/add.js +16 -3
- package/dist/add.js.map +1 -1
- package/dist/agents.d.ts +31 -4
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +135 -70
- package/dist/agents.js.map +1 -1
- package/dist/api.d.ts +129 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +156 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +87 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +334 -0
- package/dist/auth.js.map +1 -0
- package/dist/checkout.d.ts +24 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +65 -0
- package/dist/checkout.js.map +1 -0
- package/dist/{prompter-6BJFVFZL.js → chunk-7IQIRMK6.js} +420 -57
- package/dist/chunk-FPS2V3S4.js +107 -0
- package/dist/chunk-ZHMW2DCK.js +1939 -0
- package/dist/cli.d.ts +53 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +107 -0
- package/dist/cli.js.map +1 -0
- package/dist/credentials.d.ts +30 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +98 -0
- package/dist/credentials.js.map +1 -0
- package/dist/examples.d.ts +1 -5
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +4 -17
- package/dist/examples.js.map +1 -1
- package/dist/flow.d.ts +115 -0
- package/dist/flow.d.ts.map +1 -1
- package/dist/flow.js +352 -35
- package/dist/flow.js.map +1 -1
- package/dist/home-config.d.ts +31 -0
- package/dist/home-config.d.ts.map +1 -0
- package/dist/home-config.js +86 -0
- package/dist/home-config.js.map +1 -0
- package/dist/index.d.ts +24 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -7
- package/dist/index.js.map +1 -1
- package/dist/key.d.ts +45 -0
- package/dist/key.d.ts.map +1 -0
- package/dist/key.js +92 -0
- package/dist/key.js.map +1 -0
- package/dist/launch.d.ts +35 -0
- package/dist/launch.d.ts.map +1 -0
- package/dist/launch.js +71 -0
- package/dist/launch.js.map +1 -0
- package/dist/main.js +11 -22
- package/dist/main.js.map +1 -1
- package/dist/open-url.d.ts +20 -0
- package/dist/open-url.d.ts.map +1 -0
- package/dist/open-url.js +51 -0
- package/dist/open-url.js.map +1 -0
- package/dist/palette.d.ts +31 -0
- package/dist/palette.d.ts.map +1 -0
- package/dist/palette.js +36 -0
- package/dist/palette.js.map +1 -0
- package/dist/prompter-LGNUYLB4.js +7 -0
- package/dist/prompter.d.ts.map +1 -1
- package/dist/prompter.js +23 -1
- package/dist/prompter.js.map +1 -1
- package/dist/providers.d.ts +24 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +23 -0
- package/dist/providers.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +1 -0
- package/dist/registry.js.map +1 -1
- package/dist/scaffold.d.ts +10 -0
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +54 -3
- package/dist/scaffold.js.map +1 -1
- package/dist/skill-install.d.ts +2 -0
- package/dist/skill-install.d.ts.map +1 -1
- package/dist/skill-install.js +8 -4
- package/dist/skill-install.js.map +1 -1
- package/dist/style.d.ts +16 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +31 -0
- package/dist/style.js.map +1 -0
- package/dist/trial.d.ts +35 -0
- package/dist/trial.d.ts.map +1 -0
- package/dist/trial.js +90 -0
- package/dist/trial.js.map +1 -0
- package/package.json +7 -4
- package/skills/nola/SKILL.md +77 -0
- package/skills/nola/references/config.md +310 -0
- package/skills/nola/references/patterns.md +277 -0
- package/skills/nola/references/pitfalls.md +289 -0
- package/skills/nola/references/syntax.md +379 -0
- package/templates/_providers/anthropic.config.ts +10 -0
- package/templates/_providers/google.config.ts +10 -0
- package/templates/_providers/nola.config.ts +11 -0
- package/templates/_providers/openai.config.ts +10 -0
- package/templates/empty/_gitignore +3 -0
- package/templates/empty/nola.config.ts +5 -7
- package/templates/starter/README.md +3 -5
- package/templates/starter/_gitignore +3 -0
- package/templates/starter/nola.config.ts +7 -9
- package/templates/starter/nola.replay.jsonl +1 -1
- package/dist/chunk-CMVM4Q25.js +0 -644
- package/dist/chunk-TRTQSARU.js +0 -34
package/README.md
CHANGED
|
@@ -9,6 +9,15 @@ npm install
|
|
|
9
9
|
npm start # runs offline via a committed replay ledger - no API key needed
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
+
Interactively the flow asks for a name (Enter keeps the default), a template,
|
|
13
|
+
an inference provider (Nola first — 25 free runs, no account or provider key —
|
|
14
|
+
then OpenAI, Anthropic, Gemini, or skip), whether to set up your editor and
|
|
15
|
+
coding agents (yes opens one list: VS Code, preselected, writes `.vscode/`
|
|
16
|
+
with a debug config + the extension recommendation; coding-agent skills,
|
|
17
|
+
Claude Code preselected), and — once the files are written, when an editor
|
|
18
|
+
was chosen — whether to install dependencies and open the project in VS Code
|
|
19
|
+
right away.
|
|
20
|
+
|
|
12
21
|
You get a typed extraction example (`src/person.tsi` + a plain-TS consumer),
|
|
13
22
|
`nola.config.ts`, tsconfig, and a recorded replay ledger so the first run
|
|
14
23
|
works without any API key. `npm create nola` is a short alias of this package
|
package/dist/add.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ProviderId } from "./providers.js";
|
|
1
2
|
export interface AddResult {
|
|
2
3
|
/** files written, e.g. ["nola.config.ts", "package.json"] */
|
|
3
4
|
wrote: string[];
|
|
@@ -8,11 +9,18 @@ export interface AddResult {
|
|
|
8
9
|
/** true when nothing needed doing */
|
|
9
10
|
alreadySetUp: boolean;
|
|
10
11
|
}
|
|
12
|
+
export interface AddOptions {
|
|
13
|
+
version?: string;
|
|
14
|
+
/**
|
|
15
|
+
* The wizard's provider choice: a vendor writes its own config (and names
|
|
16
|
+
* the `model:` line when a config already exists); nola and none write the
|
|
17
|
+
* empty template's — the nola key step rewrites it afterwards (`applyTrial`).
|
|
18
|
+
*/
|
|
19
|
+
provider?: ProviderId;
|
|
20
|
+
}
|
|
11
21
|
/**
|
|
12
22
|
* Retrofit an existing npm project: write nola.config.ts (unless present) and
|
|
13
23
|
* additively merge the required packages. Never rewrites existing entries.
|
|
14
24
|
*/
|
|
15
|
-
export declare function addNola(targetDir: string, opts?:
|
|
16
|
-
version?: string;
|
|
17
|
-
}): Promise<AddResult>;
|
|
25
|
+
export declare function addNola(targetDir: string, opts?: AddOptions): Promise<AddResult>;
|
|
18
26
|
//# sourceMappingURL=add.d.ts.map
|
package/dist/add.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAgB,MAAM,gBAAgB,CAAC;AAG/D,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kCAAkC;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qCAAqC;IACrC,YAAY,EAAE,OAAO,CAAC;CACvB;AAKD,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAoBD;;;GAGG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CA0D1F"}
|
package/dist/add.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
3
3
|
import { join, resolve } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { providerById } from "./providers.js";
|
|
5
|
+
import { ownVersion, providerConfigUrl } from "./scaffold.js";
|
|
5
6
|
/** The retrofit config is the empty template's — a retrofit has no replay ledger. */
|
|
6
7
|
const EMPTY_CONFIG_URL = new URL("../templates/empty/nola.config.ts", import.meta.url);
|
|
8
|
+
/** The vendor a retrofit configures, or undefined for nola/none (which keep the empty template's config). */
|
|
9
|
+
function vendorOf(provider) {
|
|
10
|
+
if (provider === undefined || provider === "nola" || provider === "none")
|
|
11
|
+
return undefined;
|
|
12
|
+
const def = providerById(provider);
|
|
13
|
+
if (!def?.model)
|
|
14
|
+
throw new Error(`provider "${provider}" has no vendor config`);
|
|
15
|
+
return { id: provider, label: def.label, model: def.model };
|
|
16
|
+
}
|
|
7
17
|
/** null range = "^<lockstep version>"; typescript is NOT lockstep, it keeps the template pin. */
|
|
8
18
|
const REQUIRED = [
|
|
9
19
|
["dependencies", "@nola-lang/runtime", null],
|
|
@@ -41,11 +51,14 @@ export async function addNola(targetDir, opts = {}) {
|
|
|
41
51
|
return undefined;
|
|
42
52
|
};
|
|
43
53
|
const configPath = join(absRoot, "nola.config.ts");
|
|
54
|
+
const vendor = vendorOf(opts.provider);
|
|
44
55
|
if (existsSync(configPath)) {
|
|
45
|
-
skipped.push(
|
|
56
|
+
skipped.push(vendor
|
|
57
|
+
? `nola.config.ts already exists — set \`model: ${vendor.model}\` (${vendor.id} from @nola-lang/providers) to use ${vendor.label}`
|
|
58
|
+
: "nola.config.ts already exists — left untouched");
|
|
46
59
|
}
|
|
47
60
|
else {
|
|
48
|
-
await writeFile(configPath, await readFile(EMPTY_CONFIG_URL, "utf8"));
|
|
61
|
+
await writeFile(configPath, await readFile(vendor ? providerConfigUrl(vendor.id) : EMPTY_CONFIG_URL, "utf8"));
|
|
49
62
|
wrote.push("nola.config.ts");
|
|
50
63
|
}
|
|
51
64
|
for (const [section, name, fixedRange] of REQUIRED) {
|
package/dist/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../src/add.ts"],"names":[],"mappings":"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"}
|
package/dist/agents.d.ts
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
export type AgentId = "claude" | "cursor" | "copilot" | "agents-md";
|
|
2
2
|
export declare const AGENT_IDS: readonly AgentId[];
|
|
3
|
-
/**
|
|
3
|
+
/** `nola skill install`'s agents multiselect (the scaffold asks its own gated list, see flow.ts). */
|
|
4
|
+
export declare const SKILL_AGENTS_QUESTION = "Set up coding agents? (Space toggles, Enter confirms)";
|
|
5
|
+
/** Shared option list for every agents multiselect. */
|
|
4
6
|
export declare const AGENT_OPTIONS: {
|
|
5
7
|
value: AgentId;
|
|
6
8
|
label: string;
|
|
7
9
|
hint: string;
|
|
8
10
|
}[];
|
|
11
|
+
/**
|
|
12
|
+
* Adapters that inject context inline embed SKILL.md's BODY verbatim, so no
|
|
13
|
+
* adapter restates the language rules in its own words and the four can
|
|
14
|
+
* never drift from each other (spec §2).
|
|
15
|
+
*/
|
|
16
|
+
export interface SkillSource {
|
|
17
|
+
/** the frontmatter block of SKILL.md, without the --- fences */
|
|
18
|
+
frontmatter: string;
|
|
19
|
+
/** the first heading up to (not including) `## References` */
|
|
20
|
+
body: string;
|
|
21
|
+
/** the whole file, verbatim — what the claude adapter copies */
|
|
22
|
+
full: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function readSkillSource(): Promise<SkillSource>;
|
|
25
|
+
/** The `## Nola` section for AGENTS.md — also the paste snippet when skipped. */
|
|
26
|
+
export declare function agentsSection(s: SkillSource, version: string): string;
|
|
9
27
|
/** Agents whose tooling is already present in the project. */
|
|
10
28
|
export declare function detectAgents(targetDir: string): AgentId[];
|
|
11
|
-
/** The interactive preselection: detected agents + the
|
|
29
|
+
/** The interactive preselection: detected agents + Claude Code (the wizard's default agent — deduped when detected). */
|
|
12
30
|
export declare function defaultAgents(targetDir: string): AgentId[];
|
|
13
31
|
/** "all" | "none" | comma list of ids; unknown ids throw listing valid values. */
|
|
14
32
|
export declare function parseAgentsFlag(value: string): AgentId[];
|
|
@@ -17,7 +35,16 @@ export interface AgentSetupResult {
|
|
|
17
35
|
wrote: string[];
|
|
18
36
|
/** human-readable notes about files left untouched */
|
|
19
37
|
skipped: string[];
|
|
38
|
+
/** true when something was left stale — the caller can suggest --force */
|
|
39
|
+
stale: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface WriteAgentSkillsOptions {
|
|
42
|
+
/** replace files stamped by another version (never touches unstamped files) */
|
|
43
|
+
force?: boolean;
|
|
20
44
|
}
|
|
21
|
-
/**
|
|
22
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Write the selected adapters as self-contained, version-stamped content.
|
|
47
|
+
* Existing files are classified, never blindly overwritten (spec §3).
|
|
48
|
+
*/
|
|
49
|
+
export declare function writeAgentSkills(targetDir: string, agents: AgentId[], opts?: WriteAgentSkillsOptions): Promise<AgentSetupResult>;
|
|
23
50
|
//# sourceMappingURL=agents.d.ts.map
|
package/dist/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAEpE,eAAO,MAAM,SAAS,EAAE,SAAS,OAAO,EAAiD,CAAC;AAE1F,qGAAqG;AACrG,eAAO,MAAM,qBAAqB,0DAA0D,CAAC;AAE7F,uDAAuD;AACvD,eAAO,MAAM,aAAa,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAK1E,CAAC;AAcF;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAQ5D;AA6BD,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE;AAMD,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAOzD;AAED,wHAAwH;AACxH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAE1D;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAaxD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0EAA0E;IAC1E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAqCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EAAE,EACjB,IAAI,GAAE,uBAA4B,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAsD3B"}
|
package/dist/agents.js
CHANGED
|
@@ -1,70 +1,68 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { ownVersion } from "./scaffold.js";
|
|
4
6
|
export const AGENT_IDS = ["claude", "cursor", "copilot", "agents-md"];
|
|
5
|
-
/**
|
|
7
|
+
/** `nola skill install`'s agents multiselect (the scaffold asks its own gated list, see flow.ts). */
|
|
8
|
+
export const SKILL_AGENTS_QUESTION = "Set up coding agents? (Space toggles, Enter confirms)";
|
|
9
|
+
/** Shared option list for every agents multiselect. */
|
|
6
10
|
export const AGENT_OPTIONS = [
|
|
7
|
-
{ value: "agents-md", label: "AGENTS.md", hint: "cross-agent
|
|
8
|
-
{ value: "claude", label: "Claude Code", hint: ".claude/skills/nola/
|
|
11
|
+
{ value: "agents-md", label: "AGENTS.md", hint: "cross-agent instructions (Codex, Gemini CLI, …)" },
|
|
12
|
+
{ value: "claude", label: "Claude Code", hint: ".claude/skills/nola/ (full skill + references)" },
|
|
9
13
|
{ value: "cursor", label: "Cursor", hint: ".cursor/rules/nola.mdc" },
|
|
10
14
|
{ value: "copilot", label: "GitHub Copilot", hint: ".github/instructions/nola.instructions.md" },
|
|
11
15
|
];
|
|
12
16
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* (
|
|
17
|
+
* The canonical skill content, resolved relative to this module — `src/` in
|
|
18
|
+
* this checkout, `dist/` in the published tarball, both one level under the
|
|
19
|
+
* package root (the same trick TEMPLATES_DIR uses in scaffold.ts).
|
|
16
20
|
*/
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
version
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const ADAPTERS = {
|
|
63
|
-
claude: { path: ".claude/skills/nola/SKILL.md", content: CLAUDE_SKILL },
|
|
64
|
-
cursor: { path: ".cursor/rules/nola.mdc", content: CURSOR_RULE },
|
|
65
|
-
copilot: { path: ".github/instructions/nola.instructions.md", content: COPILOT_INSTRUCTIONS },
|
|
66
|
-
"agents-md": { path: "AGENTS.md", content: AGENTS_MD },
|
|
67
|
-
};
|
|
21
|
+
const SKILLS_DIR = fileURLToPath(new URL("../skills/nola/", import.meta.url));
|
|
22
|
+
/** Marks a generated file so staleness is detectable (spec §3). */
|
|
23
|
+
const STAMP_RE = /^<!-- nola-skill v(\S+)/m;
|
|
24
|
+
const stamp = (version) => `<!-- nola-skill v${version} — regenerate with: nola skill install --force -->`;
|
|
25
|
+
export async function readSkillSource() {
|
|
26
|
+
const full = (await readFile(join(SKILLS_DIR, "SKILL.md"), "utf8")).replaceAll("\r\n", "\n");
|
|
27
|
+
const fm = /^---\n([\s\S]*?)\n---\n/.exec(full);
|
|
28
|
+
if (!fm)
|
|
29
|
+
throw new Error("SKILL.md is missing its frontmatter block");
|
|
30
|
+
const afterFm = full.slice(fm[0].length);
|
|
31
|
+
const refsAt = afterFm.indexOf("\n## References");
|
|
32
|
+
const body = (refsAt === -1 ? afterFm : afterFm.slice(0, refsAt)).trim();
|
|
33
|
+
return { frontmatter: fm[1], body, full };
|
|
34
|
+
}
|
|
35
|
+
/** Points at the project-local copy — never node_modules (spec §1). */
|
|
36
|
+
const LOCAL_REFERENCES = [
|
|
37
|
+
"Deeper references, when this repo has them:",
|
|
38
|
+
"`.claude/skills/nola/references/` — syntax.md, patterns.md, config.md,",
|
|
39
|
+
"pitfalls.md.",
|
|
40
|
+
].join("\n");
|
|
41
|
+
function cursorRule(s, version) {
|
|
42
|
+
return [
|
|
43
|
+
"---",
|
|
44
|
+
"description: Nola (.tsi) language rules",
|
|
45
|
+
'globs: ["**/*.tsi", "nola.config.ts"]',
|
|
46
|
+
"alwaysApply: false",
|
|
47
|
+
"---",
|
|
48
|
+
stamp(version),
|
|
49
|
+
"",
|
|
50
|
+
s.body,
|
|
51
|
+
"",
|
|
52
|
+
LOCAL_REFERENCES,
|
|
53
|
+
"",
|
|
54
|
+
].join("\n");
|
|
55
|
+
}
|
|
56
|
+
function copilotInstructions(s, version) {
|
|
57
|
+
return ["---", 'applyTo: "**/*.tsi"', "---", stamp(version), "", s.body, "", LOCAL_REFERENCES, ""].join("\n");
|
|
58
|
+
}
|
|
59
|
+
/** The `## Nola` section for AGENTS.md — also the paste snippet when skipped. */
|
|
60
|
+
export function agentsSection(s, version) {
|
|
61
|
+
return ["## Nola", "", stamp(version), "", s.body, "", LOCAL_REFERENCES, ""].join("\n");
|
|
62
|
+
}
|
|
63
|
+
function agentsMd(s, version) {
|
|
64
|
+
return `# AGENTS.md\n\n${agentsSection(s, version)}`;
|
|
65
|
+
}
|
|
68
66
|
/** Agents whose tooling is already present in the project. */
|
|
69
67
|
export function detectAgents(targetDir) {
|
|
70
68
|
const root = resolve(targetDir);
|
|
@@ -77,9 +75,9 @@ export function detectAgents(targetDir) {
|
|
|
77
75
|
found.push("copilot");
|
|
78
76
|
return found;
|
|
79
77
|
}
|
|
80
|
-
/** The interactive preselection: detected agents + the
|
|
78
|
+
/** The interactive preselection: detected agents + Claude Code (the wizard's default agent — deduped when detected). */
|
|
81
79
|
export function defaultAgents(targetDir) {
|
|
82
|
-
return [...detectAgents(targetDir), "
|
|
80
|
+
return [...new Set([...detectAgents(targetDir), "claude"])];
|
|
83
81
|
}
|
|
84
82
|
/** "all" | "none" | comma list of ids; unknown ids throw listing valid values. */
|
|
85
83
|
export function parseAgentsFlag(value) {
|
|
@@ -87,7 +85,10 @@ export function parseAgentsFlag(value) {
|
|
|
87
85
|
return [...AGENT_IDS];
|
|
88
86
|
if (value === "none")
|
|
89
87
|
return [];
|
|
90
|
-
const ids = value
|
|
88
|
+
const ids = value
|
|
89
|
+
.split(",")
|
|
90
|
+
.map((s) => s.trim())
|
|
91
|
+
.filter(Boolean);
|
|
91
92
|
for (const id of ids) {
|
|
92
93
|
if (!AGENT_IDS.includes(id)) {
|
|
93
94
|
throw new Error(`invalid --agents "${value}" (valid: ${AGENT_IDS.join(", ")} — or all, none)`);
|
|
@@ -95,27 +96,91 @@ export function parseAgentsFlag(value) {
|
|
|
95
96
|
}
|
|
96
97
|
return [...new Set(ids)];
|
|
97
98
|
}
|
|
98
|
-
/**
|
|
99
|
-
|
|
99
|
+
/** Classify an existing target per spec §3. */
|
|
100
|
+
function disposition(path, existing, version, force) {
|
|
101
|
+
const found = STAMP_RE.exec(existing);
|
|
102
|
+
if (!found) {
|
|
103
|
+
return {
|
|
104
|
+
write: false,
|
|
105
|
+
note: `${path} already exists and was not generated by nola — left untouched`,
|
|
106
|
+
stale: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (found[1] === version)
|
|
110
|
+
return { write: false, note: `${path} is up to date (v${version})`, stale: false };
|
|
111
|
+
if (force)
|
|
112
|
+
return { write: true };
|
|
113
|
+
return {
|
|
114
|
+
write: false,
|
|
115
|
+
note: `${path} is stale (v${found[1]} → v${version}) — re-run with --force to replace it`,
|
|
116
|
+
stale: true,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** Copy the canonical skill dir verbatim (stamp aside) into .claude/skills/nola/. */
|
|
120
|
+
async function writeClaudeSkill(root, s, version) {
|
|
121
|
+
const dir = join(root, ".claude", "skills", "nola");
|
|
122
|
+
await mkdir(join(dir, "references"), { recursive: true });
|
|
123
|
+
const stamped = s.full.replace(/^(---\n[\s\S]*?\n---\n)/, `$1${stamp(version)}\n`);
|
|
124
|
+
await writeFile(join(dir, "SKILL.md"), stamped);
|
|
125
|
+
const wrote = [".claude/skills/nola/SKILL.md"];
|
|
126
|
+
for (const name of (await readdir(join(SKILLS_DIR, "references"))).sort()) {
|
|
127
|
+
await writeFile(join(dir, "references", name), await readFile(join(SKILLS_DIR, "references", name), "utf8"));
|
|
128
|
+
wrote.push(`.claude/skills/nola/references/${name}`);
|
|
129
|
+
}
|
|
130
|
+
return wrote;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Write the selected adapters as self-contained, version-stamped content.
|
|
134
|
+
* Existing files are classified, never blindly overwritten (spec §3).
|
|
135
|
+
*/
|
|
136
|
+
export async function writeAgentSkills(targetDir, agents, opts = {}) {
|
|
100
137
|
const root = resolve(targetDir);
|
|
138
|
+
const version = await ownVersion();
|
|
139
|
+
const source = await readSkillSource();
|
|
140
|
+
const force = opts.force === true;
|
|
101
141
|
const wrote = [];
|
|
102
142
|
const skipped = [];
|
|
143
|
+
let stale = false;
|
|
144
|
+
const flat = {
|
|
145
|
+
cursor: { path: ".cursor/rules/nola.mdc", content: cursorRule(source, version) },
|
|
146
|
+
copilot: { path: ".github/instructions/nola.instructions.md", content: copilotInstructions(source, version) },
|
|
147
|
+
"agents-md": { path: "AGENTS.md", content: agentsMd(source, version) },
|
|
148
|
+
};
|
|
103
149
|
for (const id of AGENT_IDS) {
|
|
104
150
|
if (!agents.includes(id))
|
|
105
151
|
continue;
|
|
106
|
-
|
|
152
|
+
if (id === "claude") {
|
|
153
|
+
const marker = join(root, ".claude", "skills", "nola", "SKILL.md");
|
|
154
|
+
if (existsSync(marker)) {
|
|
155
|
+
const d = disposition(".claude/skills/nola/SKILL.md", await readFile(marker, "utf8"), version, force);
|
|
156
|
+
if (!d.write) {
|
|
157
|
+
skipped.push(d.note);
|
|
158
|
+
stale ||= d.stale;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
wrote.push(...(await writeClaudeSkill(root, source, version)));
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const { path, content } = flat[id];
|
|
107
166
|
const abs = join(root, ...path.split("/"));
|
|
108
167
|
if (existsSync(abs)) {
|
|
109
|
-
// AGENTS.md
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
168
|
+
// AGENTS.md is a user file: never modified, --force included.
|
|
169
|
+
if (id === "agents-md") {
|
|
170
|
+
skipped.push(`AGENTS.md already exists — left untouched. Add this section manually:\n\n${agentsSection(source, version)}`);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const d = disposition(path, await readFile(abs, "utf8"), version, force);
|
|
174
|
+
if (!d.write) {
|
|
175
|
+
skipped.push(d.note);
|
|
176
|
+
stale ||= d.stale;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
114
179
|
}
|
|
115
180
|
await mkdir(dirname(abs), { recursive: true });
|
|
116
181
|
await writeFile(abs, content);
|
|
117
182
|
wrote.push(path);
|
|
118
183
|
}
|
|
119
|
-
return { wrote, skipped };
|
|
184
|
+
return { wrote, skipped, stale };
|
|
120
185
|
}
|
|
121
186
|
//# sourceMappingURL=agents.js.map
|
package/dist/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hosted Nola API, from the scaffolder's side. This package ships with
|
|
3
|
+
* ZERO runtime deps, so the wire shapes below are structural mirrors of
|
|
4
|
+
* `@nola-lang/core`'s `nola-protocol.ts` (the authoritative contract the
|
|
5
|
+
* platform imports); `packages/nola-lang/src/account.ts` pins them equal at
|
|
6
|
+
* compile time.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_API_URL = "https://api.nola.sh";
|
|
9
|
+
/** `NOLA_API_URL` overrides the endpoint (dev: http://127.0.0.1:8787 against `wrangler dev`). */
|
|
10
|
+
export declare function nolaApiUrl(env?: NodeJS.ProcessEnv): string;
|
|
11
|
+
export interface ClientInit {
|
|
12
|
+
fetch?: typeof globalThis.fetch;
|
|
13
|
+
/** default: nolaApiUrl() */
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
}
|
|
16
|
+
export type NolaAccountKind = "anonymous" | "user";
|
|
17
|
+
export interface NolaTrialResponse {
|
|
18
|
+
apiKey: string;
|
|
19
|
+
account: {
|
|
20
|
+
id: string;
|
|
21
|
+
kind: NolaAccountKind;
|
|
22
|
+
};
|
|
23
|
+
trial: {
|
|
24
|
+
runs: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** Where the CLI signs in: the Auth0 tenant (`issuer` = https://<domain>), the CLI's public client id, the API audience, the loopback ports registered for the PKCE callback. */
|
|
28
|
+
export interface NolaAuthConfig {
|
|
29
|
+
issuer: string;
|
|
30
|
+
clientId: string;
|
|
31
|
+
audience: string;
|
|
32
|
+
/** `http://127.0.0.1:<port>/callback` is registered on the tenant for each; the CLI binds the first free one. Absent or empty = no sign-in here. */
|
|
33
|
+
redirectPorts?: readonly number[];
|
|
34
|
+
}
|
|
35
|
+
export interface NolaCapabilities {
|
|
36
|
+
protocol: 1;
|
|
37
|
+
infer?: boolean;
|
|
38
|
+
ingest: boolean;
|
|
39
|
+
profiles?: readonly string[];
|
|
40
|
+
/** absent when sign-in is not available on this server */
|
|
41
|
+
auth?: NolaAuthConfig;
|
|
42
|
+
/** the console origin (billing page, account) — absent on servers without a console */
|
|
43
|
+
consoleUrl?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface NolaBillingSession {
|
|
46
|
+
url: string;
|
|
47
|
+
/** ISO-8601 */
|
|
48
|
+
expiresAt: string;
|
|
49
|
+
}
|
|
50
|
+
/** POST /v1/console/keys — 201; the raw key appears here exactly once. */
|
|
51
|
+
export interface NolaConsoleCreatedKey {
|
|
52
|
+
id: string;
|
|
53
|
+
name: string | null;
|
|
54
|
+
prefix: string;
|
|
55
|
+
suffix: string | null;
|
|
56
|
+
apiKey: string;
|
|
57
|
+
}
|
|
58
|
+
/** GET /v1/console/me — the signed-in user and their personal account. */
|
|
59
|
+
export interface NolaConsoleMe {
|
|
60
|
+
user: {
|
|
61
|
+
id: string;
|
|
62
|
+
email: string | null;
|
|
63
|
+
name: string | null;
|
|
64
|
+
avatarUrl: string | null;
|
|
65
|
+
};
|
|
66
|
+
account: {
|
|
67
|
+
id: string;
|
|
68
|
+
kind: NolaAccountKind;
|
|
69
|
+
status: "active" | "suspended";
|
|
70
|
+
mode: "trial" | "paid";
|
|
71
|
+
trial: {
|
|
72
|
+
runsUsed: number;
|
|
73
|
+
runsLimit: number;
|
|
74
|
+
};
|
|
75
|
+
balanceMicro: number;
|
|
76
|
+
spendThisMonthMicro: number;
|
|
77
|
+
liveKeyCount: number;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** POST /v1/console/sessions/:id/claim — links a key's (anonymous) account to the signed-in user. */
|
|
81
|
+
export interface NolaClaim {
|
|
82
|
+
outcome: "claimed" | "merged" | "already_owned";
|
|
83
|
+
accountId: string;
|
|
84
|
+
}
|
|
85
|
+
/** A failed API call. `status` 0 means the request never got an HTTP answer (offline, DNS, refused). */
|
|
86
|
+
export declare class NolaApiError extends Error {
|
|
87
|
+
readonly status: number;
|
|
88
|
+
readonly code?: string | undefined;
|
|
89
|
+
readonly retryAfterMs?: number | undefined;
|
|
90
|
+
name: string;
|
|
91
|
+
constructor(message: string, status: number, code?: string | undefined, retryAfterMs?: number | undefined, options?: {
|
|
92
|
+
cause?: unknown;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The API no longer accepts this Auth0 session: an invalid token (401), or a token
|
|
97
|
+
* without / with a stale `nola:account_id` (403 `account_claim_missing` /
|
|
98
|
+
* `account_mismatch`, spec 2026-09-07 account-claim-required). The cure is the same:
|
|
99
|
+
* forget the session and sign in again, which re-provisions the account.
|
|
100
|
+
*/
|
|
101
|
+
export declare function isSessionRejected(err: unknown): err is NolaApiError;
|
|
102
|
+
/** A key the CLI obtained: from the machine's one anonymous trial, or minted on the signed-in user's account. */
|
|
103
|
+
export interface KeyGrant {
|
|
104
|
+
apiKey: string;
|
|
105
|
+
source: "trial" | "account";
|
|
106
|
+
/** the account the key belongs to, when the server said */
|
|
107
|
+
accountId?: string;
|
|
108
|
+
/** the trial's run limit (the public offer, 25) — trial keys only */
|
|
109
|
+
runs?: number;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* POST /v1/trial — mint an anonymous trial account and its key. The body is
|
|
113
|
+
* always the empty object: nothing on this machine identifies it to the
|
|
114
|
+
* server (spec 2026-09-02-home-config-trial-identity-design.md §6).
|
|
115
|
+
*/
|
|
116
|
+
export declare function requestTrial(init?: ClientInit): Promise<KeyGrant>;
|
|
117
|
+
/** GET /v1/capabilities — what this server offers; the CLI reads `auth` (sign-in) and `consoleUrl`. */
|
|
118
|
+
export declare function fetchCapabilities(init?: ClientInit): Promise<NolaCapabilities>;
|
|
119
|
+
/** POST /v1/console/keys — a new key on the signed-in user's account (Auth0 access token as Bearer). */
|
|
120
|
+
export declare function createConsoleKey(accessToken: string, init?: ClientInit): Promise<KeyGrant>;
|
|
121
|
+
/** GET /v1/console/me — the signed-in user and their account (Auth0 access token as Bearer). */
|
|
122
|
+
export declare function fetchMe(accessToken: string, init?: ClientInit): Promise<NolaConsoleMe>;
|
|
123
|
+
/** POST /v1/billing/session — a short-lived session for the key's account; used as the claim carrier (the key never leaves this process). */
|
|
124
|
+
export declare function createBillingSession(apiKey: string, init?: ClientInit): Promise<NolaBillingSession>;
|
|
125
|
+
/** POST /v1/console/sessions/:id/claim — link the session's account to the signed-in user (Auth0 access token as Bearer). */
|
|
126
|
+
export declare function claimSession(accessToken: string, sessionId: string, init?: ClientInit): Promise<NolaClaim>;
|
|
127
|
+
/** The session id a billing-session URL carries (`…/billing?session=bill_…`, from `POST /v1/billing/session`); undefined when the URL has none. */
|
|
128
|
+
export declare function sessionIdOf(url: string): string | undefined;
|
|
129
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|