text: #! /usr/bin/env node
  
  var fs           = require('fs')
  var path         = require('path')
  var pull         = require('pull-stream')
  var toPull       = require('stream-to-pull-stream')
  var File         = require('pull-file')
  var explain      = require('explain-error')
  var Config       = require('ssb-config/inject')
  var Client       = require('ssb-client')
  var minimist     = require('minimist')
  var muxrpcli     = require('muxrpcli')
  var cmdAliases   = require('./lib/cli-cmd-aliases')
  var ProgressBar  = require('./lib/progress')
  var packageJson  = require('./package.json')
  
  //get config as cli options after --, options before that are
  //options to the command.
  var argv = process.argv.slice(2)
  var i = argv.indexOf('--')
  var conf = argv.slice(i+1)
  argv = ~i ? argv.slice(0, i) : argv
  
  var config = Config(process.env.ssb_appname, minimist(conf))
  
  if (config.keys.curve === 'k256')
    throw new Error('k256 curves are no longer supported,'+
                    'please delete' + path.join(config.path, 'secret'))
  
  var manifestFile = path.join(config.path, 'manifest.json')
  
  if (argv[0] == 'server') {
    console.log('WARNING-DEPRECATION: `sbot server` has been renamed to `ssb-server start`')
    argv[0] = 'start'
  }
  
  if (argv[0] == 'start') {
    console.log(packageJson.name, packageJson.version, config.path, 'logging.level:'+config.logging.level)
    console.log('my key ID:', config.keys.public)
  
    // special start command:
    // import ssbServer and start the server
  
    var createSsbServer = require('./')
      .use(require('ssb-private1'))
      .use(require('ssb-onion'))
      .use(require('ssb-unix-socket'))
      .use(require('ssb-no-auth'))
      .use(require('ssb-plugins'))
      .use(require('ssb-master'))
      .use(require('ssb-gossip'))
      .use(require('ssb-replicate'))
      .use(require('ssb-friends'))
      .use(require('ssb-blobs'))
      .use(require('ssb-invite'))
      .use(require('ssb-local'))
      .use(require('ssb-logging'))
      .use(require('ssb-query'))
      .use(require('ssb-links'))
      .use(require('ssb-ws'))
      .use(require('ssb-ebt'))
      .use(require('ssb-ooo'))
    // add third-party plugins
  
    require('ssb-plugins').loadUserPlugins(createSsbServer, config)
  
    // start server
    var server = createSsbServer(config)
  
    // write RPC manifest to ~/.ssb/manifest.json
    fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
  
    if(process.stdout.isTTY && (config.logging.level != 'info'))
      ProgressBar(server.progress)
  } else {
    // normal command:
    // create a client connection to the server
  
    // read manifest.json
    var manifest
    try {
      manifest = JSON.parse(fs.readFileSync(manifestFile))
    } catch (err) {
      throw explain(err,
        'no manifest file'
        + '- should be generated first time server is run'
      )
    }
  
    var opts = {
      manifest: manifest,
      port: config.port,
      host: config.host || 'localhost',
      caps: config.caps,
      key: config.key || config.keys.id
    }
  
    // connect
    Client(config.keys, opts, function (err, rpc) {
      if(err) {
        if (/could not connect/.test(err.message)) {
          console.error('Error: Could not connect to ssb-server ' + opts.host + ':' + opts.port)
          console.error('Use the "start" command to start it.')
          console.error('Use --verbose option to see full error')
          if(config.verbose) throw err
          process.exit(1)
        }
        throw err
      }
  
      // add aliases
      for (var k in cmdAliases) {
        rpc[k] = rpc[cmdAliases[k]]
        manifest[k] = manifest[cmdAliases[k]]
      }
  
      // add some extra commands
  //    manifest.version = 'async'
      manifest.config = 'sync'
  //    rpc.version = function (cb) {
  //      console.log(packageJson.version)
  //      cb()
  //    }
      rpc.config = function (cb) {
        console.log(JSON.stringify(config, null, 2))
        cb()
      }
  
      if (process.argv[2] === 'blobs.add') {
        var filename = process.argv[3]
        var source =
          filename ? File(process.argv[3])
        : !process.stdin.isTTY ? toPull.source(process.stdin)
        : (function () {
          console.error('USAGE:')
          console.error('  blobs.add <filename> # add a file')
          console.error('  source | blobs.add   # read from stdin')
          process.exit(1)
        })()
        pull(
          source,
          rpc.blobs.add(function (err, hash) {
            if (err)
              throw err
            console.log(hash)
            process.exit()
          })
        )
        return
      }
  
      // run commandline flow
      muxrpcli(argv, manifest, rpc, config.verbose)
    })
  }
  
  
  
  
  
  
  
  