Pear updates
This commit is contained in:
+43
-45
@@ -96,15 +96,17 @@ function bareOsEmitRaw(ctx, chunk) {
|
|||||||
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
async function run(ctx, argv = []) {
|
||||||
function printHelp(argv0 = 'pear') {
|
function printHelp(argv0 = 'pear') {
|
||||||
console.log(`${argv0} — Pear development surface for Bare OS
|
ctx.console.log(`${argv0} — Pear development surface for Bare OS
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
${argv0} help
|
${argv0} help
|
||||||
${argv0} info
|
${argv0} info
|
||||||
${argv0} list
|
${argv0} list
|
||||||
${argv0} stage [dir] (stub — will use ctx.pear.pearBuild)
|
${argv0} stage [dir]
|
||||||
${argv0} build [dir] (alias for stage in v1)
|
${argv0} build [dir]
|
||||||
|
${argv0} init [dir]
|
||||||
|
|
||||||
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
||||||
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
||||||
@@ -116,54 +118,54 @@ the P2P App Store.
|
|||||||
|
|
||||||
Pear apps you create here are natural citizens of the P2P App Store:
|
Pear apps you create here are natural citizens of the P2P App Store:
|
||||||
- Stage your app with Pear tooling
|
- Stage your app with Pear tooling
|
||||||
- Publish it via `appstore` (or directly as a pear:// package)
|
- Publish it via appstore (or directly as a pear:// package)
|
||||||
- Other users can discover and run it
|
- Other users can discover and run it
|
||||||
|
|
||||||
Use the `pear-dev` agent skill together with the `appstore` skill for
|
Use the pear-dev agent skill together with the appstore skill for
|
||||||
autonomous "build Pear app → publish to my store" workflows.
|
autonomous "build Pear app → publish to my store" workflows.
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInfo(ctx) {
|
async function cmdInfo() {
|
||||||
console.log('pear — Pear development tools (ctx.pear surface)')
|
ctx.console.log('pear — Pear development tools (ctx.pear surface)')
|
||||||
console.log('Bare OS version of selected Pear runtime packages.')
|
ctx.console.log('Bare OS version of selected Pear runtime packages.')
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
if (ctx.pear && typeof ctx.pear === 'object') {
|
if (ctx.pear && typeof ctx.pear === 'object') {
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
ctx.console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
const val = ctx.pear[k]
|
const val = ctx.pear[k]
|
||||||
const type = typeof val
|
const type = typeof val
|
||||||
console.log(` ${k.padEnd(20)} ${type}`)
|
ctx.console.log(` ${k.padEnd(20)} ${type}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
ctx.console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
||||||
}
|
}
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
console.log('Run "pear list" for the same view.')
|
ctx.console.log('Run "pear list" for the same view.')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdList(ctx) {
|
async function cmdList() {
|
||||||
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
||||||
console.log('ctx.pear is not available in this environment.')
|
ctx.console.log('ctx.pear is not available in this environment.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
if (keys.length === 0) {
|
if (keys.length === 0) {
|
||||||
console.log('No packages currently exposed on ctx.pear.')
|
ctx.console.log('No packages currently exposed on ctx.pear.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
ctx.console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
console.log(` ${k}`)
|
ctx.console.log(` ${k}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInit(ctx, targetDir = '.') {
|
async function cmdInit(targetDir = '.') {
|
||||||
const name = 'my-pear-app'
|
const name = 'my-pear-app'
|
||||||
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
||||||
|
|
||||||
console.log(`pear init: creating minimal Pear app skeleton at ${dir} (stub implementation)`)
|
ctx.console.log(`pear init: creating minimal Pear app skeleton at ${dir}`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await ctx.vfs.mkdir(dir, { recursive: true })
|
await ctx.vfs.mkdir(dir, { recursive: true })
|
||||||
@@ -179,53 +181,49 @@ async function cmdInit(ctx, targetDir = '.') {
|
|||||||
}
|
}
|
||||||
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
||||||
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
||||||
console.log('Created basic package.json + index.js')
|
ctx.console.log('Created basic package.json + index.js')
|
||||||
console.log('Next (when fully wired): run "pear stage ' + dir + '" using ctx.pear.pearBuild')
|
ctx.console.log(`Next: run "pear stage ${dir}" (uses ctx.pear.pearBuild when available)`)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to init:', err?.message || err)
|
ctx.console.error('Failed to init:', err?.message || err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The coreutils runner executes this file body with `ctx` in scope.
|
const sub = (argv[1] || 'help').toLowerCase()
|
||||||
// We run the command logic directly at the bottom (consistent with other commands like appstore).
|
|
||||||
|
|
||||||
const sub = (typeof argv !== 'undefined' && argv[1] ? argv[1] : 'help').toLowerCase()
|
|
||||||
|
|
||||||
switch (sub) {
|
switch (sub) {
|
||||||
case 'help':
|
case 'help':
|
||||||
case '--help':
|
case '--help':
|
||||||
case '-h':
|
case '-h':
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
case 'info':
|
case 'info':
|
||||||
await cmdInfo(ctx)
|
await cmdInfo()
|
||||||
break
|
break
|
||||||
case 'list':
|
case 'list':
|
||||||
case 'ls':
|
case 'ls':
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
break
|
break
|
||||||
case 'stage':
|
case 'stage':
|
||||||
case 'build':
|
case 'build':
|
||||||
const target = (typeof argv !== 'undefined' ? argv[2] : null) || '.'
|
const target = argv[2] || '.'
|
||||||
if (ctx.pear && ctx.pear.pearBuild) {
|
if (ctx.pear && ctx.pear.pearBuild) {
|
||||||
console.log(`Attempting stage of ${target} using ctx.pear.pearBuild (early integration)...`)
|
ctx.console.log(`Attempting stage of ${target} using ctx.pear.pearBuild...`)
|
||||||
try {
|
ctx.console.log('ctx.pear.pearBuild is available. Full pipeline implementation in progress.')
|
||||||
console.log('ctx.pear.pearBuild is available. Full stage pipeline landing in upcoming plan items.')
|
ctx.console.log('Exposed build-related keys:', Object.keys(ctx.pear).filter(k =>
|
||||||
console.log('Exposed Pear build surface:', Object.keys(ctx.pear).filter(k => k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')))
|
k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')
|
||||||
} catch (e) {
|
))
|
||||||
console.error('Stage attempt error:', e?.message || e)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.log('pear stage / build: advanced integration in progress (ctx.pear.pearBuild available).')
|
ctx.console.log('pear stage / build: ctx.pear.pearBuild not yet available in this environment.')
|
||||||
console.log('Current exposed packages on ctx.pear:')
|
ctx.console.log('Current exposed packages on ctx.pear:')
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'init':
|
case 'init':
|
||||||
await cmdInit(ctx, (typeof argv !== 'undefined' ? argv[2] : null))
|
await cmdInit(argv[2])
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
console.error(`Unknown subcommand: ${sub}`)
|
ctx.console.error(`Unknown subcommand: ${sub}`)
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"schema": 2,
|
"schema": 2,
|
||||||
"profileId": "bare-os-posix-like",
|
"profileId": "bare-os-posix-like",
|
||||||
"generatedAt": "2026-05-26T21:57:58.462Z",
|
"generatedAt": "2026-05-26T22:02:23.960Z",
|
||||||
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
||||||
"commandIndex": [
|
"commandIndex": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"schema": 1,
|
"schema": 1,
|
||||||
"atMs": 1779832678462,
|
"atMs": 1779832943959,
|
||||||
"commands": [
|
"commands": [
|
||||||
"agent",
|
"agent",
|
||||||
"appctl",
|
"appctl",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -7,15 +7,17 @@
|
|||||||
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
async function run(ctx, argv = []) {
|
||||||
function printHelp(argv0 = 'pear') {
|
function printHelp(argv0 = 'pear') {
|
||||||
console.log(`${argv0} — Pear development surface for Bare OS
|
ctx.console.log(`${argv0} — Pear development surface for Bare OS
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
${argv0} help
|
${argv0} help
|
||||||
${argv0} info
|
${argv0} info
|
||||||
${argv0} list
|
${argv0} list
|
||||||
${argv0} stage [dir] (stub — will use ctx.pear.pearBuild)
|
${argv0} stage [dir]
|
||||||
${argv0} build [dir] (alias for stage in v1)
|
${argv0} build [dir]
|
||||||
|
${argv0} init [dir]
|
||||||
|
|
||||||
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
||||||
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
||||||
@@ -27,54 +29,54 @@ the P2P App Store.
|
|||||||
|
|
||||||
Pear apps you create here are natural citizens of the P2P App Store:
|
Pear apps you create here are natural citizens of the P2P App Store:
|
||||||
- Stage your app with Pear tooling
|
- Stage your app with Pear tooling
|
||||||
- Publish it via `appstore` (or directly as a pear:// package)
|
- Publish it via appstore (or directly as a pear:// package)
|
||||||
- Other users can discover and run it
|
- Other users can discover and run it
|
||||||
|
|
||||||
Use the `pear-dev` agent skill together with the `appstore` skill for
|
Use the pear-dev agent skill together with the appstore skill for
|
||||||
autonomous "build Pear app → publish to my store" workflows.
|
autonomous "build Pear app → publish to my store" workflows.
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInfo(ctx) {
|
async function cmdInfo() {
|
||||||
console.log('pear — Pear development tools (ctx.pear surface)')
|
ctx.console.log('pear — Pear development tools (ctx.pear surface)')
|
||||||
console.log('Bare OS version of selected Pear runtime packages.')
|
ctx.console.log('Bare OS version of selected Pear runtime packages.')
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
if (ctx.pear && typeof ctx.pear === 'object') {
|
if (ctx.pear && typeof ctx.pear === 'object') {
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
ctx.console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
const val = ctx.pear[k]
|
const val = ctx.pear[k]
|
||||||
const type = typeof val
|
const type = typeof val
|
||||||
console.log(` ${k.padEnd(20)} ${type}`)
|
ctx.console.log(` ${k.padEnd(20)} ${type}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
ctx.console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
||||||
}
|
}
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
console.log('Run "pear list" for the same view.')
|
ctx.console.log('Run "pear list" for the same view.')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdList(ctx) {
|
async function cmdList() {
|
||||||
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
||||||
console.log('ctx.pear is not available in this environment.')
|
ctx.console.log('ctx.pear is not available in this environment.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
if (keys.length === 0) {
|
if (keys.length === 0) {
|
||||||
console.log('No packages currently exposed on ctx.pear.')
|
ctx.console.log('No packages currently exposed on ctx.pear.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
ctx.console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
console.log(` ${k}`)
|
ctx.console.log(` ${k}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInit(ctx, targetDir = '.') {
|
async function cmdInit(targetDir = '.') {
|
||||||
const name = 'my-pear-app'
|
const name = 'my-pear-app'
|
||||||
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
||||||
|
|
||||||
console.log(`pear init: creating minimal Pear app skeleton at ${dir} (stub implementation)`)
|
ctx.console.log(`pear init: creating minimal Pear app skeleton at ${dir}`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await ctx.vfs.mkdir(dir, { recursive: true })
|
await ctx.vfs.mkdir(dir, { recursive: true })
|
||||||
@@ -90,53 +92,49 @@ async function cmdInit(ctx, targetDir = '.') {
|
|||||||
}
|
}
|
||||||
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
||||||
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
||||||
console.log('Created basic package.json + index.js')
|
ctx.console.log('Created basic package.json + index.js')
|
||||||
console.log('Next (when fully wired): run "pear stage ' + dir + '" using ctx.pear.pearBuild')
|
ctx.console.log(`Next: run "pear stage ${dir}" (uses ctx.pear.pearBuild when available)`)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to init:', err?.message || err)
|
ctx.console.error('Failed to init:', err?.message || err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The coreutils runner executes this file body with `ctx` in scope.
|
const sub = (argv[1] || 'help').toLowerCase()
|
||||||
// We run the command logic directly at the bottom (consistent with other commands like appstore).
|
|
||||||
|
|
||||||
const sub = (typeof argv !== 'undefined' && argv[1] ? argv[1] : 'help').toLowerCase()
|
|
||||||
|
|
||||||
switch (sub) {
|
switch (sub) {
|
||||||
case 'help':
|
case 'help':
|
||||||
case '--help':
|
case '--help':
|
||||||
case '-h':
|
case '-h':
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
case 'info':
|
case 'info':
|
||||||
await cmdInfo(ctx)
|
await cmdInfo()
|
||||||
break
|
break
|
||||||
case 'list':
|
case 'list':
|
||||||
case 'ls':
|
case 'ls':
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
break
|
break
|
||||||
case 'stage':
|
case 'stage':
|
||||||
case 'build':
|
case 'build':
|
||||||
const target = (typeof argv !== 'undefined' ? argv[2] : null) || '.'
|
const target = argv[2] || '.'
|
||||||
if (ctx.pear && ctx.pear.pearBuild) {
|
if (ctx.pear && ctx.pear.pearBuild) {
|
||||||
console.log(`Attempting stage of ${target} using ctx.pear.pearBuild (early integration)...`)
|
ctx.console.log(`Attempting stage of ${target} using ctx.pear.pearBuild...`)
|
||||||
try {
|
ctx.console.log('ctx.pear.pearBuild is available. Full pipeline implementation in progress.')
|
||||||
console.log('ctx.pear.pearBuild is available. Full stage pipeline landing in upcoming plan items.')
|
ctx.console.log('Exposed build-related keys:', Object.keys(ctx.pear).filter(k =>
|
||||||
console.log('Exposed Pear build surface:', Object.keys(ctx.pear).filter(k => k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')))
|
k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')
|
||||||
} catch (e) {
|
))
|
||||||
console.error('Stage attempt error:', e?.message || e)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.log('pear stage / build: advanced integration in progress (ctx.pear.pearBuild available).')
|
ctx.console.log('pear stage / build: ctx.pear.pearBuild not yet available in this environment.')
|
||||||
console.log('Current exposed packages on ctx.pear:')
|
ctx.console.log('Current exposed packages on ctx.pear:')
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'init':
|
case 'init':
|
||||||
await cmdInit(ctx, (typeof argv !== 'undefined' ? argv[2] : null))
|
await cmdInit(argv[2])
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
console.error(`Unknown subcommand: ${sub}`)
|
ctx.console.error(`Unknown subcommand: ${sub}`)
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -96,15 +96,17 @@ function bareOsEmitRaw(ctx, chunk) {
|
|||||||
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
* See docs/design/ctx-pear-surface-and-bare-audit-plan.md for the full plan and design.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
async function run(ctx, argv = []) {
|
||||||
function printHelp(argv0 = 'pear') {
|
function printHelp(argv0 = 'pear') {
|
||||||
console.log(`${argv0} — Pear development surface for Bare OS
|
ctx.console.log(`${argv0} — Pear development surface for Bare OS
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
${argv0} help
|
${argv0} help
|
||||||
${argv0} info
|
${argv0} info
|
||||||
${argv0} list
|
${argv0} list
|
||||||
${argv0} stage [dir] (stub — will use ctx.pear.pearBuild)
|
${argv0} stage [dir]
|
||||||
${argv0} build [dir] (alias for stage in v1)
|
${argv0} build [dir]
|
||||||
|
${argv0} init [dir]
|
||||||
|
|
||||||
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
The ctx.pear surface exposes selected Pear and Bare build/bundling packages
|
||||||
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
(pear-build, pear-bundle, bare-bundle-compile, etc.) when BARE_OS_BARE_MODULES
|
||||||
@@ -116,54 +118,54 @@ the P2P App Store.
|
|||||||
|
|
||||||
Pear apps you create here are natural citizens of the P2P App Store:
|
Pear apps you create here are natural citizens of the P2P App Store:
|
||||||
- Stage your app with Pear tooling
|
- Stage your app with Pear tooling
|
||||||
- Publish it via `appstore` (or directly as a pear:// package)
|
- Publish it via appstore (or directly as a pear:// package)
|
||||||
- Other users can discover and run it
|
- Other users can discover and run it
|
||||||
|
|
||||||
Use the `pear-dev` agent skill together with the `appstore` skill for
|
Use the pear-dev agent skill together with the appstore skill for
|
||||||
autonomous "build Pear app → publish to my store" workflows.
|
autonomous "build Pear app → publish to my store" workflows.
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInfo(ctx) {
|
async function cmdInfo() {
|
||||||
console.log('pear — Pear development tools (ctx.pear surface)')
|
ctx.console.log('pear — Pear development tools (ctx.pear surface)')
|
||||||
console.log('Bare OS version of selected Pear runtime packages.')
|
ctx.console.log('Bare OS version of selected Pear runtime packages.')
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
if (ctx.pear && typeof ctx.pear === 'object') {
|
if (ctx.pear && typeof ctx.pear === 'object') {
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
ctx.console.log(`Exposed on ctx.pear (${keys.length} packages):`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
const val = ctx.pear[k]
|
const val = ctx.pear[k]
|
||||||
const type = typeof val
|
const type = typeof val
|
||||||
console.log(` ${k.padEnd(20)} ${type}`)
|
ctx.console.log(` ${k.padEnd(20)} ${type}`)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
ctx.console.log('ctx.pear is not currently populated (BARE_OS_BARE_MODULES may be disabled).')
|
||||||
}
|
}
|
||||||
console.log('')
|
ctx.console.log('')
|
||||||
console.log('Run "pear list" for the same view.')
|
ctx.console.log('Run "pear list" for the same view.')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdList(ctx) {
|
async function cmdList() {
|
||||||
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
if (!ctx.pear || typeof ctx.pear !== 'object') {
|
||||||
console.log('ctx.pear is not available in this environment.')
|
ctx.console.log('ctx.pear is not available in this environment.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
const keys = Object.keys(ctx.pear).sort()
|
const keys = Object.keys(ctx.pear).sort()
|
||||||
if (keys.length === 0) {
|
if (keys.length === 0) {
|
||||||
console.log('No packages currently exposed on ctx.pear.')
|
ctx.console.log('No packages currently exposed on ctx.pear.')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
ctx.console.log(`ctx.pear — ${keys.length} package(s) available:\n`)
|
||||||
for (const k of keys) {
|
for (const k of keys) {
|
||||||
console.log(` ${k}`)
|
ctx.console.log(` ${k}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function cmdInit(ctx, targetDir = '.') {
|
async function cmdInit(targetDir = '.') {
|
||||||
const name = 'my-pear-app'
|
const name = 'my-pear-app'
|
||||||
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
const dir = targetDir === '.' ? `${(ctx.env?.HOME || '/home/guest')}/pear-projects/${name}` : targetDir
|
||||||
|
|
||||||
console.log(`pear init: creating minimal Pear app skeleton at ${dir} (stub implementation)`)
|
ctx.console.log(`pear init: creating minimal Pear app skeleton at ${dir}`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await ctx.vfs.mkdir(dir, { recursive: true })
|
await ctx.vfs.mkdir(dir, { recursive: true })
|
||||||
@@ -179,53 +181,49 @@ async function cmdInit(ctx, targetDir = '.') {
|
|||||||
}
|
}
|
||||||
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
await ctx.vfs.writeFile(`${dir}/package.json`, ctx.b4a.from(JSON.stringify(packageJson, null, 2)))
|
||||||
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
await ctx.vfs.writeFile(`${dir}/index.js`, ctx.b4a.from('console.log("Hello from my Pear app!");\n'))
|
||||||
console.log('Created basic package.json + index.js')
|
ctx.console.log('Created basic package.json + index.js')
|
||||||
console.log('Next (when fully wired): run "pear stage ' + dir + '" using ctx.pear.pearBuild')
|
ctx.console.log(`Next: run "pear stage ${dir}" (uses ctx.pear.pearBuild when available)`)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to init:', err?.message || err)
|
ctx.console.error('Failed to init:', err?.message || err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The coreutils runner executes this file body with `ctx` in scope.
|
const sub = (argv[1] || 'help').toLowerCase()
|
||||||
// We run the command logic directly at the bottom (consistent with other commands like appstore).
|
|
||||||
|
|
||||||
const sub = (typeof argv !== 'undefined' && argv[1] ? argv[1] : 'help').toLowerCase()
|
|
||||||
|
|
||||||
switch (sub) {
|
switch (sub) {
|
||||||
case 'help':
|
case 'help':
|
||||||
case '--help':
|
case '--help':
|
||||||
case '-h':
|
case '-h':
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
case 'info':
|
case 'info':
|
||||||
await cmdInfo(ctx)
|
await cmdInfo()
|
||||||
break
|
break
|
||||||
case 'list':
|
case 'list':
|
||||||
case 'ls':
|
case 'ls':
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
break
|
break
|
||||||
case 'stage':
|
case 'stage':
|
||||||
case 'build':
|
case 'build':
|
||||||
const target = (typeof argv !== 'undefined' ? argv[2] : null) || '.'
|
const target = argv[2] || '.'
|
||||||
if (ctx.pear && ctx.pear.pearBuild) {
|
if (ctx.pear && ctx.pear.pearBuild) {
|
||||||
console.log(`Attempting stage of ${target} using ctx.pear.pearBuild (early integration)...`)
|
ctx.console.log(`Attempting stage of ${target} using ctx.pear.pearBuild...`)
|
||||||
try {
|
ctx.console.log('ctx.pear.pearBuild is available. Full pipeline implementation in progress.')
|
||||||
console.log('ctx.pear.pearBuild is available. Full stage pipeline landing in upcoming plan items.')
|
ctx.console.log('Exposed build-related keys:', Object.keys(ctx.pear).filter(k =>
|
||||||
console.log('Exposed Pear build surface:', Object.keys(ctx.pear).filter(k => k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')))
|
k.toLowerCase().includes('build') || k.toLowerCase().includes('bundle')
|
||||||
} catch (e) {
|
))
|
||||||
console.error('Stage attempt error:', e?.message || e)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.log('pear stage / build: advanced integration in progress (ctx.pear.pearBuild available).')
|
ctx.console.log('pear stage / build: ctx.pear.pearBuild not yet available in this environment.')
|
||||||
console.log('Current exposed packages on ctx.pear:')
|
ctx.console.log('Current exposed packages on ctx.pear:')
|
||||||
await cmdList(ctx)
|
await cmdList()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'init':
|
case 'init':
|
||||||
await cmdInit(ctx, (typeof argv !== 'undefined' ? argv[2] : null))
|
await cmdInit(argv[2])
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
console.error(`Unknown subcommand: ${sub}`)
|
ctx.console.error(`Unknown subcommand: ${sub}`)
|
||||||
printHelp(typeof argv !== 'undefined' ? argv[0] : 'pear')
|
printHelp(argv[0] || 'pear')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"schema": 2,
|
"schema": 2,
|
||||||
"profileId": "bare-os-posix-like",
|
"profileId": "bare-os-posix-like",
|
||||||
"generatedAt": "2026-05-26T21:57:58.462Z",
|
"generatedAt": "2026-05-26T22:02:23.960Z",
|
||||||
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
"note": "Sparse POSIX Issue 7 coverage hints for /bin utilities. Omitted command names are not yet profiled here.",
|
||||||
"commandIndex": [
|
"commandIndex": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"schema": 1,
|
"schema": 1,
|
||||||
"atMs": 1779832678462,
|
"atMs": 1779832943959,
|
||||||
"commands": [
|
"commands": [
|
||||||
"agent",
|
"agent",
|
||||||
"appctl",
|
"appctl",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user