OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git / scripts / create-issue-direct.js

102 lines · javascript ref:
#!/usr/bin/env bare

/**
 * Create issue directly in database (bypasses HTTP)
 */

import Corestore from 'corestore'
import Hyperbee from 'hyperbee'
import process from 'bare-process'
import fs from 'bare-fs'

async function main() {
  const repoName = process.argv[2]
  const title = process.argv[3]
  const descriptionFile = process.argv[4]

  if (!repoName || !title || !descriptionFile) {
    console.error('Usage: bare create-issue-direct.js <repo-name> <title> <description-file>')
    console.error('Example: bare create-issue-direct.js pear-git "Roadmap" /tmp/roadmap.md')
    process.exit(1)
  }

  console.log('📝 Creating issue directly in database...\n')
  console.log(`Repository: ${repoName}`)
  console.log(`Title: ${title}`)
  console.log(`Description file: ${descriptionFile}`)
  console.log('')

  // Read description from file
  let description
  try {
    description = fs.readFileSync(descriptionFile, 'utf8')
  } catch (err) {
    console.error(`❌ Failed to read description file: ${err.message}`)
    process.exit(1)
  }

  // Initialize storage
  const store = new Corestore('./pear-git-storage')
  await store.ready()

  const core = store.get({ name: 'registry' })
  const db = new Hyperbee(core, { keyEncoding: 'utf-8', valueEncoding: 'json' })
  await db.ready()

  try {
    // Get next issue number
    console.log('Finding next issue number...')
    let maxNumber = 0
    for await (const entry of db.createReadStream({
      gt: `issue:${repoName}:`,
      lt: `issue:${repoName}:\xff`
    })) {
      if (entry.value.number > maxNumber) {
        maxNumber = entry.value.number
      }
    }

    const issueNumber = maxNumber + 1
    console.log(`Next issue number: #${issueNumber}`)
    console.log('')

    // Create issue object
    const issue = {
      number: issueNumber,
      title,
      description,
      images: [],
      status: 'open',
      createdBy: 'admin-71f234c6f5a991d5',  // Admin user we created earlier
      createdAt: Date.now(),
      updatedAt: Date.now(),
      comments: []
    }

    // Store in database
    console.log('Writing to database...')
    await db.put(`issue:${repoName}:${issueNumber}`, issue)

    console.log('✅ Issue created successfully!')
    console.log('')
    console.log(`Issue #${issueNumber}: ${title}`)
    console.log(`Status: ${issue.status}`)
    console.log(`Created: ${new Date(issue.createdAt).toISOString()}`)
    console.log('')
    console.log('View at: http://10.22.0.1:5005/git/tabertron/pear-git/issues/' + issueNumber)

  } catch (err) {
    console.error('❌ Error:', err.message)
    console.error(err)
    process.exit(1)
  } finally {
    await db.close()
    await store.close()
  }
}

main().catch(err => {
  console.error('Fatal error:', err)
  process.exit(1)
})