opkg 0.6.0 → 0.6.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.
Files changed (250) hide show
  1. package/README.md +145 -105
  2. package/assets/openpackage_ascii_dark.png +0 -0
  3. package/assets/openpackage_ascii_light.png +0 -0
  4. package/dist/commands/duplicate.js +5 -2
  5. package/dist/commands/duplicate.js.map +1 -1
  6. package/dist/commands/init.js +4 -1
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/install.js +22 -8
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/list.js +9 -3
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/login.js +58 -0
  13. package/dist/commands/login.js.map +1 -0
  14. package/dist/commands/logout.js +28 -0
  15. package/dist/commands/logout.js.map +1 -0
  16. package/dist/commands/pull.js +5 -299
  17. package/dist/commands/pull.js.map +1 -1
  18. package/dist/commands/push.js +5 -245
  19. package/dist/commands/push.js.map +1 -1
  20. package/dist/commands/save.js +20 -4
  21. package/dist/commands/save.js.map +1 -1
  22. package/dist/commands/show.js +18 -5
  23. package/dist/commands/show.js.map +1 -1
  24. package/dist/commands/status.js +19 -6
  25. package/dist/commands/status.js.map +1 -1
  26. package/dist/commands/tui.js +61 -0
  27. package/dist/commands/tui.js.map +1 -0
  28. package/dist/constants/index.js +3 -7
  29. package/dist/constants/index.js.map +1 -1
  30. package/dist/core/add/package-index-updater.js +7 -6
  31. package/dist/core/add/package-index-updater.js.map +1 -1
  32. package/dist/core/add/platform-path-transformer.js +2 -2
  33. package/dist/core/add/platform-path-transformer.js.map +1 -1
  34. package/dist/core/add/source-collector.js +1 -1
  35. package/dist/core/add/source-collector.js.map +1 -1
  36. package/dist/core/api-keys.js +6 -2
  37. package/dist/core/api-keys.js.map +1 -1
  38. package/dist/core/auth.js +25 -40
  39. package/dist/core/auth.js.map +1 -1
  40. package/dist/core/config.js +11 -3
  41. package/dist/core/config.js.map +1 -1
  42. package/dist/core/dependency-resolver.js +100 -19
  43. package/dist/core/dependency-resolver.js.map +1 -1
  44. package/dist/core/device-auth.js +81 -0
  45. package/dist/core/device-auth.js.map +1 -0
  46. package/dist/core/directory.js +14 -8
  47. package/dist/core/directory.js.map +1 -1
  48. package/dist/core/install/bulk-install-pipeline.js +33 -2
  49. package/dist/core/install/bulk-install-pipeline.js.map +1 -1
  50. package/dist/core/install/canonical-plan.js +11 -5
  51. package/dist/core/install/canonical-plan.js.map +1 -1
  52. package/dist/core/install/download-keys.js +2 -2
  53. package/dist/core/install/download-keys.js.map +1 -1
  54. package/dist/core/install/install-flow.js +6 -4
  55. package/dist/core/install/install-flow.js.map +1 -1
  56. package/dist/core/install/install-pipeline.js +74 -6
  57. package/dist/core/install/install-pipeline.js.map +1 -1
  58. package/dist/core/install/install-reporting.js +2 -1
  59. package/dist/core/install/install-reporting.js.map +1 -1
  60. package/dist/core/install/local-source-handler.js +76 -0
  61. package/dist/core/install/local-source-handler.js.map +1 -0
  62. package/dist/core/install/path-install-pipeline.js +227 -0
  63. package/dist/core/install/path-install-pipeline.js.map +1 -0
  64. package/dist/core/install/path-package-loader.js +101 -0
  65. package/dist/core/install/path-package-loader.js.map +1 -0
  66. package/dist/core/install/remote-flow.js +17 -6
  67. package/dist/core/install/remote-flow.js.map +1 -1
  68. package/dist/core/install/version-selection.js +25 -8
  69. package/dist/core/install/version-selection.js.map +1 -1
  70. package/dist/core/openpackage.js +6 -6
  71. package/dist/core/openpackage.js.map +1 -1
  72. package/dist/core/package.js +71 -8
  73. package/dist/core/package.js.map +1 -1
  74. package/dist/core/platforms.js +398 -185
  75. package/dist/core/platforms.js.map +1 -1
  76. package/dist/core/profiles.js +60 -3
  77. package/dist/core/profiles.js.map +1 -1
  78. package/dist/core/pull/pull-errors.js +62 -0
  79. package/dist/core/pull/pull-errors.js.map +1 -0
  80. package/dist/core/pull/pull-options.js +2 -0
  81. package/dist/core/pull/pull-options.js.map +1 -0
  82. package/dist/core/pull/pull-output.js +50 -0
  83. package/dist/core/pull/pull-output.js.map +1 -0
  84. package/dist/core/pull/pull-pipeline.js +141 -0
  85. package/dist/core/pull/pull-pipeline.js.map +1 -0
  86. package/dist/core/pull/pull-strategies.js +103 -0
  87. package/dist/core/pull/pull-strategies.js.map +1 -0
  88. package/dist/core/pull/pull-types.js +2 -0
  89. package/dist/core/pull/pull-types.js.map +1 -0
  90. package/dist/core/push/push-context.js +95 -0
  91. package/dist/core/push/push-context.js.map +1 -0
  92. package/dist/core/push/push-errors.js +133 -0
  93. package/dist/core/push/push-errors.js.map +1 -0
  94. package/dist/core/push/push-output.js +44 -0
  95. package/dist/core/push/push-output.js.map +1 -0
  96. package/dist/core/push/push-pipeline.js +74 -0
  97. package/dist/core/push/push-pipeline.js.map +1 -0
  98. package/dist/core/push/push-single-file.js +56 -0
  99. package/dist/core/push/push-single-file.js.map +1 -0
  100. package/dist/core/push/push-types.js +2 -0
  101. package/dist/core/push/push-types.js.map +1 -0
  102. package/dist/core/push/push-upload.js +68 -0
  103. package/dist/core/push/push-upload.js.map +1 -0
  104. package/dist/core/registry.js +4 -2
  105. package/dist/core/registry.js.map +1 -1
  106. package/dist/core/remote-pull.js +163 -35
  107. package/dist/core/remote-pull.js.map +1 -1
  108. package/dist/core/save/package-saver.js +37 -1
  109. package/dist/core/save/package-saver.js.map +1 -1
  110. package/dist/core/save/package-yml-generator.js +5 -4
  111. package/dist/core/save/package-yml-generator.js.map +1 -1
  112. package/dist/core/save/save-candidate-loader.js +10 -9
  113. package/dist/core/save/save-candidate-loader.js.map +1 -1
  114. package/dist/core/save/save-pipeline.js +31 -7
  115. package/dist/core/save/save-pipeline.js.map +1 -1
  116. package/dist/core/save/save-single-file.js +124 -0
  117. package/dist/core/save/save-single-file.js.map +1 -0
  118. package/dist/core/scoping/package-scoping.js +1 -1
  119. package/dist/core/scoping/package-scoping.js.map +1 -1
  120. package/dist/core/status/status-file-discovery.js.map +1 -1
  121. package/dist/core/token-store.js +73 -0
  122. package/dist/core/token-store.js.map +1 -0
  123. package/dist/index.js +29 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/mcp/access/context.js +20 -0
  126. package/dist/mcp/access/context.js.map +1 -0
  127. package/dist/mcp/access/index.js +57 -0
  128. package/dist/mcp/access/index.js.map +1 -0
  129. package/dist/mcp/server.js +20 -0
  130. package/dist/mcp/server.js.map +1 -0
  131. package/dist/tui/app.js +105 -0
  132. package/dist/tui/app.js.map +1 -0
  133. package/dist/tui/components/package-list.js +73 -0
  134. package/dist/tui/components/package-list.js.map +1 -0
  135. package/dist/tui/controller.js +708 -0
  136. package/dist/tui/controller.js.map +1 -0
  137. package/dist/tui/index.js +12 -0
  138. package/dist/tui/index.js.map +1 -0
  139. package/dist/tui/services/file-index.js +64 -0
  140. package/dist/tui/services/file-index.js.map +1 -0
  141. package/dist/tui/services/local-mgmt.js +68 -0
  142. package/dist/tui/services/local-mgmt.js.map +1 -0
  143. package/dist/tui/services/packages.js +18 -0
  144. package/dist/tui/services/packages.js.map +1 -0
  145. package/dist/tui/services/save.js +21 -0
  146. package/dist/tui/services/save.js.map +1 -0
  147. package/dist/tui/services/status.js +18 -0
  148. package/dist/tui/services/status.js.map +1 -0
  149. package/dist/tui/state/app-state.js +21 -0
  150. package/dist/tui/state/app-state.js.map +1 -0
  151. package/dist/tui/state.js +17 -0
  152. package/dist/tui/state.js.map +1 -0
  153. package/dist/tui/types.js +2 -0
  154. package/dist/tui/types.js.map +1 -0
  155. package/dist/tui/views/add-file-modal.js +129 -0
  156. package/dist/tui/views/add-file-modal.js.map +1 -0
  157. package/dist/tui/views/dashboard.js +106 -0
  158. package/dist/tui/views/dashboard.js.map +1 -0
  159. package/dist/tui/views/file-preview.js +44 -0
  160. package/dist/tui/views/file-preview.js.map +1 -0
  161. package/dist/tui/views/list-packages.js +73 -0
  162. package/dist/tui/views/list-packages.js.map +1 -0
  163. package/dist/tui/views/main-menu.js +33 -0
  164. package/dist/tui/views/main-menu.js.map +1 -0
  165. package/dist/tui/views/manage-view.js +81 -0
  166. package/dist/tui/views/manage-view.js.map +1 -0
  167. package/dist/tui/views/package-detail.js +254 -0
  168. package/dist/tui/views/package-detail.js.map +1 -0
  169. package/dist/tui/views/package-hub.js +120 -0
  170. package/dist/tui/views/package-hub.js.map +1 -0
  171. package/dist/tui/views/placeholder.js +24 -0
  172. package/dist/tui/views/placeholder.js.map +1 -0
  173. package/dist/types/index.js.map +1 -1
  174. package/dist/utils/bun-bootstrap.js +72 -0
  175. package/dist/utils/bun-bootstrap.js.map +1 -0
  176. package/dist/utils/command-helpers.js +24 -0
  177. package/dist/utils/command-helpers.js.map +1 -0
  178. package/dist/utils/cwd-resolver.js +45 -0
  179. package/dist/utils/cwd-resolver.js.map +1 -0
  180. package/dist/utils/formatters.js +3 -1
  181. package/dist/utils/formatters.js.map +1 -1
  182. package/dist/utils/http-client.js +27 -5
  183. package/dist/utils/http-client.js.map +1 -1
  184. package/dist/utils/index-based-installer.js +39 -15
  185. package/dist/utils/index-based-installer.js.map +1 -1
  186. package/dist/utils/install-file-discovery.js +17 -23
  187. package/dist/utils/install-file-discovery.js.map +1 -1
  188. package/dist/utils/install-helpers.js +2 -0
  189. package/dist/utils/install-helpers.js.map +1 -1
  190. package/dist/utils/jsonc.js +23 -1
  191. package/dist/utils/jsonc.js.map +1 -1
  192. package/dist/utils/manifest-paths.js +27 -0
  193. package/dist/utils/manifest-paths.js.map +1 -0
  194. package/dist/utils/package-copy.js +1 -1
  195. package/dist/utils/package-copy.js.map +1 -1
  196. package/dist/utils/package-input.js +55 -0
  197. package/dist/utils/package-input.js.map +1 -0
  198. package/dist/utils/package-management.js +160 -45
  199. package/dist/utils/package-management.js.map +1 -1
  200. package/dist/utils/package-merge.js +48 -0
  201. package/dist/utils/package-merge.js.map +1 -0
  202. package/dist/utils/package-name.js +29 -0
  203. package/dist/utils/package-name.js.map +1 -1
  204. package/dist/utils/package-versioning.js +16 -4
  205. package/dist/utils/package-versioning.js.map +1 -1
  206. package/dist/utils/package-yml.js +17 -12
  207. package/dist/utils/package-yml.js.map +1 -1
  208. package/dist/utils/platform-file.js +8 -8
  209. package/dist/utils/platform-file.js.map +1 -1
  210. package/dist/utils/platform-mapper.js +12 -28
  211. package/dist/utils/platform-mapper.js.map +1 -1
  212. package/dist/utils/platform-utils.js +23 -49
  213. package/dist/utils/platform-utils.js.map +1 -1
  214. package/dist/utils/platform-yaml-merge.js +6 -5
  215. package/dist/utils/platform-yaml-merge.js.map +1 -1
  216. package/dist/utils/prompts.js +2 -33
  217. package/dist/utils/prompts.js.map +1 -1
  218. package/dist/utils/registry-entry-filter.js +8 -8
  219. package/dist/utils/registry-entry-filter.js.map +1 -1
  220. package/dist/utils/registry-paths.js +43 -4
  221. package/dist/utils/registry-paths.js.map +1 -1
  222. package/dist/utils/tarball.js +6 -2
  223. package/dist/utils/tarball.js.map +1 -1
  224. package/dist/utils/version-ranges.js +11 -8
  225. package/dist/utils/version-ranges.js.map +1 -1
  226. package/examples/custom-subdirs-platform.jsonc +90 -0
  227. package/package.json +2 -2
  228. package/platforms.jsonc +99 -60
  229. package/specs/auth/auth-device-flow.md +70 -0
  230. package/specs/cli-options.md +42 -0
  231. package/specs/install/README.md +1 -0
  232. package/specs/install/install-behavior.md +38 -0
  233. package/specs/install/package-yml-canonical.md +21 -1
  234. package/specs/install/version-resolution.md +9 -7
  235. package/specs/login/login-device-flow.md +70 -0
  236. package/specs/package/README.md +3 -6
  237. package/specs/package/package-root-layout.md +3 -3
  238. package/specs/package/registry-payload-and-copy.md +2 -2
  239. package/specs/package/universal-content.md +3 -10
  240. package/specs/platforms.md +40 -19
  241. package/specs/push/README.md +1 -0
  242. package/specs/push/push-behavior.md +46 -10
  243. package/specs/push/push-errors-and-hints.md +19 -6
  244. package/specs/push/push-remote-upload.md +3 -0
  245. package/specs/push/push-scoping.md +14 -22
  246. package/specs/push/push-version-selection.md +18 -16
  247. package/specs/save/README.md +2 -0
  248. package/specs/save/save-modes-inputs.md +4 -2
  249. package/specs/save/save-package-detection.md +1 -1
  250. package/specs/save-pack.md +1 -0
package/README.md CHANGED
@@ -1,165 +1,199 @@
1
- # OpenPackage
2
1
 
2
+ <p align="center">
3
+ <a href="https://github.com/enulus/OpenPackage">
4
+ <picture>
5
+ <source srcset="assets/openpackage_ascii_dark.png" media="(prefers-color-scheme: dark)">
6
+ <source srcset="assets/openpackage_ascii_light.png" media="(prefers-color-scheme: light)">
7
+ <img src="assets/openpackage_ascii_light.png" alt="OpenPackage logo" height="64">
8
+ </picture>
9
+ </a>
10
+ </p>
11
+
12
+ <p align="center">Organized agentic coding for teams.</p>
13
+ <p align="center">
3
14
  <a href="https://www.npmjs.com/package/opkg " target="blank">
4
- <img src="https://img.shields.io/npm/v/opkg ?style=flat-square" alt="Npm package for OpenPackage">
15
+ <img src="https://img.shields.io/npm/v/opkg?style=flat-square" alt="Npm package for OpenPackage">
16
+ </a>
17
+ <a href="./LICENSE">
18
+ <img alt="License: Apache-2.0" src="https://img.shields.io/github/license/enulus/openpackage?style=flat-square" />
5
19
  </a>
6
- <a href="https://discord.gg/W5H54HZ8Fm" target="blank">
7
- <img src="https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white&style=flat-square" alt="OpenPackage Discord">
20
+ <a href="https://discord.gg/W5H54HZ8Fm" target="blank">
21
+ <img src="https://img.shields.io/badge/Discord-Join%20the%20community-5865F2?logo=discord&logoColor=white&style=flat-square" alt="OpenPackage Discord">
8
22
  </a>
9
23
  <br /><br />
24
+ </p>
10
25
 
11
- OpenPackage is the package manager for AI coding.
26
+ <p align="center">
27
+ Follow <a href="https://x.com/hyericlee">@hyericlee on X</a> for updates · Join the <a href="https://discord.gg/W5H54HZ8Fm">OpenPackage Discord</a> for help and questions.
28
+ </p>
12
29
 
13
- Save and sync rules, slash commands, agents, and more.
14
- Build reusable packages for use across multiple projects and AI coding platforms.
30
+ # OpenPackage
15
31
 
16
- Learn more in the official docs: [openpackage.dev/docs](https://openpackage.dev/docs).
32
+ **OpenPackage is the centralized hub for organizing your specs and configs for agentic coding, giving you consistent context and workflows between sessions, projects, and teams.**
17
33
 
18
- Looking to discover, download, or publish packages?
19
- Check out the official OpenPackage registry: [openpackage.dev/packages](https://openpackage.dev/packages).
34
+ ## Why OpenPackage?
20
35
 
21
- > [!NOTE]
22
- > For latest news and updates, follow the creator's X (Twitter) account
23
- > [@hyericlee](https://x.com/hyericlee)
36
+ Modern AI coding tools are powerful, but lack organization, reusability, and efficiency.
37
+ - Specs across individuals and codebases, diverging, unversioned, and incohesive.
38
+ - Rules, commands, and subagents scattered across multiple projects.
39
+ - Familiar workflows rebuilt for each project, incompatible between AI coding platforms.
40
+
41
+ OpenPackage organizes your specs and AI coding configs into reusable packages that can be accessed by any session, any project, and any coding platform.
42
+
43
+ ## How it works
44
+
45
+ At it's core, OpenPackage is a lightweight CLI tool for creating versioned, AI coding platform agnostic packages, each contaning sets of specs and coding config files for simplified installs, uninstalls, and distribution.
46
+
47
+ **No API keys required. No MCP installation.**
24
48
 
25
- ## Installation
49
+ 1. Declare a package
50
+ 2. Add specs and AI coding config files
51
+ 3. Sync to multiple codebases
52
+
53
+ ## Quick start
54
+
55
+ ### Install
26
56
 
27
57
  npm
28
58
  ```bash
29
59
  npm install -g opkg
30
60
  ```
31
- ## Use Cases
32
61
 
33
- ### Reuse files across multiple codebases
34
- Reuse rules, slash commands, and more across multiple codebases.
62
+ ### Create a package
63
+
35
64
  ```bash title="Terminal"
36
- # In current codebase
37
- opkg save essentials
38
- # In another codebase
39
- opkg install essentials
65
+ opkg init # Initialize the workspace as a package, or
66
+ opkg init <package> # Initialize a package under cwd `.openpackage/packages`
40
67
  ```
41
68
 
42
69
  > [!NOTE]
43
70
  > You can also use command `openpackage` instead of `opkg`
44
71
 
45
- ### Sync files across multiple platforms
46
- Automatically sync your rules, slash commands, and more across multiple platform.
47
- ```bash title="Terminal"
48
- # Current codebase has .cursor, .claude, .opencode directories
49
- opkg save essentials .cursor/commands/essentials
50
- # OpenPackage CLI automatically generates/syncs the same command files across all platforms.
51
-
52
- # Before save:
53
- # .cursor/commands/essentials/clean-code.md
72
+ ### Add/update/remove package files
54
73
 
55
- # After save:
56
- # .cursor/commands/essentials/clean-code.md
57
- # .claude/commands/essentials/clean-code.md
58
- # .opencode/command/essentials/clean-code.md
59
- ```
74
+ Directly update the files (at cwd or in `.openpackage/packages/`) and perform `opkg save`.
75
+ You can also use the add command to add workspace files to a package.
60
76
 
61
- ### Modular management of files
62
- Create domain specific packages for modular reuse.
63
77
  ```bash title="Terminal"
64
- # Create typescript package
65
- opkg add typescript .cursor/rules/typescript
66
- opkg save typescript
67
-
68
- # Create scalable-nextjs package
69
- opkg add scalable-nextjs .cursor/rules/nextjs
70
- opkg save scalable-nextjs
71
-
72
- # Create scalable-nestjs package
73
- opkg add scalable-nestjs .cursor/rules/nestjs
74
- opkg save scalable-nestjs
78
+ opkg add <package> <path-to-dir-or-file>
79
+ ```
75
80
 
76
- # Create mongodb package
77
- opkg add mongodb .cursor/rules/mongodb
78
- opkg save mongodb
81
+ > [!TIP]
82
+ > Learn how to compose packages by reading the [packages doc](https://openpackage.dev/docs/packages) from our official docs.
79
83
 
80
- # In your NextJS codebase
81
- opkg install typescript
82
- opkg install scalable-nextjs
84
+ Use `save` or `pack` to save the set of dirs and files as a package to your local registry for reuse and distribution.
83
85
 
84
- # In your NestJS codebase
85
- opkg install typescript
86
- opkg install scalable-nestjs
87
- opkg install mongodb
86
+ ```bash title="Terminal"
87
+ opkg save [package] # Prerelease/unversioned
88
+ opkg pack [package] # Stable releases
88
89
  ```
89
90
 
90
- ## Usage
91
-
92
91
  > [!TIP]
93
- > We highly recommend reading [the packages doc](https://openpackage.dev/docs/packages) to understand how packages work.
94
-
95
- ### Create a package
92
+ > Packages are saved to your local machine at `~/.openpackage/registry/`.
96
93
 
97
- #### In a project/workspace
94
+ ### List local packages
98
95
  ```bash title="Terminal"
99
- opkg init <package>
96
+ opkg list
100
97
  ```
101
- Initializes a package at `.openpackage/packages/<package>/` and generates the package's `package.yml` manifest file. This method is ideal for creating/managing multiple packages within existing projects.
98
+ Shows all packages currently saved to the local registry.
99
+
100
+ ### Show local package details
102
101
  ```bash title="Terminal"
103
- opkg add <package> <path-to-dir-or-file>
102
+ opkg show <package>
104
103
  ```
105
- Use the `add` command to add files from the workspace to a package. You can also directly create/update the package files in `.openpackage/packages/<package>/` (see Package Structure below for details).
106
-
104
+ Outputs the details of the package and lists all included files.
107
105
 
108
- #### In a dedicated codebase for the package
106
+ ### Install packages
109
107
  ```bash title="Terminal"
110
- opkg init
108
+ opkg install <package>
111
109
  ```
112
- Initializes a package at cwd and generates the package's `package.yml` manifest file. Use this to dedicate the codebase to the package itself (see Package Structure below for details on structuring a package).
110
+ Adds all files under the specified package to the codebase at cwd.
113
111
 
114
-
115
- ### Save a package
112
+ ### Uninstall packages
116
113
  ```bash title="Terminal"
117
- opkg save [package]
114
+ opkg uninstall <package>
118
115
  ```
119
- Save the set of dirs and files as a package for reuse and cross-platform sync (prerelease).
120
- Also performs sync of universal subdir content across detected AI coding platform dirs.
116
+ Removes all files for the specified package from the codebase at cwd.
121
117
 
122
- ### Finalize/pack a package
118
+ ### Upload packages (push)
123
119
  ```bash title="Terminal"
124
- opkg pack [package]
120
+ opkg push <package>
125
121
  ```
126
- Save the package as a stable non-prerelease version ready for push (upload).
127
122
 
128
- ### List packages
123
+ ### Download packages (pull)
129
124
  ```bash title="Terminal"
130
- opkg list
125
+ opkg pull <package>
131
126
  ```
132
- Use the list command to show all packages currently saved to the local registry.
133
127
 
134
- ### Show package details
128
+ ### Authenticate CLI
135
129
  ```bash title="Terminal"
136
- opkg show <package>
130
+ opkg login
137
131
  ```
138
- The show command outputs the details of the package and lists all included files.
139
132
 
140
- ### Install a package
133
+ > [!TIP]
134
+ > Create an account at [openpackage.dev](https://openpackage.dev) to manage packages remotely.
135
+
136
+ ## Use Cases
137
+
138
+ ### Reuse files across multiple codebases
139
+ Reuse rules, slash commands, and more across multiple codebases.
140
+
141
+ #### Single file
141
142
  ```bash title="Terminal"
142
- opkg install <package>
143
+ # In current codebase
144
+ opkg save f specs/nextjs.md
145
+ # In another codebase
146
+ opkg install f/specs/nextjs.md
143
147
  ```
144
- Use the install command to add all files under the specified package to the codebase at cwd.
145
148
 
146
- ### Uninstall a package
149
+ #### Multiple files via package
147
150
  ```bash title="Terminal"
148
- opkg uninstall <package>
151
+ # In current codebase
152
+ opkg save essentials
153
+ # In another codebase
154
+ opkg install essentials
149
155
  ```
150
- Use the uninstall command to remove all files for the specified package from the codebase at cwd.
151
156
 
152
- ### Push a package to remote
157
+ ### Sync files across multiple platforms
158
+ Automatically sync your rules, slash commands, and more across multiple platform.
153
159
  ```bash title="Terminal"
154
- opkg push <package>
160
+ # Current codebase has .cursor, .claude, .opencode directories
161
+ opkg save essentials .cursor/commands/essentials
162
+ # OpenPackage CLI automatically generates/syncs the same command files across all platforms.
163
+
164
+ # Before save:
165
+ # .cursor/commands/essentials/cleanup.md
166
+
167
+ # After save:
168
+ # .cursor/commands/essentials/cleanup.md
169
+ # .claude/commands/essentials/cleanup.md
170
+ # .opencode/command/essentials/cleanup.md
155
171
  ```
156
- Use the `push` command to upload a package to the [official OpenPackage registry](https://openpackage.dev).
157
172
 
158
- ### Pull a package from remote
173
+ ### Modular management of files
174
+ Create domain specific packages for modular reuse.
159
175
  ```bash title="Terminal"
160
- opkg pull <package>
176
+ # Create typescript package
177
+ opkg save typescript .cursor/rules/typescript
178
+
179
+ # Create scalable-nextjs package
180
+ opkg save scalable-nextjs .cursor/rules/nextjs
181
+
182
+ # Create scalable-nestjs package
183
+ opkg save scalable-nestjs .cursor/rules/nestjs
184
+
185
+ # Create mongodb package
186
+ opkg save mongodb .cursor/rules/mongodb
187
+
188
+ # In your NextJS codebase
189
+ opkg install typescript
190
+ opkg install scalable-nextjs
191
+
192
+ # In your NestJS codebase
193
+ opkg install typescript
194
+ opkg install scalable-nestjs
195
+ opkg install mongodb
161
196
  ```
162
- Use the `pull` command to download a package from the [official OpenPackage registry](https://openpackage.dev) to the local registry.
163
197
 
164
198
  > [!TIP]
165
199
  > Learn more by heading over to the [official docs](https://openpackage.dev/docs).
@@ -170,7 +204,7 @@ Packages are composed using the following directory structure:
170
204
 
171
205
  ```txt title="Structure"
172
206
  <package>
173
- ├── .openpackage
207
+ ├── .openpackage/
174
208
  │ ├── package.yml # The OpenPackage manifest, required
175
209
  │ ├── rules/
176
210
  │ │ └── # Rule files
@@ -190,18 +224,18 @@ There are two ways to compose packages:
190
224
  - In a project workspace: `opkg init <package>` will create a package in `.openpackage/packages/<packages>/`
191
225
  - In a dedicated package codebase: `opkg init` will create a package at cwd (similar to npm, pypi, etc.)
192
226
 
227
+ > [!TIP]
228
+ > Learn more about packages from the [packages doc](https://openpackage.dev/docs/packages) from our official docs.
229
+
193
230
  ## Supported Platforms
194
231
 
195
232
  OpenPackage performs installation and platform sync of files for supported AI coding platforms outlined by the table below.
196
- Files and paths will be automatically converted to platform specific designations during `save` and `install`. The `platforms.jsonc` file includes the specifications for all supported platforms.
197
-
198
- > [!NOTE]
199
- > OpenPackage searches and includes markdown files under supported platform directories as well as any other workspace directories.
200
233
 
201
234
  | Platform | Directory | Root file | Rules | Commands | Agents | Skills |
202
235
  | --- | --- | --- | --- | --- | --- | --- |
236
+ | Antigravity | .agent/ | | rules/ | workflows/ | | |
203
237
  | Augment Code | .augment/ | | rules/ | commands/ | | |
204
- | Claude Code | .claude/ | CLAUDE.md | | commands/ | agents/ | skills/ |
238
+ | Claude Code | .claude/ | CLAUDE.md | rules/ | commands/ | agents/ | skills/ |
205
239
  | Codex | .codex/ | AGENTS.md | | prompts/ | | |
206
240
  | Cursor | .cursor/ | AGENTS.md | rules/ | commands/ | | |
207
241
  | Factory | .factory/ | AGENTS.md | | commands/ | droids/ | |
@@ -213,9 +247,15 @@ Files and paths will be automatically converted to platform specific designation
213
247
  | Warp | .warp/ | WARP.md | | | |
214
248
  | Windsurf | .windsurf/ | | rules/ | | | |
215
249
 
250
+ The built-in `platforms.jsonc` defines supported platforms, but can be overridden by user configs:
251
+ - Global: `~/.openpackage/platforms.jsonc` (`.json`)
252
+ - Workspace: `<cwd>/.openpackage/platforms.jsonc` (`.json`)
253
+
254
+ Deep-merged (local > global > built-in) for per-project customization.
255
+
216
256
  ## Contributing
217
257
 
218
- We would love your help building the future of package management for AI coding.
258
+ We would love your help building the future of package management for agentic coding.
219
259
 
220
260
  Feel free to create [PRs](https://github.com/enulus/OpenPackage/pulls) and [Github issues](https://github.com/enulus/OpenPackage/issues) for:
221
261
  - Bugs
@@ -5,6 +5,7 @@ import { logger } from '../utils/logger.js';
5
5
  import { withErrorHandling, PackageNotFoundError } from '../utils/errors.js';
6
6
  import { parsePackageInput } from '../utils/package-name.js';
7
7
  import { transformPackageFilesMetadata } from '../utils/package-versioning.js';
8
+ import { UNVERSIONED } from '../constants/index.js';
8
9
  async function duplicatePackageCommand(sourceInput, newInput) {
9
10
  logger.info(`Duplicating package: ${sourceInput} -> ${newInput}`);
10
11
  // Ensure registry directories
@@ -45,8 +46,10 @@ async function duplicatePackageCommand(sourceInput, newInput) {
45
46
  };
46
47
  // Save duplicated package
47
48
  await packageManager.savePackage(newPackage);
48
- console.log(`✓ Duplicated '${sourceName}@${sourcePackage.metadata.version}' -> '${newName}@${newVersion}'`);
49
- return { success: true, data: { from: `${sourceName}@${sourcePackage.metadata.version}`, to: `${newName}@${newVersion}` } };
49
+ const fromLabel = sourcePackage.metadata.version ? `${sourceName}@${sourcePackage.metadata.version}` : `${sourceName} (${UNVERSIONED})`;
50
+ const toLabel = newVersion ? `${newName}@${newVersion}` : `${newName} (${UNVERSIONED})`;
51
+ console.log(`✓ Duplicated '${fromLabel}' -> '${toLabel}'`);
52
+ return { success: true, data: { from: fromLabel, to: toLabel } };
50
53
  }
51
54
  export function setupDuplicateCommand(program) {
52
55
  program
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate.js","sourceRoot":"","sources":["../../src/commands/duplicate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"duplicate.js","sourceRoot":"","sources":["../../src/commands/duplicate.ts"],"names":[],"mappings":"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"}
@@ -71,7 +71,10 @@ async function initNestedPackage(packageName, force) {
71
71
  logger.info(`Initializing nested package '${normalizedName}' in: ${packageFilesDir}`);
72
72
  try {
73
73
  await ensureDir(packageFilesDir);
74
- const packageConfig = await promptPackageDetailsForNamed(normalizedName);
74
+ const packageConfig = {
75
+ ...(await promptPackageDetailsForNamed(normalizedName)),
76
+ partial: true
77
+ };
75
78
  // Ensure include pattern is set
76
79
  if (!packageConfig.include || packageConfig.include.length === 0) {
77
80
  packageConfig.include = ['**'];
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { DIR_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';
2
2
  import { runBulkInstallPipeline } from '../core/install/bulk-install-pipeline.js';
3
3
  import { runInstallPipeline, determineResolutionMode } from '../core/install/install-pipeline.js';
4
+ import { runPathInstallPipeline } from '../core/install/path-install-pipeline.js';
4
5
  import { withErrorHandling } from '../utils/errors.js';
5
6
  import { normalizePlatforms } from '../utils/platform-mapper.js';
6
- import { parsePackageInput } from '../utils/package-name.js';
7
+ import { classifyPackageInput } from '../utils/package-input.js';
7
8
  import { logger } from '../utils/logger.js';
8
9
  import { normalizePathForProcessing } from '../utils/path-normalization.js';
9
10
  function assertTargetDirOutsideMetadata(targetDir) {
@@ -21,18 +22,32 @@ export function validateResolutionFlags(options) {
21
22
  throw new Error('--remote and --local cannot be used together. Choose one resolution mode.');
22
23
  }
23
24
  }
24
- async function installCommand(packageName, targetDir, options) {
25
+ async function installCommand(packageInput, options) {
26
+ const targetDir = '.';
27
+ const cwd = process.cwd();
25
28
  assertTargetDirOutsideMetadata(targetDir);
26
29
  options.resolutionMode = determineResolutionMode(options);
27
30
  logger.debug('Install resolution mode selected', { mode: options.resolutionMode });
28
- if (!packageName) {
29
- return await runBulkInstallPipeline(targetDir, options);
31
+ if (!packageInput) {
32
+ return await runBulkInstallPipeline(options);
30
33
  }
31
- const { name, version } = parsePackageInput(packageName);
34
+ // Classify the input to determine if it's a registry name, directory, or tarball
35
+ const classification = await classifyPackageInput(packageInput, cwd);
36
+ if (classification.type === 'directory' || classification.type === 'tarball') {
37
+ return await runPathInstallPipeline({
38
+ ...options,
39
+ sourcePath: classification.resolvedPath,
40
+ sourceType: classification.type,
41
+ targetDir
42
+ });
43
+ }
44
+ // Registry-based install (existing flow)
45
+ const { name, version, registryPath } = classification;
32
46
  return await runInstallPipeline({
33
47
  ...options,
34
48
  packageName: name,
35
49
  version,
50
+ registryPath,
36
51
  targetDir
37
52
  });
38
53
  }
@@ -42,7 +57,6 @@ export function setupInstallCommand(program) {
42
57
  .alias('i')
43
58
  .description('Install packages from the local (and optional remote) registry into this workspace. Works with WIP copies from `opkg save` and stable releases from `opkg pack`.')
44
59
  .argument('[package-name]', 'name of the package to install (optional - installs all from package.yml if not specified). Supports package@version syntax.')
45
- .argument('[target-dir]', 'target directory relative to the workspace install root (defaults to ./ai)', '.')
46
60
  .option('--dry-run', 'preview changes without applying them')
47
61
  .option('--force', 'overwrite existing files')
48
62
  .option('--conflicts <strategy>', 'conflict handling strategy: keep-both, overwrite, skip, or ask')
@@ -53,7 +67,7 @@ export function setupInstallCommand(program) {
53
67
  .option('--stable', 'prefer the latest stable version when resolving; ignore newer prerelease/WIP versions if a satisfying stable exists')
54
68
  .option('--profile <profile>', 'profile to use for authentication')
55
69
  .option('--api-key <key>', 'API key for authentication (overrides profile)')
56
- .action(withErrorHandling(async (packageName, targetDir, options) => {
70
+ .action(withErrorHandling(async (packageName, options) => {
57
71
  options.platforms = normalizePlatforms(options.platforms);
58
72
  const commandOptions = options;
59
73
  const rawConflictStrategy = commandOptions.conflicts ?? options.conflictStrategy;
@@ -67,7 +81,7 @@ export function setupInstallCommand(program) {
67
81
  }
68
82
  validateResolutionFlags(options);
69
83
  options.resolutionMode = determineResolutionMode(options);
70
- const result = await installCommand(packageName, targetDir, options);
84
+ const result = await installCommand(packageName, options);
71
85
  if (!result.success) {
72
86
  if (result.error === 'Package not found') {
73
87
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { logger } from '../utils/logger.js';
4
4
  import { withErrorHandling } from '../utils/errors.js';
5
5
  import { displayPackageTable } from '../utils/formatters.js';
6
6
  import { arePackageNamesEquivalent } from '../utils/package-name.js';
7
+ import { isUnversionedVersion } from '../utils/package-versioning.js';
7
8
  /**
8
9
  * List packages command implementation
9
10
  */
@@ -17,12 +18,17 @@ async function listPackagesCommand(options) {
17
18
  // When package name is specified, show all versions automatically
18
19
  const showAllVersions = options.packageName ? true : options.all;
19
20
  const entries = await registryManager.listPackages(filter, showAllVersions);
21
+ const formatVersionDisplay = (version) => (isUnversionedVersion(version) ? 'Unversioned' : (version ?? 'Unversioned'));
20
22
  // If a specific package name was provided, filter for exact matches only
21
23
  let filteredEntries = entries;
22
24
  if (options.packageName) {
23
25
  const target = options.packageName;
24
26
  filteredEntries = entries.filter(entry => arePackageNamesEquivalent(entry.name, target));
25
27
  }
28
+ const displayEntries = filteredEntries.map(entry => ({
29
+ ...entry,
30
+ version: formatVersionDisplay(entry.version)
31
+ }));
26
32
  if (filteredEntries.length === 0) {
27
33
  if (options.packageName) {
28
34
  console.log(`Package not found: ${options.packageName}`);
@@ -37,11 +43,11 @@ async function listPackagesCommand(options) {
37
43
  }
38
44
  // Display results
39
45
  if (options.format === 'json') {
40
- console.log(JSON.stringify(filteredEntries, null, 2));
46
+ console.log(JSON.stringify(displayEntries, null, 2));
41
47
  }
42
48
  else {
43
49
  // Table format using shared formatter
44
- const tableEntries = filteredEntries.map(entry => ({
50
+ const tableEntries = displayEntries.map(entry => ({
45
51
  name: entry.name,
46
52
  version: entry.version,
47
53
  description: entry.description
@@ -57,7 +63,7 @@ async function listPackagesCommand(options) {
57
63
  }
58
64
  return {
59
65
  success: true,
60
- data: filteredEntries
66
+ data: displayEntries
61
67
  };
62
68
  }
63
69
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { withErrorHandling } from '../utils/errors.js';
2
+ import { authManager } from '../core/auth.js';
3
+ import { startDeviceAuthorization, pollForDeviceToken, persistTokens, openBrowser, } from '../core/device-auth.js';
4
+ import { profileManager } from '../core/profiles.js';
5
+ import { logger } from '../utils/logger.js';
6
+ import { getCurrentUsername } from '../core/api-keys.js';
7
+ export function setupLoginCommand(program) {
8
+ program
9
+ .command('login')
10
+ .description('Authenticate with OpenPackage using the device authorization flow')
11
+ .option('--profile <profile>', 'profile to use for authentication')
12
+ .action(withErrorHandling(async (options) => {
13
+ const profileName = authManager.getCurrentProfile({
14
+ profile: options.profile,
15
+ });
16
+ console.log(`Using profile: ${profileName}`);
17
+ const authorization = await startDeviceAuthorization();
18
+ console.log('A browser will open for you to confirm sign-in.');
19
+ console.log(`User code: ${authorization.userCode}`);
20
+ console.log(`Verification URL: ${authorization.verificationUri}`);
21
+ console.log('');
22
+ console.log('If the browser does not open, visit the URL and enter the code above.');
23
+ openBrowser(authorization.verificationUriComplete);
24
+ try {
25
+ const tokens = await pollForDeviceToken({
26
+ deviceCode: authorization.deviceCode,
27
+ intervalSeconds: authorization.interval,
28
+ expiresInSeconds: authorization.expiresIn,
29
+ });
30
+ await persistTokens(profileName, tokens);
31
+ const username = tokens.username ?? (await resolveUsername(profileName));
32
+ if (username) {
33
+ await profileManager.setProfileDefaultScope(profileName, `@${username}`);
34
+ console.log(`✓ Default scope set to @${username} for profile "${profileName}".`);
35
+ }
36
+ else {
37
+ logger.debug('Could not derive username from API key; default scope not set');
38
+ }
39
+ console.log('');
40
+ console.log('✓ Login successful.');
41
+ console.log(`✓ API key stored for profile "${profileName}".`);
42
+ }
43
+ catch (error) {
44
+ logger.debug('Device login failed', { error });
45
+ throw error;
46
+ }
47
+ }));
48
+ }
49
+ async function resolveUsername(profileName) {
50
+ try {
51
+ return await getCurrentUsername({ profile: profileName });
52
+ }
53
+ catch (error) {
54
+ logger.debug('Unable to resolve username from API key', { error });
55
+ return undefined;
56
+ }
57
+ }
58
+ //# sourceMappingURL=login.js.map