@agent-loom/loom 1.0.0

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.
Files changed (62) hide show
  1. package/README.md +144 -0
  2. package/dist/apply.d.ts +56 -0
  3. package/dist/apply.d.ts.map +1 -0
  4. package/dist/apply.js +97 -0
  5. package/dist/apply.js.map +1 -0
  6. package/dist/cli.d.ts +9 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +503 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/clone.d.ts +38 -0
  11. package/dist/clone.d.ts.map +1 -0
  12. package/dist/clone.js +68 -0
  13. package/dist/clone.js.map +1 -0
  14. package/dist/config.d.ts +14 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +55 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/manifest.d.ts +41 -0
  19. package/dist/manifest.d.ts.map +1 -0
  20. package/dist/manifest.js +454 -0
  21. package/dist/manifest.js.map +1 -0
  22. package/dist/renderers/claude.d.ts +15 -0
  23. package/dist/renderers/claude.d.ts.map +1 -0
  24. package/dist/renderers/claude.js +180 -0
  25. package/dist/renderers/claude.js.map +1 -0
  26. package/dist/renderers/copilot.d.ts +16 -0
  27. package/dist/renderers/copilot.d.ts.map +1 -0
  28. package/dist/renderers/copilot.js +191 -0
  29. package/dist/renderers/copilot.js.map +1 -0
  30. package/dist/repo-clone.d.ts +72 -0
  31. package/dist/repo-clone.d.ts.map +1 -0
  32. package/dist/repo-clone.js +197 -0
  33. package/dist/repo-clone.js.map +1 -0
  34. package/dist/resolve-template.d.ts +32 -0
  35. package/dist/resolve-template.d.ts.map +1 -0
  36. package/dist/resolve-template.js +75 -0
  37. package/dist/resolve-template.js.map +1 -0
  38. package/dist/search-registry.d.ts +31 -0
  39. package/dist/search-registry.d.ts.map +1 -0
  40. package/dist/search-registry.js +96 -0
  41. package/dist/search-registry.js.map +1 -0
  42. package/dist/search.d.ts +20 -0
  43. package/dist/search.d.ts.map +1 -0
  44. package/dist/search.js +51 -0
  45. package/dist/search.js.map +1 -0
  46. package/dist/skill-fetcher.d.ts +40 -0
  47. package/dist/skill-fetcher.d.ts.map +1 -0
  48. package/dist/skill-fetcher.js +99 -0
  49. package/dist/skill-fetcher.js.map +1 -0
  50. package/dist/types.d.ts +297 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +18 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/validate.d.ts +42 -0
  55. package/dist/validate.d.ts.map +1 -0
  56. package/dist/validate.js +191 -0
  57. package/dist/validate.js.map +1 -0
  58. package/dist/workspaces.d.ts +17 -0
  59. package/dist/workspaces.d.ts.map +1 -0
  60. package/dist/workspaces.js +72 -0
  61. package/dist/workspaces.js.map +1 -0
  62. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # Loom
2
+
3
+ **Template engine for coding agent workspaces.** Share and apply workspace configurations — instructions, skills, prompts, MCP servers, agents, and repos — across GitHub Copilot, Claude Code, and Cursor.
4
+
5
+ Loom lets teams maintain reusable workspace templates in a GitHub repository and apply them with a single chat command. No database, no server — just Git and GitHub Pages.
6
+
7
+ ## Demo
8
+
9
+ https://github.com/user-attachments/assets/8c937a54-cd23-45e6-9eb8-f7e2c86ec3f6
10
+
11
+ ## Why Loom?
12
+
13
+ Coding agents (Copilot, Claude Code, Cursor) rely on workspace-level configuration: instruction files, skill definitions, MCP servers, prompt files, and repository references. Teams often need to share and reuse these configurations across projects:
14
+
15
+ - **Onboarding** — new team members get a ready-to-go agent workspace in seconds
16
+ - **Consistency** — shared instructions and skills stay in sync across projects
17
+ - **Multi-agent support** — one template renders to Copilot, Claude Code, or Cursor format
18
+ - **Personal setups** — host your own templates on a personal GitHub repo
19
+
20
+ ## Quick Start
21
+
22
+ ### 1. Install
23
+
24
+ ```bash
25
+ npm install -g @agent-loom/loom
26
+ ```
27
+
28
+ ### 2. Set up a registry
29
+
30
+ ```bash
31
+ loom registry add my-templates https://github.com/<your-org>/<your-templates>
32
+ ```
33
+
34
+ ### 3. Search and apply templates
35
+
36
+ In your coding agent's chat (Copilot, Claude Code, etc.):
37
+
38
+ ```
39
+ Search for available Loom templates
40
+ ```
41
+
42
+ ```
43
+ Apply the functions-dev template to this workspace
44
+ ```
45
+
46
+ The agent handles the whole workflow — searching, selecting, and applying the template to your workspace.
47
+
48
+ ## Available Skills
49
+
50
+ Loom ships with 5 skills that teach your coding agent how to use the system:
51
+
52
+ | Skill | Purpose |
53
+ |-------|---------|
54
+ | **loom-setup** | Install CLI, configure registries, verify setup |
55
+ | **loom-search** | Search and discover templates across registries |
56
+ | **loom-apply** | Apply templates to scaffold workspaces |
57
+ | **loom-scaffold** | Create new templates from existing projects |
58
+ | **loom-workspaces** | Manage workspace history and navigate past projects |
59
+
60
+ All skills are bundled with the [Craft catalog](https://www.npmjs.com/package/@agent-loom/craft). Install them with `npx @agent-loom/craft add <skill-name>`.
61
+
62
+ ## How It Works
63
+
64
+ ```
65
+ Template Registry (GitHub repo)
66
+ ├── index.yaml ← auto-generated template index
67
+ ├── shared/ ← reusable instructions, MCP, repos, prompts
68
+ └── templates/
69
+ └── my-template/
70
+ └── manifest.yaml ← declarative workspace definition
71
+
72
+ loom apply
73
+
74
+ ┌──── Target: Copilot ──────────────────┐
75
+ │ .github/copilot-instructions.md │
76
+ │ .github/instructions/*.instructions.md │
77
+ │ .github/agents/*.agent.md │
78
+ │ .github/skills/*/SKILL.md │
79
+ │ .github/prompts/*.prompt.md │
80
+ │ .vscode/mcp.json │
81
+ └────────────────────────────────────────┘
82
+ ┌──── Target: Claude Code ──────────────┐
83
+ │ CLAUDE.md │
84
+ │ .claude/agents/*.md │
85
+ │ .claude/skills/*/SKILL.md │
86
+ │ .claude/settings.json │
87
+ │ .mcp.json │
88
+ └────────────────────────────────────────┘
89
+ ```
90
+
91
+ Templates are declarative `manifest.yaml` files. Shared resources (instructions, MCP servers, repos, prerequisites) live in `shared/` and are referenced via `$ref`. Loom resolves all references, fetches registry skills, and renders target-specific files.
92
+
93
+ ## Template Registries
94
+
95
+ A template registry is a GitHub repository with a specific layout:
96
+
97
+ ```
98
+ my-registry/
99
+ ├── index.yaml
100
+ ├── shared/
101
+ │ ├── instructions/
102
+ │ ├── mcp/
103
+ │ ├── repos/
104
+ │ ├── prerequisites/
105
+ │ └── prompts/
106
+ └── templates/
107
+ ├── template-a/
108
+ │ └── manifest.yaml
109
+ └── template-b/
110
+ └── manifest.yaml
111
+ ```
112
+
113
+ Create a GitHub repository with a template registry layout. See the [documentation](docs/getting-started.md) for a working example with CI/CD and a GitHub Pages catalog.
114
+
115
+ ## Catalog UI
116
+
117
+ Registries can publish a browsable catalog site to GitHub Pages using `@agent-loom/loom-ui`. The catalog is a static Next.js export that displays all templates with their full manifest details, built and deployed automatically via CI/CD.
118
+
119
+ ## Documentation
120
+
121
+ - [Getting Started](docs/getting-started.md) — Chat-based usage guide
122
+ - [CLI Reference](docs/cli-reference.md) — Full command reference
123
+ - [Architecture](docs/architecture.md) — System design and internals
124
+ - [Skills Specification](docs/skills-spec.md) — How skills are defined and resolved
125
+
126
+ ## Packages
127
+
128
+ | Package | Description |
129
+ |---------|-------------|
130
+ | [`@agent-loom/loom`](https://www.npmjs.com/package/@agent-loom/loom) | CLI + core library |
131
+ | [`@agent-loom/loom-ui`](https://www.npmjs.com/package/@agent-loom/loom-ui) | Static catalog site generator (Next.js) |
132
+
133
+ ## Development
134
+
135
+ ```bash
136
+ npm install
137
+ npm run build
138
+ npm test
139
+ node dist/cli.js --help
140
+ ```
141
+
142
+ ## License
143
+
144
+ ISC
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Apply — resolves a template from a registry and renders it to a target workspace.
3
+ */
4
+ import { type SkillFetcher } from './skill-fetcher.js';
5
+ import { type CloneRepoResult } from './repo-clone.js';
6
+ import type { TargetType } from './types.js';
7
+ export interface ApplyOptions {
8
+ templateDir: string;
9
+ registryRoot: string;
10
+ outputDir: string;
11
+ target: TargetType;
12
+ /** Optional fetcher to resolve registry skills to local content */
13
+ skillFetcher?: SkillFetcher;
14
+ /** Clone mode for manifest repos: 'auto' | 'all' | 'none' | undefined (no clone) */
15
+ cloneRepos?: 'auto' | 'all' | 'none';
16
+ /** Clone strategy override: 'partial' applies blobless clone to all repos without explicit cloneStrategy */
17
+ cloneMode?: 'full' | 'partial';
18
+ /** Inject exec function for testing (repo cloning) */
19
+ execFn?: (cmd: string) => void;
20
+ /** Inject prompt function for testing (large repo decisions) */
21
+ promptFn?: (message: string, choices: string[]) => Promise<string>;
22
+ /** Inject link function for creating directory junctions/symlinks */
23
+ linkFn?: (target: string, linkPath: string) => Promise<void>;
24
+ /** Select specific agents (comma-separated IDs). If undefined, all agents used. */
25
+ agents?: string[];
26
+ }
27
+ export interface ApplyResult {
28
+ target: TargetType;
29
+ template: string;
30
+ filesGenerated: boolean;
31
+ /** Registry skills that were NOT fetched (returned only when no skillFetcher is provided) */
32
+ registrySkills: Array<{
33
+ registry: string;
34
+ ref: string;
35
+ }>;
36
+ /** Skills that were fetched and placed locally */
37
+ localizedSkills: Array<{
38
+ name: string;
39
+ registry: string;
40
+ ref: string;
41
+ }>;
42
+ /** Repo clone results (only present when cloneRepos is set) */
43
+ repoCloneResult?: CloneRepoResult;
44
+ }
45
+ /**
46
+ * Apply a template to a workspace directory.
47
+ *
48
+ * Steps:
49
+ * 1. Parse manifest.yaml from templateDir
50
+ * 2. Resolve all $ref / file references
51
+ * 3. Fetch registry skills if a skillFetcher is provided
52
+ * 4. Render output files using the appropriate renderer
53
+ * 5. Return list of registry skills that need external install (if not fetched)
54
+ */
55
+ export declare function applyTemplate(options: ApplyOptions): Promise<ApplyResult>;
56
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAA6C,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,mEAAmE;IACnE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,oFAAoF;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,4GAA4G;IAC5G,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sDAAsD;IACtD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,6FAA6F;IAC7F,cAAc,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,kDAAkD;IAClD,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,+DAA+D;IAC/D,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2F/E"}
package/dist/apply.js ADDED
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Apply — resolves a template from a registry and renders it to a target workspace.
3
+ */
4
+ import { join } from 'node:path';
5
+ import { parseManifest, resolveManifest, parseAgentManifest, discoverNestedAgents, mergeTeamAndAgentManifests } from './manifest.js';
6
+ import { renderCopilot } from './renderers/copilot.js';
7
+ import { renderClaude } from './renderers/claude.js';
8
+ import { resolveRegistrySkills } from './skill-fetcher.js';
9
+ import { cloneManifestRepos } from './repo-clone.js';
10
+ /**
11
+ * Apply a template to a workspace directory.
12
+ *
13
+ * Steps:
14
+ * 1. Parse manifest.yaml from templateDir
15
+ * 2. Resolve all $ref / file references
16
+ * 3. Fetch registry skills if a skillFetcher is provided
17
+ * 4. Render output files using the appropriate renderer
18
+ * 5. Return list of registry skills that need external install (if not fetched)
19
+ */
20
+ export async function applyTemplate(options) {
21
+ const { templateDir, registryRoot, outputDir, target, skillFetcher, cloneRepos, cloneMode, execFn, promptFn, linkFn, agents: selectedAgents } = options;
22
+ const manifestPath = join(templateDir, 'manifest.yaml');
23
+ const teamManifest = await parseManifest(manifestPath);
24
+ // Detect nested agents
25
+ const nestedAgentIds = await discoverNestedAgents(templateDir);
26
+ let manifest = teamManifest;
27
+ if (nestedAgentIds.length > 0) {
28
+ // Nested template — determine which agents to include
29
+ const agentIds = selectedAgents && selectedAgents.length > 0
30
+ ? selectedAgents.filter((id) => nestedAgentIds.includes(id))
31
+ : nestedAgentIds; // All agents if none specified
32
+ // Parse agent manifests
33
+ const agentManifests = [];
34
+ for (const agentId of agentIds) {
35
+ const agentManifestPath = join(templateDir, 'agents', agentId, 'manifest.yaml');
36
+ const am = await parseAgentManifest(agentManifestPath);
37
+ agentManifests.push(am);
38
+ }
39
+ // Merge team + agent manifests
40
+ manifest = mergeTeamAndAgentManifests(teamManifest, agentManifests, agentIds);
41
+ }
42
+ const resolved = await resolveManifest(manifest, templateDir, registryRoot);
43
+ // Resolve registry skills to local if fetcher is provided
44
+ const resolvedSkills = await resolveRegistrySkills(resolved.skills, skillFetcher);
45
+ const manifestWithLocalSkills = {
46
+ ...resolved,
47
+ skills: resolvedSkills,
48
+ };
49
+ // Render
50
+ switch (target) {
51
+ case 'copilot':
52
+ await renderCopilot(manifestWithLocalSkills, outputDir);
53
+ break;
54
+ case 'claude':
55
+ await renderClaude(manifestWithLocalSkills, outputDir);
56
+ break;
57
+ case 'cursor':
58
+ // Cursor renderer not yet implemented — fall back to copilot
59
+ await renderCopilot(manifestWithLocalSkills, outputDir);
60
+ break;
61
+ default:
62
+ throw new Error(`Unknown target: ${target}`);
63
+ }
64
+ // Clone manifest repos if requested
65
+ let repoCloneResult;
66
+ if (cloneRepos && resolved.repos.length > 0) {
67
+ // Apply --clone-mode partial: override repos without explicit cloneStrategy
68
+ const repos = cloneMode === 'partial'
69
+ ? resolved.repos.map((r) => (!r.cloneStrategy && !r.sparse) ? { ...r, cloneStrategy: 'partial' } : r)
70
+ : resolved.repos;
71
+ repoCloneResult = await cloneManifestRepos({
72
+ repos,
73
+ workspaceDir: outputDir === '.' ? process.cwd() : outputDir,
74
+ mode: cloneRepos,
75
+ execFn,
76
+ promptFn,
77
+ linkFn,
78
+ });
79
+ }
80
+ // Collect registry skills that were NOT fetched (still type='registry')
81
+ const registrySkills = resolvedSkills
82
+ .filter((s) => s.type === 'registry' && s.registry && s.ref)
83
+ .map((s) => ({ registry: s.registry, ref: s.ref }));
84
+ // Collect skills that were fetched and localized
85
+ const localizedSkills = resolvedSkills
86
+ .filter((s) => s.type === 'local' && s.originalRegistry && s.originalRef)
87
+ .map((s) => ({ name: s.name, registry: s.originalRegistry, ref: s.originalRef }));
88
+ return {
89
+ target,
90
+ template: resolved.template.id,
91
+ filesGenerated: true,
92
+ registrySkills,
93
+ localizedSkills,
94
+ repoCloneResult,
95
+ };
96
+ }
97
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../src/apply.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Loom CLI — Entry Point
4
+ *
5
+ * Template engine for coding agent workspaces.
6
+ * Supports GitHub Copilot, Claude Code, and Cursor targets.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}